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