1 #ifdef __cplusplus
2 extern "C" {
3 #endif
4 #include "EXTERN.h"
5 #include "perl.h"
6 #include "XSUB.h"
7 #ifdef __cplusplus
8 }
9 #endif
10 #include <sys/shm.h>
11 #include <sys/sem.h>
12 #include <sys/ipc.h>
13 #include "sharestuff.h"
14 /*
15  * Some perl version compatibility stuff.
16  * Taken from HTML::Parser
17  */
18 #include "patchlevel.h"
19 #if PATCHLEVEL <= 4             /* perl5.004_XX */
20 #ifndef PL_sv_undef
21 #define PL_sv_undef sv_undef
22 #define PL_sv_yes   sv_yes
23 #endif
24 #ifndef PL_hexdigit
25 #define PL_hexdigit hexdigit
26 #endif
27 #if (PATCHLEVEL == 4 && SUBVERSION <= 4)
28 /* The newSVpvn function was introduced in perl5.004_05 */ static SV *
newSVpvn(char * s,STRLEN len)29 newSVpvn( char *s, STRLEN len ) {
30   register SV *sv = newSV( 0 );
31   sv_setpvn( sv, s, len );
32   return sv;
33 }
34 #endif                          /* not perl5.004_05 */
35 #endif                          /* perl5.004_XX */
36 
37 static double
constant(char * name,int arg)38 constant( char *name, int arg ) {
39   errno = 0;
40   switch ( *name ) {
41   case 'A':
42     break;
43   case 'B':
44     break;
45   case 'C':
46     break;
47   case 'D':
48     break;
49   case 'E':
50     break;
51   case 'F':
52     break;
53   case 'G':
54     if ( strEQ( name, "GETALL" ) )
55 #ifdef GETALL
56       return GETALL;
57 #else
58       goto not_there;
59 #endif
60     if ( strEQ( name, "GETNCNT" ) )
61 #ifdef GETNCNT
62       return GETNCNT;
63 #else
64       goto not_there;
65 #endif
66     if ( strEQ( name, "GETPID" ) )
67 #ifdef GETPID
68       return GETPID;
69 #else
70       goto not_there;
71 #endif
72     if ( strEQ( name, "GETVAL" ) )
73 #ifdef GETVAL
74       return GETVAL;
75 #else
76       goto not_there;
77 #endif
78     if ( strEQ( name, "GETZCNT" ) )
79 #ifdef GETZCNT
80       return GETZCNT;
81 #else
82       goto not_there;
83 #endif
84     break;
85   case 'H':
86     break;
87   case 'I':
88     if ( strEQ( name, "IPC_ALLOC" ) )
89 #ifdef IPC_ALLOC
90       return IPC_ALLOC;
91 #else
92       goto not_there;
93 #endif
94     if ( strEQ( name, "IPC_CREAT" ) )
95 #ifdef IPC_CREAT
96       return IPC_CREAT;
97 #else
98       goto not_there;
99 #endif
100     if ( strEQ( name, "IPC_EXCL" ) )
101 #ifdef IPC_EXCL
102       return IPC_EXCL;
103 #else
104       goto not_there;
105 #endif
106     if ( strEQ( name, "IPC_NOWAIT" ) )
107 #ifdef IPC_NOWAIT
108       return IPC_NOWAIT;
109 #else
110       goto not_there;
111 #endif
112     if ( strEQ( name, "IPC_O_RMID" ) )
113 #ifdef IPC_O_RMID
114       return IPC_O_RMID;
115 #else
116       goto not_there;
117 #endif
118     if ( strEQ( name, "IPC_O_SET" ) )
119 #ifdef IPC_O_SET
120       return IPC_O_SET;
121 #else
122       goto not_there;
123 #endif
124     if ( strEQ( name, "IPC_O_STAT" ) )
125 #ifdef IPC_O_STAT
126       return IPC_O_STAT;
127 #else
128       goto not_there;
129 #endif
130     if ( strEQ( name, "IPC_PRIVATE" ) )
131 #ifdef IPC_PRIVATE
132       return IPC_PRIVATE;
133 #else
134       goto not_there;
135 #endif
136     if ( strEQ( name, "IPC_RMID" ) )
137 #ifdef IPC_RMID
138       return IPC_RMID;
139 #else
140       goto not_there;
141 #endif
142     if ( strEQ( name, "IPC_SET" ) )
143 #ifdef IPC_SET
144       return IPC_SET;
145 #else
146       goto not_there;
147 #endif
148     if ( strEQ( name, "IPC_STAT" ) )
149 #ifdef IPC_STAT
150       return IPC_STAT;
151 #else
152       goto not_there;
153 #endif
154     break;
155   case 'J':
156     break;
157   case 'K':
158     break;
159   case 'L':
160     if ( strEQ( name, "LOCK_EX" ) )
161 #ifdef LOCK_EX
162       return LOCK_EX;
163 #else
164       goto not_there;
165 #endif
166     if ( strEQ( name, "LOCK_SH" ) )
167 #ifdef LOCK_SH
168       return LOCK_SH;
169 #else
170       goto not_there;
171 #endif
172     if ( strEQ( name, "LOCK_NB" ) )
173 #ifdef LOCK_NB
174       return LOCK_NB;
175 #else
176       goto not_there;
177 #endif
178     if ( strEQ( name, "LOCK_UN" ) )
179 #ifdef LOCK_UN
180       return LOCK_UN;
181 #else
182       goto not_there;
183 #endif
184     break;
185   case 'M':
186     break;
187   case 'N':
188     break;
189   case 'O':
190     break;
191   case 'P':
192     break;
193   case 'Q':
194     break;
195   case 'R':
196     break;
197   case 'S':
198     if ( strEQ( name, "SEM_A" ) )
199 #ifdef SEM_A
200       return SEM_A;
201 #else
202       goto not_there;
203 #endif
204     if ( strEQ( name, "SEM_R" ) )
205 #ifdef SEM_R
206       return SEM_R;
207 #else
208       goto not_there;
209 #endif
210     if ( strEQ( name, "SEM_UNDO" ) )
211 #ifdef SEM_UNDO
212       return SEM_UNDO;
213 #else
214       goto not_there;
215 #endif
216     if ( strEQ( name, "SETALL" ) )
217 #ifdef SETALL
218       return SETALL;
219 #else
220       goto not_there;
221 #endif
222     if ( strEQ( name, "SETVAL" ) )
223 #ifdef SETVAL
224       return SETVAL;
225 #else
226       goto not_there;
227 #endif
228     if ( strEQ( name, "SHM_LOCK" ) )
229 #ifdef SHM_LOCK
230       return SHM_LOCK;
231 #else
232       goto not_there;
233 #endif
234     if ( strEQ( name, "SHM_R" ) )
235 #ifdef SHM_R
236       return SHM_R;
237 #else
238       goto not_there;
239 #endif
240     if ( strEQ( name, "SHM_RDONLY" ) )
241 #ifdef SHM_RDONLY
242       return SHM_RDONLY;
243 #else
244       goto not_there;
245 #endif
246     if ( strEQ( name, "SHM_RND" ) )
247 #ifdef SHM_RND
248       return SHM_RND;
249 #else
250       goto not_there;
251 #endif
252     if ( strEQ( name, "SHM_SHARE_MMU" ) )
253 #ifdef SHM_SHARE_MMU
254       return SHM_SHARE_MMU;
255 #else
256       goto not_there;
257 #endif
258     if ( strEQ( name, "SHM_UNLOCK" ) )
259 #ifdef SHM_UNLOCK
260       return SHM_UNLOCK;
261 #else
262       goto not_there;
263 #endif
264     if ( strEQ( name, "SHM_W" ) )
265 #ifdef SHM_W
266       return SHM_W;
267 #else
268       goto not_there;
269 #endif
270     break;
271   case 'T':
272     break;
273   case 'U':
274     break;
275   case 'V':
276     break;
277   case 'W':
278     break;
279   case 'X':
280     break;
281   case 'Y':
282     break;
283   case 'Z':
284     break;
285   }
286   errno = EINVAL;
287   return 0;
288 
289 not_there:
290   errno = ENOENT;
291   return 0;
292 }
293 
294 /* *INDENT-OFF* */
295 
296 MODULE = IPC::ShareLite PACKAGE = IPC::ShareLite
297 
298 PROTOTYPES: DISABLE
299 
300 double
301 constant( char *name, int arg)
302 
303 Share*
304 new_share(key_t key, int segment_size, int flags)
305 
306 int
307 write_share(Share *share, char *data, int length)
308 
309 char*
310 read_share(Share *share)
311   PREINIT:
312     char*    data;
313     int      length;
314   CODE:
315     length = read_share(share, &data);
316     ST(0) = sv_newmortal();
317     if (length >= 0) {
318 #ifdef sv_usepvn_flags
319         sv_usepvn_flags((SV*)ST(0), data, length, SV_HAS_TRAILING_NUL);
320 #else
321         sv_usepvn((SV*)ST(0), data, length);
322 #endif
323     } else {
324         sv_setsv(ST(0), &PL_sv_undef);
325     }
326 
327 int
328 destroy_share(Share *share, int rmid)
329 
330 int
331 sharelite_lock(Share *share, int flags)
332 
333 int
334 sharelite_unlock(Share *share)
335 
336 unsigned int
337 sharelite_version(Share *share)
338 
339 int
340 sharelite_num_segments(Share *share)
341