sniper          Wed Oct  9 22:23:23 2002 EDT

  Modified files:              
    /php4/ext/pfpro     pfpro.c php_pfpro.h 
  Log:
  - Cleaned up some code and used the proper macros for ZTS stuff.
  - Fixed a memleak.
  - Fixed a bug in pfpro_process() when response contains only 2 entries.
    (random garbage added in the end of the value + key sometimes wrong)
  
  # Sorry for including the ws fixes..I got carried away when fixing that bug
  
  
Index: php4/ext/pfpro/pfpro.c
diff -u php4/ext/pfpro/pfpro.c:1.23 php4/ext/pfpro/pfpro.c:1.24
--- php4/ext/pfpro/pfpro.c:1.23 Tue Dec 11 10:30:09 2001
+++ php4/ext/pfpro/pfpro.c      Wed Oct  9 22:23:23 2002
@@ -17,31 +17,26 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: pfpro.c,v 1.23 2001/12/11 15:30:09 sebastian Exp $ */
-
-/* {{{ includes */
+/* $Id: pfpro.c,v 1.24 2002/10/10 02:23:23 sniper Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include "php.h"
-#include "php_ini.h"
 #include "php_pfpro.h"
 
-#include "pfpro.h"
-
 #if HAVE_PFPRO
 
+/* {{{ includes */
+#include "php_ini.h"
+#include "ext/standard/info.h"
 #include "ext/standard/php_string.h"
+#include <pfpro.h>
 /* }}} */
 
 /* {{{ zts */
-#ifdef ZTS
-int pfpro_globals_id;
-#else
-php_pfpro_globals pfpro_globals;
-#endif
+ZEND_DECLARE_MODULE_GLOBALS(pfpro)
 /* }}} */
 
 /* {{{ Function table */
@@ -65,7 +60,7 @@
        PHP_RINIT(pfpro),                                       /* request start */
        PHP_RSHUTDOWN(pfpro),                           /* request end */
        PHP_MINFO(pfpro),
-    NO_VERSION_YET,
+       NO_VERSION_YET,
        STANDARD_MODULE_PROPERTIES
 };
 /* }}} */
@@ -78,24 +73,33 @@
 
 /* {{{ initialization defaults */
 PHP_INI_BEGIN()
-#if PFPRO_VERSION < 3
-       STD_PHP_INI_ENTRY("pfpro.defaulthost",          "test.signio.com",
-       PHP_INI_ALL, OnUpdateString,    defaulthost, php_pfpro_globals, pfpro_globals) 
-#else
-       STD_PHP_INI_ENTRY("pfpro.defaulthost",          "test-payflow.verisign.com",
-       PHP_INI_ALL, OnUpdateString,    defaulthost, php_pfpro_globals, pfpro_globals)
-#endif
-       STD_PHP_INI_ENTRY("pfpro.defaultport",                  "443",                 
 PHP_INI_ALL, OnUpdateInt,               defaultport,                    
php_pfpro_globals,      pfpro_globals)
-       STD_PHP_INI_ENTRY("pfpro.defaulttimeout",               "30",                  
 PHP_INI_ALL, OnUpdateInt,               defaulttimeout,                 
php_pfpro_globals,      pfpro_globals)
-       STD_PHP_INI_ENTRY("pfpro.proxyaddress",                 "",                    
         PHP_INI_ALL, OnUpdateString,    proxyaddress,                   
php_pfpro_globals,      pfpro_globals)
-       STD_PHP_INI_ENTRY("pfpro.proxyport",                    "",                    
         PHP_INI_ALL, OnUpdateInt,               proxyport,                      
php_pfpro_globals,      pfpro_globals)
-       STD_PHP_INI_ENTRY("pfpro.proxylogon",                   "",                    
         PHP_INI_ALL, OnUpdateString,    proxylogon,                     
php_pfpro_globals,      pfpro_globals)
-       STD_PHP_INI_ENTRY("pfpro.proxypassword",                "",                    
         PHP_INI_ALL, OnUpdateString,    proxypassword,                  
php_pfpro_globals,      pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.defaulthost",    "test-payflow.verisign.com", 
+PHP_INI_ALL, OnUpdateString,     defaulthost, zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.defaultport",    "443", PHP_INI_ALL, OnUpdateInt,    
+defaultport,    zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.defaulttimeout", "30",  PHP_INI_ALL, OnUpdateInt,    
+defaulttimeout, zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.proxyaddress",   "",    PHP_INI_ALL, OnUpdateString, 
+proxyaddress,   zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.proxyport",      "",    PHP_INI_ALL, OnUpdateInt,    
+proxyport,      zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.proxylogon",     "",    PHP_INI_ALL, OnUpdateString, 
+proxylogon,     zend_pfpro_globals, pfpro_globals)
+       STD_PHP_INI_ENTRY("pfpro.proxypassword",  "",    PHP_INI_ALL, OnUpdateString, 
+proxypassword,  zend_pfpro_globals, pfpro_globals)
 PHP_INI_END()
 
