diff options
author | Brendan W. McAdams <bmcadams@php.net> | 2000-08-08 22:36:56 +0000 |
---|---|---|
committer | Brendan W. McAdams <bmcadams@php.net> | 2000-08-08 22:36:56 +0000 |
commit | f3b757eeada296b30626f63c553e529b62dd4683 (patch) | |
tree | 5f1a102d1d1e57c21c731bea259b0b1dca170785 /ext/ccvs | |
parent | 472c727186dad9a283c384e7b8146f370708411b (diff) | |
download | php-git-f3b757eeada296b30626f63c553e529b62dd4683.tar.gz |
First commit of these files. We have had them working for about 3 weeks, very well, as a DL. The straight compile-into PHP support should work fine; I've got it compiling on my Slackware 7 i386 box with Apache 1.3.12 + mod_ssl. Documentation, module info and example code are forthcoming.
Diffstat (limited to 'ext/ccvs')
-rw-r--r-- | ext/ccvs/Makefile.in | 6 | ||||
-rw-r--r-- | ext/ccvs/ccvs.c | 469 | ||||
-rw-r--r-- | ext/ccvs/ccvs.h | 124 | ||||
-rw-r--r-- | ext/ccvs/config.m4 | 25 |
4 files changed, 624 insertions, 0 deletions
diff --git a/ext/ccvs/Makefile.in b/ext/ccvs/Makefile.in new file mode 100644 index 0000000000..441ef6e603 --- /dev/null +++ b/ext/ccvs/Makefile.in @@ -0,0 +1,6 @@ +# $Id$ + +LTLIBRARY_NAME = libccvs.la +LTLIBRARY_SOURCES = ccvs.c + +include $(top_srcdir)/build/dynlib.mk diff --git a/ext/ccvs/ccvs.c b/ext/ccvs/ccvs.c new file mode 100644 index 0000000000..31e9a7d028 --- /dev/null +++ b/ext/ccvs/ccvs.c @@ -0,0 +1,469 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Brendan W. McAdams <brendan@plexmedia.com> | + | Doug DeJulio <ddj@redhat.com> | + +----------------------------------------------------------------------+ + */ +/* +* cvvs.c $Revision$ - PHP4 Interface to the RedHat CCVS API +* ------- +* Interfaces RedHat's CCVS [Credit Card Verification System] <http://www.redhat.com/products/ccvs/> +* This code is ported from an original php3 interface written by RedHat's Doug DeJulio <ddj@redhat.com> +* The code was subsequently ported to the Zend API by Brendan W. McAdams <brendan@plexmedia.com> +* ------- +*/ + +/* +* Code started on 2000.07.24@09.04.EST by Brendan W. McAdams <brendan@plexmedia.com> +* $Revision$ +*/ + +static char const cvsid[] = "$Id$"; + +#include <php.h> +#include <stdlib.h> +#include <string.h> +#include <ccvs.h> + +/* Full Functions (The actual CCVS functions and any internal php hooked functions such as MINFO) */ + +ZEND_FUNCTION(ccvs_init) /* cv_init() */ +{ + zval **name; + void *vsess; + char *p; + + if ((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, &name) != SUCCESS)) + /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(name); + + vsess = cv_init((*name)->value.str.val); + + /* + * -- In the case that we don't run error checking on the return value... -- + * On 32 bit systems a failure of the cv_init call returns 0,0,0,0 ; on 64 bit systems its 0,0,0,0,0,0,0,0 + * This unconsistent error (not to mention a string of comma seperated zeros in and of itself) is hard to + * Trap for in PHP (or any language). However, we can also grab cv_init to return CV_SESS_BAD on + * failure at the C API level, and return a set, fixed error code to the user which the user then knows to + * trap for... e.g. a NULL Value which PHP can then trap by: + * if (!($string = cv_init($config)) { or some such... + */ + + if (vsess == CV_SESS_BAD) /* if the cv_init() call failed... */ + { + + p = ""; /* set p, the value we will return, to NULL */ + + } + else /* we got a valid session returned, which means it worked */ + { + + p = hks_ptr_ptrtostring(vsess); /* Convert the (void*) into a string representation. */ + + } + + RETVAL_STRING(p, 1); + + free(p); + return; +} + +ZEND_FUNCTION(ccvs_done) /* cv_done() */ +{ + zval **sess; + void *vsess; + + if ((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, &sess) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(sess); + + /* Convert from the string representation back to a (void*) */ + vsess = hks_ptr_stringtoptr((*sess)->value.str.val); + cv_done(vsess); + + RETURN_STRING("OK", 1); +} + +ZEND_FUNCTION(ccvs_new) /* cv_new() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + + r = cv_new(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_add) /* cv_add() */ +{ + zval **psess; + zval **pinvoice; + zval **pargtype; + zval **pargval; + void *sess; + char *invoice; + int argtype; + char *argval; + register int r; + + if ((ZEND_NUM_ARGS() != 4) || (zend_get_parameters_ex(4, &psess, &pinvoice, &pargtype, &pargval) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + /* Get meaningful arguments. */ + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + convert_to_string_ex(pargtype); + convert_to_string_ex(pargval); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + invoice = (*pinvoice)->value.str.val; + argtype = cv_str2arg((*pargtype)->value.str.val); + argval = (*pargval)->value.str.val; + + r = cv_add(sess, invoice, argtype, argval); + + RETURN_STRING(cv_ret2str(r), 1); +} + +/* +* cv_create can't be implemented because of vararg limits in PHP3's C API. +* (COMMENT BY DDJ [from original code]) +* +* BWM: I looked into this, checking in on what cv_create was; it is a deprecated function left in for +* backwards compatibility according +* to the CCVS C API ref. I didn't try to implement it for that reason. If anyone needs it, they can add it in +* themselves I'm sure. +*/ +ZEND_FUNCTION(ccvs_delete) /* cv_delete() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_delete(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_auth) /* cv_auth() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_auth(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_return) /* cv_return() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_return(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_reverse) /* cv_reverse() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_reverse(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_sale) /* cv_sale() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(ht, 2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_sale(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_void) /* cv_void() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_void(sess, invoice); + + RETURN_STRING(cv_ret2str(r), 1); +} + +ZEND_FUNCTION(ccvs_status) /* cv_status() */ +{ + zval **psess; + zval **pinvoice; + void *sess; + char *invoice; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &pinvoice) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(pinvoice); + invoice = (*pinvoice)->value.str.val; + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_status(sess, invoice); + + RETURN_STRING(cv_stat2str(r), 1); +} + +ZEND_FUNCTION(ccvs_count) /* cv_count() */ +{ + zval **psess; + zval **ptype; + void *sess; + int type; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &ptype) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + convert_to_string_ex(ptype); + type = cv_str2stat((*ptype)->value.str.val); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + r = cv_count(sess, type); + + RETURN_LONG(r); +} + +ZEND_FUNCTION(ccvs_lookup) /* cv_lookup() */ +{ + zval **psess; + zval **ptype; + zval **pinum; + void *sess; + int type; + long inum; + register int r; + + if ((ZEND_NUM_ARGS() != 3) || (zend_get_parameters_ex(3, &psess, &ptype, &pinum) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + convert_to_string_ex(ptype); + type = cv_str2stat((*ptype)->value.str.val); + convert_to_long_ex(pinum); + inum = (*pinum)->value.lval; + + r = cv_lookup(sess, type, inum); + + RETURN_STRING(cv_textvalue(sess), 1); +} + +ZEND_FUNCTION(ccvs_report) /* cv_report() */ +{ + zval **psess; + zval **ptype; + void *sess; + int type; + long inum; + register int r; + + if ((ZEND_NUM_ARGS() != 2) || (zend_get_parameters_ex(2, &psess, &ptype) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + convert_to_string_ex(ptype); + type = cv_str2rep((*ptype)->value.str.val); + + r = cv_report(sess, type); + + RETURN_STRING(cv_stat2str(r), 1); +} + +ZEND_FUNCTION(ccvs_command) /* cv_command() */ +{ + zval **psess; + zval **ptype; + zval **pargval; + void *sess; + int type; + register int r; + char *argval; + + if ((ZEND_NUM_ARGS() != 3) || (zend_get_parameters_ex(3, &psess, &ptype, &pargval) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + convert_to_string_ex(ptype); + type = cv_str2cmd((*ptype)->value.str.val); + convert_to_string_ex(pargval); + argval = (*pargval)->value.str.val; + + r = cv_command(sess, type, argval); + + RETURN_STRING(cv_stat2str(r), 1); +} + +ZEND_FUNCTION(ccvs_textvalue) /* cv_textvalue() */ +{ + zval **psess; + void *sess; + + if ((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, &psess) != SUCCESS)) /* accept only SUCCESS in case something weird gets returned instead of 'FAILURE' on fail */ + { + WRONG_PARAM_COUNT; + } + + convert_to_string_ex(psess); + sess = hks_ptr_stringtoptr((*psess)->value.str.val); + + RETURN_STRING(cv_textvalue(sess), 1); +} + +/* +* Our Info Function which reports info on this module out to PHP's phpinfo() function +* Brendan W. McAdams <brendan@plexmedia.com> on 2000.07.26@16:22.EST +*/ + +PHP_MINFO_FUNCTION(ccvs) +{ + php_info_print_table_start(); + php_info_print_table_header(2, "RedHat CCVS support", "enabled"); + php_info_print_table_row(2,"CCVS Support by","Brendan W. McAdams <brendan@plexmedia.com>"); + php_info_print_table_row(2,"Release ID",cvsid); + php_info_print_table_end(); + + /* DISPLAY_INI_ENTRIES(); */ + + /* + * In the future, we will probably have entries in php.ini for runtime config, in which case we will + * Uncomment the DISPLAY_INI_ENTRIES call... + */ + +}
\ No newline at end of file diff --git a/ext/ccvs/ccvs.h b/ext/ccvs/ccvs.h new file mode 100644 index 0000000000..66406c3e3d --- /dev/null +++ b/ext/ccvs/ccvs.h @@ -0,0 +1,124 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Brendan W. McAdams <brendan@plexmedia.com> | + | Doug DeJulio <ddj@redhat.com> | + +----------------------------------------------------------------------+ +*/ + + #include <cv_api.h> + + + #define ccvs_module_ptr &ccvs_module_entry + #define phpext_ccvs_ptr ccvs_module_ptr + + /* Declare functions not in cv_api.h but in libccvs.a. */ + char *hks_ptr_ptrtostring(void *vptr); + void *hks_ptr_stringtoptr(char *str); + + /* Declare the Functions this Module Makes Available to Zend */ + + + /* Pre-declarations of functions */ + ZEND_FUNCTION(ccvs_init); + ZEND_FUNCTION(ccvs_done); + ZEND_FUNCTION(ccvs_new); + ZEND_FUNCTION(ccvs_add); + ZEND_FUNCTION(ccvs_delete); + ZEND_FUNCTION(ccvs_auth); + ZEND_FUNCTION(ccvs_return); + ZEND_FUNCTION(ccvs_reverse); + ZEND_FUNCTION(ccvs_sale); + ZEND_FUNCTION(ccvs_void); + ZEND_FUNCTION(ccvs_status); + ZEND_FUNCTION(ccvs_count); + ZEND_FUNCTION(ccvs_lookup); + ZEND_FUNCTION(ccvs_report); + ZEND_FUNCTION(ccvs_command); + ZEND_FUNCTION(ccvs_textvalue); + PHP_MINFO_FUNCTION(ccvs); + + /* + * Create the Zend Internal hash construct to track this modules functions + * + * In case anyone is wondering why we use ccvs_<action> instead of cv_<action>, + * it's because we are directly importing functions of the actual CCVS, which uses functions that are + * cv_<action>, and we had problems implementing ZEND_NAMED_FE calls (bug in NAMED_FE? investigate + * later). We don't want our PHP calls to conflict with the C calls in the CCVS API. + * + * BWM - 2000.07.27@16.41.EST - Added FALIAS Calls. While I'm of the opinion that naming the + * functions in PHP ccvs_<action> is much more readable and clear to anyone reading the code than + * cv_<action>, It strikes me that many people coming from php3 -> php4 will need backwards + * compatibility. It was kind of careless to simply change the function calls (There were reasons other + * than readability behind this; the ZEND_NAMED_FE macro was misbehaving) and not provide for + * backwards compatibility - this *IS* an API and should scale with compatibility. + * + */ + + zend_function_entry ccvs_functions[] = { + ZEND_FE(ccvs_init,NULL) + ZEND_FALIAS(cv_init,ccvs_init,NULL) + ZEND_FE(ccvs_done,NULL) + ZEND_FALIAS(cv_done,ccvs_done,NULL) + ZEND_FE(ccvs_new,NULL) + ZEND_FALIAS(cv_new,ccvs_new,NULL) + ZEND_FE(ccvs_add,NULL) + ZEND_FALIAS(cv_add,ccvs_add,NULL) + ZEND_FE(ccvs_delete,NULL) + ZEND_FALIAS(cv_delete,ccvs_delete,NULL) + ZEND_FE(ccvs_auth,NULL) + ZEND_FALIAS(cv_auth,ccvs_auth,NULL) + ZEND_FE(ccvs_return,NULL) + ZEND_FALIAS(cv_return,ccvs_return,NULL) + ZEND_FE(ccvs_reverse,NULL) + ZEND_FALIAS(cv_reverse,ccvs_reverse,NULL) + ZEND_FE(ccvs_sale,NULL) + ZEND_FALIAS(cv_sale,ccvs_sale,NULL) + ZEND_FE(ccvs_void,NULL) + ZEND_FALIAS(cv_void,ccvs_void,NULL) + ZEND_FE(ccvs_status,NULL) + ZEND_FALIAS(cv_status,ccvs_status,NULL) + ZEND_FE(ccvs_count,NULL) + ZEND_FALIAS(cv_count,ccvs_count,NULL) + ZEND_FE(ccvs_lookup,NULL) + ZEND_FALIAS(cv_lookup,ccvs_lookup,NULL) + ZEND_FE(ccvs_report,NULL) + ZEND_FALIAS(cv_report,ccvs_report,NULL) + ZEND_FE(ccvs_command,NULL) + ZEND_FALIAS(cv_command,ccvs_command,NULL) + ZEND_FE(ccvs_textvalue,NULL) + ZEND_FALIAS(cv_textvalue,ccvs_textvalue,NULL) + {NULL,NULL} + }; + + /* End function declarations */ + + /* Zend Engine Exports - module information */ + + /* Declare our module to the Zend engine */ + zend_module_entry ccvs_module_entry = { + "CCVS", + ccvs_functions, + NULL,NULL,NULL,NULL, + PHP_MINFO(ccvs), + STANDARD_MODULE_PROPERTIES + }; + + /* Declare the information we need to dynamically link this module later */ + #if COMPILE_DL + DLEXPORT zend_module_entry *get_module(void) { return &ccvs_module_entry; } + #endif + + /* End exports */ + diff --git a/ext/ccvs/config.m4 b/ext/ccvs/config.m4 new file mode 100644 index 0000000000..2d2bd883a9 --- /dev/null +++ b/ext/ccvs/config.m4 @@ -0,0 +1,25 @@ +dnl $Id$ +dnl config.m4 for PHP4 CCVS Extension + +AC_MSG_CHECKING(CCVS Support) +AC_ARG_WITH(ccvs, +[ --with-ccvs[=DIR] Compile CCVS support into PHP4. Please specify your CCVS base install directory as DIR.], +[ + if test "$withval" != "no"; then + test -f $withval/include/cv_api.h && CCVS_DIR="$withval/include" + test -f $withval/lib/libccvs.a && CCVS_DIR="$withval/lib" + if test -n "$CCVS_DIR"; then + AC_MSG_RESULT(yes) + PHP_EXTENSION(ccvs) + old_LIBS="$LIBS" + LIBS="$LIBS -LCCVS_DIR/lib" + LIBS="$old_LIBS -lccvs" + AC_ADD_LIBRARY_WITH_PATH(libccvs, $CCVS_DIR) + AC_ADD_INCLUDE($withval/include) + else + AC_MSG_RESULT(no) + fi +fi +],[ + AC_MSG_RESULT(no) +]) |