@@ -50,6 +50,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_shm_detach, 0, 0, 1)
50
50
ZEND_ARG_INFO (0 , shm_identifier )
51
51
ZEND_END_ARG_INFO ()
52
52
53
+ ZEND_BEGIN_ARG_INFO_EX (arginfo_shm_has_var , 0 , 0 , 2 )
54
+ ZEND_ARG_INFO (0 , id )
55
+ ZEND_ARG_INFO (0 , variable_key )
56
+ ZEND_END_ARG_INFO ()
57
+
53
58
ZEND_BEGIN_ARG_INFO_EX (arginfo_shm_remove , 0 , 0 , 1 )
54
59
ZEND_ARG_INFO (0 , shm_identifier )
55
60
ZEND_END_ARG_INFO ()
@@ -78,6 +83,7 @@ const zend_function_entry sysvshm_functions[] = {
78
83
PHP_FE (shm_remove , arginfo_shm_detach )
79
84
PHP_FE (shm_detach , arginfo_shm_remove )
80
85
PHP_FE (shm_put_var , arginfo_shm_put_var )
86
+ PHP_FE (shm_has_var , arginfo_shm_has_var )
81
87
PHP_FE (shm_get_var , arginfo_shm_get_var )
82
88
PHP_FE (shm_remove_var , arginfo_shm_remove_var )
83
89
{NULL , NULL , NULL }
@@ -106,9 +112,11 @@ ZEND_GET_MODULE(sysvshm)
106
112
107
113
#undef shm_ptr /* undefine AIX-specific macro */
108
114
115
+ #define SHM_FETCH_RESOURCE (shm_ptr , z_ptr ) ZEND_FETCH_RESOURCE(shm_ptr, sysvshm_shm *, &z_ptr, -1, PHP_SHM_RSRC_NAME, php_sysvshm.le_shm)
116
+
109
117
THREAD_LS sysvshm_module php_sysvshm ;
110
118
111
- static int php_put_shm_data (sysvshm_chunk_head * ptr , long key , char * data , long len );
119
+ static int php_put_shm_data (sysvshm_chunk_head * ptr , long key , const char * data , long len );
112
120
static long php_check_shm_data (sysvshm_chunk_head * ptr , long key );
113
121
static int php_remove_shm_data (sysvshm_chunk_head * ptr , long shm_varpos );
114
122
@@ -126,7 +134,7 @@ static void php_release_sysvshm(zend_rsrc_list_entry *rsrc TSRMLS_DC)
126
134
*/
127
135
PHP_MINIT_FUNCTION (sysvshm )
128
136
{
129
- php_sysvshm .le_shm = zend_register_list_destructors_ex (php_release_sysvshm , NULL , "sysvshm" , module_number );
137
+ php_sysvshm .le_shm = zend_register_list_destructors_ex (php_release_sysvshm , NULL , PHP_SHM_RSRC_NAME , module_number );
130
138
131
139
if (cfg_get_long ("sysvshm.init_mem" , & php_sysvshm .init_mem ) == FAILURE ) {
132
140
php_sysvshm .init_mem = 10000 ;
@@ -139,35 +147,19 @@ PHP_MINIT_FUNCTION(sysvshm)
139
147
Creates or open a shared memory segment */
140
148
PHP_FUNCTION (shm_attach )
141
149
{
142
- long arg_key , arg_size , arg_flag = 0 ;
143
- long shm_size = 0 , shm_flag ;
144
150
sysvshm_shm * shm_list_ptr ;
145
151
char * shm_ptr ;
146
152
sysvshm_chunk_head * chunk_ptr ;
147
- key_t shm_key = (key_t ) 0 ;
148
- long shm_id , list_id ;
149
- int ac = ZEND_NUM_ARGS ();
150
-
151
- shm_flag = 0666 ;
152
- shm_size = php_sysvshm .init_mem ;
153
+ long shm_key , shm_id , shm_size = php_sysvshm .init_mem , shm_flag = 0666 ;
153
154
154
- if (zend_parse_parameters (ac TSRMLS_CC , "l|ll" , & arg_key , & arg_size , & arg_flag ) == FAILURE ) {
155
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "l|ll" , & shm_key , & shm_size , & shm_flag ) ) {
155
156
return ;
156
157
}
157
-
158
- shm_key = arg_key ;
159
-
160
- if (ac > 1 ) {
161
- shm_size = arg_size ;
162
- if (ac > 2 ) {
163
- shm_flag = arg_flag ;
164
- }
165
- }
166
158
167
159
if (shm_size < 1 ) {
168
160
php_error_docref (NULL TSRMLS_CC , E_WARNING , "Segment size must be greater then zero." );
169
161
RETURN_FALSE ;
170
- }
162
+ }
171
163
172
164
shm_list_ptr = (sysvshm_shm * ) emalloc (sizeof (sysvshm_shm ));
173
165
@@ -185,7 +177,7 @@ PHP_FUNCTION(shm_attach)
185
177
}
186
178
}
187
179
188
- if ((shm_ptr = shmat (shm_id , NULL , 0 )) == (void * ) - 1 ) {
180
+ if ((shm_ptr = shmat (shm_id , NULL , 0 )) == (void * ) -1 ) {
189
181
php_error_docref (NULL TSRMLS_CC , E_WARNING , "failed for key 0x%x: %s" , shm_key , strerror (errno ));
190
182
efree (shm_list_ptr );
191
183
RETURN_FALSE ;
@@ -204,98 +196,70 @@ PHP_FUNCTION(shm_attach)
204
196
shm_list_ptr -> key = shm_key ;
205
197
shm_list_ptr -> id = shm_id ;
206
198
shm_list_ptr -> ptr = chunk_ptr ;
207
- list_id = zend_list_insert ( shm_list_ptr , php_sysvshm . le_shm );
208
- RETURN_LONG ( list_id );
199
+
200
+ ZEND_REGISTER_RESOURCE ( return_value , shm_list_ptr , php_sysvshm . le_shm );
209
201
}
210
202
/* }}} */
211
203
212
- /* {{{ proto bool shm_detach(int shm_identifier)
204
+ /* {{{ proto bool shm_detach(resource shm_identifier)
213
205
Disconnects from shared memory segment */
214
206
PHP_FUNCTION (shm_detach )
215
207
{
216
- long arg_id ;
217
- int type ;
208
+ zval * shm_id ;
218
209
sysvshm_shm * shm_list_ptr ;
219
210
220
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "l " , & arg_id ) == FAILURE ) {
211
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r " , & shm_id ) ) {
221
212
return ;
222
213
}
223
-
224
- shm_list_ptr = (sysvshm_shm * ) zend_list_find (arg_id , & type );
225
- if (!shm_list_ptr || type != php_sysvshm .le_shm ) {
226
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "The parameter is not a valid shm_identifier" );
227
- RETURN_FALSE ;
228
- }
229
-
230
- zend_list_delete (arg_id );
231
-
232
- RETURN_TRUE ;
214
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
215
+ RETURN_BOOL (SUCCESS == zend_list_delete (Z_LVAL_P (shm_id )));
233
216
}
234
217
/* }}} */
235
218
236
- /* {{{ proto bool shm_remove(int shm_identifier)
219
+ /* {{{ proto bool shm_remove(resource shm_identifier)
237
220
Removes shared memory from Unix systems */
238
221
PHP_FUNCTION (shm_remove )
239
222
{
240
- long arg_id ;
241
- long id ;
242
- int type ;
223
+ zval * shm_id ;
243
224
sysvshm_shm * shm_list_ptr ;
244
225
245
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "l " , & arg_id ) == FAILURE ) {
226
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r " , & shm_id ) ) {
246
227
return ;
247
228
}
248
-
249
- id = arg_id ;
250
- shm_list_ptr = (sysvshm_shm * ) zend_list_find (id , & type );
251
-
252
- if (!shm_list_ptr || type != php_sysvshm .le_shm ) {
253
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "The parameter is not a valid shm_identifier" );
229
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
230
+
231
+ if (shmctl (shm_list_ptr -> id , IPC_RMID , NULL ) < 0 ) {
232
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "failed for key 0x%x, id %ld: %s" , shm_list_ptr -> key , Z_LVAL_P (shm_id ), strerror (errno ));
254
233
RETURN_FALSE ;
255
234
}
256
235
257
- if (shmctl (shm_list_ptr -> id , IPC_RMID ,NULL ) < 0 ) {
258
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "failed for key 0x%x, id %ld: %s" , shm_list_ptr -> key , id , strerror (errno ));
259
- RETURN_FALSE ;
260
- }
261
-
262
236
RETURN_TRUE ;
263
237
}
264
238
/* }}} */
265
239
266
- /* {{{ proto bool shm_put_var(int shm_identifier, int variable_key, mixed variable)
240
+ /* {{{ proto bool shm_put_var(resource shm_identifier, int variable_key, mixed variable)
267
241
Inserts or updates a variable in shared memory */
268
242
PHP_FUNCTION (shm_put_var )
269
243
{
270
- long arg_id , arg_key ;
271
- zval * * arg_var ;
272
- long key , id ;
244
+ zval * shm_id , * arg_var ;
245
+ int ret ;
246
+ long shm_key ;
273
247
sysvshm_shm * shm_list_ptr ;
274
- int type ;
275
248
smart_str shm_var = {0 };
276
- int ret ;
277
249
php_serialize_data_t var_hash ;
278
250
279
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "llZ " , & arg_id , & arg_key , & arg_var ) == FAILURE ) {
251
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rlz " , & shm_id , & shm_key , & arg_var )) {
280
252
return ;
281
253
}
282
-
283
- id = arg_id ;
284
- key = arg_key ;
285
-
286
- shm_list_ptr = (sysvshm_shm * ) zend_list_find (id , & type );
287
- if (!shm_list_ptr || type != php_sysvshm .le_shm ) {
288
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "%ld is not a SysV shared memory index" , id );
289
- RETURN_FALSE ;
290
- }
291
-
254
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
255
+
292
256
/* setup string-variable and serialize */
293
-
294
257
PHP_VAR_SERIALIZE_INIT (var_hash );
295
- php_var_serialize (& shm_var , arg_var , & var_hash TSRMLS_CC );
258
+ php_var_serialize (& shm_var , & arg_var , & var_hash TSRMLS_CC );
296
259
PHP_VAR_SERIALIZE_DESTROY (var_hash );
260
+
297
261
/* insert serialized variable into shared memory */
298
- ret = php_put_shm_data (shm_list_ptr -> ptr , key , shm_var .c , shm_var .len );
262
+ ret = php_put_shm_data (shm_list_ptr -> ptr , shm_key , shm_var .c , shm_var .len );
299
263
300
264
/* free string */
301
265
smart_str_free (& shm_var );
@@ -308,90 +272,86 @@ PHP_FUNCTION(shm_put_var)
308
272
}
309
273
/* }}} */
310
274
311
- /* {{{ proto mixed shm_get_var(int id, int variable_key)
275
+ /* {{{ proto mixed shm_get_var(resource id, int variable_key)
312
276
Returns a variable from shared memory */
313
277
PHP_FUNCTION (shm_get_var )
314
278
{
315
- long arg_id , arg_key ;
316
- long key , id ;
279
+ zval * shm_id ;
280
+ long shm_key ;
317
281
sysvshm_shm * shm_list_ptr ;
318
- int type ;
319
- char * shm_data ;
282
+ char * shm_data ;
320
283
long shm_varpos ;
321
284
sysvshm_chunk * shm_var ;
322
285
php_unserialize_data_t var_hash ;
323
-
324
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ll " , & arg_id , & arg_key ) == FAILURE ) {
286
+
287
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rl " , & shm_id , & shm_key ) ) {
325
288
return ;
326
289
}
327
-
328
- id = arg_id ;
329
- key = arg_key ;
330
-
331
- shm_list_ptr = (sysvshm_shm * ) zend_list_find (id , & type );
332
- if (!shm_list_ptr || type != php_sysvshm .le_shm ) {
333
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "%ld is not a SysV shared memory index" , id );
334
- RETURN_FALSE ;
335
- }
290
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
336
291
337
292
/* setup string-variable and serialize */
338
293
/* get serialized variable from shared memory */
339
- shm_varpos = php_check_shm_data ((shm_list_ptr -> ptr ), key );
294
+ shm_varpos = php_check_shm_data ((shm_list_ptr -> ptr ), shm_key );
340
295
341
296
if (shm_varpos < 0 ) {
342
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "variable key %ld doesn't exist" , key );
297
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "variable key %ld doesn't exist" , shm_key );
343
298
RETURN_FALSE ;
344
299
}
345
300
shm_var = (sysvshm_chunk * ) ((char * )shm_list_ptr -> ptr + shm_varpos );
346
301
shm_data = & shm_var -> mem ;
347
302
348
303
PHP_VAR_UNSERIALIZE_INIT (var_hash );
349
- if (php_var_unserialize (& return_value , (const unsigned char * * ) & shm_data , shm_data + shm_var -> length , & var_hash TSRMLS_CC ) != 1 ) {
350
- PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
304
+ if (php_var_unserialize (& return_value , (const unsigned char * * ) & shm_data , (unsigned char * ) shm_data + shm_var -> length , & var_hash TSRMLS_CC ) != 1 ) {
351
305
php_error_docref (NULL TSRMLS_CC , E_WARNING , "variable data in shared memory is corrupted" );
352
- RETURN_FALSE ;
306
+ RETVAL_FALSE ;
353
307
}
354
308
PHP_VAR_UNSERIALIZE_DESTROY (var_hash );
355
309
}
356
310
/* }}} */
357
311
358
- /* {{{ proto bool shm_remove_var(int id, int variable_key)
359
- Removes variable from shared memory */
360
- PHP_FUNCTION (shm_remove_var )
312
+ /* {{{ proto bool shm_has_var(resource id, int variable_key)
313
+ Checks whether a specific entry exists */
314
+ PHP_FUNCTION (shm_has_var )
361
315
{
362
- long arg_id , arg_key ;
363
- long key , id ;
316
+ zval * shm_id ;
317
+ long shm_key ;
364
318
sysvshm_shm * shm_list_ptr ;
365
- int type ;
366
- long shm_varpos ;
367
-
368
- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ll" , & arg_id , & arg_key ) == FAILURE ) {
319
+
320
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rl" , & shm_id , & shm_key )) {
369
321
return ;
370
322
}
323
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
324
+ RETURN_BOOL (php_check_shm_data (shm_list_ptr -> ptr , shm_key ) >= 0 );
325
+ }
326
+ /* }}} */
371
327
372
- id = arg_id ;
373
- key = arg_key ;
374
-
375
- shm_list_ptr = (sysvshm_shm * ) zend_list_find (id , & type );
376
- if (!shm_list_ptr || type != php_sysvshm .le_shm ) {
377
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "%ld is not a SysV shared memory index" , id );
378
- RETURN_FALSE ;
328
+ /* {{{ proto bool shm_remove_var(resource id, int variable_key)
329
+ Removes variable from shared memory */
330
+ PHP_FUNCTION (shm_remove_var )
331
+ {
332
+ zval * shm_id ;
333
+ long shm_key , shm_varpos ;
334
+ sysvshm_shm * shm_list_ptr ;
335
+
336
+ if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "rl" , & shm_id , & shm_key )) {
337
+ return ;
379
338
}
339
+ SHM_FETCH_RESOURCE (shm_list_ptr , shm_id );
380
340
381
- shm_varpos = php_check_shm_data ((shm_list_ptr -> ptr ), key );
341
+ shm_varpos = php_check_shm_data ((shm_list_ptr -> ptr ), shm_key );
382
342
383
343
if (shm_varpos < 0 ) {
384
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "variable key %ld doesn't exist" , key );
344
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "variable key %ld doesn't exist" , shm_key );
385
345
RETURN_FALSE ;
386
346
}
387
- php_remove_shm_data ((shm_list_ptr -> ptr ), shm_varpos );
347
+ php_remove_shm_data ((shm_list_ptr -> ptr ), shm_varpos );
388
348
RETURN_TRUE ;
389
349
}
390
350
/* }}} */
391
351
392
352
/* {{{ php_put_shm_data
393
353
* inserts an ascii-string into shared memory */
394
- static int php_put_shm_data (sysvshm_chunk_head * ptr , long key , char * data , long len )
354
+ static int php_put_shm_data (sysvshm_chunk_head * ptr , long key , const char * data , long len )
395
355
{
396
356
sysvshm_chunk * shm_var ;
397
357
long total_size ;
@@ -404,7 +364,7 @@ static int php_put_shm_data(sysvshm_chunk_head *ptr, long key, char *data, long
404
364
}
405
365
406
366
if (ptr -> free < total_size ) {
407
- return -1 ; /* not enough memeory */
367
+ return -1 ; /* not enough memory */
408
368
}
409
369
410
370
shm_var = (sysvshm_chunk * ) ((char * ) ptr + ptr -> end );
0 commit comments