ohrn Sun Mar 18 14:16:46 2001 EDT Modified files: /php4/ext/yp CREDITS php_yp.h yp.c Log: 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
Index: php4/ext/yp/CREDITS diff -u php4/ext/yp/CREDITS:1.1 php4/ext/yp/CREDITS:1.2 --- php4/ext/yp/CREDITS:1.1 Mon Nov 20 02:31:40 2000 +++ php4/ext/yp/CREDITS Sun Mar 18 14:16:46 2001 @@ -1,2 +1,2 @@ Yellow Pages -Stephanie Wehner +Stephanie Wehner, Fredrik Ohrn Index: php4/ext/yp/php_yp.h diff -u php4/ext/yp/php_yp.h:1.8 php4/ext/yp/php_yp.h:1.9 --- php4/ext/yp/php_yp.h:1.8 Sun Feb 25 22:07:30 2001 +++ php4/ext/yp/php_yp.h Sun Mar 18 14:16:46 2001 @@ -13,16 +13,23 @@ | [EMAIL PROTECTED] so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Stephanie Wehner <[EMAIL PROTECTED]> | + | Fredrik Ohrn | +----------------------------------------------------------------------+ */ -/* $Id: php_yp.h,v 1.8 2001/02/26 06:07:30 andi Exp $ */ +/* $Id: php_yp.h,v 1.9 2001/03/18 22:16:46 ohrn Exp $ */ #ifndef PHP_YP_H #define PHP_YP_H #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,7 +40,33 @@ 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 Index: php4/ext/yp/yp.c diff -u php4/ext/yp/yp.c:1.15 php4/ext/yp/yp.c:1.16 --- php4/ext/yp/yp.c:1.15 Sun Feb 25 22:07:30 2001 +++ php4/ext/yp/yp.c Sun Mar 18 14:16:46 2001 @@ -13,9 +13,10 @@ | [EMAIL PROTECTED] so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Stephanie Wehner <[EMAIL PROTECTED]> | + | Fredrik Ohrn | +----------------------------------------------------------------------+ */ -/* $Id: yp.c,v 1.15 2001/02/26 06:07:30 andi Exp $ */ +/* $Id: yp.c,v 1.16 2001/03/18 22:16:46 ohrn Exp $ */ #include "php.h" #include "ext/standard/info.h" @@ -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,16 +44,20 @@ 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, + PHP_RINIT(yp), NULL, - NULL, - NULL, PHP_MINFO(yp), STANDARD_MODULE_PROPERTIES }; @@ -55,8 +70,10 @@ 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 @@ #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 @@ 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_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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]