Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / perl5 / ext / IPC / SysV / SysV.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #include <sys/types.h>
6 #ifdef __linux__
7 #   include <asm/page.h>
8 #endif
9 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
10 #ifndef HAS_SEM
11 #   include <sys/ipc.h>
12 #endif
13 #   ifdef HAS_MSG
14 #       include <sys/msg.h>
15 #   endif
16 #   ifdef HAS_SHM
17 #       if defined(PERL_SCO) || defined(PERL_ISC)
18 #           include <sys/sysmacros.h>   /* SHMLBA */
19 #       endif
20 #      include <sys/shm.h>
21 #      ifndef HAS_SHMAT_PROTOTYPE
22            extern Shmat_t shmat _((int, char *, int));
23 #      endif
24 #      if defined(__sparc__) && (defined(__NetBSD__) || defined(__OpenBSD__))
25 #          undef  SHMLBA /* not static: determined at boot time */
26 #          define SHMLBA getpagesize()
27 #      endif
28 #   endif
29 #endif
30
31 /* Required to get 'struct pte' for SHMLBA on ULTRIX. */
32 #if defined(__ultrix) || defined(__ultrix__) || defined(ultrix)
33 #   include <machine/pte.h>
34 #endif
35
36 /* Required in BSDI to get PAGE_SIZE definition for SHMLBA.
37  * Ugly.  More beautiful solutions welcome.
38  * Shouting at BSDI sounds quite beautiful. */
39 #ifdef __bsdi__
40 #   include <vm/vm_param.h>     /* move upwards under HAS_SHM? */
41 #endif
42
43 #ifndef S_IRWXU
44 #   ifdef S_IRUSR
45 #       define S_IRWXU (S_IRUSR|S_IWUSR|S_IWUSR)
46 #       define S_IRWXG (S_IRGRP|S_IWGRP|S_IWGRP)
47 #       define S_IRWXO (S_IROTH|S_IWOTH|S_IWOTH)
48 #   else
49 #       define S_IRWXU 0700
50 #       define S_IRWXG 0070
51 #       define S_IRWXO 0007
52 #   endif
53 #endif
54
55 MODULE=IPC::SysV        PACKAGE=IPC::Msg::stat
56
57 PROTOTYPES: ENABLE
58
59 void
60 pack(obj)
61     SV  * obj
62 PPCODE:
63 {
64 #ifdef HAS_MSG
65     SV *sv;
66     struct msqid_ds ds;
67     AV *list = (AV*)SvRV(obj);
68     sv = *av_fetch(list,0,TRUE); ds.msg_perm.uid = SvIV(sv);
69     sv = *av_fetch(list,1,TRUE); ds.msg_perm.gid = SvIV(sv);
70     sv = *av_fetch(list,4,TRUE); ds.msg_perm.mode = SvIV(sv);
71     sv = *av_fetch(list,6,TRUE); ds.msg_qbytes = SvIV(sv);
72     ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
73     XSRETURN(1);
74 #else
75     croak("System V msgxxx is not implemented on this machine");
76 #endif
77 }
78
79 void
80 unpack(obj,buf)
81     SV * obj
82     SV * buf
83 PPCODE:
84 {
85 #ifdef HAS_MSG
86     STRLEN len;
87     SV **sv_ptr;
88     struct msqid_ds *ds = (struct msqid_ds *)SvPV(buf,len);
89     AV *list = (AV*)SvRV(obj);
90     if (len != sizeof(*ds)) {
91         croak("Bad arg length for %s, length is %d, should be %d",
92                     "IPC::Msg::stat",
93                     len, sizeof(*ds));
94     }
95     sv_ptr = av_fetch(list,0,TRUE);
96     sv_setiv(*sv_ptr, ds->msg_perm.uid);
97     sv_ptr = av_fetch(list,1,TRUE);
98     sv_setiv(*sv_ptr, ds->msg_perm.gid);
99     sv_ptr = av_fetch(list,2,TRUE);
100     sv_setiv(*sv_ptr, ds->msg_perm.cuid);
101     sv_ptr = av_fetch(list,3,TRUE);
102     sv_setiv(*sv_ptr, ds->msg_perm.cgid);
103     sv_ptr = av_fetch(list,4,TRUE);
104     sv_setiv(*sv_ptr, ds->msg_perm.mode);
105     sv_ptr = av_fetch(list,5,TRUE);
106     sv_setiv(*sv_ptr, ds->msg_qnum);
107     sv_ptr = av_fetch(list,6,TRUE);
108     sv_setiv(*sv_ptr, ds->msg_qbytes);
109     sv_ptr = av_fetch(list,7,TRUE);
110     sv_setiv(*sv_ptr, ds->msg_lspid);
111     sv_ptr = av_fetch(list,8,TRUE);
112     sv_setiv(*sv_ptr, ds->msg_lrpid);
113     sv_ptr = av_fetch(list,9,TRUE);
114     sv_setiv(*sv_ptr, ds->msg_stime);
115     sv_ptr = av_fetch(list,10,TRUE);
116     sv_setiv(*sv_ptr, ds->msg_rtime);
117     sv_ptr = av_fetch(list,11,TRUE);
118     sv_setiv(*sv_ptr, ds->msg_ctime);
119     XSRETURN(1);
120 #else
121     croak("System V msgxxx is not implemented on this machine");
122 #endif
123 }
124
125 MODULE=IPC::SysV        PACKAGE=IPC::Semaphore::stat
126
127 void
128 unpack(obj,ds)
129     SV * obj
130     SV * ds
131 PPCODE:
132 {
133 #ifdef HAS_SEM
134     STRLEN len;
135     AV *list = (AV*)SvRV(obj);
136     struct semid_ds *data = (struct semid_ds *)SvPV(ds,len);
137     if(!sv_isa(obj, "IPC::Semaphore::stat"))
138         croak("method %s not called a %s object",
139                 "unpack","IPC::Semaphore::stat");
140     if (len != sizeof(*data)) {
141         croak("Bad arg length for %s, length is %d, should be %d",
142                     "IPC::Semaphore::stat",
143                     len, sizeof(*data));
144     }
145     sv_setiv(*av_fetch(list,0,TRUE), data[0].sem_perm.uid);
146     sv_setiv(*av_fetch(list,1,TRUE), data[0].sem_perm.gid);
147     sv_setiv(*av_fetch(list,2,TRUE), data[0].sem_perm.cuid);
148     sv_setiv(*av_fetch(list,3,TRUE), data[0].sem_perm.cgid);
149     sv_setiv(*av_fetch(list,4,TRUE), data[0].sem_perm.mode);
150     sv_setiv(*av_fetch(list,5,TRUE), data[0].sem_ctime);
151     sv_setiv(*av_fetch(list,6,TRUE), data[0].sem_otime);
152     sv_setiv(*av_fetch(list,7,TRUE), data[0].sem_nsems);
153     XSRETURN(1);
154 #else
155     croak("System V semxxx is not implemented on this machine");
156 #endif
157 }
158
159 void
160 pack(obj)
161     SV  * obj
162 PPCODE:
163 {
164 #ifdef HAS_SEM
165     SV **sv_ptr;
166     SV *sv;
167     struct semid_ds ds;
168     AV *list = (AV*)SvRV(obj);
169     if(!sv_isa(obj, "IPC::Semaphore::stat"))
170         croak("method %s not called a %s object",
171                 "pack","IPC::Semaphore::stat");
172     if((sv_ptr = av_fetch(list,0,TRUE)) && (sv = *sv_ptr))
173         ds.sem_perm.uid = SvIV(*sv_ptr);
174     if((sv_ptr = av_fetch(list,1,TRUE)) && (sv = *sv_ptr))
175         ds.sem_perm.gid = SvIV(*sv_ptr);
176     if((sv_ptr = av_fetch(list,2,TRUE)) && (sv = *sv_ptr))
177         ds.sem_perm.cuid = SvIV(*sv_ptr);
178     if((sv_ptr = av_fetch(list,3,TRUE)) && (sv = *sv_ptr))
179         ds.sem_perm.cgid = SvIV(*sv_ptr);
180     if((sv_ptr = av_fetch(list,4,TRUE)) && (sv = *sv_ptr))
181         ds.sem_perm.mode = SvIV(*sv_ptr);
182     if((sv_ptr = av_fetch(list,5,TRUE)) && (sv = *sv_ptr))
183         ds.sem_ctime = SvIV(*sv_ptr);
184     if((sv_ptr = av_fetch(list,6,TRUE)) && (sv = *sv_ptr))
185         ds.sem_otime = SvIV(*sv_ptr);
186     if((sv_ptr = av_fetch(list,7,TRUE)) && (sv = *sv_ptr))
187         ds.sem_nsems = SvIV(*sv_ptr);
188     ST(0) = sv_2mortal(newSVpv((char *)&ds,sizeof(ds)));
189     XSRETURN(1);
190 #else
191     croak("System V semxxx is not implemented on this machine");
192 #endif
193 }
194
195 MODULE=IPC::SysV        PACKAGE=IPC::SysV
196
197 int
198 ftok(path, id)
199         char *          path
200         int             id
201     CODE:
202 #if defined(HAS_SEM) || defined(HAS_SHM)
203         key_t k = ftok(path, id);
204         ST(0) = k == (key_t) -1 ? &PL_sv_undef : sv_2mortal(newSViv(k));
205 #else
206         DIE(no_func, "ftok");
207 #endif
208
209 int
210 SHMLBA()
211     CODE:
212 #ifdef SHMLBA
213     ST(0) = sv_2mortal(newSViv(SHMLBA));
214 #else
215     croak("SHMLBA is not defined on this architecture");
216 #endif
217
218 BOOT:
219 {
220     HV *stash = gv_stashpvn("IPC::SysV", 9, TRUE);
221     /*
222      * constant subs for IPC::SysV
223      */
224      struct { char *n; I32 v; } IPC__SysV__const[] = {
225 #ifdef GETVAL
226         {"GETVAL", GETVAL},
227 #endif
228 #ifdef GETPID
229         {"GETPID", GETPID},
230 #endif
231 #ifdef GETNCNT
232         {"GETNCNT", GETNCNT},
233 #endif
234 #ifdef GETZCNT
235         {"GETZCNT", GETZCNT},
236 #endif
237 #ifdef GETALL
238         {"GETALL", GETALL},
239 #endif
240 #ifdef IPC_ALLOC
241         {"IPC_ALLOC", IPC_ALLOC},
242 #endif
243 #ifdef IPC_CREAT
244         {"IPC_CREAT", IPC_CREAT},
245 #endif
246 #ifdef IPC_EXCL
247         {"IPC_EXCL", IPC_EXCL},
248 #endif
249 #ifdef IPC_GETACL
250         {"IPC_GETACL", IPC_EXCL},
251 #endif
252 #ifdef IPC_LOCKED
253         {"IPC_LOCKED", IPC_LOCKED},
254 #endif
255 #ifdef IPC_M
256         {"IPC_M", IPC_M},
257 #endif
258 #ifdef IPC_NOERROR
259         {"IPC_NOERROR", IPC_NOERROR},
260 #endif
261 #ifdef IPC_NOWAIT
262         {"IPC_NOWAIT", IPC_NOWAIT},
263 #endif
264 #ifdef IPC_PRIVATE
265         {"IPC_PRIVATE", IPC_PRIVATE},
266 #endif
267 #ifdef IPC_R
268         {"IPC_R", IPC_R},
269 #endif
270 #ifdef IPC_RMID
271         {"IPC_RMID", IPC_RMID},
272 #endif
273 #ifdef IPC_SET
274         {"IPC_SET", IPC_SET},
275 #endif
276 #ifdef IPC_SETACL
277         {"IPC_SETACL", IPC_SETACL},
278 #endif
279 #ifdef IPC_SETLABEL
280         {"IPC_SETLABEL", IPC_SETLABEL},
281 #endif
282 #ifdef IPC_STAT
283         {"IPC_STAT", IPC_STAT},
284 #endif
285 #ifdef IPC_W
286         {"IPC_W", IPC_W},
287 #endif
288 #ifdef IPC_WANTED
289         {"IPC_WANTED", IPC_WANTED},
290 #endif
291 #ifdef MSG_NOERROR
292         {"MSG_NOERROR", MSG_NOERROR},
293 #endif
294 #ifdef MSG_FWAIT
295         {"MSG_FWAIT", MSG_FWAIT},
296 #endif
297 #ifdef MSG_LOCKED
298         {"MSG_LOCKED", MSG_LOCKED},
299 #endif
300 #ifdef MSG_MWAIT
301         {"MSG_MWAIT", MSG_MWAIT},
302 #endif
303 #ifdef MSG_WAIT
304         {"MSG_WAIT", MSG_WAIT},
305 #endif
306 #ifdef MSG_R
307         {"MSG_R", MSG_R},
308 #endif
309 #ifdef MSG_RWAIT
310         {"MSG_RWAIT", MSG_RWAIT},
311 #endif
312 #ifdef MSG_STAT
313         {"MSG_STAT", MSG_STAT},
314 #endif
315 #ifdef MSG_W
316         {"MSG_W", MSG_W},
317 #endif
318 #ifdef MSG_WWAIT
319         {"MSG_WWAIT", MSG_WWAIT},
320 #endif
321 #ifdef SEM_A
322         {"SEM_A", SEM_A},
323 #endif
324 #ifdef SEM_ALLOC
325         {"SEM_ALLOC", SEM_ALLOC},
326 #endif
327 #ifdef SEM_DEST
328         {"SEM_DEST", SEM_DEST},
329 #endif
330 #ifdef SEM_ERR
331         {"SEM_ERR", SEM_ERR},
332 #endif
333 #ifdef SEM_R
334         {"SEM_R", SEM_R},
335 #endif
336 #ifdef SEM_ORDER
337         {"SEM_ORDER", SEM_ORDER},
338 #endif
339 #ifdef SEM_UNDO
340         {"SEM_UNDO", SEM_UNDO},
341 #endif
342 #ifdef SETVAL
343         {"SETVAL", SETVAL},
344 #endif
345 #ifdef SETALL
346         {"SETALL", SETALL},
347 #endif
348 #ifdef SHM_CLEAR
349         {"SHM_CLEAR", SHM_CLEAR},
350 #endif
351 #ifdef SHM_COPY
352         {"SHM_COPY", SHM_COPY},
353 #endif
354 #ifdef SHM_DCACHE
355         {"SHM_DCACHE", SHM_DCACHE},
356 #endif
357 #ifdef SHM_DEST
358         {"SHM_DEST", SHM_DEST},
359 #endif
360 #ifdef SHM_ECACHE
361         {"SHM_ECACHE", SHM_ECACHE},
362 #endif
363 #ifdef SHM_FMAP
364         {"SHM_FMAP", SHM_FMAP},
365 #endif
366 #ifdef SHM_ICACHE
367         {"SHM_ICACHE", SHM_ICACHE},
368 #endif
369 #ifdef SHM_INIT
370         {"SHM_INIT", SHM_INIT},
371 #endif
372 #ifdef SHM_LOCK
373         {"SHM_LOCK", SHM_LOCK},
374 #endif
375 #ifdef SHM_LOCKED
376         {"SHM_LOCKED", SHM_LOCKED},
377 #endif
378 #ifdef SHM_MAP
379         {"SHM_MAP", SHM_MAP},
380 #endif
381 #ifdef SHM_NOSWAP
382         {"SHM_NOSWAP", SHM_NOSWAP},
383 #endif
384 #ifdef SHM_RDONLY
385         {"SHM_RDONLY", SHM_RDONLY},
386 #endif
387 #ifdef SHM_REMOVED
388         {"SHM_REMOVED", SHM_REMOVED},
389 #endif
390 #ifdef SHM_RND
391         {"SHM_RND", SHM_RND},
392 #endif
393 #ifdef SHM_SHARE_MMU
394         {"SHM_SHARE_MMU", SHM_SHARE_MMU},
395 #endif
396 #ifdef SHM_SHATTR
397         {"SHM_SHATTR", SHM_SHATTR},
398 #endif
399 #ifdef SHM_SIZE
400         {"SHM_SIZE", SHM_SIZE},
401 #endif
402 #ifdef SHM_UNLOCK
403         {"SHM_UNLOCK", SHM_UNLOCK},
404 #endif
405 #ifdef SHM_W
406         {"SHM_W", SHM_W},
407 #endif
408 #ifdef S_IRUSR
409         {"S_IRUSR", S_IRUSR},
410 #endif
411 #ifdef S_IWUSR
412         {"S_IWUSR", S_IWUSR},
413 #endif
414 #ifdef S_IRWXU
415         {"S_IRWXU", S_IRWXU},
416 #endif
417 #ifdef S_IRGRP
418         {"S_IRGRP", S_IRGRP},
419 #endif
420 #ifdef S_IWGRP
421         {"S_IWGRP", S_IWGRP},
422 #endif
423 #ifdef S_IRWXG
424         {"S_IRWXG", S_IRWXG},
425 #endif
426 #ifdef S_IROTH
427         {"S_IROTH", S_IROTH},
428 #endif
429 #ifdef S_IWOTH
430         {"S_IWOTH", S_IWOTH},
431 #endif
432 #ifdef S_IRWXO
433         {"S_IRWXO", S_IRWXO},
434 #endif
435         {Nullch,0}};
436     char *name;
437     int i;
438
439     for(i = 0 ; name = IPC__SysV__const[i].n ; i++) {
440         newCONSTSUB(stash,name, newSViv(IPC__SysV__const[i].v));
441     }
442 }
443