+/* {{{ php_extname_init_globals
+ */
+static void php_pfpro_init_globals(zend_pfpro_globals *pfpro_globals)
+{
+       pfpro_globals->initialized    = 0;
+       pfpro_globals->defaulthost    = NULL;
+       pfpro_globals->defaultport    = 0;
+       pfpro_globals->defaulttimeout = 0;
+       pfpro_globals->proxyaddress   = NULL;
+       pfpro_globals->proxyport      = 0;
+       pfpro_globals->proxylogon     = NULL;
+       pfpro_globals->proxypassword  = NULL;
+}
+/* }}} */
 
 PHP_MINIT_FUNCTION(pfpro)
 {
+       ZEND_INIT_MODULE_GLOBALS(pfpro, php_pfpro_init_globals, NULL);
        REGISTER_INI_ENTRIES();
        return SUCCESS;
 }
@@ -110,7 +114,7 @@
 {
        PFPROG(initialized) = 0;
 
-    return SUCCESS;
+       return SUCCESS;
 }
 
 PHP_RSHUTDOWN_FUNCTION(pfpro)
@@ -119,7 +123,7 @@
                pfproCleanup();
        }
 
-    return SUCCESS;
+       return SUCCESS;
 }
 /* }}} */
 
@@ -127,7 +131,7 @@
 PHP_MINFO_FUNCTION(pfpro)
 {
        php_info_print_table_start();
-       php_info_print_table_header(2, "Verisign Payflow Pro support", "enabled");
+       php_info_print_table_row(2, "Verisign Payflow Pro support", "enabled");
        php_info_print_table_row(2, "libpfpro version", pfproVersion());
        php_info_print_table_end();
 
@@ -184,7 +188,6 @@
 PHP_FUNCTION(pfpro_process_raw)
 {
        zval ***args;
-
        char *parmlist = NULL;
        char *address = NULL;
        int port = PFPROG(defaultport);
@@ -193,9 +196,7 @@
        int proxyPort = PFPROG(proxyport);
        char *proxyLogon = PFPROG(proxylogon);
        char *proxyPassword = PFPROG(proxypassword);
-
        int freeaddress = 0;
-
 #if PFPRO_VERSION < 3
        char response[512] = "";
 #else
@@ -210,7 +211,7 @@
        args = (zval ***) emalloc(sizeof(zval **) * ZEND_NUM_ARGS());
 
        if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) {
-        php_error(E_WARNING, "Unable to read parameters in pfpro_process_raw()");
+               php_error(E_WARNING, "Unable to read parameters in 
+pfpro_process_raw()");
                efree(args);
                RETURN_FALSE;
        }
@@ -256,8 +257,6 @@
 
        efree(args);
 
-       /* Default to signio's test server */
-
        if (address == NULL) {
                address = estrdup(PFPROG(defaulthost));
                freeaddress = 1;
@@ -298,13 +297,11 @@
 PHP_FUNCTION(pfpro_process)
 {
        zval ***args;
-
        HashTable *target_hash;
        ulong num_key;
        char *string_key;
        zval **entry;
        int pass;
-
        char *parmlist = NULL;
        char *address = NULL;
        int port = PFPROG(defaultport);
@@ -313,23 +310,16 @@
        int proxyPort = PFPROG(proxyport);
        char *proxyLogon = PFPROG(proxylogon);
        char *proxyPassword = PFPROG(proxypassword);
-
        int parmlength = 0;
        int freeaddress = 0;
-
 #if PFPRO_VERSION < 3
        char response[512] = "";
 #else
        int context;
        char *response;
 #endif
-
        char tmpbuf[128];
-
-    char buf[128], sbuf[128];
-    char *p1, *p2, *p_end,          /* Pointers for string manipulation */
-        *sp1, *sp2,
-        *pdelim1="&", *pdelim2="=";
+       char *var,*val,*strtok_buf=NULL; /* Pointers for string manipulation */
 
        if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 8) {
                WRONG_PARAM_COUNT;
@@ -338,7 +328,7 @@
        args = (zval ***) emalloc(sizeof(zval **) * ZEND_NUM_ARGS());
 
        if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) {
-        php_error(E_ERROR, "Unable to read parameters in pfpro_process()");
+               php_error(E_ERROR, "Unable to read parameters in pfpro_process()");
                efree(args);
                RETURN_FALSE;
        }
@@ -420,7 +410,7 @@
 
                                case HASH_KEY_IS_LONG:
 
-                                       sprintf(tmpbuf, "%d", num_key);
+                                       sprintf(tmpbuf, "%ld", num_key);
                                        if (pass == 1)
                                                strcpy(parmlist + parmlength, tmpbuf);
                                        parmlength += strlen(tmpbuf);
@@ -442,8 +432,7 @@
                                                if (pass == 1)
                                                        strcpy(parmlist + parmlength, 
tmpbuf);
                                                parmlength += strlen(tmpbuf);
-                                       }
-                                       else {
+                                       } else {
                                                if (pass == 1)
                                                        strcpy(parmlist + parmlength, 
"=");
                                                parmlength += 1;
@@ -456,7 +445,7 @@
                                        break;
 
                                case IS_LONG:
-                                       sprintf(tmpbuf, "=%d", Z_LVAL_PP(entry));
+                                       sprintf(tmpbuf, "=%ld", Z_LVAL_PP(entry));
                                        if (pass == 1)
                                                strcpy(parmlist + parmlength, tmpbuf);
                                        parmlength += strlen(tmpbuf);
@@ -486,10 +475,7 @@
 
        efree(args);
 
-       /* Default to signio's test server */
-
        if (address == NULL) {
-               /* is it safe to just do address = "test.signio.com"; here? */
                address = estrdup(PFPROG(defaulthost));
                freeaddress = 1;
        }
@@ -528,63 +514,23 @@
                efree(address);
        }
 
+       if (pass) {
+               efree(parmlist);
+       }
 
-       /* This final chunk of code is to walk the string returned by Signio
-          and build a string array to return to the user */
-
-       /* John, I suspect this code will fall over if there are less than
-          3 items in the response string -- david */
-
-       /* Clean our str[n]cpy buffers */
-       memset(buf, 0, sizeof(buf));
-       memset(sbuf, 0, sizeof(sbuf));
-
-       p_end = response + strlen(response);
-       p1 = response;
-       p2 = (char*)php_memnstr(response, pdelim1, 1, p_end);
-
-       sp1 = (char*)php_memnstr(response, pdelim2, 1, p2);
-       strncpy(buf, p1, sp1-p1);
-
-       sp1++;
-       strncpy(sbuf, sp1, p2-sp1);
-
-       add_assoc_string(return_value, &buf[0], &sbuf[0], 1);
-
-       do {
-               memset(buf, 0, sizeof(buf));
-               memset(sbuf, 0, sizeof(sbuf));
-
-               p1 = p2+1;
-
-               if ((sp2 = (char*)php_memnstr(p1, pdelim1, 1, p_end)) != NULL) {
-                       sp1 = (char*)php_memnstr(p1, pdelim2, 1, sp2);
-                       strncpy(buf, p1, sp1-p1);
-
-                       sp1++;
-
-                       strncpy(sbuf, sp1, sp2-sp1);
-
-                       add_assoc_string(return_value, &buf[0], &sbuf[0], 1);
+       /* This final chunk of code is to walk the returned string
+        * and build the return array to the user.
+     */
+       var = php_strtok_r(response, "&", &strtok_buf);
+
+       while (var) {
+               val = strchr(var, '=');
+               if (val) { /* have a value */
+                       *val++ = '\0';
+                       add_assoc_string(return_value, var, val, 1);
                }
-
-
-       } while ((p2 = (char*)php_memnstr(p1, pdelim1, 1, p_end)) != NULL);
-
-       if (p1 <= p_end) {
-               memset(buf, 0, sizeof(buf));
-               memset(sbuf, 0, sizeof(sbuf));
-
-               sp1 = (char*)php_memnstr(p1, pdelim2, 1, p_end);
-               strncpy(buf, p1, sp1-p1);
-
-               sp1++;
-               strncpy(sbuf, sp1, p_end-sp1);
-
-               add_assoc_string(return_value, &buf[0], &sbuf[0], 1);
+               var = php_strtok_r(NULL, "&", &strtok_buf);
        }
-
-
 }
 /* }}} */
 
Index: php4/ext/pfpro/php_pfpro.h
diff -u php4/ext/pfpro/php_pfpro.h:1.11 php4/ext/pfpro/php_pfpro.h:1.12
--- php4/ext/pfpro/php_pfpro.h:1.11     Tue Dec 11 10:30:10 2001
+++ php4/ext/pfpro/php_pfpro.h  Wed Oct  9 22:23:23 2002
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_pfpro.h,v 1.11 2001/12/11 15:30:10 sebastian Exp $ */
+/* $Id: php_pfpro.h,v 1.12 2002/10/10 02:23:23 sniper Exp $ */
 
 #ifndef PHP_PFPRO_H
 #define PHP_PFPRO_H
@@ -51,8 +51,7 @@
 PHP_FUNCTION(pfpro_process_raw);        /* Raw transaction processing */
 PHP_FUNCTION(pfpro_process);            /* Transaction processing     */
 
-typedef struct {
-       int le_pfpro;
+ZEND_BEGIN_MODULE_GLOBALS(pfpro)
        int initialized;
        char *defaulthost;
        int defaultport;
@@ -61,10 +60,10 @@
        int proxyport;
        char *proxylogon;
        char *proxypassword;
-} php_pfpro_globals;
+ZEND_END_MODULE_GLOBALS(pfpro)
 
 #ifdef ZTS
-#define PFPROG(v) TSRMG(pfpro_globals_id, php_pfpro_globals *, v)
+#define PFPROG(v) TSRMG(pfpro_globals_id, zend_pfpro_globals *, v)
 #else
 #define PFPROG(v) (pfpro_globals.v)
 #endif

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to