rwmode := access rights under unix. default 0600 user=read,write
{
#ifdef RLUNIX
struct shmid_ds buf;
name =
new char[strlen(shmname)+1];
size = Size +
sizeof(*mutex);
fdlock = open(
name, O_RDWR | O_CREAT, rwmode );
if(fdlock < 0)
{
int ret;
char buf[1024];
sprintf(buf,"could not write shm=%s\n",shmname);
if(ret < 0) exit(-1);
sprintf(buf,"you have to run this program as root !!!\n");
if(ret < 0) exit(-1);
exit(-1);
}
if(shmctl(
id, IPC_STAT, &buf) != 0) { status=
ERROR_SHMCTL;
return; };
flock(fdlock,LOCK_UN);
#endif
#ifdef __VMS
int file_existed = 0;
long ret,fd,page_size,pagelets,pagelet_size,file_block_size,flags,item,ident[2];
FILE *fp;
struct dsc$descriptor_s section_name;
struct FAB fab;
name =
new char[strlen(shmname)+1];
size = Size +
sizeof(*mutex);
file_block_size = 512;
item = SYI$_PAGE_SIZE;
ret = lib$getsyi( &item ,
&page_size ,
0 ,
0 ,
0 ,
0
);
if(ret != SS$_NORMAL) { status=
ERROR_FILE;
return; }
section_name.dsc$w_length = strlen(
name);
section_name.dsc$a_pointer =
name;
section_name.dsc$b_dtype = DSC$K_DTYPE_T;
section_name.dsc$b_class = DSC$K_CLASS_S;
pagelet_size = 512;
if(
size % page_size == 0) pagelets =
size / pagelet_size;
else pagelets = (
size / page_size + 1) * (page_size / pagelet_size);
ret = sys$expreg(pagelets,&add_ret,0,0);
if(ret != SS$_NORMAL) { status=
ERROR_FILE;
return; }
fab = cc$rms_fab;
fab.fab$b_fac = fab.fab$b_fac | FAB$M_PUT | FAB$M_DEL | FAB$M_GET | FAB$M_UPD;
fab.fab$b_fns = strlen(
name);
fab.fab$l_fop = fab.fab$l_fop
| FAB$M_CIF
| FAB$M_CTG
| FAB$M_UFO;
fab.fab$b_shr = fab.fab$b_shr
| FAB$M_SHRPUT
| FAB$M_UPI;
fab.fab$l_alq = pagelets * pagelet_size / file_block_size;
ret = sys$create (&fab);
if(ret != RMS$_NORMAL && ret != RMS$_CREATED)
{
sys$close (&fab);
return;
}
fd = fab.fab$l_stv;
ident[0] = 0;
ident[1] = 0;
flags = 0;
flags = SEC$M_GBL | SEC$M_WRT | SEC$M_PERM;
ret = sys$crmpsc(&add_in ,&add_ret,
(long)0 ,
flags ,
§ion_name ,
&ident ,
(long)0 ,
(short)fd ,
pagelets ,
(long)0 ,
(long)0 ,
(long)0
);
if(ret != SS$_NORMAL && ret != SS$_CREATED)
{
sys$close(&fab);
return;
}
{
sys$close(&fab);
return;
}
ret = sys$close(&fab);
if(file_existed == 0) myinit(mutex);
#endif
#ifdef RLWIN32
HANDLE hShmem;
int file_existed;
name =
new char[strlen(shmname)+1];
size = Size +
sizeof(HANDLE);
file_existed = 1;
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
{
file_existed = 0;
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL
);
}
hShmem = CreateFileMapping(
NULL,
PAGE_READWRITE,
0,
0);
hShmem,
FILE_MAP_WRITE,
0,
0,
0);
id = (int) hShmem;
#endif
if(rwmode == 0) return;
}