]> granicus.if.org Git - php/commitdiff
Initial steps to move the INI mechanism to the Zend engine
authorZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 11:38:26 +0000 (11:38 +0000)
committerZeev Suraski <zeev@php.net>
Sun, 29 Oct 2000 11:38:26 +0000 (11:38 +0000)
18 files changed:
Zend/Makefile.am
Zend/zend_ini.c [new file with mode: 0644]
Zend/zend_ini.h [new file with mode: 0644]
Zend/zend_operators.c
Zend/zend_operators.h
ext/session/session.c
ext/standard/basic_functions.c
ext/standard/info.c
main/configuration-parser.y
main/main.c
main/php_ini.c
main/php_ini.h
sapi/aolserver/aolserver.c
sapi/apache/mod_php4.c
sapi/apache2/mod_php4.c
sapi/apache2filter/apache_config.c
sapi/cgi/cgi_main.c
win32/registry.c

index ceb69f96fef12281fb98c3280fb8c7d9536100bc..a5dadf1b57535b9cc1e9442318484f6ef5f70483 100644 (file)
@@ -15,7 +15,8 @@ libZend_la_SOURCES=\
        zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \
        zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \
        zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \
-       zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c
+       zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \
+       zend_ini.c
 
 libZend_la_LIBADD = $(ZEND_SCANNER)
 libZend_la_LDFLAGS = @EXTRA_LIBS@
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
new file mode 100644 (file)
index 0000000..4c48209
--- /dev/null
@@ -0,0 +1,516 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1998-2000 Zend Technologies Ltd. (http://www.zend.com) |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 0.92 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.zend.com/license/0_92.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Author: Zeev Suraski <zeev@zend.com>                                 |
+   +----------------------------------------------------------------------+
+*/
+
+
+#include <stdlib.h>
+
+#include "zend.h"
+#include "zend_API.h"
+#include "zend_ini.h"
+#include "zend_alloc.h"
+#include "zend_operators.h"
+
+static HashTable known_directives;
+
+
+/*
+ * hash_apply functions
+ */
+static int zend_remove_ini_entries(zend_ini_entry *ini_entry, int *module_number)
+{
+       if (ini_entry->module_number == *module_number) {
+               return 1;
+       } else {
+               return 0;
+       }
+}
+
+
+static int zend_restore_ini_entry_cb(zend_ini_entry *ini_entry, int stage)
+{
+       if (ini_entry->modified) {
+               if (ini_entry->on_modify) {
+                       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);
+               }
+               efree(ini_entry->value);
+               ini_entry->value = ini_entry->orig_value;
+               ini_entry->value_length = ini_entry->orig_value_length;
+               ini_entry->modified = 0;
+               ini_entry->orig_value = NULL;
+               ini_entry->orig_value_length = 0;
+       }
+       return 0;
+}
+
+/*
+ * Startup / shutdown
+ */
+int zend_ini_mstartup()
+{
+       if (zend_hash_init_ex(&known_directives, 100, NULL, NULL, 1, 0)==FAILURE) {
+               return FAILURE;
+       }
+       return SUCCESS;
+}
+
+
+int zend_ini_mshutdown()
+{
+       zend_hash_destroy(&known_directives);
+       return SUCCESS;
+}
+
+
+int zend_ini_rshutdown()
+{
+       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_restore_ini_entry_cb, (void *) ZEND_INI_STAGE_DEACTIVATE);
+       return SUCCESS;
+}
+
+
+static int ini_key_compare(const void *a, const void *b)
+{
+       Bucket *f;
+       Bucket *s;
+       f = *((Bucket **) a);
+       s = *((Bucket **) b);
+
+       if (f->nKeyLength==0 && s->nKeyLength==0) { /* both numeric */
+               return ZEND_NORMALIZE_BOOL(f->nKeyLength - s->nKeyLength);
+       } else if (f->nKeyLength==0) { /* f is numeric, s is not */
+               return -1;
+       } else if (s->nKeyLength==0) { /* s is numeric, f is not */
+               return 1;
+       } else { /* both strings */
+               return zend_binary_strcasecmp(f->arKey, f->nKeyLength, s->arKey, s->nKeyLength);
+       }
+}
+
+
+void zend_ini_sort_entries(void)
+{
+       zend_hash_sort(&known_directives, qsort, ini_key_compare, 0);
+}
+
+/*
+ * Registration / unregistration
+ */
+
+ZEND_API int zend_register_ini_entries(zend_ini_entry *ini_entry, int module_number)
+{
+       zend_ini_entry *p = ini_entry;
+       zend_ini_entry *hashed_ini_entry;
+       zval *default_value;
+
+       while (p->name) {
+               p->module_number = module_number;
+               if (zend_hash_add(&known_directives, p->name, p->name_length, p, sizeof(zend_ini_entry), (void **) &hashed_ini_entry)==FAILURE) {
+                       zend_unregister_ini_entries(module_number);
+                       return FAILURE;
+               }
+               if ((default_value=cfg_get_entry(p->name, p->name_length))) {
+                       if (!hashed_ini_entry->on_modify
+                               || hashed_ini_entry->on_modify(hashed_ini_entry, default_value->value.str.val, default_value->value.str.len, hashed_ini_entry->mh_arg1, hashed_ini_entry->mh_arg2, hashed_ini_entry->mh_arg3, ZEND_INI_STAGE_STARTUP)==SUCCESS) {
+                               hashed_ini_entry->value = default_value->value.str.val;
+                               hashed_ini_entry->value_length = default_value->value.str.len;
+                       }
+               } else {
+                       if (hashed_ini_entry->on_modify) {
+                               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);
+                       }
+               }
+               p++;
+       }
+       return SUCCESS;
+}
+
+
+ZEND_API void zend_unregister_ini_entries(int module_number)
+{
+       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_remove_ini_entries, (void *) &module_number);
+}
+
+
+static int zend_ini_refresh_cache(zend_ini_entry *p, int stage)
+{
+       if (p->on_modify) {
+               p->on_modify(p, p->value, p->value_length, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage);
+       }
+       return 0;
+}
+
+
+ZEND_API void zend_ini_refresh_caches(int stage)
+{
+       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_ini_refresh_cache, (void *) stage);
+}
+
+
+ZEND_API int zend_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage)
+{
+       zend_ini_entry *ini_entry;
+       char *duplicate;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
+               return FAILURE;
+       }
+
+       if (!(ini_entry->modifyable & modify_type)) {
+               return FAILURE;
+       }
+
+       duplicate = estrndup(new_value, new_value_length);
+       
+       if (!ini_entry->on_modify
+               || ini_entry->on_modify(ini_entry, duplicate, new_value_length, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage)==SUCCESS) {
+               if (!ini_entry->modified) {
+                       ini_entry->orig_value = ini_entry->value;
+                       ini_entry->orig_value_length = ini_entry->value_length;
+               } else { /* we already changed the value, free the changed value */
+                       efree(ini_entry->value);
+               }
+               ini_entry->value = duplicate;
+               ini_entry->value_length = new_value_length;
+               ini_entry->modified = 1;
+       } else {
+               efree(duplicate);
+       }
+
+       return SUCCESS;
+}
+
+
+ZEND_API int zend_restore_ini_entry(char *name, uint name_length, int stage)
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
+               return FAILURE;
+       }
+
+       zend_restore_ini_entry_cb(ini_entry, stage);
+       return SUCCESS;
+}
+
+
+ZEND_API int zend_ini_register_displayer(char *name, uint name_length, void (*displayer)(zend_ini_entry *ini_entry, int type))
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
+               return FAILURE;
+       }
+
+       ini_entry->displayer = displayer;
+       return SUCCESS;
+}
+
+
+
+/*
+ * Data retrieval
+ */
+
+ZEND_API long zend_ini_long(char *name, uint name_length, int orig)
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
+               if (orig && ini_entry->modified) {
+                       return (ini_entry->orig_value ? strtol(ini_entry->orig_value, NULL, 0) : 0);
+               } else if (ini_entry->value) {
+                       return strtol(ini_entry->value, NULL, 0);
+               }
+       }
+
+       return 0;
+}
+
+
+ZEND_API double zend_ini_double(char *name, uint name_length, int orig)
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
+               if (orig && ini_entry->modified) {
+                       return (double) (ini_entry->orig_value ? strtod(ini_entry->orig_value, NULL) : 0.0);
+               } else if (ini_entry->value) {
+                       return (double) strtod(ini_entry->value, NULL);
+               }
+       }
+
+       return 0.0;
+}
+
+
+ZEND_API char *zend_ini_string(char *name, uint name_length, int orig)
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
+               if (orig && ini_entry->modified) {
+                       return ini_entry->orig_value;
+               } else {
+                       return ini_entry->value;
+               }
+       }
+
+       return "";
+}
+
+
+zend_ini_entry *get_ini_entry(char *name, uint name_length)
+{
+       zend_ini_entry *ini_entry;
+
+       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
+               return ini_entry;
+       } else {
+               return NULL;
+       }
+}
+
+
+static void zend_ini_displayer_cb(zend_ini_entry *ini_entry, int type)
+{
+       if (ini_entry->displayer) {
+               ini_entry->displayer(ini_entry, type);
+       } else {
+               char *display_string;
+               uint display_string_length;
+
+               if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
+                       if (ini_entry->orig_value) {
+                               display_string = ini_entry->orig_value;
+                               display_string_length = ini_entry->orig_value_length;
+                       } else {
+                               display_string = "<i>no value</i>";
+                               display_string_length = sizeof("<i>no value</i>")-1;
+                       }
+               } else if (ini_entry->value && ini_entry->value[0]) {
+                       display_string = ini_entry->value;
+                       display_string_length = ini_entry->value_length;
+               } else {
+                       display_string = "<i>no value</i>";
+                       display_string_length = sizeof("<i>no value</i>")-1;
+               }
+               ZEND_WRITE(display_string, display_string_length);
+       }
+}
+
+
+ZEND_INI_DISP(zend_ini_boolean_displayer_cb)
+{
+       int value;
+
+       if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
+               value = (ini_entry->orig_value ? atoi(ini_entry->orig_value) : 0);
+       } else if (ini_entry->value) {
+               value = atoi(ini_entry->value);
+       } else {
+               value = 0;
+       }
+       if (value) {
+               ZEND_PUTS("On");
+       } else {
+               ZEND_PUTS("Off");
+       }
+}
+
+
+ZEND_INI_DISP(zend_ini_color_displayer_cb)
+{
+       char *value;
+
+       if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
+               value = ini_entry->orig_value;
+       } else if (ini_entry->value) {
+               value = ini_entry->value;
+       } else {
+               value = NULL;
+       }
+       if (value) {
+               zend_printf("<font color=\"%s\">%s</font>", value, value);
+       } else {
+               ZEND_PUTS("<i>no value</i>;");
+       }
+}
+
+
+ZEND_INI_DISP(display_link_numbers)
+{
+       char *value;
+
+       if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
+               value = ini_entry->orig_value;
+       } else if (ini_entry->value) {
+               value = ini_entry->value;
+       } else {
+               value = NULL;
+       }
+
+       if (value) {
+               if (atoi(value)==-1) {
+                       ZEND_PUTS("Unlimited");
+               } else {
+                       zend_printf("%s", value);
+               }
+       }
+}
+
+
+#if 0
+static int zend_ini_displayer(zend_ini_entry *ini_entry, int module_number)
+{
+       if (ini_entry->module_number != module_number) {
+               return 0;
+       }
+
+       ZEND_PUTS("<TR VALIGN=\"baseline\" BGCOLOR=\"" ZEND_CONTENTS_COLOR "\">");
+       ZEND_PUTS("<TD BGCOLOR=\"" ZEND_ENTRY_NAME_COLOR "\"><B>");
+       ZEND_WRITE(ini_entry->name, ini_entry->name_length-1);
+       ZEND_PUTS("</B><BR></TD><TD ALIGN=\"center\">");
+       zend_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ACTIVE);
+       ZEND_PUTS("</TD><TD ALIGN=\"center\">");
+       zend_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ORIG);
+       ZEND_PUTS("</TD></TR>\n");
+       return 0;
+}
+
+
+ZEND_API void display_ini_entries(zend_module_entry *module)
+{
+       int module_number;
+
+       if (module) {
+               module_number = module->module_number;
+       } else {
+               module_number = 0;
+       }
+#if 0 /* FIXME */
+       php_info_print_table_start();
+       php_info_print_table_header(3, "Directive", "Local Value", "Master Value");
+       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_ini_displayer, (void *) (long) module_number);
+       php_info_print_table_end();
+#endif
+}
+#endif
+
+
+/* Standard message handlers */
+
+ZEND_API ZEND_INI_MH(OnUpdateBool)
+{
+       zend_bool *p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       p = (zend_bool *) (base+(size_t) mh_arg1);
+
+       *p = (zend_bool) atoi(new_value);
+       return SUCCESS;
+}
+
+
+ZEND_API ZEND_INI_MH(OnUpdateInt)
+{
+       long *p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       p = (long *) (base+(size_t) mh_arg1);
+
+       *p = zend_atoi(new_value, new_value_length);
+       return SUCCESS;
+}
+
+
+ZEND_API ZEND_INI_MH(OnUpdateReal)
+{
+       double *p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       p = (double *) (base+(size_t) mh_arg1);
+
+       *p = strtod(new_value, NULL);
+       return SUCCESS;
+}
+
+
+ZEND_API ZEND_INI_MH(OnUpdateString)
+{
+       char **p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       p = (char **) (base+(size_t) mh_arg1);
+
+       *p = new_value;
+       return SUCCESS;
+}
+
+
+ZEND_API ZEND_INI_MH(OnUpdateStringUnempty)
+{
+       char **p;
+#ifndef ZTS
+       char *base = (char *) mh_arg2;
+#else
+       char *base;
+
+       base = (char *) ts_resource(*((int *) mh_arg2));
+#endif
+
+       if (new_value && !new_value[0]) {
+               return FAILURE;
+       }
+
+       p = (char **) (base+(size_t) mh_arg1);
+
+       *p = new_value;
+       return SUCCESS;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
new file mode 100644 (file)
index 0000000..6127d7e
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1998-2000 Zend Technologies Ltd. (http://www.zend.com) |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 0.92 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.zend.com/license/0_92.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Author: Zeev Suraski <zeev@zend.com>                                 |
+   +----------------------------------------------------------------------+
+*/
+
+
+#ifndef ZEND_INI_H
+#define ZEND_INI_H
+
+#define ZEND_INI_USER  (1<<0)
+#define ZEND_INI_PERDIR        (1<<1)
+#define ZEND_INI_SYSTEM        (1<<2)
+
+#define ZEND_INI_ALL (ZEND_INI_USER|ZEND_INI_PERDIR|ZEND_INI_SYSTEM)
+
+typedef struct _zend_ini_entry zend_ini_entry;
+
+#define ZEND_INI_MH(name) int name(zend_ini_entry *entry, char *new_value, uint new_value_length, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage)
+#define ZEND_INI_DISP(name) void name(zend_ini_entry *ini_entry, int type)
+
+struct _zend_ini_entry {
+       int module_number;
+       int modifyable;
+       char *name;
+       uint name_length;
+       ZEND_INI_MH((*on_modify));
+       void *mh_arg1;
+       void *mh_arg2;
+       void *mh_arg3;
+
+       char *value;
+       uint value_length;
+
+       char *orig_value;
+       uint orig_value_length;
+       int modified;
+
+       void (*displayer)(zend_ini_entry *ini_entry, int type);
+};
+
+
+int zend_ini_mstartup(void);
+int zend_ini_mshutdown(void);
+int zend_ini_rshutdown(void);
+
+void zend_ini_sort_entries(void);
+
+ZEND_API int zend_register_ini_entries(zend_ini_entry *ini_entry, int module_number);
+ZEND_API void zend_unregister_ini_entries(int module_number);
+ZEND_API void zend_ini_refresh_caches(int stage);
+ZEND_API int zend_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage);
+ZEND_API int zend_restore_ini_entry(char *name, uint name_length, int stage);
+ZEND_API void display_ini_entries(zend_module_entry *module);
+
+ZEND_API long zend_ini_long(char *name, uint name_length, int orig);
+ZEND_API double zend_ini_double(char *name, uint name_length, int orig);
+ZEND_API char *zend_ini_string(char *name, uint name_length, int orig);
+zend_ini_entry *get_ini_entry(char *name, uint name_length);
+
+ZEND_API int zend_ini_register_displayer(char *name, uint name_length, void (*displayer)(zend_ini_entry *ini_entry, int type));
+ZEND_API ZEND_INI_DISP(zend_ini_boolean_displayer_cb);
+ZEND_API ZEND_INI_DISP(zend_ini_color_displayer_cb);
+ZEND_API ZEND_INI_DISP(display_link_numbers);
+
+#define ZEND_INI_BEGIN()               static zend_ini_entry ini_entries[] = {
+#define ZEND_INI_END()         { 0, 0, NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, NULL } };
+
+#define ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, arg3, displayer) \
+       { 0, modifyable, name, sizeof(name), on_modify, arg1, arg2, arg3, default_value, sizeof(default_value)-1, NULL, 0, 0, displayer },
+
+#define ZEND_INI_ENTRY3(name, default_value, modifyable, on_modify, arg1, arg2, arg3) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, arg3, NULL)
+
+#define ZEND_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, arg1, arg2, displayer) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, NULL, displayer)
+
+#define ZEND_INI_ENTRY2(name, default_value, modifyable, on_modify, arg1, arg2) \
+       ZEND_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, arg1, arg2, NULL)
+
+#define ZEND_INI_ENTRY1_EX(name, default_value, modifyable, on_modify, arg1, displayer) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, NULL, NULL, displayer)
+
+#define ZEND_INI_ENTRY1(name, default_value, modifyable, on_modify, arg1) \
+       ZEND_INI_ENTRY1_EX(name, default_value, modifyable, on_modify, arg1, NULL)
+       
+#define ZEND_INI_ENTRY_EX(name, default_value, modifyable, on_modify, displayer) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, NULL, NULL, NULL, displayer)
+
+#define ZEND_INI_ENTRY(name, default_value, modifyable, on_modify) \
+       ZEND_INI_ENTRY_EX(name, default_value, modifyable, on_modify, NULL)
+
+#ifdef ZTS
+#define STD_ZEND_INI_ENTRY(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
+       ZEND_INI_ENTRY2(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id)
+#define STD_ZEND_INI_ENTRY_EX(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr, displayer) \
+       ZEND_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, displayer)
+#define STD_ZEND_INI_BOOLEAN(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, NULL, zend_ini_boolean_displayer_cb)
+#else
+#define STD_ZEND_INI_ENTRY(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
+       ZEND_INI_ENTRY2(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr)
+#define STD_ZEND_INI_ENTRY_EX(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr, displayer) \
+       ZEND_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, displayer)
+#define STD_ZEND_INI_BOOLEAN(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
+       ZEND_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, NULL, zend_ini_boolean_displayer_cb)
+#endif
+
+#define INI_INT(name) zend_ini_long((name), sizeof(name), 0)
+#define INI_FLT(name) zend_ini_double((name), sizeof(name), 0)
+#define INI_STR(name) zend_ini_string((name), sizeof(name), 0)
+#define INI_BOOL(name) ((zend_bool) INI_INT(name))
+
+#define INI_ORIG_INT(name)     zend_ini_long((name), sizeof(name), 1)
+#define INI_ORIG_FLT(name)     zend_ini_double((name), sizeof(name), 1)
+#define INI_ORIG_STR(name)     zend_ini_string((name), sizeof(name), 1)
+#define INI_ORIG_BOOL(name) ((zend_bool) INI_ORIG_INT(name))
+
+
+#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries, module_number)
+#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries(module_number)
+#define DISPLAY_INI_ENTRIES() display_ini_entries(zend_module)
+
+#define REGISTER_INI_DISPLAYER(name, displayer) zend_ini_register_displayer((name), sizeof(name), displayer)
+#define REGISTER_INI_BOOLEAN(name) REGISTER_INI_DISPLAYER(name, zend_ini_boolean_displayer_cb)
+
+zval *cfg_get_entry(char *name, uint name_length);
+
+
+/* Standard message handlers */
+ZEND_API ZEND_INI_MH(OnUpdateBool);
+ZEND_API ZEND_INI_MH(OnUpdateInt);
+ZEND_API ZEND_INI_MH(OnUpdateReal);
+ZEND_API ZEND_INI_MH(OnUpdateString);
+ZEND_API ZEND_INI_MH(OnUpdateStringUnempty);
+
+
+#define ZEND_INI_DISPLAY_ORIG  1
+#define ZEND_INI_DISPLAY_ACTIVE        2
+
+#define ZEND_INI_STAGE_STARTUP         (1<<0)
+#define ZEND_INI_STAGE_SHUTDOWN                (1<<1)
+#define ZEND_INI_STAGE_ACTIVATE                (1<<2)
+#define ZEND_INI_STAGE_DEACTIVATE      (1<<3)
+#define ZEND_INI_STAGE_RUNTIME         (1<<4)
+
+#endif /* ZEND_INI_H */
index 6a4402a9359653861ff412322f9f16d9ed6234f3..aaaffd6d71daf8c3616ee5dd9145938ba1b8149b 100644 (file)
 #include "ext/bcmath/number.h"
 #endif
 
