Annotation of embedaddon/php/Zend/zend_ini.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | Zend Engine                                                          |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 2.00 of the Zend license,     |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.zend.com/license/2_00.txt.                                |
                     11:    | If you did not receive a copy of the Zend license and are unable to  |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@zend.com so we can mail you a copy immediately.              |
                     14:    +----------------------------------------------------------------------+
                     15:    | Author: Zeev Suraski <zeev@zend.com>                                 |
                     16:    +----------------------------------------------------------------------+
                     17: */
                     18: 
                     19: /* $Id: zend_ini.c 321634 2012-01-01 13:15:04Z felipe $ */
                     20: 
                     21: #include "zend.h"
                     22: #include "zend_qsort.h"
                     23: #include "zend_API.h"
                     24: #include "zend_ini.h"
                     25: #include "zend_alloc.h"
                     26: #include "zend_operators.h"
                     27: #include "zend_strtod.h"
                     28: 
                     29: static HashTable *registered_zend_ini_directives;
                     30: 
                     31: #define NO_VALUE_PLAINTEXT             "no value"
                     32: #define NO_VALUE_HTML                  "<i>no value</i>"
                     33: 
                     34: /*
                     35:  * hash_apply functions
                     36:  */
                     37: static int zend_remove_ini_entries(zend_ini_entry *ini_entry, int *module_number TSRMLS_DC) /* {{{ */
                     38: {
                     39:        if (ini_entry->module_number == *module_number) {
                     40:                return 1;
                     41:        } else {
                     42:                return 0;
                     43:        }
                     44: }
                     45: /* }}} */
                     46: 
                     47: static int zend_restore_ini_entry_cb(zend_ini_entry *ini_entry, int stage TSRMLS_DC) /* {{{ */
                     48: {
                     49:        int result = FAILURE;
                     50: 
                     51:        if (ini_entry->modified) {
                     52:                if (ini_entry->on_modify) {
                     53:                        zend_try {
                     54:                        /* even if on_modify bails out, we have to continue on with restoring,
                     55:                                since there can be allocated variables that would be freed on MM shutdown
                     56:                                and would lead to memory corruption later ini entry is modified again */
                     57:                                result = ini_entry->on_modify(ini_entry, ini_entry->orig_value, ini_entry->orig_value_length, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage TSRMLS_CC);
                     58:                        } zend_end_try();
                     59:                }
                     60:                if (stage == ZEND_INI_STAGE_RUNTIME && result == FAILURE) {
                     61:                        /* runtime failure is OK */
                     62:                        return 1;
                     63:                }
                     64:                if (ini_entry->value != ini_entry->orig_value) {
                     65:                        efree(ini_entry->value);
                     66:                }
                     67:                ini_entry->value = ini_entry->orig_value;
                     68:                ini_entry->value_length = ini_entry->orig_value_length;
                     69:                ini_entry->modifiable = ini_entry->orig_modifiable;
                     70:                ini_entry->modified = 0;
                     71:                ini_entry->orig_value = NULL;
                     72:                ini_entry->orig_value_length = 0;
                     73:                ini_entry->orig_modifiable = 0;
                     74:        }
                     75:        return 0;
                     76: }
                     77: /* }}} */
                     78: 
                     79: static int zend_restore_ini_entry_wrapper(zend_ini_entry **ini_entry TSRMLS_DC) /* {{{ */
                     80: {
                     81:        zend_restore_ini_entry_cb(*ini_entry, ZEND_INI_STAGE_DEACTIVATE TSRMLS_CC);
                     82:        return 1;
                     83: }
                     84: /* }}} */
                     85: 
                     86: /*
                     87:  * Startup / shutdown
                     88:  */
                     89: ZEND_API int zend_ini_startup(TSRMLS_D) /* {{{ */
                     90: {
                     91:        registered_zend_ini_directives = (HashTable *) malloc(sizeof(HashTable));
                     92: 
                     93:        EG(ini_directives) = registered_zend_ini_directives;
                     94:        EG(modified_ini_directives) = NULL;
                     95:        if (zend_hash_init_ex(registered_zend_ini_directives, 100, NULL, NULL, 1, 0) == FAILURE) {
                     96:                return FAILURE;
                     97:        }
                     98:        return SUCCESS;
                     99: }
                    100: /* }}} */
                    101: 
                    102: ZEND_API int zend_ini_shutdown(TSRMLS_D) /* {{{ */
                    103: {
                    104:        zend_hash_destroy(EG(ini_directives));
                    105:        free(EG(ini_directives));
                    106:        return SUCCESS;
                    107: }
                    108: /* }}} */
                    109: 
                    110: ZEND_API int zend_ini_global_shutdown(TSRMLS_D) /* {{{ */
                    111: {
                    112:        zend_hash_destroy(registered_zend_ini_directives);
                    113:        free(registered_zend_ini_directives);
                    114:        return SUCCESS;
                    115: }
                    116: /* }}} */
                    117: 
                    118: ZEND_API int zend_ini_deactivate(TSRMLS_D) /* {{{ */
                    119: {
                    120:        if (EG(modified_ini_directives)) {
                    121:                zend_hash_apply(EG(modified_ini_directives), (apply_func_t) zend_restore_ini_entry_wrapper TSRMLS_CC);
                    122:                zend_hash_destroy(EG(modified_ini_directives));
                    123:                FREE_HASHTABLE(EG(modified_ini_directives));
                    124:                EG(modified_ini_directives) = NULL;
                    125:        }
                    126:        return SUCCESS;
                    127: }
                    128: /* }}} */
                    129: 
                    130: #ifdef ZTS
                    131: ZEND_API int zend_copy_ini_directives(TSRMLS_D) /* {{{ */
                    132: {
                    133:        zend_ini_entry ini_entry;
                    134: 
                    135:        EG(modified_ini_directives) = NULL;
                    136:        EG(ini_directives) = (HashTable *) malloc(sizeof(HashTable));
                    137:        if (zend_hash_init_ex(EG(ini_directives), registered_zend_ini_directives->nNumOfElements, NULL, NULL, 1, 0) == FAILURE) {
                    138:                return FAILURE;
                    139:        }
                    140:        zend_hash_copy(EG(ini_directives), registered_zend_ini_directives, NULL, &ini_entry, sizeof(zend_ini_entry));
                    141:        return SUCCESS;
                    142: }
                    143: /* }}} */
                    144: #endif
                    145: 
                    146: static int ini_key_compare(const void *a, const void *b TSRMLS_DC) /* {{{ */
                    147: {
                    148:        Bucket *f;
                    149:        Bucket *s;
                    150: 
                    151:        f = *((Bucket **) a);
                    152:        s = *((Bucket **) b);
                    153: 
                    154:        if (f->nKeyLength == 0 && s->nKeyLength == 0) { /* both numeric */
                    155:                return ZEND_NORMALIZE_BOOL(f->nKeyLength - s->nKeyLength);
                    156:        } else if (f->nKeyLength == 0) { /* f is numeric, s is not */
                    157:                return -1;
                    158:        } else if (s->nKeyLength == 0) { /* s is numeric, f is not */
                    159:                return 1;
                    160:        } else { /* both strings */
                    161:                return zend_binary_strcasecmp(f->arKey, f->nKeyLength, s->arKey, s->nKeyLength);
                    162:        }
                    163: }
                    164: /* }}} */
                    165: 
                    166: ZEND_API void zend_ini_sort_entries(TSRMLS_D) /* {{{ */
                    167: {
                    168:        zend_hash_sort(EG(ini_directives), zend_qsort, ini_key_compare, 0 TSRMLS_CC);
                    169: }
                    170: /* }}} */
                    171: 
                    172: /*
                    173:  * Registration / unregistration
                    174:  */
                    175: ZEND_API int zend_register_ini_entries(const zend_ini_entry *ini_entry, int module_number TSRMLS_DC) /* {{{ */
                    176: {
                    177:        const zend_ini_entry *p = ini_entry;
                    178:        zend_ini_entry *hashed_ini_entry;
                    179:        zval default_value;
                    180:        HashTable *directives = registered_zend_ini_directives;
                    181:        zend_bool config_directive_success = 0;
                    182: 
                    183: #ifdef ZTS
                    184:        /* if we are called during the request, eg: from dl(),
                    185:         * then we should not touch the global directives table,
                    186:         * and should update the per-(request|thread) version instead.
                    187:         * This solves two problems: one is that ini entries for dl()'d
                    188:         * extensions will now work, and the second is that updating the
                    189:         * global hash here from dl() is not mutex protected and can
                    190:         * lead to death.
                    191:         */
                    192:        if (directives != EG(ini_directives)) {
                    193:                directives = EG(ini_directives);
                    194:        }
                    195: #endif
                    196: 
                    197:        while (p->name) {
                    198:                config_directive_success = 0;
                    199:                if (zend_hash_add(directives, p->name, p->name_length, (void*)p, sizeof(zend_ini_entry), (void **) &hashed_ini_entry) == FAILURE) {
                    200:                        zend_unregister_ini_entries(module_number TSRMLS_CC);
                    201:                        return FAILURE;
                    202:                }
                    203:                hashed_ini_entry->module_number = module_number;
                    204:                if ((zend_get_configuration_directive(p->name, p->name_length, &default_value)) == SUCCESS) {
                    205:                        if (!hashed_ini_entry->on_modify
                    206:                                || hashed_ini_entry->on_modify(hashed_ini_entry, Z_STRVAL(default_value), Z_STRLEN(default_value), hashed_ini_entry->mh_arg1, hashed_ini_entry->mh_arg2, hashed_ini_entry->mh_arg3, ZEND_INI_STAGE_STARTUP TSRMLS_CC) == SUCCESS) {
                    207:                                hashed_ini_entry->value = Z_STRVAL(default_value);
                    208:                                hashed_ini_entry->value_length = Z_STRLEN(default_value);
                    209:                                config_directive_success = 1;
                    210:                        }
                    211:                }
                    212: 
                    213:                if (!config_directive_success && hashed_ini_entry->on_modify) {
                    214:                        hashed_ini_entry->on_modify(hashed_ini_entry, hashed_ini_entry->value, hashed_ini_entry->value_length, hashed_ini_entry->mh_arg1, hashed_ini_entry->mh_arg2, hashed_ini_entry->mh_arg3, ZEND_INI_STAGE_STARTUP TSRMLS_CC);
                    215:                }
                    216:                p++;
                    217:        }
                    218:        return SUCCESS;
                    219: }
                    220: /* }}} */
                    221: 
                    222: ZEND_API void zend_unregister_ini_entries(int module_number TSRMLS_DC) /* {{{ */
                    223: {
                    224:        zend_hash_apply_with_argument(registered_zend_ini_directives, (apply_func_arg_t) zend_remove_ini_entries, (void *) &module_number TSRMLS_CC);
                    225: }
                    226: /* }}} */
                    227: 
                    228: #ifdef ZTS
                    229: static int zend_ini_refresh_cache(zend_ini_entry *p, int stage TSRMLS_DC) /* {{{ */
                    230: {
                    231:        if (p->on_modify) {
                    232:                p->on_modify(p, p->value, p->value_length, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage TSRMLS_CC);
                    233:        }
                    234:        return 0;
                    235: }
                    236: /* }}} */
                    237: 
                    238: ZEND_API void zend_ini_refresh_caches(int stage TSRMLS_DC) /* {{{ */
                    239: {
                    240:        zend_hash_apply_with_argument(EG(ini_directives), (apply_func_arg_t) zend_ini_refresh_cache, (void *)(zend_intptr_t) stage TSRMLS_CC);
                    241: }
                    242: /* }}} */
                    243: #endif
                    244: 
                    245: ZEND_API int zend_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage) /* {{{ */
                    246: {
                    247:        TSRMLS_FETCH();
                    248: 
                    249:        return zend_alter_ini_entry_ex(name, name_length, new_value, new_value_length, modify_type, stage, 0 TSRMLS_CC);
                    250: }
                    251: /* }}} */
                    252: 
                    253: ZEND_API int zend_alter_ini_entry_ex(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage, int force_change TSRMLS_DC) /* {{{ */
                    254: {
                    255:        zend_ini_entry *ini_entry;
                    256:        char *duplicate;
                    257:        zend_bool modifiable;
                    258:        zend_bool modified;
                    259: 
                    260:        if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == FAILURE) {
                    261:                return FAILURE;
                    262:        }
                    263: 
                    264:        modifiable = ini_entry->modifiable;
                    265:        modified = ini_entry->modified;
                    266: 
                    267:        if (stage == ZEND_INI_STAGE_ACTIVATE && modify_type == ZEND_INI_SYSTEM) {
                    268:                ini_entry->modifiable = ZEND_INI_SYSTEM;
                    269:        }
                    270: 
                    271:        if (!force_change) {
                    272:                if (!(ini_entry->modifiable & modify_type)) {
                    273:                        return FAILURE;
                    274:                }
                    275:        }
                    276: 
                    277:        if (!EG(modified_ini_directives)) {
                    278:                ALLOC_HASHTABLE(EG(modified_ini_directives));
                    279:                zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
                    280:        }
                    281:        if (!modified) {
                    282:                ini_entry->orig_value = ini_entry->value;
                    283:                ini_entry->orig_value_length = ini_entry->value_length;
                    284:                ini_entry->orig_modifiable = modifiable;
                    285:                ini_entry->modified = 1;
                    286:                zend_hash_add(EG(modified_ini_directives), name, name_length, &ini_entry, sizeof(zend_ini_entry*), NULL);
                    287:        }
                    288: 
                    289:        duplicate = estrndup(new_value, new_value_length);
                    290: 
                    291:        if (!ini_entry->on_modify
                    292:                || ini_entry->on_modify(ini_entry, duplicate, new_value_length, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage TSRMLS_CC) == SUCCESS) {
                    293:                if (modified && ini_entry->orig_value != ini_entry->value) { /* we already changed the value, free the changed value */
                    294:                        efree(ini_entry->value);
                    295:                }
                    296:                ini_entry->value = duplicate;
                    297:                ini_entry->value_length = new_value_length;
                    298:        } else {
                    299:                efree(duplicate);
                    300:                return FAILURE;
                    301:        }
                    302: 
                    303:        return SUCCESS;
                    304: }
                    305: /* }}} */
                    306: 
                    307: ZEND_API int zend_restore_ini_entry(char *name, uint name_length, int stage) /* {{{ */
                    308: {
                    309:        zend_ini_entry *ini_entry;
                    310:        TSRMLS_FETCH();
                    311: 
                    312:        if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == FAILURE ||
                    313:                (stage == ZEND_INI_STAGE_RUNTIME && (ini_entry->modifiable & ZEND_INI_USER) == 0)) {
                    314:                return FAILURE;
                    315:        }
                    316: 
                    317:        if (EG(modified_ini_directives)) {
                    318:                if (zend_restore_ini_entry_cb(ini_entry, stage TSRMLS_CC) == 0) {
                    319:                        zend_hash_del(EG(modified_ini_directives), name, name_length);
                    320:                } else {
                    321:                        return FAILURE;
                    322:                }
                    323:        }
                    324: 
                    325:        return SUCCESS;
                    326: }
                    327: /* }}} */
                    328: 
                    329: ZEND_API int zend_ini_register_displayer(char *name, uint name_length, void (*displayer)(zend_ini_entry *ini_entry, int type)) /* {{{ */
                    330: {
                    331:        zend_ini_entry *ini_entry;
                    332: 
                    333:        if (zend_hash_find(registered_zend_ini_directives, name, name_length, (void **) &ini_entry) == FAILURE) {
                    334:                return FAILURE;
                    335:        }
                    336: 
                    337:        ini_entry->displayer = displayer;
                    338:        return SUCCESS;
                    339: }
                    340: /* }}} */
                    341: 
                    342: /*
                    343:  * Data retrieval
                    344:  */
                    345: 
                    346: ZEND_API long zend_ini_long(char *name, uint name_length, int orig) /* {{{ */
                    347: {
                    348:        zend_ini_entry *ini_entry;
                    349:        TSRMLS_FETCH();
                    350: 
                    351:        if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == SUCCESS) {
                    352:                if (orig && ini_entry->modified) {
                    353:                        return (ini_entry->orig_value ? strtol(ini_entry->orig_value, NULL, 0) : 0);
                    354:                } else {
                    355:                        return (ini_entry->value      ? strtol(ini_entry->value, NULL, 0)      : 0);
                    356:                }
                    357:        }
                    358: 
                    359:        return 0;
                    360: }
                    361: /* }}} */
                    362: 
                    363: ZEND_API double zend_ini_double(char *name, uint name_length, int orig) /* {{{ */
                    364: {
                    365:        zend_ini_entry *ini_entry;
                    366:        TSRMLS_FETCH();
                    367: 
                    368:        if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == SUCCESS) {
                    369:                if (orig && ini_entry->modified) {
                    370:                        return (double) (ini_entry->orig_value ? zend_strtod(ini_entry->orig_value, NULL) : 0.0);
                    371:                } else {
                    372:                        return (double) (ini_entry->value      ? zend_strtod(ini_entry->value, NULL)      : 0.0);
                    373:                }
                    374:        }
                    375: 
                    376:        return 0.0;
                    377: }
                    378: /* }}} */
                    379: 
                    380: ZEND_API char *zend_ini_string_ex(char *name, uint name_length, int orig, zend_bool *exists) /* {{{ */
                    381: {
                    382:        zend_ini_entry *ini_entry;
                    383:        TSRMLS_FETCH();
                    384: 
                    385:        if (zend_hash_find(EG(ini_directives), name, name_length, (void **) &ini_entry) == SUCCESS) {
                    386:                if (exists) {
                    387:                        *exists = 1;
                    388:                }
                    389: 
                    390:                if (orig && ini_entry->modified) {
                    391:                        return ini_entry->orig_value;
                    392:                } else {
                    393:                        return ini_entry->value;
                    394:                }
                    395:        } else {
                    396:                if (exists) {
                    397:                        *exists = 0;
                    398:                }
                    399:                return NULL;
                    400:        }
                    401: }
                    402: /* }}} */
                    403: 
                    404: ZEND_API char *zend_ini_string(char *name, uint name_length, int orig) /* {{{ */
                    405: {
                    406:        zend_bool exists = 1;
                    407:        char *return_value;
                    408: 
                    409:        return_value = zend_ini_string_ex(name, name_length, orig, &exists);
                    410:        if (!exists) {
                    411:                return NULL;
                    412:        } else if (!return_value) {
                    413:                return_value = "";
                    414:        }
                    415:        return return_value;
                    416: }
                    417: /* }}} */
                    418: 
                    419: #if TONY_20070307
                    420: static void zend_ini_displayer_cb(zend_ini_entry *ini_entry, int type) /* {{{ */
                    421: {
                    422:        if (ini_entry->displayer) {
                    423:                ini_entry->displayer(ini_entry, type);
                    424:        } else {
                    425:                char *display_string;
                    426:                uint display_string_length;
                    427: 
                    428:                if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
                    429:                        if (ini_entry->orig_value) {
                    430:                                display_string = ini_entry->orig_value;
                    431:                                display_string_length = ini_entry->orig_value_length;
                    432:                        } else {
                    433:                                if (zend_uv.html_errors) {
                    434:                                        display_string = NO_VALUE_HTML;
                    435:                                        display_string_length = sizeof(NO_VALUE_HTML) - 1;
                    436:                                } else {
                    437:                                        display_string = NO_VALUE_PLAINTEXT;
                    438:                                        display_string_length = sizeof(NO_VALUE_PLAINTEXT) - 1;
                    439:                                }
                    440:                        }
                    441:                } else if (ini_entry->value && ini_entry->value[0]) {
                    442:                        display_string = ini_entry->value;
                    443:                        display_string_length = ini_entry->value_length;
                    444:                } else {
                    445:                        if (zend_uv.html_errors) {
                    446:                                display_string = NO_VALUE_HTML;
                    447:                                display_string_length = sizeof(NO_VALUE_HTML) - 1;
                    448:                        } else {
                    449:                                display_string = NO_VALUE_PLAINTEXT;
                    450:                                display_string_length = sizeof(NO_VALUE_PLAINTEXT) - 1;
                    451:                        }
                    452:                }
                    453:                ZEND_WRITE(display_string, display_string_length);
                    454:        }
                    455: }
                    456: /* }}} */
                    457: #endif
                    458: 
                    459: ZEND_INI_DISP(zend_ini_boolean_displayer_cb) /* {{{ */
                    460: {
                    461:        int value, tmp_value_len;
                    462:        char *tmp_value;
                    463: 
                    464:        if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
                    465:                tmp_value = (ini_entry->orig_value ? ini_entry->orig_value : NULL );
                    466:                tmp_value_len = ini_entry->orig_value_length;
                    467:        } else if (ini_entry->value) {
                    468:                tmp_value = ini_entry->value;
                    469:                tmp_value_len = ini_entry->value_length;
                    470:        } else {
                    471:                tmp_value = NULL;
                    472:                tmp_value_len = 0;
                    473:        }
                    474: 
                    475:        if (tmp_value) {
                    476:                if (tmp_value_len == 4 && strcasecmp(tmp_value, "true") == 0) {
                    477:                        value = 1;
                    478:                } else if (tmp_value_len == 3 && strcasecmp(tmp_value, "yes") == 0) {
                    479:                        value = 1;
                    480:                } else if (tmp_value_len == 2 && strcasecmp(tmp_value, "on") == 0) {
                    481:                        value = 1;
                    482:                } else {
                    483:                        value = atoi(tmp_value);
                    484:                }
                    485:        } else {
                    486:                value = 0;
                    487:        }
                    488: 
                    489:        if (value) {
                    490:                ZEND_PUTS("On");
                    491:        } else {
                    492:                ZEND_PUTS("Off");
                    493:        }
                    494: }
                    495: /* }}} */
                    496: 
                    497: ZEND_INI_DISP(zend_ini_color_displayer_cb) /* {{{ */
                    498: {
                    499:        char *value;
                    500: 
                    501:        if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
                    502:                value = ini_entry->orig_value;
                    503:        } else if (ini_entry->value) {
                    504:                value = ini_entry->value;
                    505:        } else {
                    506:                value = NULL;
                    507:        }
                    508:        if (value) {
                    509:                if (zend_uv.html_errors) {
                    510:                        zend_printf("<font style=\"color: %s\">%s</font>", value, value);
                    511:                } else {
                    512:                        ZEND_PUTS(value);
                    513:                }
                    514:        } else {
                    515:                if (zend_uv.html_errors) {
                    516:                        ZEND_PUTS(NO_VALUE_HTML);
                    517:                } else {
                    518:                        ZEND_PUTS(NO_VALUE_PLAINTEXT);
                    519:                }
                    520:        }
                    521: }
                    522: /* }}} */
                    523: 
                    524: ZEND_INI_DISP(display_link_numbers) /* {{{ */
                    525: {
                    526:        char *value;
                    527: 
                    528:        if (type == ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
                    529:                value = ini_entry->orig_value;
                    530:        } else if (ini_entry->value) {
                    531:                value = ini_entry->value;
                    532:        } else {
                    533:                value = NULL;
                    534:        }
                    535: 
                    536:        if (value) {
                    537:                if (atoi(value) == -1) {
                    538:                        ZEND_PUTS("Unlimited");
                    539:                } else {
                    540:                        zend_printf("%s", value);
                    541:                }
                    542:        }
                    543: }
                    544: /* }}} */
                    545: 
                    546: /* Standard message handlers */
                    547: ZEND_API ZEND_INI_MH(OnUpdateBool) /* {{{ */
                    548: {
                    549:        zend_bool *p;
                    550: #ifndef ZTS
                    551:        char *base = (char *) mh_arg2;
                    552: #else
                    553:        char *base;
                    554: 
                    555:        base = (char *) ts_resource(*((int *) mh_arg2));
                    556: #endif
                    557: 
                    558:        p = (zend_bool *) (base+(size_t) mh_arg1);
                    559: 
                    560:        if (new_value_length == 2 && strcasecmp("on", new_value) == 0) {
                    561:                *p = (zend_bool) 1;
                    562:        }
                    563:        else if (new_value_length == 3 && strcasecmp("yes", new_value) == 0) {
                    564:                *p = (zend_bool) 1;
                    565:        }
                    566:        else if (new_value_length == 4 && strcasecmp("true", new_value) == 0) {
                    567:                *p = (zend_bool) 1;
                    568:        }
                    569:        else {
                    570:                *p = (zend_bool) atoi(new_value);
                    571:        }
                    572:        return SUCCESS;
                    573: }
                    574: /* }}} */
                    575: 
                    576: ZEND_API ZEND_INI_MH(OnUpdateLong) /* {{{ */
                    577: {
                    578:        long *p;
                    579: #ifndef ZTS
                    580:        char *base = (char *) mh_arg2;
                    581: #else
                    582:        char *base;
                    583: 
                    584:        base = (char *) ts_resource(*((int *) mh_arg2));
                    585: #endif
                    586: 
                    587:        p = (long *) (base+(size_t) mh_arg1);
                    588: 
                    589:        *p = zend_atol(new_value, new_value_length);
                    590:        return SUCCESS;
                    591: }
                    592: /* }}} */
                    593: 
                    594: ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) /* {{{ */
                    595: {
                    596:        long *p, tmp;
                    597: #ifndef ZTS
                    598:        char *base = (char *) mh_arg2;
                    599: #else
                    600:        char *base;
                    601: 
                    602:        base = (char *) ts_resource(*((int *) mh_arg2));
                    603: #endif
                    604: 
                    605:        tmp = zend_atol(new_value, new_value_length);
                    606:        if (tmp < 0) {
                    607:                return FAILURE;
                    608:        }
                    609: 
                    610:        p = (long *) (base+(size_t) mh_arg1);
                    611:        *p = tmp;
                    612: 
                    613:        return SUCCESS;
                    614: }
                    615: /* }}} */
                    616: 
                    617: ZEND_API ZEND_INI_MH(OnUpdateReal) /* {{{ */
                    618: {
                    619:        double *p;
                    620: #ifndef ZTS
                    621:        char *base = (char *) mh_arg2;
                    622: #else
                    623:        char *base;
                    624: 
                    625:        base = (char *) ts_resource(*((int *) mh_arg2));
                    626: #endif
                    627: 
                    628:        p = (double *) (base+(size_t) mh_arg1);
                    629: 
                    630:        *p = zend_strtod(new_value, NULL);
                    631:        return SUCCESS;
                    632: }
                    633: /* }}} */
                    634: 
                    635: ZEND_API ZEND_INI_MH(OnUpdateString) /* {{{ */
                    636: {
                    637:        char **p;
                    638: #ifndef ZTS
                    639:        char *base = (char *) mh_arg2;
                    640: #else
                    641:        char *base;
                    642: 
                    643:        base = (char *) ts_resource(*((int *) mh_arg2));
                    644: #endif
                    645: 
                    646:        p = (char **) (base+(size_t) mh_arg1);
                    647: 
                    648:        *p = new_value;
                    649:        return SUCCESS;
                    650: }
                    651: /* }}} */
                    652: 
                    653: ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */
                    654: {
                    655:        char **p;
                    656: #ifndef ZTS
                    657:        char *base = (char *) mh_arg2;
                    658: #else
                    659:        char *base;
                    660: 
                    661:        base = (char *) ts_resource(*((int *) mh_arg2));
                    662: #endif
                    663: 
                    664:        if (new_value && !new_value[0]) {
                    665:                return FAILURE;
                    666:        }
                    667: 
                    668:        p = (char **) (base+(size_t) mh_arg1);
                    669: 
                    670:        *p = new_value;
                    671:        return SUCCESS;
                    672: }
                    673: /* }}} */
                    674: 
                    675: /*
                    676:  * Local variables:
                    677:  * tab-width: 4
                    678:  * c-basic-offset: 4
                    679:  * indent-tabs-mode: t
                    680:  * End:
                    681:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>