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