+ZEND_API int zend_atoi(const char *str, int str_len)
+{
+       int retval;
+
+       if (!str_len) {
+               str_len = strlen(str);
+       }
+       retval = atoi(str);
+       if (str_len>0) {
+               switch (str[str_len-1]) {
+                       case 'k':
+                       case 'K':
+                               retval *= 1024;
+                               break;
+                       case 'm':
+                       case 'M':
+                               retval *= 1048576;
+                               break;
+               }
+       }
+       return retval;
+}
+
+
 ZEND_API double zend_string_to_double(const char *number, zend_uint length)
 {
        double divisor = 10.0;
@@ -1724,4 +1748,6 @@ static inline int is_numeric_string(char *str, int length, long *lval, double *d
        }
 }
 
+
+
 #endif
index c0e6138a2663059ab945d63bc657f37f7b5ddce2..c0815e77f8033a9ffd606eb9092a7848bd163a8d 100644 (file)
@@ -158,6 +158,7 @@ ZEND_API void zend_compare_symbol_tables(zval *result, HashTable *ht1, HashTable
 ZEND_API void zend_compare_arrays(zval *result, zval *a1, zval *a2);
 ZEND_API void zend_compare_objects(zval *result, zval *o1, zval *o2);
 
+ZEND_API int zend_atoi(const char *str, int str_len);
 
 #define convert_to_ex_master(ppzv, lower_type, upper_type)     \
        if ((*ppzv)->type!=IS_##upper_type) {                                   \
index 9603e0020ede351b30a595e848f5362e1cead93f..4be69bfd9f51aa064b8e886b7d3bae4900a25581 100644 (file)
@@ -987,14 +987,14 @@ PHP_FUNCTION(session_set_cookie_params)
 
        if (ZEND_NUM_ARGS() > 1) {
                convert_to_string_ex(path);
-               php_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), Z_STRVAL_PP(path), Z_STRLEN_PP(path), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+               zend_alter_ini_entry("session.cookie_path", sizeof("session.cookie_path"), Z_STRVAL_PP(path), Z_STRLEN_PP(path), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
 
                if (ZEND_NUM_ARGS() > 2) {
                        convert_to_string_ex(domain);
-                       php_alter_ini_entry("session.cookie_domain", sizeof("session.cookie_domain"), Z_STRVAL_PP(domain), Z_STRLEN_PP(domain), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+                       zend_alter_ini_entry("session.cookie_domain", sizeof("session.cookie_domain"), Z_STRVAL_PP(domain), Z_STRLEN_PP(domain), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
                        if (ZEND_NUM_ARGS() > 3) {
                                convert_to_long_ex(secure);
-                               php_alter_ini_entry("session.cookie_secure", sizeof("session.cookie_secure"), Z_BVAL_PP(secure)?"1":"0", 1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+                               zend_alter_ini_entry("session.cookie_secure", sizeof("session.cookie_secure"), Z_BVAL_PP(secure)?"1":"0", 1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
                        }
                }
        }
@@ -1039,7 +1039,7 @@ PHP_FUNCTION(session_name)
 
        if (ac == 1) {
                convert_to_string_ex(p_name);
-               php_alter_ini_entry("session.name", sizeof("session.name"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+               zend_alter_ini_entry("session.name", sizeof("session.name"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
        }
        
        RETVAL_STRING(old, 0);
@@ -1097,7 +1097,7 @@ PHP_FUNCTION(session_set_save_handler)
        if (PS(nr_open_sessions) > 0)
                RETURN_FALSE;
        
-       php_alter_ini_entry("session.save_handler", sizeof("session.save_handler"), "user", sizeof("user")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+       zend_alter_ini_entry("session.save_handler", sizeof("session.save_handler"), "user", sizeof("user")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
 
        mdata = emalloc(sizeof(*mdata));
        
@@ -1128,7 +1128,7 @@ PHP_FUNCTION(session_save_path)
 
        if (ac == 1) {
                convert_to_string_ex(p_name);
-               php_alter_ini_entry("session.save_path", sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+               zend_alter_ini_entry("session.save_path", sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
        }
        
        RETVAL_STRING(old, 0);
@@ -1176,7 +1176,7 @@ PHP_FUNCTION(session_cache_limiter)
 
        if (ac == 1) {
                convert_to_string_ex(p_cache_limiter);
-               php_alter_ini_entry("session.cache_limiter", sizeof("session.cache_limiter"), Z_STRVAL_PP(p_cache_limiter), Z_STRLEN_PP(p_cache_limiter), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
+               zend_alter_ini_entry("session.cache_limiter", sizeof("session.cache_limiter"), Z_STRVAL_PP(p_cache_limiter), Z_STRLEN_PP(p_cache_limiter), PHP_INI_USER, PHP_INI_STAGE_RUNTIME);
        }
        
        RETVAL_STRING(old, 0);
index 0ee9ae00120d20d2b4775b3ffea05209fa981790..722c5cbcb27bbeab8703786b3bc64b3188db0a1d 100644 (file)
@@ -1919,7 +1919,8 @@ PHP_FUNCTION(ini_set)
                RETVAL_FALSE;
        }
 
-       if (php_alter_ini_entry((*varname)->value.str.val, (*varname)->value.str.len+1, (*new_value)->value.str.val, (*new_value)->value.str.len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)==FAILURE) {
+       if (zend_alter_ini_entry((*varname)->value.str.val, (*varname)->value.str.len+1, (*new_value)->value.str.val, (*new_value)->value.str.len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME)==FAILURE) {
+               zval_dtor(return_value);
                RETURN_FALSE;
        }
 }
@@ -1937,7 +1938,7 @@ PHP_FUNCTION(ini_restore)
 
        convert_to_string_ex(varname);
 
-       php_restore_ini_entry((*varname)->value.str.val, (*varname)->value.str.len+1, PHP_INI_STAGE_RUNTIME);
+       zend_restore_ini_entry((*varname)->value.str.val, (*varname)->value.str.len+1, PHP_INI_STAGE_RUNTIME);
 }
 /* }}} */
 
index 06c721a89e9daa42c0c930d01dcaec9cfe523beb..4dabcbeb9bdcc081b56c381464bcb95110ccb34a 100644 (file)
@@ -240,7 +240,7 @@ PHPAPI void php_print_info(int flag)
                PUTS("</a></h1>\n");
        }
 
-       php_ini_sort_entries();
+       zend_ini_sort_entries();
 
        if (flag & PHP_INFO_CONFIGURATION) {
                php_info_print_hr();
index dcef335ea0f4ca40dd805526280cc8e0cf92728f..6c1cc3d8b4b7677efe679f49ff8619e2bc315a97 100644 (file)
@@ -453,7 +453,7 @@ statement:
                                case PARSING_MODE_CFG:
                                        zend_hash_update(active_hash_table, $1.value.str.val, $1.value.str.len+1, &$3, sizeof(zval), NULL);
                                        if (active_hash_table == &configuration_hash) {
-                                               php_alter_ini_entry($1.value.str.val, $1.value.str.len+1, $3.value.str.val, $3.value.str.len+1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP);
+                                               zend_alter_ini_entry($1.value.str.val, $1.value.str.len+1, $3.value.str.val, $3.value.str.len+1, PHP_INI_SYSTEM, PHP_INI_STAGE_STARTUP);
                                        }
                                        break;
                                case PARSING_MODE_BROWSCAP:
index e706b7ca2a2078e637db99d36c208aebe5fe68f8..5409b6f4a088213d7b78278be2ede9e56f463cbc 100644 (file)
@@ -672,7 +672,7 @@ void php_request_shutdown(void *dummy)
        }
        
        if (setjmp(EG(bailout))==0) {
-               php_ini_rshutdown();
+               zend_ini_rshutdown();
        }
        
        zend_deactivate(CLS_C ELS_CC);
@@ -862,7 +862,7 @@ int php_module_startup(sapi_module_struct *sf)
        le_index_ptr = zend_register_list_destructors_ex(NULL, NULL, "index pointer", 0);
        FREE_MUTEX(gLock);
 
-       php_ini_mstartup();
+       zend_ini_mstartup();
 
        if (php_config_ini_startup() == FAILURE) {
                return FAILURE;
@@ -937,7 +937,7 @@ void php_module_shutdown()
        zend_shutdown();
        php_shutdown_fopen_wrappers();
        UNREGISTER_INI_ENTRIES();
-       php_ini_mshutdown();
+       zend_ini_mshutdown();
        shutdown_memory_manager(0, 1);
        module_initialized = 0;
 }
index aec25c3f8c9f96eee9464f30d5180988757f52da..c681eb227044750ced41a1148df2bedd5d08e98b 100644 (file)
 /*
    +----------------------------------------------------------------------+
-   | PHP version 4.0                                                      |
+   | PHP version 4.0                                                                                                     |
    +----------------------------------------------------------------------+
-   | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group                   |
+   | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group                                   |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
-   | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | This source file is subject to version 2.02 of the PHP license,     |
+   | that is bundled with this package in the file LICENSE, and is             |
+   | available at through the world-wide-web at                                                   |
+   | http://www.php.net/license/2_02.txt.                                                               |
    | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
+   | obtain it through the world-wide-web, please send a note to                 |
+   | license@php.net so we can mail you a copy immediately.                       |
    +----------------------------------------------------------------------+
-   | Author: Zeev Suraski <zeev@zend.com>                                 |
+   | Author: Zeev Suraski <zeev@zend.com>                                                               |
    +----------------------------------------------------------------------+
  */
 
 
-#include <stdlib.h>
-
 #include "php.h"
-#include "php_ini.h"
-#include "zend_alloc.h"
-#include "php_globals.h"
 #include "ext/standard/info.h"
+#include "zend_ini.h"
 
-static HashTable known_directives;
-
-
-/*
- * hash_apply functions
- */
-static int php_remove_ini_entries(php_ini_entry *ini_entry, int *module_number)
-{
-       if (ini_entry->module_number == *module_number) {
-               return 1;
-       } else {
-               return 0;
-       }
-}
-
-
-static int php_restore_ini_entry_cb(php_ini_entry *ini_entry, int stage)
-{
-       if (ini_entry->modified) {
-               if (ini_entry->on_modify) {
-                       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);
-               }
-               efree(ini_entry->value);
-               ini_entry->value = ini_entry->orig_value;
-               ini_entry->value_length = ini_entry->orig_value_length;
-               ini_entry->modified = 0;
-               ini_entry->orig_value = NULL;
-               ini_entry->orig_value_length = 0;
-       }
-       return 0;
-}
-
-/*
- * Startup / shutdown
- */
-int php_ini_mstartup()
-{
-       if (zend_hash_init_ex(&known_directives, 100, NULL, NULL, 1, 0)==FAILURE) {
-               return FAILURE;
-       }
-       return SUCCESS;
-}
-
-
-int php_ini_mshutdown()
-{
-       zend_hash_destroy(&known_directives);
-       return SUCCESS;
-}
-
-
-int php_ini_rshutdown()
-{
-       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) php_restore_ini_entry_cb, (void *) PHP_INI_STAGE_DEACTIVATE);
-       return SUCCESS;
-}
-
-
-static int ini_key_compare(const void *a, const void *b)
-{
-       Bucket *f;
-       Bucket *s;
-       f = *((Bucket **) a);
-       s = *((Bucket **) b);
-
-       if (f->nKeyLength==0 && s->nKeyLength==0) { /* both numeric */
-               return ZEND_NORMALIZE_BOOL(f->nKeyLength - s->nKeyLength);
-       } else if (f->nKeyLength==0) { /* f is numeric, s is not */
-               return -1;
-       } else if (s->nKeyLength==0) { /* s is numeric, f is not */
-               return 1;
-       } else { /* both strings */
-               return zend_binary_strcasecmp(f->arKey, f->nKeyLength, s->arKey, s->nKeyLength);
-       }
-}
-
-
-void php_ini_sort_entries(void)
-{
-       zend_hash_sort(&known_directives, qsort, ini_key_compare, 0);
-}
-
-/*
- * Registration / unregistration
- */
-
-PHPAPI int php_register_ini_entries(php_ini_entry *ini_entry, int module_number)
-{
-       php_ini_entry *p = ini_entry;
-       php_ini_entry *hashed_ini_entry;
-       pval *default_value;
-
-       while (p->name) {
-               p->module_number = module_number;
-               if (zend_hash_add(&known_directives, p->name, p->name_length, p, sizeof(php_ini_entry), (void **) &hashed_ini_entry)==FAILURE) {
-                       php_unregister_ini_entries(module_number);
-                       return FAILURE;
-               }
-               if ((default_value=cfg_get_entry(p->name, p->name_length))) {
-                       if (!hashed_ini_entry->on_modify
-                               || hashed_ini_entry->on_modify(hashed_ini_entry, default_value->value.str.val, default_value->value.str.len, hashed_ini_entry->mh_arg1, hashed_ini_entry->mh_arg2, hashed_ini_entry->mh_arg3, PHP_INI_STAGE_STARTUP)==SUCCESS) {
-                               hashed_ini_entry->value = default_value->value.str.val;
-                               hashed_ini_entry->value_length = default_value->value.str.len;
-                       }
-               } else {
-                       if (hashed_ini_entry->on_modify) {
-                               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, PHP_INI_STAGE_STARTUP);
-                       }
-               }
-               p++;
-       }
-       return SUCCESS;
-}
-
-
-PHPAPI void php_unregister_ini_entries(int module_number)
-{
-       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) php_remove_ini_entries, (void *) &module_number);
-}
-
-
-static int php_ini_refresh_cache(php_ini_entry *p, int stage)
-{
-       if (p->on_modify) {
-               p->on_modify(p, p->value, p->value_length, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage);
-       }
-       return 0;
-}
 
-
-PHPAPI void php_ini_refresh_caches(int stage)
-{
-       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) php_ini_refresh_cache, (void *) stage);
-}
-
-
-PHPAPI int php_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage)
-{
-       php_ini_entry *ini_entry;
-       char *duplicate;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
-               return FAILURE;
-       }
-
-       if (!(ini_entry->modifyable & modify_type)) {
-               return FAILURE;
-       }
-
-       duplicate = estrndup(new_value, new_value_length);
-       
-       if (!ini_entry->on_modify
-               || ini_entry->on_modify(ini_entry, duplicate, new_value_length, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage)==SUCCESS) {
-               if (!ini_entry->modified) {
-                       ini_entry->orig_value = ini_entry->value;
-                       ini_entry->orig_value_length = ini_entry->value_length;
-               } else { /* we already changed the value, free the changed value */
-                       efree(ini_entry->value);
-               }
-               ini_entry->value = duplicate;
-               ini_entry->value_length = new_value_length;
-               ini_entry->modified = 1;
-       } else {
-               efree(duplicate);
-       }
-
-       return SUCCESS;
-}
-
-
-PHPAPI int php_restore_ini_entry(char *name, uint name_length, int stage)
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
-               return FAILURE;
-       }
-
-       php_restore_ini_entry_cb(ini_entry, stage);
-       return SUCCESS;
-}
-
-
-PHPAPI int php_ini_register_displayer(char *name, uint name_length, void (*displayer)(php_ini_entry *ini_entry, int type))
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) {
-               return FAILURE;
-       }
-
-       ini_entry->displayer = displayer;
-       return SUCCESS;
-}
-
-
-
-/*
- * Data retrieval
- */
-
-PHPAPI long php_ini_long(char *name, uint name_length, int orig)
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
-               if (orig && ini_entry->modified) {
-                       return (ini_entry->orig_value ? strtol(ini_entry->orig_value, NULL, 0) : 0);
-               } else if (ini_entry->value) {
-                       return strtol(ini_entry->value, NULL, 0);
-               }
-       }
-
-       return 0;
-}
-
-
-PHPAPI double php_ini_double(char *name, uint name_length, int orig)
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
-               if (orig && ini_entry->modified) {
-                       return (double) (ini_entry->orig_value ? strtod(ini_entry->orig_value, NULL) : 0.0);
-               } else if (ini_entry->value) {
-                       return (double) strtod(ini_entry->value, NULL);
-               }
-       }
-
-       return 0.0;
-}
-
-
-PHPAPI char *php_ini_string(char *name, uint name_length, int orig)
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
-               if (orig && ini_entry->modified) {
-                       return ini_entry->orig_value;
-               } else {
-                       return ini_entry->value;
-               }
-       }
-
-       return "";
-}
-
-
-php_ini_entry *get_ini_entry(char *name, uint name_length)
-{
-       php_ini_entry *ini_entry;
-
-       if (zend_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) {
-               return ini_entry;
-       } else {
-               return NULL;
-       }
-}
-
-
-static void php_ini_displayer_cb(php_ini_entry *ini_entry, int type)
+static void php_ini_displayer_cb(zend_ini_entry *ini_entry, int type)
 {
        if (ini_entry->displayer) {
                ini_entry->displayer(ini_entry, type);
@@ -295,7 +30,7 @@ static void php_ini_displayer_cb(php_ini_entry *ini_entry, int type)
                char *display_string;
                uint display_string_length;
 
-               if (type==PHP_INI_DISPLAY_ORIG && ini_entry->modified) {
+               if (type==ZEND_INI_DISPLAY_ORIG && ini_entry->modified) {
                        if (ini_entry->orig_value) {
                                display_string = ini_entry->orig_value;
                                display_string_length = ini_entry->orig_value_length;
@@ -315,67 +50,7 @@ static void php_ini_displayer_cb(php_ini_entry *ini_entry, int type)
 }
 
 
-PHP_INI_DISP(php_ini_boolean_displayer_cb)
-{
-       int value;
-
-       if (type==PHP_INI_DISPLAY_ORIG && ini_entry->modified) {
-               value = (ini_entry->orig_value ? atoi(ini_entry->orig_value) : 0);
-       } else if (ini_entry->value) {
-               value = atoi(ini_entry->value);
-       } else {
-               value = 0;
-       }
-       if (value) {
-               PUTS("On");
-       } else {
-               PUTS("Off");
-       }
-}
-
-
-PHP_INI_DISP(php_ini_color_displayer_cb)
-{
-       char *value;
-
-       if (type==PHP_INI_DISPLAY_ORIG && ini_entry->modified) {
-               value = ini_entry->orig_value;
-       } else if (ini_entry->value) {
-               value = ini_entry->value;
-       } else {
-               value = NULL;
-       }
-       if (value) {
-               php_printf("<font color=\"%s\">%s</font>", value, value);
-       } else {
-               PUTS("<i>no value</i>;");
-       }
-}
-
-
-PHP_INI_DISP(display_link_numbers)
-{
-       char *value;
-
-       if (type==PHP_INI_DISPLAY_ORIG && ini_entry->modified) {
-               value = ini_entry->orig_value;
-       } else if (ini_entry->value) {
-               value = ini_entry->value;
-       } else {
-               value = NULL;
-       }
-
-       if (value) {
-               if (atoi(value)==-1) {
-                       PUTS("Unlimited");
-               } else {
-                       php_printf("%s", value);
-               }
-       }
-}
-
-
-static int php_ini_displayer(php_ini_entry *ini_entry, int module_number)
+static int php_ini_displayer(zend_ini_entry *ini_entry, int module_number)
 {
        if (ini_entry->module_number != module_number) {
                return 0;
@@ -385,9 +60,9 @@ static int php_ini_displayer(php_ini_entry *ini_entry, int module_number)
        PUTS("<TD BGCOLOR=\"" PHP_ENTRY_NAME_COLOR "\"><B>");
        PHPWRITE(ini_entry->name, ini_entry->name_length-1);
        PUTS("</B><BR></TD><TD ALIGN=\"center\">");
-       php_ini_displayer_cb(ini_entry, PHP_INI_DISPLAY_ACTIVE);
+       php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ACTIVE);
        PUTS("</TD><TD ALIGN=\"center\">");
-       php_ini_displayer_cb(ini_entry, PHP_INI_DISPLAY_ORIG);
+       php_ini_displayer_cb(ini_entry, ZEND_INI_DISPLAY_ORIG);
        PUTS("</TD></TR>\n");
        return 0;
 }
@@ -399,138 +74,12 @@ PHPAPI void display_ini_entries(zend_module_entry *module)
 
        if (module) {
                module_number = module->module_number;
-       } else {
+       } else { 
                module_number = 0;
        }
        php_info_print_table_start();
        php_info_print_table_header(3, "Directive", "Local Value", "Master Value");
-       zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) php_ini_displayer, (void *) (long) module_number);
+       /*zend_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_ini_displayer, (void *) (long) module_number); */
        php_info_print_table_end();
 }
 
-
-PHPAPI int php_atoi(const char *str, int str_len)
-{
-       int retval;
-
-       if (!str_len) {
-               str_len = strlen(str);
-       }
-       retval = atoi(str);
-       if (str_len>0) {
-               switch (str[str_len-1]) {
-                       case 'k':
-                       case 'K':
-                               retval *= 1024;
-                               break;
-                       case 'm':
-                       case 'M':
-                               retval *= 1048576;
-                               break;
-               }
-       }
-       return retval;
-}
-
-
-/* Standard message handlers */
-
-PHPAPI PHP_INI_MH(OnUpdateBool)
-{
-       zend_bool *p;
-#ifndef ZTS
-       char *base = (char *) mh_arg2;
-#else
-       char *base;
-
-       base = (char *) ts_resource(*((int *) mh_arg2));
-#endif
-
-       p = (zend_bool *) (base+(size_t) mh_arg1);
-
-       *p = (zend_bool) atoi(new_value);
-       return SUCCESS;
-}
-
-
-PHPAPI PHP_INI_MH(OnUpdateInt)
-{
-       long *p;
-#ifndef ZTS
-       char *base = (char *) mh_arg2;
-#else
-       char *base;
-
-       base = (char *) ts_resource(*((int *) mh_arg2));
-#endif
-
-       p = (long *) (base+(size_t) mh_arg1);
-
-       *p = php_atoi(new_value, new_value_length);
-       return SUCCESS;
-}
-
-
-PHPAPI PHP_INI_MH(OnUpdateReal)
-{
-       double *p;
-#ifndef ZTS
-       char *base = (char *) mh_arg2;
-#else
-       char *base;
-
-       base = (char *) ts_resource(*((int *) mh_arg2));
-#endif
-
-       p = (double *) (base+(size_t) mh_arg1);
-
-       *p = strtod(new_value, NULL);
-       return SUCCESS;
-}
-
-
-PHPAPI PHP_INI_MH(OnUpdateString)
-{
-       char **p;
-#ifndef ZTS
-       char *base = (char *) mh_arg2;
-#else
-       char *base;
-
-       base = (char *) ts_resource(*((int *) mh_arg2));
-#endif
-
-       p = (char **) (base+(size_t) mh_arg1);
-
-       *p = new_value;
-       return SUCCESS;
-}
-
-
-PHPAPI PHP_INI_MH(OnUpdateStringUnempty)
-{
-       char **p;
-#ifndef ZTS
-       char *base = (char *) mh_arg2;
-#else
-       char *base;
-
-       base = (char *) ts_resource(*((int *) mh_arg2));
-#endif
-
-       if (new_value && !new_value[0]) {
-               return FAILURE;
-       }
-
-       p = (char **) (base+(size_t) mh_arg1);
-
-       *p = new_value;
-       return SUCCESS;
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- */
index 5b1994a711687a481480515b130159f1c182c4e0..80014e68b5b08dd5ba06d6cf8f079551656cba08 100644 (file)
 #ifndef PHP_INI_H
 #define PHP_INI_H
 
-#define PHP_INI_USER   (1<<0)
-#define PHP_INI_PERDIR (1<<1)
-#define PHP_INI_SYSTEM (1<<2)
+#include "zend_ini.h"
 
-#define PHP_INI_ALL (PHP_INI_USER|PHP_INI_PERDIR|PHP_INI_SYSTEM)
+#define PHP_INI_USER   ZEND_INI_USER
+#define PHP_INI_PERDIR ZEND_INI_PERDIR
+#define PHP_INI_SYSTEM ZEND_INI_SYSTEM
 
-typedef struct _php_ini_entry php_ini_entry;
+#define PHP_INI_ALL    ZEND_INI_ALL
 
-#define PHP_INI_MH(name) int name(php_ini_entry *entry, char *new_value, uint new_value_length, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage)
-#define PHP_INI_DISP(name) void name(php_ini_entry *ini_entry, int type)
+#define php_ini_entry  zend_ini_entry
 
-struct _php_ini_entry {
-       int module_number;
-       int modifyable;
-       char *name;
-       uint name_length;
-       PHP_INI_MH((*on_modify));
-       void *mh_arg1;
-       void *mh_arg2;
-       void *mh_arg3;
+#define PHP_INI_MH             ZEND_INI_MH
+#define PHP_INI_DISP   ZEND_INI_DISP
 
-       char *value;
-       uint value_length;
+#define PHP_INI_BEGIN          ZEND_INI_BEGIN
+#define PHP_INI_END                    ZEND_INI_END
 
-       char *orig_value;
-       uint orig_value_length;
-       int modified;
+#define PHP_INI_ENTRY3_EX      ZEND_INI_ENTRY3_EX
+#define PHP_INI_ENTRY3         ZEND_INI_ENTRY3
+#define PHP_INI_ENTRY2_EX      ZEND_INI_ENTRY2_EX
+#define PHP_INI_ENTRY2         ZEND_INI_ENTRY2
+#define PHP_INI_ENTRY1_EX      ZEND_INI_ENTRY1_EX
+#define PHP_INI_ENTRY1         ZEND_INI_ENTRY1
+#define PHP_INI_ENTRY_EX       ZEND_INI_ENTRY_EX
+#define PHP_INI_ENTRY          ZEND_INI_ENTRY
 
-       void (*displayer)(php_ini_entry *ini_entry, int type);
-};
+#define STD_PHP_INI_ENTRY              STD_ZEND_INI_ENTRY
+#define STD_PHP_INI_ENTRY_EX   STD_ZEND_INI_ENTRY_EX
+#define STD_PHP_INI_BOOLEAN            STD_ZEND_INI_BOOLEAN
 
+#define PHP_INI_DISPLAY_ORIG   ZEND_INI_DISPLAY_ORIG
+#define PHP_INI_DISPLAY_ACTIVE ZEND_INI_DISPLAY_ACTIVE
 
-int php_ini_mstartup(void);
-int php_ini_mshutdown(void);
-int php_ini_rshutdown(void);
+#define PHP_INI_STAGE_STARTUP          ZEND_INI_STAGE_STARTUP
+#define PHP_INI_STAGE_SHUTDOWN         ZEND_INI_STAGE_SHUTDOWN
+#define PHP_INI_STAGE_ACTIVATE         ZEND_INI_STAGE_ACTIVATE
+#define PHP_INI_STAGE_DEACTIVATE       ZEND_INI_STAGE_DEACTIVATE
+#define PHP_INI_STAGE_RUNTIME          ZEND_INI_STAGE_RUNTIME
 
-void php_ini_sort_entries(void);
+#define php_ini_boolean_displayer_cb   zend_ini_boolean_displayer_cb
+#define php_ini_color_displayer_cb             zend_ini_color_displayer_cb
 
-PHPAPI int php_register_ini_entries(php_ini_entry *ini_entry, int module_number);
-PHPAPI void php_unregister_ini_entries(int module_number);
-PHPAPI void php_ini_refresh_caches(int stage);
-PHPAPI int php_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type, int stage);
-PHPAPI int php_restore_ini_entry(char *name, uint name_length, int stage);
-PHPAPI void display_ini_entries(zend_module_entry *module);
+#define php_alter_ini_entry            zend_alter_ini_entry
 
-PHPAPI long php_ini_long(char *name, uint name_length, int orig);
-PHPAPI double php_ini_double(char *name, uint name_length, int orig);
-PHPAPI char *php_ini_string(char *name, uint name_length, int orig);
-php_ini_entry *get_ini_entry(char *name, uint name_length);
-
-PHPAPI int php_ini_register_displayer(char *name, uint name_length, void (*displayer)(php_ini_entry *ini_entry, int type));
-PHPAPI PHP_INI_DISP(php_ini_boolean_displayer_cb);
-PHPAPI PHP_INI_DISP(php_ini_color_displayer_cb);
-PHPAPI PHP_INI_DISP(display_link_numbers);
-
-#define PHP_INI_BEGIN()                static php_ini_entry ini_entries[] = {
-#define PHP_INI_END()          { 0, 0, NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, NULL } };
-
-#define PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, arg3, displayer) \
-       { 0, modifyable, name, sizeof(name), on_modify, arg1, arg2, arg3, default_value, sizeof(default_value)-1, NULL, 0, 0, displayer },
-
-#define PHP_INI_ENTRY3(name, default_value, modifyable, on_modify, arg1, arg2, arg3) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, arg3, NULL)
-
-#define PHP_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, arg1, arg2, displayer) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, arg2, NULL, displayer)
-
-#define PHP_INI_ENTRY2(name, default_value, modifyable, on_modify, arg1, arg2) \
-       PHP_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, arg1, arg2, NULL)
-
-#define PHP_INI_ENTRY1_EX(name, default_value, modifyable, on_modify, arg1, displayer) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, arg1, NULL, NULL, displayer)
-
-#define PHP_INI_ENTRY1(name, default_value, modifyable, on_modify, arg1) \
-       PHP_INI_ENTRY1_EX(name, default_value, modifyable, on_modify, arg1, NULL)
-       
-#define PHP_INI_ENTRY_EX(name, default_value, modifyable, on_modify, displayer) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, NULL, NULL, NULL, displayer)
-
-#define PHP_INI_ENTRY(name, default_value, modifyable, on_modify) \
-       PHP_INI_ENTRY_EX(name, default_value, modifyable, on_modify, NULL)
-
-#ifdef ZTS
-#define STD_PHP_INI_ENTRY(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
-       PHP_INI_ENTRY2(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id)
-#define STD_PHP_INI_ENTRY_EX(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr, displayer) \
-       PHP_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, displayer)
-#define STD_PHP_INI_BOOLEAN(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr##_id, NULL, php_ini_boolean_displayer_cb)
-#else
-#define STD_PHP_INI_ENTRY(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
-       PHP_INI_ENTRY2(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr)
-#define STD_PHP_INI_ENTRY_EX(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr, displayer) \
-       PHP_INI_ENTRY2_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, displayer)
-#define STD_PHP_INI_BOOLEAN(name, default_value, modifyable, on_modify, property_name, struct_type, struct_ptr) \
-       PHP_INI_ENTRY3_EX(name, default_value, modifyable, on_modify, (void *) XtOffsetOf(struct_type, property_name), (void *) &struct_ptr, NULL, php_ini_boolean_displayer_cb)
-#endif
-
-#define INI_INT(name) php_ini_long((name), sizeof(name), 0)
-#define INI_FLT(name) php_ini_double((name), sizeof(name), 0)
-#define INI_STR(name) php_ini_string((name), sizeof(name), 0)
-#define INI_BOOL(name) ((zend_bool) INI_INT(name))
-
-#define INI_ORIG_INT(name)     php_ini_long((name), sizeof(name), 1)
-#define INI_ORIG_FLT(name)     php_ini_double((name), sizeof(name), 1)
-#define INI_ORIG_STR(name)     php_ini_string((name), sizeof(name), 1)
-#define INI_ORIG_BOOL(name) ((zend_bool) INI_ORIG_INT(name))
-
-
-#define REGISTER_INI_ENTRIES() php_register_ini_entries(ini_entries, module_number)
-#define UNREGISTER_INI_ENTRIES() php_unregister_ini_entries(module_number)
-#define DISPLAY_INI_ENTRIES() display_ini_entries(zend_module)
-
-#define REGISTER_INI_DISPLAYER(name, displayer) php_ini_register_displayer((name), sizeof(name), displayer)
-#define REGISTER_INI_BOOLEAN(name) REGISTER_INI_DISPLAYER(name, php_ini_boolean_displayer_cb)
-
-pval *cfg_get_entry(char *name, uint name_length);
-
-PHPAPI int php_atoi(const char *str, int str_len);
-
-/* Standard message handlers */
-PHPAPI PHP_INI_MH(OnUpdateBool);
-PHPAPI PHP_INI_MH(OnUpdateInt);
-PHPAPI PHP_INI_MH(OnUpdateReal);
-PHPAPI PHP_INI_MH(OnUpdateString);
-PHPAPI PHP_INI_MH(OnUpdateStringUnempty);
-
-
-#define PHP_INI_DISPLAY_ORIG   1
-#define PHP_INI_DISPLAY_ACTIVE 2
-
-#define PHP_INI_STAGE_STARTUP          (1<<0)
-#define PHP_INI_STAGE_SHUTDOWN         (1<<1)
-#define PHP_INI_STAGE_ACTIVATE         (1<<2)
-#define PHP_INI_STAGE_DEACTIVATE       (1<<3)
-#define PHP_INI_STAGE_RUNTIME          (1<<4)
+#define php_ini_long   zend_ini_long
+#define php_ini_double zend_ini_double
+#define php_ini_string zend_ini_string
 
 #endif /* PHP_INI_H */
