@@ -53,6 +53,7 @@ const zend_function_entry appserver_functions[] = {
53
53
PHP_FE (appserver_get_headers , NULL )
54
54
PHP_FE (appserver_register_file_upload , NULL )
55
55
PHP_FE (appserver_set_headers_sent , NULL )
56
+ PHP_FE (appserver_redefine , NULL )
56
57
PHP_FE_END
57
58
};
58
59
@@ -167,6 +168,13 @@ static void php_appserver_init_globals(zend_appserver_globals *appserver_globals
167
168
appserver_globals -> headers = NULL ;
168
169
}
169
170
171
+ static inline void php_appserver_free_redefined (zval * * pzval )
172
+ {
173
+ TSRMLS_FETCH ();
174
+ zval_dtor (* pzval );
175
+ efree (* pzval );
176
+ }
177
+
170
178
PHP_MSHUTDOWN_FUNCTION (appserver )
171
179
{
172
180
/* uncomment this line if you have INI entries
@@ -195,12 +203,15 @@ PHP_MINIT_FUNCTION(appserver)
195
203
PHP_RINIT_FUNCTION (appserver )
196
204
{
197
205
APPSERVER_GLOBALS (headers ) = appserver_llist_allocate (appserver_llist_string_destor );
198
-
206
+ zend_hash_init (
207
+ & APPSERVER_GLOBALS (redefined ), 16 , NULL , (dtor_func_t ) php_appserver_free_redefined , 0 );
199
208
return SUCCESS ;
200
209
}
201
210
202
211
PHP_RSHUTDOWN_FUNCTION (appserver )
203
212
{
213
+ zend_hash_destroy (
214
+ & APPSERVER_GLOBALS (redefined ));
204
215
return SUCCESS ;
205
216
}
206
217
@@ -215,6 +226,65 @@ PHP_MINFO_FUNCTION(appserver)
215
226
*/
216
227
}
217
228
229
+ /* {{{ proto boolean appserver_redefine(string $constant [, mixed $value])
230
+ redefine/undefine constant at runtime ... /* }}} */
231
+ PHP_FUNCTION (appserver_redefine )
232
+ {
233
+ char * name ;
234
+ zend_uint name_len ;
235
+ zval * pzval = NULL ;
236
+
237
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "s|z" , & name , & name_len , & pzval ) == FAILURE ) {
238
+ return ;
239
+ }
240
+
241
+ {
242
+ zend_constant * defined = NULL ;
243
+
244
+ if (zend_hash_find (EG (zend_constants ), name , name_len + 1 , (void * * )& defined ) == FAILURE ) {
245
+ char * lname = zend_str_tolower_dup (name , name_len );
246
+
247
+ if (zend_hash_find (
248
+ EG (zend_constants ), lname , name_len + 1 , (void * * )& defined ) == SUCCESS ) {
249
+ if (defined -> flags & CONST_CS )
250
+ defined = NULL ;
251
+ }
252
+
253
+ efree (lname );
254
+ }
255
+
256
+ if (defined != NULL ) {
257
+ /* change user constant */
258
+ if ((defined -> module_number == PHP_USER_CONSTANT )) {
259
+ zend_constant container = * defined ;
260
+
261
+ if (pzval )
262
+ container .name = zend_strndup (container .name , container .name_len );
263
+
264
+ if (zend_hash_del (EG (zend_constants ), name , name_len + 1 )== SUCCESS ) {
265
+ if (pzval ) {
266
+ SEPARATE_ZVAL (& pzval );
267
+ container .value = * pzval ;
268
+ zend_hash_next_index_insert (
269
+ & APPSERVER_GLOBALS (redefined ), & pzval , sizeof (zval * * ), NULL );
270
+ Z_ADDREF_P (pzval );
271
+ zend_register_constant (& container TSRMLS_CC );
272
+ }
273
+ }
274
+ } else {
275
+ /* change internal constant */
276
+ SEPARATE_ZVAL (& pzval );
277
+ defined -> value = * pzval ;
278
+ zend_hash_next_index_insert (
279
+ & APPSERVER_GLOBALS (redefined ), & pzval , sizeof (zval * * ), NULL );
280
+ Z_ADDREF_P (pzval );
281
+ }
282
+ }
283
+
284
+ RETURN_FALSE ;
285
+ }
286
+ }
287
+
218
288
PHP_FUNCTION (appserver_register_file_upload )
219
289
{
220
290
char * path ;
0 commit comments