mirror of
https://github.com/pcsc-for-php/pcsc.git
synced 2026-08-08 21:09:26 +02:00
Replace warnings with RETURN_FALSE and a global last_errno to allow userland response to errors
git-svn-id: https://svn.php.net/repository/pecl/pcsc/trunk@332847 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
parent
9791060ed7
commit
d47c882716
2 changed files with 60 additions and 25 deletions
70
pcsc.c
70
pcsc.c
|
|
@ -25,6 +25,8 @@
|
||||||
#include "ext/standard/info.h"
|
#include "ext/standard/info.h"
|
||||||
#include "php_pcsc.h"
|
#include "php_pcsc.h"
|
||||||
|
|
||||||
|
ZEND_DECLARE_MODULE_GLOBALS(pcsc);
|
||||||
|
|
||||||
#include <winscard.h>
|
#include <winscard.h>
|
||||||
#ifndef PHP_WIN32
|
#ifndef PHP_WIN32
|
||||||
#include <PCSC/pcsclite.h>
|
#include <PCSC/pcsclite.h>
|
||||||
|
|
@ -57,7 +59,8 @@ zend_function_entry pcsc_functions[] = {
|
||||||
PHP_FE(scard_disconnect, NULL)
|
PHP_FE(scard_disconnect, NULL)
|
||||||
PHP_FE(scard_transmit, NULL)
|
PHP_FE(scard_transmit, NULL)
|
||||||
PHP_FE(scard_status, NULL)
|
PHP_FE(scard_status, NULL)
|
||||||
//PHP_FE(scard_cancel, NULL)
|
PHP_FE(scard_last_errno, NULL)
|
||||||
|
PHP_FE(scard_errstr, NULL)
|
||||||
{NULL, NULL, NULL}
|
{NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
@ -126,6 +129,11 @@ static void php_pcsc_conn_res_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TLS */
|
||||||
|
static void php_pcsc_globals_ctor(zend_pcsc_globals* pcsc_globals) {
|
||||||
|
pcsc_globals->last_errno=SCARD_S_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/* {{{ PHP_MINIT_FUNCTION
|
/* {{{ PHP_MINIT_FUNCTION
|
||||||
*/
|
*/
|
||||||
PHP_MINIT_FUNCTION(pcsc)
|
PHP_MINIT_FUNCTION(pcsc)
|
||||||
|
|
@ -220,6 +228,13 @@ PHP_MINIT_FUNCTION(pcsc)
|
||||||
le_pcsc_ctx_res=zend_register_list_destructors_ex(php_pcsc_ctx_res_dtor, NULL, PHP_PCSC_CTX_RES_NAME,module_number);
|
le_pcsc_ctx_res=zend_register_list_destructors_ex(php_pcsc_ctx_res_dtor, NULL, PHP_PCSC_CTX_RES_NAME,module_number);
|
||||||
le_pcsc_conn_res=zend_register_list_destructors_ex(php_pcsc_conn_res_dtor, NULL, PHP_PCSC_CONN_RES_NAME,module_number);
|
le_pcsc_conn_res=zend_register_list_destructors_ex(php_pcsc_conn_res_dtor, NULL, PHP_PCSC_CONN_RES_NAME,module_number);
|
||||||
|
|
||||||
|
/* TLS */
|
||||||
|
#ifdef ZTS
|
||||||
|
ts_allocate_id(&pcsc_globals_id,sizeof(zend_pcsc_globals),(ts_allocate_ctor)php_pcsc_globals_ctor, NULL);
|
||||||
|
#else
|
||||||
|
php_pcsc_globals_ctor(&pcsc_globals TRSMLS_CC);
|
||||||
|
#endif
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
@ -243,7 +258,7 @@ PHP_MINFO_FUNCTION(pcsc)
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* map error codes to string */
|
/* map error codes to string */
|
||||||
static char* php_pcsc_error_to_string(LONG dwRC) {
|
static char* php_pcsc_error_to_string(DWORD dwRC) {
|
||||||
switch(dwRC) {
|
switch(dwRC) {
|
||||||
case SCARD_E_BAD_SEEK: return "SCARD_E_BAD_SEEK";
|
case SCARD_E_BAD_SEEK: return "SCARD_E_BAD_SEEK";
|
||||||
case SCARD_E_CANCELLED: return "SCARD_E_CANCELLED";
|
case SCARD_E_CANCELLED: return "SCARD_E_CANCELLED";
|
||||||
|
|
@ -380,7 +395,7 @@ PHP_FUNCTION(scard_establish_context)
|
||||||
rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &scard_context);
|
rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &scard_context);
|
||||||
if (rc != SCARD_S_SUCCESS)
|
if (rc != SCARD_S_SUCCESS)
|
||||||
{
|
{
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardEstablishContext returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -403,7 +418,7 @@ PHP_FUNCTION(scard_is_valid_context)
|
||||||
|
|
||||||
rc = SCardIsValidContext(context);
|
rc = SCardIsValidContext(context);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardIsValidContext returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
|
|
@ -444,15 +459,9 @@ PHP_FUNCTION(scard_list_readers)
|
||||||
}
|
}
|
||||||
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);
|
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);
|
||||||
|
|
||||||
rc = SCardIsValidContext(context);
|
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardIsValidContext returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
|
||||||
RETURN_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = SCardListReaders(context, NULL, (char *) &strReaders, &dwLen);
|
rc = SCardListReaders(context, NULL, (char *) &strReaders, &dwLen);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardListReaders returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,16 +503,10 @@ PHP_FUNCTION(scard_connect)
|
||||||
RETURN_NULL();
|
RETURN_NULL();
|
||||||
}
|
}
|
||||||
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);
|
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);
|
||||||
|
|
||||||
rc = SCardIsValidContext(context);
|
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardIsValidContext returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
|
||||||
RETURN_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = SCardConnect(context, strReaderName, SCARD_SHARE_SHARED, dwPreferredProtocol, &hCard, &dwCurrentProtocol);
|
rc = SCardConnect(context, strReaderName, SCARD_SHARE_SHARED, dwPreferredProtocol, &hCard, &dwCurrentProtocol);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardConnect returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
ZVAL_LONG(current_protocol,dwCurrentProtocol);
|
ZVAL_LONG(current_protocol,dwCurrentProtocol);
|
||||||
|
|
@ -528,7 +531,7 @@ PHP_FUNCTION(scard_disconnect)
|
||||||
|
|
||||||
rc = SCardDisconnect(hCard, dwDisposition);
|
rc = SCardDisconnect(hCard, dwDisposition);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardDisconnect returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
|
|
@ -557,14 +560,15 @@ PHP_FUNCTION(scard_transmit)
|
||||||
}
|
}
|
||||||
ZEND_FETCH_RESOURCE(hCard,SCARDHANDLE,&conn_res,-1,PHP_PCSC_CONN_RES_NAME,le_pcsc_conn_res);
|
ZEND_FETCH_RESOURCE(hCard,SCARDHANDLE,&conn_res,-1,PHP_PCSC_CONN_RES_NAME,le_pcsc_conn_res);
|
||||||
|
|
||||||
/* Are we in T=0 or T=1 ? */
|
/* Are we in T=0 or T=1 ? Is the card powered? */
|
||||||
rc = SCardStatus(hCard, NULL, NULL, &dwState, &dwProtocol, NULL, NULL);
|
rc = SCardStatus(hCard, NULL, NULL, &dwState, &dwProtocol, NULL, NULL);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardStatus returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(dwState & SCARD_POWERED)) {
|
if (!(dwState & SCARD_POWERED)) {
|
||||||
|
PCSC_G(last_errno)=SCARD_W_UNPOWERED_CARD;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -588,7 +592,7 @@ PHP_FUNCTION(scard_transmit)
|
||||||
|
|
||||||
rc = SCardTransmit(hCard, sendPci, sendBuffer, sendLen, recvPci, recvBuffer, &recvLen);
|
rc = SCardTransmit(hCard, sendPci, sendBuffer, sendLen, recvPci, recvBuffer, &recvLen);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardTransmit returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
efree(recvPci);
|
efree(recvPci);
|
||||||
efree(recvBuffer);
|
efree(recvBuffer);
|
||||||
efree(sendBuffer);
|
efree(sendBuffer);
|
||||||
|
|
@ -625,7 +629,7 @@ PHP_FUNCTION(scard_status)
|
||||||
atrLen = sizeof(atrBuffer);
|
atrLen = sizeof(atrBuffer);
|
||||||
rc = SCardStatus(hCard, NULL, NULL, &dwState, &dwProtocol, atrBuffer, &atrLen);
|
rc = SCardStatus(hCard, NULL, NULL, &dwState, &dwProtocol, atrBuffer, &atrLen);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
if (rc != SCARD_S_SUCCESS) {
|
||||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "SCardStatus returned %s (0x%x)",php_pcsc_error_to_string(rc),rc);
|
PCSC_G(last_errno)=rc;
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -671,3 +675,23 @@ PHP_FUNCTION(scard_status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ proto long scard_last_errno()
|
||||||
|
Retrieve last error code */
|
||||||
|
PHP_FUNCTION(scard_last_errno)
|
||||||
|
{
|
||||||
|
RETURN_LONG(PCSC_G(last_errno));
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ proto long scard_errstr(long errno)
|
||||||
|
Retrieve string name of error code */
|
||||||
|
PHP_FUNCTION(scard_errstr)
|
||||||
|
{
|
||||||
|
DWORD in_errno=0;
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &in_errno) == FAILURE) {
|
||||||
|
RETURN_NULL();
|
||||||
|
}
|
||||||
|
RETURN_STRING(php_pcsc_error_to_string(in_errno),1);
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
|
||||||
15
php_pcsc.h
15
php_pcsc.h
|
|
@ -29,11 +29,22 @@ PHP_FUNCTION(scard_connect);
|
||||||
PHP_FUNCTION(scard_disconnect);
|
PHP_FUNCTION(scard_disconnect);
|
||||||
PHP_FUNCTION(scard_status);
|
PHP_FUNCTION(scard_status);
|
||||||
PHP_FUNCTION(scard_transmit);
|
PHP_FUNCTION(scard_transmit);
|
||||||
//PHP_FUNCTION(scard_cancel);
|
PHP_FUNCTION(scard_last_errno);
|
||||||
|
PHP_FUNCTION(scard_errstr);
|
||||||
|
|
||||||
#define PHP_PCSC_CTX_RES_NAME "PC/SC Context"
|
#define PHP_PCSC_CTX_RES_NAME "PC/SC Context"
|
||||||
#define PHP_PCSC_CONN_RES_NAME "PC/SC Connection"
|
#define PHP_PCSC_CONN_RES_NAME "PC/SC Connection"
|
||||||
|
|
||||||
static char* php_pcsc_error_to_string(LONG dwRC);
|
static char* php_pcsc_error_to_string(DWORD dwRC);
|
||||||
|
|
||||||
|
ZEND_BEGIN_MODULE_GLOBALS(pcsc)
|
||||||
|
DWORD last_errno;
|
||||||
|
ZEND_END_MODULE_GLOBALS(pcsc)
|
||||||
|
|
||||||
|
#ifdef ZTS
|
||||||
|
#define PCSC_G(v) TSRMG(pcsc_globals_id,zend_pcsc_globals*,v)
|
||||||
|
#else
|
||||||
|
#define PCSC_G(v) (pcsc_globals.v)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* PHP_PCSC_H */
|
#endif /* PHP_PCSC_H */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue