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