diff options
Diffstat (limited to 'main/php_ini.c')
| -rw-r--r-- | main/php_ini.c | 148 | 
1 files changed, 148 insertions, 0 deletions
| diff --git a/main/php_ini.c b/main/php_ini.c new file mode 100644 index 0000000000..49464fdc99 --- /dev/null +++ b/main/php_ini.c @@ -0,0 +1,148 @@ +#include <stdlib.h> + +#include "php.h" +#include "php_ini.h" +#include "zend_alloc.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(zend_ini_entry *ini_entry) +{ +	if (ini_entry->modified) { +		efree(ini_entry->value); +		ini_entry->value = ini_entry->orig_value; +		ini_entry->value_length = ini_entry->orig_value_length; +		ini_entry->modified = 0; +	} +	return 0; +} + +/* + * Startup / shutdown + */ +int zend_ini_mstartup() +{ +	if (_php3_hash_init(&known_directives, 100, NULL, NULL, 1)==FAILURE) { +		return FAILURE; +	} +	return SUCCESS; +} + + +int zend_ini_mshutdown() +{ +	_php3_hash_destroy(&known_directives); +	return SUCCESS; +} + + +int zend_ini_rshutdown() +{ +	_php3_hash_apply(&known_directives, (int (*)(void *)) zend_restore_ini_entry); +	return SUCCESS; +} + +/* + * Registration / unregistration + */ + +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; +	pval *default_value; + +	while (p->name) { +		p->module_number = module_number; +		if (_php3_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))) { +			hashed_ini_entry->value = default_value->value.str.val; +			hashed_ini_entry->value_length = default_value->value.str.len; +		} +		hashed_ini_entry->modified = 0; +		p++; +	} +	return SUCCESS; +} + + +void zend_unregister_ini_entries(int module_number) +{ +	_php3_hash_apply_with_argument(&known_directives, (int (*)(void *, void *)) zend_remove_ini_entries, (void *) &module_number); +} + +int zend_alter_ini_entry(char *name, uint name_length, char *new_value, uint new_value_length, int modify_type) +{ +	zend_ini_entry *ini_entry; + +	if (_php3_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==FAILURE) { +		return FAILURE; +	} + +	if (!(ini_entry->modifyable & modify_type)) { +		return FAILURE; +	} + +	ini_entry->value = estrndup(new_value, new_value_length); +	ini_entry->value_length = new_value_length; +	ini_entry->modified = 1; + +	return SUCCESS; +} + + +/* + * Data retrieval + */ + +long zend_ini_long(char *name, uint name_length) +{ +	zend_ini_entry *ini_entry; + +	if (_php3_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) { +		return (long) atoi(ini_entry->value); +	} + +	return 0; +} + + +double zend_ini_double(char *name, uint name_length) +{ +	zend_ini_entry *ini_entry; + +	if (_php3_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) { +		return (double) strtod(ini_entry->value, NULL); +	} + +	return 0.0; +} + + +char *zend_ini_string(char *name, uint name_length) +{ +	zend_ini_entry *ini_entry; + +	if (_php3_hash_find(&known_directives, name, name_length, (void **) &ini_entry)==SUCCESS) { +		return ini_entry->value; +	} + +	return ""; +} | 
