diff options
author | Fredrik Öhrn <ohrn@php.net> | 2001-03-18 22:16:47 +0000 |
---|---|---|
committer | Fredrik Öhrn <ohrn@php.net> | 2001-03-18 22:16:47 +0000 |
commit | 87138d68cd2ce2feeef437fb8a5416fde8232988 (patch) | |
tree | 52022de7bb40db6bda09dbae3107b32bb54d82bf /ext/yp | |
parent | 00d81acc4f87931f9a071434b46b78791d4a482d (diff) | |
download | php-git-87138d68cd2ce2feeef437fb8a5416fde8232988.tar.gz |
Much needed cleanup and new functions added
-------------------------------------------
Cleaned up stringhandling for binary safeness.
All functions now maintain a global 'errno' variable.
All functions now print warning messages on failure.
Added error code constants.
Fixed bug #8041 while maintaining backward compatibility.
New functions:
yp_all traverse a map
yp_cat retrive an entire map in one go
yp_errno get last error code
yp_err_string get a human readable error message
Diffstat (limited to 'ext/yp')
-rw-r--r-- | ext/yp/CREDITS | 2 | ||||
-rw-r--r-- | ext/yp/php_yp.h | 33 | ||||
-rw-r--r-- | ext/yp/yp.c | 241 |
3 files changed, 258 insertions, 18 deletions
diff --git a/ext/yp/CREDITS b/ext/yp/CREDITS index e6cdb43d95..4c52145877 100644 --- a/ext/yp/CREDITS +++ b/ext/yp/CREDITS @@ -1,2 +1,2 @@ Yellow Pages -Stephanie Wehner +Stephanie Wehner, Fredrik Ohrn diff --git a/ext/yp/php_yp.h b/ext/yp/php_yp.h index c3723d2f99..0b6d7bbad1 100644 --- a/ext/yp/php_yp.h +++ b/ext/yp/php_yp.h @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Stephanie Wehner <_@r4k.net> | + | Fredrik Ohrn | +----------------------------------------------------------------------+ */ @@ -23,6 +24,12 @@ #if HAVE_YP +#ifdef PHP_WIN32 +#define PHP_YP_API __declspec(dllexport) +#else +#define PHP_YP_API +#endif + extern zend_module_entry yp_module_entry; #define yp_module_ptr &yp_module_entry @@ -33,8 +40,34 @@ PHP_FUNCTION(yp_master); PHP_FUNCTION(yp_match); PHP_FUNCTION(yp_first); PHP_FUNCTION(yp_next); +PHP_FUNCTION(yp_all); +PHP_FUNCTION(yp_cat); +PHP_FUNCTION(yp_errno); +PHP_FUNCTION(yp_err_string); +PHP_MINIT_FUNCTION(yp); +PHP_RINIT_FUNCTION(yp); PHP_MINFO_FUNCTION(yp); +typedef struct { + int error; +} php_yp_globals; + +#ifdef ZTS +#define YPLS_D php_yp_globals *yp_globals +#define YPLS_DC , YPLS_D +#define YPLS_C yp_globals +#define YPLS_CC , YPLS_C +#define YP(v) (yp_globals->v) +#define YPLS_FETCH() php_yp_globals *yp_globals = ts_resource(yp_globals_id) +#else +#define YPLS_D +#define YPLS_DC +#define YPLS_C +#define YPLS_CC +#define YP(v) (yp_globals.v) +#define YPLS_FETCH() +#endif + #else #define yp_module_ptr NULL diff --git a/ext/yp/yp.c b/ext/yp/yp.c index 49b7272015..bbed3ef273 100644 --- a/ext/yp/yp.c +++ b/ext/yp/yp.c @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Stephanie Wehner <_@r4k.net> | + | Fredrik Ohrn | +----------------------------------------------------------------------+ */ /* $Id$ */ @@ -26,6 +27,16 @@ #include <rpcsvc/ypclnt.h> +/* {{{ thread safety stuff */ + +#ifdef ZTS +int yp_globals_id; +#else +PHP_YP_API php_yp_globals yp_globals; +#endif + +/* }}} */ + function_entry yp_functions[] = { PHP_FE(yp_get_default_domain, NULL) PHP_FE(yp_order, NULL) @@ -33,15 +44,19 @@ function_entry yp_functions[] = { PHP_FE(yp_match, NULL) PHP_FE(yp_first, NULL) PHP_FE(yp_next, NULL) + PHP_FE(yp_all, NULL) + PHP_FE(yp_cat, NULL) + PHP_FE(yp_errno, NULL) + PHP_FE(yp_err_string, NULL) {NULL, NULL, NULL} }; zend_module_entry yp_module_entry = { "yp", yp_functions, + PHP_MINIT(yp), NULL, - NULL, - NULL, + PHP_RINIT(yp), NULL, PHP_MINFO(yp), STANDARD_MODULE_PROPERTIES @@ -55,8 +70,10 @@ ZEND_GET_MODULE(yp) Returns the domain or false */ PHP_FUNCTION(yp_get_default_domain) { char *outdomain; + YPLS_FETCH(); - if(yp_get_default_domain(&outdomain)) { + if(YP(error) = yp_get_default_domain(&outdomain)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } RETVAL_STRING(outdomain,1); @@ -71,9 +88,11 @@ PHP_FUNCTION(yp_order) { #if SOLARIS_YP unsigned long outval; #else - int outval; + int outval; #endif + YPLS_FETCH(); + if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) { WRONG_PARAM_COUNT; } @@ -81,7 +100,8 @@ PHP_FUNCTION(yp_order) { convert_to_string_ex(domain); convert_to_string_ex(map); - if(yp_order((*domain)->value.str.val,(*map)->value.str.val,&outval)) { + if(YP(error) = yp_order(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outval)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } @@ -94,6 +114,7 @@ PHP_FUNCTION(yp_order) { PHP_FUNCTION(yp_master) { pval **domain, **map; char *outname; + YPLS_FETCH(); if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) { WRONG_PARAM_COUNT; @@ -102,7 +123,8 @@ PHP_FUNCTION(yp_master) { convert_to_string_ex(domain); convert_to_string_ex(map); - if(yp_master((*domain)->value.str.val,(*map)->value.str.val,&outname)) { + if(YP(error) = yp_master(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outname)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } @@ -116,6 +138,7 @@ PHP_FUNCTION(yp_match) { pval **domain, **map, **key; char *outval; int outvallen; + YPLS_FETCH(); if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&key) == FAILURE) { WRONG_PARAM_COUNT; @@ -125,20 +148,22 @@ PHP_FUNCTION(yp_match) { convert_to_string_ex(map); convert_to_string_ex(key); - if(yp_match((*domain)->value.str.val,(*map)->value.str.val,(*key)->value.str.val,(*key)->value.str.len,&outval,&outvallen)) { + if(YP(error) = yp_match(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), Z_STRVAL_PP (key), Z_STRLEN_PP (key), &outval, &outvallen)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } - RETVAL_STRING(outval,1); + RETVAL_STRINGL(outval,outvallen,1); } /* }}} */ /* {{{ proto array yp_first(string domain, string map) - Returns the first key as $var["key"] and the first line as $var["value"] */ + Returns the first key as array with $var[$key] and the the line as the value */ PHP_FUNCTION(yp_first) { pval **domain, **map; char *outval, *outkey; int outvallen, outkeylen; + YPLS_FETCH(); if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) { WRONG_PARAM_COUNT; @@ -147,12 +172,16 @@ PHP_FUNCTION(yp_first) { convert_to_string_ex(domain); convert_to_string_ex(map); - if(yp_first((*domain)->value.str.val,(*map)->value.str.val,&outkey,&outkeylen,&outval,&outvallen)) { + if(YP(error) = yp_first(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outkey, &outkeylen, &outval, &outvallen)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } array_init(return_value); - add_assoc_string(return_value,"key",outkey,1); - add_assoc_string(return_value,"value",outval,1); + add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1); + + /* Deprecated */ + add_assoc_stringl(return_value,"key",outkey,outkeylen,1); + add_assoc_stringl(return_value,"value",outval,outvallen,1); } /* }}} */ @@ -162,6 +191,7 @@ PHP_FUNCTION(yp_next) { pval **domain, **map, **key; char *outval, *outkey; int outvallen, outkeylen; + YPLS_FETCH(); if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&key) == FAILURE) { WRONG_PARAM_COUNT; @@ -171,18 +201,195 @@ PHP_FUNCTION(yp_next) { convert_to_string_ex(map); convert_to_string_ex(key); - if(yp_next((*domain)->value.str.val,(*map)->value.str.val,(*key)->value.str.val,(*key)->value.str.len,&outkey,&outkeylen,&outval,&outvallen)) { + if(YP(error) = yp_next(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), Z_STRVAL_PP (key), Z_STRLEN_PP (key), &outkey, &outkeylen, &outval, &outvallen)) { + php_error(E_WARNING, yperr_string (YP(error))); RETURN_FALSE; } array_init(return_value); - add_assoc_string(return_value,outkey,outval,1); + add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1); +} +/* }}} */ + +static int php_foreach_all (int instatus, char *inkey, int inkeylen, char *inval, int invallen, char *indata) +{ + int r; + + zval *status, *key, *value; + zval **args [3] = { &status, &key, &value }; + zval *retval; + + MAKE_STD_ZVAL (status); + ZVAL_LONG (status, ypprot_err (instatus)); + + MAKE_STD_ZVAL (key); + ZVAL_STRINGL (key, inkey, inkeylen, 1); + + MAKE_STD_ZVAL (value); + ZVAL_STRINGL (value, inval, invallen, 1); + + CLS_FETCH(); + + if(call_user_function_ex(CG(function_table), NULL, *((zval **)indata), &retval, 3, args, 0, NULL) != SUCCESS) + { + zend_error(E_ERROR, "Function call failed"); + return 1; + } + + convert_to_long_ex(&retval); + r = Z_LVAL_P (retval); + + zval_ptr_dtor(&retval); + + zval_ptr_dtor(&status); + zval_ptr_dtor(&key); + zval_ptr_dtor(&value); + + return r; +} + +/* {{{ proto void yp_all(string domain, string map, string callback) + Traverse the map and call a function on each entry */ +PHP_FUNCTION(yp_all) { + pval **domain, **map, **php_callback; + struct ypall_callback callback; + + if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&php_callback) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(domain); + convert_to_string_ex(map); + + callback.foreach = php_foreach_all; + callback.data = (char *) php_callback; + + yp_all(Z_STRVAL_PP(domain),Z_STRVAL_PP(map),&callback); + + RETURN_FALSE; +} +/* }}} */ + +static int php_foreach_cat (int instatus, char *inkey, int inkeylen, char *inval, int invallen, char *indata) +{ + int err; + + err = ypprot_err (instatus); + + if (!err) + { + if (inkeylen) + add_assoc_stringl_ex((zval *) indata,inkey,inkeylen,inval,invallen,1); + + return 0; + } + + if (err != YPERR_NOMORE) + { + YPLS_FETCH(); + YP(error) = err; + php_error(E_WARNING, yperr_string (err)); + } + + return 0; +} + +/* {{{ proto array yp_cat(string domain, string map) + Return an array containing the entire map */ +PHP_FUNCTION(yp_cat) { + pval **domain, **map; + struct ypall_callback callback; + + if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(domain); + convert_to_string_ex(map); + + array_init(return_value); + + callback.foreach = php_foreach_cat; + callback.data = (char *) return_value; + + yp_all(Z_STRVAL_PP(domain),Z_STRVAL_PP(map),&callback); } /* }}} */ +/* {{{ proto int yp_errno() + Returns the error code from the last call or 0 if no error occured */ +PHP_FUNCTION(yp_errno) { + YPLS_FETCH(); + + if((ZEND_NUM_ARGS() != 0)) { + WRONG_PARAM_COUNT; + } + + RETURN_LONG (YP(error)); +} +/* }}} */ + +/* {{{ proto string yp_err_string(int errorcode) + Returns the corresponding error string for the given error code */ +PHP_FUNCTION(yp_err_string) { + pval **error; + char *string; + + if((ZEND_NUM_ARGS() != 1) || zend_get_parameters_ex(1,&error) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(error); + + if((string = yperr_string(Z_LVAL_PP(error))) == NULL) { + RETURN_FALSE; + } + + RETVAL_STRING(string,1); +} +/* }}} */ + +static void php_yp_init_globals(YPLS_D) +{ + YP(error) = 0; +} + +PHP_MINIT_FUNCTION(yp) +{ +#ifdef ZTS + yp_globals_id = ts_allocate_id(sizeof(php_yp_globals), (ts_allocate_ctor) php_yp_init_globals, NULL); +#else + php_yp_init_globals(YPLS_C); +#endif + + REGISTER_LONG_CONSTANT("YPERR_BADARGS", YPERR_BADARGS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_BADDB", YPERR_BADDB, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_BUSY", YPERR_BUSY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_DOMAIN", YPERR_DOMAIN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_KEY", YPERR_KEY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_MAP", YPERR_MAP, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_NODOM", YPERR_NODOM, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_NOMORE", YPERR_NOMORE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_PMAP", YPERR_PMAP, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_RESRC", YPERR_RESRC, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_RPC", YPERR_RPC, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_YPBIND", YPERR_YPBIND, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_YPERR", YPERR_YPERR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_YPSERV", YPERR_YPSERV, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("YPERR_VERS", YPERR_VERS, CONST_CS | CONST_PERSISTENT); + + return SUCCESS; +} + +PHP_RINIT_FUNCTION(yp) +{ + YPLS_FETCH(); + YP(error) = 0; +} + PHP_MINFO_FUNCTION(yp) { - php_info_print_table_start(); - php_info_print_table_row(2, "YP Support", "enabled"); - php_info_print_table_end(); + php_info_print_table_start(); + php_info_print_table_row(2, "YP Support", "enabled"); + php_info_print_table_end(); } #endif /* HAVE_YP */ |