index 8e18fa48f4a268fa9b1b2db8b9d5271ca3fce3e9..b7b3f9ab124eeccd6c346d107138fa798f8a8217 100644 (file)
@@ -559,7 +559,7 @@ php_ns_config(php_ns_context *ctx, char global)
                                } while(*val == ' ');
 
                                Ns_Log(Debug, "PHP configuration option '%s=%s'", new_key, val);
-                               php_alter_ini_entry(new_key, strlen(new_key) + 1, val, 
+                               zend_alter_ini_entry(new_key, strlen(new_key) + 1, val, 
                                                strlen(val) + 1, PHP_INI_SYSTEM, PHP_INI_STAGE_RUNTIME);
                                
                                efree(new_key);
index 09d732dbe6d17b4f39ef48e8aa81f75de9900e3d..eea725287b86e4257ade01d45fa908722087b58a 100644 (file)
@@ -415,7 +415,7 @@ static void init_request_info(SLS_D)
 
 static int php_apache_alter_ini_entries(php_per_dir_entry *per_dir_entry)
 {
-       php_alter_ini_entry(per_dir_entry->key, per_dir_entry->key_length+1, per_dir_entry->value, per_dir_entry->value_length+1, per_dir_entry->type, PHP_INI_STAGE_ACTIVATE);
+       zend_alter_ini_entry(per_dir_entry->key, per_dir_entry->key_length+1, per_dir_entry->value, per_dir_entry->value_length+1, per_dir_entry->type, PHP_INI_STAGE_ACTIVATE);
        return 0;
 }
 
index 0ab579764e9f3699af467aa31f378b4f43984ccc..7734034acab205a0bcd6a801fe52d44bb376dd69 100644 (file)
@@ -409,7 +409,7 @@ static void init_request_info(SLS_D)
 
 static int php_apache_alter_ini_entries(php_per_dir_entry *per_dir_entry)
 {
-       php_alter_ini_entry(per_dir_entry->key, per_dir_entry->key_length+1, per_dir_entry->value, per_dir_entry->value_length+1, per_dir_entry->type, PHP_INI_STAGE_ACTIVATE);
+       zend_alter_ini_entry(per_dir_entry->key, per_dir_entry->key_length+1, per_dir_entry->value, per_dir_entry->value_length+1, per_dir_entry->type, PHP_INI_STAGE_ACTIVATE);
        return 0;
 }
 
index eca4a2463e5ca5828b919bf362ae4107b2541638..4b82cdddd33d18cc8484692dd722eb87bed8e75a 100644 (file)
@@ -94,7 +94,7 @@ void apply_config(void *dummy)
                        zend_hash_move_forward(&d->config)) {
                zend_hash_get_current_data(&d->config, &data);
                fprintf(stderr, "APPLYING (%s)(%s)\n", str, data->value);
-               if (php_alter_ini_entry(str, str_len, data->value, data->value_len + 1, 
+               if (zend_alter_ini_entry(str, str_len, data->value, data->value_len + 1, 
                                data->status, PHP_INI_STAGE_RUNTIME) == FAILURE)
                        fprintf(stderr, "..FAILED\n");
        }
index d3957e06b84931054e8f0ab7a87410f314fb3c9b..24d7b833ef28059d3067fc9b9448e17c95e95d47 100644 (file)
@@ -346,7 +346,7 @@ static void define_command_line_ini_entry(char *arg)
        } else {
                value = "1";
        }
-       php_alter_ini_entry(name, strlen(name), value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
+       zend_alter_ini_entry(name, strlen(name), value, strlen(value), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE);
 }
 
 
index f29de501cf721f5f5ba5647d6442df61a4b4a63f..ac34902af73bc993f1df8e9ae2b3bf7ce7449bb6 100644 (file)
@@ -69,7 +69,7 @@ void UpdateIniFromRegistry(char *path)
                                continue;
                        }
                        /*printf("%s -> %s\n", namebuf, valuebuf);*/
-                       php_alter_ini_entry(namebuf, namebuf_length+1, valuebuf, valuebuf_length+1, PHP_INI_PERDIR, PHP_INI_STAGE_ACTIVATE);
+                       zend_alter_ini_entry(namebuf, namebuf_length+1, valuebuf, valuebuf_length+1, PHP_INI_PERDIR, PHP_INI_STAGE_ACTIVATE);
                }
 
                RegCloseKey(hKey);