php-src/ext/ccvs/ccvs.c
2001-12-17 10:59:52 +00:00

608 lines
18 KiB
C

/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 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 <bmcadams@php.net> |
| 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 <bmcadams@php.net>
* -------
*/
/*
* Code started on 2000.07.24@09.04.EST by Brendan W. McAdams <bmcadams@php.net>
* $Revision$
*/
static char const cvsid[] = "$Id$";
#include <php.h>
#include <stdlib.h>
#include <string.h>
#include <ccvs.h>
/*
* 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.
*
*/
function_entry ccvs_functions[] = {
PHP_FE(ccvs_init, NULL)
PHP_FALIAS(cv_init, ccvs_init, NULL)
PHP_FE(ccvs_done, NULL)
PHP_FALIAS(cv_done, ccvs_done, NULL)
PHP_FE(ccvs_new, NULL)
PHP_FALIAS(cv_new, ccvs_new, NULL)
PHP_FE(ccvs_add, NULL)
PHP_FALIAS(cv_add, ccvs_add, NULL)
PHP_FE(ccvs_delete, NULL)
PHP_FALIAS(cv_delete, ccvs_delete, NULL)
PHP_FE(ccvs_auth, NULL)
PHP_FALIAS(cv_auth, ccvs_auth, NULL)
PHP_FE(ccvs_return, NULL)
PHP_FALIAS(cv_return, ccvs_return, NULL)
PHP_FE(ccvs_reverse, NULL)
PHP_FALIAS(cv_reverse, ccvs_reverse, NULL)
PHP_FE(ccvs_sale, NULL)
PHP_FALIAS(cv_sale, ccvs_sale, NULL)
PHP_FE(ccvs_void, NULL)
PHP_FALIAS(cv_void, ccvs_void, NULL)
PHP_FE(ccvs_status, NULL)
PHP_FALIAS(cv_status, ccvs_status, NULL)
PHP_FE(ccvs_count, NULL)
PHP_FALIAS(cv_count, ccvs_count, NULL)
PHP_FE(ccvs_lookup, NULL)
PHP_FALIAS(cv_lookup, ccvs_lookup, NULL)
PHP_FE(ccvs_report, NULL)
PHP_FALIAS(cv_report, ccvs_report, NULL)
PHP_FE(ccvs_command, NULL)
PHP_FALIAS(cv_command, ccvs_command, NULL)
PHP_FE(ccvs_textvalue, NULL)
PHP_FALIAS(cv_textvalue, ccvs_textvalue, NULL)
{NULL, NULL, NULL}
};
/* End function declarations */
/* Zend Engine Exports - module information */
/* Declare our module to the Zend engine */
zend_module_entry ccvs_module_entry = {
STANDARD_MODULE_HEADER,
"CCVS",
ccvs_functions,
NULL, NULL, NULL, NULL,
PHP_MINFO(ccvs),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_CCVS
ZEND_GET_MODULE(ccvs)
#endif
/* Full Functions (The actual CCVS functions and any internal php hooked functions such as MINFO) */
/* {{{ proto string ccvs_init(string name)
Initialize CCVS for use */
PHP_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(Z_STRVAL_PP(name));
/*
* -- 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;
}
/* }}} */
/* {{{ proto string ccvs_done(string sess)
Terminate CCVS engine and do cleanup work */
PHP_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(Z_STRVAL_PP(sess));
cv_done(vsess);
RETURN_STRING("OK", 1);
}
/* }}} */
/* {{{ proto string ccvs_new(string session, string invoice)
Create a new, blank transaction */
PHP_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);
if (!Z_STRVAL_PP(psess)) {
php_error(E_WARNING, "Invalid session to ccvs_new()");
RETURN_FALSE;
}
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
convert_to_string_ex(pinvoice);
invoice = Z_STRVAL_PP(pinvoice);
r = cv_new(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_add(string session, string invoice, string argtype, string argval)
Add data to a transaction */
PHP_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(Z_STRVAL_PP(psess));
invoice = Z_STRVAL_PP(pinvoice);
argtype = cv_str2arg(Z_STRVAL_PP(pargtype));
argval = Z_STRVAL_PP(pargval);
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.
*/
/* {{{ proto string ccvs_delete(string session, string invoice)
Delete a transaction */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_delete(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_auth(string session, string invoice)
Perform credit authorization test on a transaction */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_auth(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_return(string session, string invoice)
Transfer funds from the merchant to the credit card holder */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_return(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_reverse(string session, string invoice)
Perform a full reversal on an already-processed authorization */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_reverse(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_sale(string session, string invoice)
Transfer funds from the credit card holder to the merchant */
PHP_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(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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_sale(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_void(string session, string invoice)
Perform a full reversal on a completed transaction */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_void(sess, invoice);
RETURN_STRING(cv_ret2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_status(string session, string invoice)
Check the status of an invoice */
PHP_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 = Z_STRVAL_PP(pinvoice);
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_status(sess, invoice);
RETURN_STRING(cv_stat2str(r), 1);
}
/* }}} */
/* {{{ proto int ccvs_count(string session, string type)
Find out how many transactions of a given type are stored in the system */
PHP_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(Z_STRVAL_PP(ptype));
sess = hks_ptr_stringtoptr(Z_STRVAL_PP(psess));
r = cv_count(sess, type);
RETURN_LONG(r);
}
/* }}} */
/* {{{ proto string ccvs_lookup(string session, string invoice, int inum)
Look up an item of a particular type in the database */
PHP_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(Z_STRVAL_PP(psess));
convert_to_string_ex(ptype);
type = cv_str2stat(Z_STRVAL_PP(ptype));
convert_to_long_ex(pinum);
inum = Z_LVAL_PP(pinum);
r = cv_lookup(sess, type, inum);
RETURN_STRING(cv_textvalue(sess), 1);
}
/* }}} */
/* {{{ proto string ccvs_report(string session, string type)
Return the status of the background communication process */
PHP_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(Z_STRVAL_PP(psess));
convert_to_string_ex(ptype);
type = cv_str2rep(Z_STRVAL_PP(ptype));
r = cv_report(sess, type);
RETURN_STRING(cv_stat2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_command(string session, string type, string argval)
Performs a command which is peculiar to a single protocol, and thus is not available in the general CCVS API */
PHP_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(Z_STRVAL_PP(psess));
convert_to_string_ex(ptype);
type = cv_str2cmd(Z_STRVAL_PP(ptype));
convert_to_string_ex(pargval);
argval = Z_STRVAL_PP(pargval);
r = cv_command(sess, type, argval);
RETURN_STRING(cv_stat2str(r), 1);
}
/* }}} */
/* {{{ proto string ccvs_textvalue(string session)
Get text return value for previous function call */
PHP_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(Z_STRVAL_PP(psess));
RETURN_STRING(cv_textvalue(sess), 1);
}
/* }}} */
/*
* Our Info Function which reports info on this module out to PHP's phpinfo() function
* Brendan W. McAdams <bmcadams@php.net> 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 &lt;bmcadams@php.net&gt;<br />&amp; Doug DeJulio &lt;ddj@redhat.com&gt;");
php_info_print_table_row(2, "Release ID", cvsid);
php_info_print_table_row(2, "This Release Certified For CCVS Versions", "3.0 and greater");
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...
*/
}
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/