9 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
19 # ifndef HAS_SHMAT_PROTOTYPE
20 extern Shmat_t shmat _((int, char *, int));
27 newCONSTSUB(stash,name,sv)
36 HV *old_cop_stash = curcop->cop_stash;
37 HV *old_curstash = curstash;
38 line_t oldline = curcop->cop_line;
39 curcop->cop_line = copline;
41 hints &= ~HINT_BLOCK_SCOPE;
43 curstash = curcop->cop_stash = stash;
46 start_subparse(FALSE, 0),
47 newSVOP(OP_CONST, 0, newSVpv(name,0)),
48 newSVOP(OP_CONST, 0, &sv_no), /* SvPV(&sv_no) == "" -- GMB */
49 newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
53 curcop->cop_stash = old_cop_stash;
54 curstash = old_curstash;
55 curcop->cop_line = oldline;
59 MODULE=IPC::SysV PACKAGE=IPC::Msg::stat
70 AV *list = (AV*)SvRV(obj);
71 sv = *av_fetch(list,0,TRUE); ds.msg_perm.uid = SvIV(sv);
72 sv = *av_fetch(list,1,TRUE); ds.msg_perm.gid = SvIV(sv);
73 sv = *av_fetch(list,4,TRUE); ds.msg_perm.mode = SvIV(sv);
74 sv = *av_fetch(list,6,TRUE); ds.msg_qbytes = SvIV(sv);
75 ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
87 struct msqid_ds *ds = (struct msqid_ds *)SvPV(buf,len);
88 AV *list = (AV*)SvRV(obj);
89 if (len != sizeof(*ds)) {
90 croak("Bad arg length for %s, length is %d, should be %d",
94 sv_ptr = av_fetch(list,0,TRUE);
95 sv_setiv(*sv_ptr, ds->msg_perm.uid);
96 sv_ptr = av_fetch(list,1,TRUE);
97 sv_setiv(*sv_ptr, ds->msg_perm.gid);
98 sv_ptr = av_fetch(list,2,TRUE);
99 sv_setiv(*sv_ptr, ds->msg_perm.cuid);
100 sv_ptr = av_fetch(list,3,TRUE);
101 sv_setiv(*sv_ptr, ds->msg_perm.cgid);
102 sv_ptr = av_fetch(list,4,TRUE);
103 sv_setiv(*sv_ptr, ds->msg_perm.mode);
104 sv_ptr = av_fetch(list,5,TRUE);
105 sv_setiv(*sv_ptr, ds->msg_qnum);
106 sv_ptr = av_fetch(list,6,TRUE);
107 sv_setiv(*sv_ptr, ds->msg_qbytes);
108 sv_ptr = av_fetch(list,7,TRUE);
109 sv_setiv(*sv_ptr, ds->msg_lspid);
110 sv_ptr = av_fetch(list,8,TRUE);
111 sv_setiv(*sv_ptr, ds->msg_lrpid);
112 sv_ptr = av_fetch(list,9,TRUE);
113 sv_setiv(*sv_ptr, ds->msg_stime);
114 sv_ptr = av_fetch(list,10,TRUE);
115 sv_setiv(*sv_ptr, ds->msg_rtime);
116 sv_ptr = av_fetch(list,11,TRUE);
117 sv_setiv(*sv_ptr, ds->msg_ctime);
121 MODULE=IPC::SysV PACKAGE=IPC::Semaphore::stat
130 AV *list = (AV*)SvRV(obj);
131 struct semid_ds *data = (struct semid_ds *)SvPV(ds,len);
132 if(!sv_isa(obj, "IPC::Semaphore::stat"))
133 croak("method %s not called a %s object",
134 "unpack","IPC::Semaphore::stat");
135 if (len != sizeof(*data)) {
136 croak("Bad arg length for %s, length is %d, should be %d",
137 "IPC::Semaphore::stat",
140 sv_setiv(*av_fetch(list,0,TRUE), data[0].sem_perm.uid);
141 sv_setiv(*av_fetch(list,1,TRUE), data[0].sem_perm.gid);
142 sv_setiv(*av_fetch(list,2,TRUE), data[0].sem_perm.cuid);
143 sv_setiv(*av_fetch(list,3,TRUE), data[0].sem_perm.cgid);
144 sv_setiv(*av_fetch(list,4,TRUE), data[0].sem_perm.mode);
145 sv_setiv(*av_fetch(list,5,TRUE), data[0].sem_ctime);
146 sv_setiv(*av_fetch(list,6,TRUE), data[0].sem_otime);
147 sv_setiv(*av_fetch(list,7,TRUE), data[0].sem_nsems);
159 AV *list = (AV*)SvRV(obj);
160 if(!sv_isa(obj, "IPC::Semaphore::stat"))
161 croak("method %s not called a %s object",
162 "pack","IPC::Semaphore::stat");
163 if((sv_ptr = av_fetch(list,0,TRUE)) && (sv = *sv_ptr))
164 ds.sem_perm.uid = SvIV(*sv_ptr);
165 if((sv_ptr = av_fetch(list,1,TRUE)) && (sv = *sv_ptr))
166 ds.sem_perm.gid = SvIV(*sv_ptr);
167 if((sv_ptr = av_fetch(list,2,TRUE)) && (sv = *sv_ptr))
168 ds.sem_perm.cuid = SvIV(*sv_ptr);
169 if((sv_ptr = av_fetch(list,3,TRUE)) && (sv = *sv_ptr))
170 ds.sem_perm.cgid = SvIV(*sv_ptr);
171 if((sv_ptr = av_fetch(list,4,TRUE)) && (sv = *sv_ptr))
172 ds.sem_perm.mode = SvIV(*sv_ptr);
173 if((sv_ptr = av_fetch(list,5,TRUE)) && (sv = *sv_ptr))
174 ds.sem_ctime = SvIV(*sv_ptr);
175 if((sv_ptr = av_fetch(list,6,TRUE)) && (sv = *sv_ptr))
176 ds.sem_otime = SvIV(*sv_ptr);
177 if((sv_ptr = av_fetch(list,7,TRUE)) && (sv = *sv_ptr))
178 ds.sem_nsems = SvIV(*sv_ptr);
179 ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
183 MODULE=IPC::SysV PACKAGE=IPC::SysV
190 #if defined(HAS_SEM) || defined(HAS_SHM)
191 key_t k = ftok(path, id);
192 ST(0) = k == (key_t) -1 ? &sv_undef : sv_2mortal(newSViv(k));
194 DIE(no_func, "ftok");
201 ST(0) = sv_2mortal(newSViv(SHMLBA));
203 croak("SHMLBA is not defined on this architecture");
208 HV *stash = gv_stashpvn("IPC::SysV", 9, TRUE);
210 * constant subs for IPC::SysV
212 struct { char *n; I32 v; } IPC__SysV__const[] = {
220 {"GETNCNT", GETNCNT},
223 {"GETZCNT", GETZCNT},
229 {"IPC_ALLOC", IPC_ALLOC},
232 {"IPC_CREAT", IPC_CREAT},
235 {"IPC_EXCL", IPC_EXCL},
238 {"IPC_GETACL", IPC_EXCL},
241 {"IPC_LOCKED", IPC_LOCKED},
247 {"IPC_NOERROR", IPC_NOERROR},
250 {"IPC_NOWAIT", IPC_NOWAIT},
253 {"IPC_PRIVATE", IPC_PRIVATE},
259 {"IPC_RMID", IPC_RMID},
262 {"IPC_SET", IPC_SET},
265 {"IPC_SETACL", IPC_SETACL},
268 {"IPC_SETLABEL", IPC_SETLABEL},
271 {"IPC_STAT", IPC_STAT},
277 {"IPC_WANTED", IPC_WANTED},
280 {"MSG_NOERROR", MSG_NOERROR},
283 {"MSG_FWAIT", MSG_FWAIT},
286 {"MSG_LOCKED", MSG_LOCKED},
289 {"MSG_MWAIT", MSG_MWAIT},
292 {"MSG_WAIT", MSG_WAIT},
298 {"MSG_RWAIT", MSG_RWAIT},
301 {"MSG_STAT", MSG_STAT},
307 {"MSG_WWAIT", MSG_WWAIT},
313 {"SEM_ALLOC", SEM_ALLOC},
316 {"SEM_DEST", SEM_DEST},
319 {"SEM_ERR", SEM_ERR},
325 {"SEM_ORDER", SEM_ORDER},
328 {"SEM_UNDO", SEM_UNDO},
337 {"SHM_CLEAR", SHM_CLEAR},
340 {"SHM_COPY", SHM_COPY},
343 {"SHM_DCACHE", SHM_DCACHE},
346 {"SHM_DEST", SHM_DEST},
349 {"SHM_ECACHE", SHM_ECACHE},
352 {"SHM_FMAP", SHM_FMAP},
355 {"SHM_ICACHE", SHM_ICACHE},
358 {"SHM_INIT", SHM_INIT},
361 {"SHM_LOCK", SHM_LOCK},
364 {"SHM_LOCKED", SHM_LOCKED},
367 {"SHM_MAP", SHM_MAP},
370 {"SHM_NOSWAP", SHM_NOSWAP},
373 {"SHM_RDONLY", SHM_RDONLY},
376 {"SHM_REMOVED", SHM_REMOVED},
379 {"SHM_RND", SHM_RND},
382 {"SHM_SHARE_MMU", SHM_SHARE_MMU},
385 {"SHM_SHATTR", SHM_SHATTR},
388 {"SHM_SIZE", SHM_SIZE},
391 {"SHM_UNLOCK", SHM_UNLOCK},
397 {"S_IRUSR", S_IRUSR},
400 {"S_IWUSR", S_IWUSR},
403 {"S_IRWXU", S_IRWXU},
406 {"S_IRGRP", S_IRGRP},
409 {"S_IWGRP", S_IWGRP},
412 {"S_IRWXG", S_IRWXG},
415 {"S_IROTH", S_IROTH},
418 {"S_IWOTH", S_IWOTH},
421 {"S_IRWXO", S_IRWXO},
427 for(i = 0 ; name = IPC__SysV__const[i].n ; i++) {
428 newCONSTSUB(stash,name, newSViv(IPC__SysV__const[i].v));