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]

Reply via email to