mirror of
https://github.com/pcsc-for-php/pcsc.git
synced 2026-08-08 21:09:26 +02:00
commit
1c91afe164
1 changed files with 48 additions and 19 deletions
67
pcsc.c
67
pcsc.c
|
|
@ -1,8 +1,6 @@
|
|||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2006 The PHP Group |
|
||||
| Copyright (c) The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 3.01 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
|
|
@ -46,24 +44,49 @@ ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_connect_arginfo, 0, 0, 2)
|
|||
ZEND_ARG_INFO(1, active_protocol)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_void, 0, 0, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_context, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, context)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_disconnect, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, card)
|
||||
ZEND_ARG_INFO(0, disposition)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_transmit, 0, 0, 2)
|
||||
ZEND_ARG_INFO(0, card)
|
||||
ZEND_ARG_INFO(0, command)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_card, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, card)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_INFO_EX(php_pcsc_scard_errstr, 0, 0, 1)
|
||||
ZEND_ARG_INFO(0, errno)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
/* {{{ pcsc_functions[]
|
||||
*
|
||||
* Every user visible function must have an entry in pcsc_functions[].
|
||||
*/
|
||||
zend_function_entry pcsc_functions[] = {
|
||||
PHP_FE(scard_establish_context, NULL)
|
||||
PHP_FE(scard_release_context, NULL)
|
||||
PHP_FE(scard_is_valid_context, NULL)
|
||||
PHP_FE(scard_list_readers, NULL)
|
||||
PHP_FE(scard_establish_context, php_pcsc_scard_void)
|
||||
PHP_FE(scard_release_context, php_pcsc_scard_context)
|
||||
PHP_FE(scard_is_valid_context, php_pcsc_scard_context)
|
||||
PHP_FE(scard_list_readers, php_pcsc_scard_context)
|
||||
PHP_FE(scard_connect, php_pcsc_scard_connect_arginfo)
|
||||
//PHP_FE(scard_reconnect, NULL)
|
||||
PHP_FE(scard_disconnect, NULL)
|
||||
PHP_FE(scard_transmit, NULL)
|
||||
PHP_FE(scard_status, NULL)
|
||||
PHP_FE(scard_disconnect, php_pcsc_scard_disconnect)
|
||||
PHP_FE(scard_transmit, php_pcsc_scard_transmit)
|
||||
PHP_FE(scard_status, php_pcsc_scard_card)
|
||||
//PHP_FE(scard_get_status_change, NULL)
|
||||
PHP_FE(scard_last_errno, NULL)
|
||||
PHP_FE(scard_errstr, NULL)
|
||||
{NULL, NULL, NULL}
|
||||
PHP_FE(scard_last_errno, php_pcsc_scard_void)
|
||||
PHP_FE(scard_errstr, php_pcsc_scard_errstr)
|
||||
PHP_FE_END
|
||||
};
|
||||
/* }}} */
|
||||
|
||||
|
|
@ -102,13 +125,13 @@ static void php_pcsc_ctx_res_dtor(zend_resource *rsrc) {
|
|||
context=(SCARDCONTEXT)rsrc->ptr;
|
||||
rc = SCardIsValidContext(context);
|
||||
if (rc != SCARD_S_SUCCESS) {
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC context dtor: SCardIsValidContext returned %s (0x%x)", php_pcsc_error_to_string(rc), rc);
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC context dtor: SCardIsValidContext returned %s (0x%lx)", php_pcsc_error_to_string(rc), rc);
|
||||
return;
|
||||
}
|
||||
|
||||
rc = SCardReleaseContext(context);
|
||||
if (rc != SCARD_S_SUCCESS) {
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC context dtor: SCardReleaseContext returned %s (0x%x)", php_pcsc_error_to_string(rc), rc);
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC context dtor: SCardReleaseContext returned %s (0x%lx)", php_pcsc_error_to_string(rc), rc);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
|
@ -127,7 +150,7 @@ static void php_pcsc_conn_res_dtor(zend_resource *rsrc) {
|
|||
|
||||
rc = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
|
||||
if (rc != SCARD_S_SUCCESS) {
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC connection dtor: SCardDisconnect returned %s (0x%x)", php_pcsc_error_to_string(rc), rc);
|
||||
php_error_docref(NULL, E_WARNING, "PC/SC connection dtor: SCardDisconnect returned %s (0x%lx)", php_pcsc_error_to_string(rc), rc);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -502,6 +525,10 @@ PHP_FUNCTION(scard_establish_context)
|
|||
SCARDCONTEXT scard_context = 0;
|
||||
LONG rc = 0;
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
rc = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &scard_context);
|
||||
if (rc != SCARD_S_SUCCESS)
|
||||
{
|
||||
|
|
@ -539,7 +566,6 @@ PHP_FUNCTION(scard_is_valid_context)
|
|||
Invalidate the PC/SC context */
|
||||
PHP_FUNCTION(scard_release_context)
|
||||
{
|
||||
LONG rc = 0;
|
||||
zval* ctx_res;
|
||||
SCARDCONTEXT context;
|
||||
|
||||
|
|
@ -547,6 +573,7 @@ PHP_FUNCTION(scard_release_context)
|
|||
RETURN_NULL();
|
||||
}
|
||||
ZEND_FETCH_RESOURCE(context, SCARDCONTEXT, &ctx_res, -1, PHP_PCSC_CTX_RES_NAME, le_pcsc_ctx_res);
|
||||
(void)context;
|
||||
|
||||
zend_hash_index_del(&EG(regular_list), Z_RES_HANDLE_P(ctx_res));
|
||||
RETURN_TRUE;
|
||||
|
|
@ -669,7 +696,7 @@ PHP_FUNCTION(scard_transmit)
|
|||
SCARD_IO_REQUEST *recvPci = NULL;
|
||||
BYTE *sendBuffer;
|
||||
BYTE *recvBuffer;
|
||||
DWORD sendLen, recvLen;
|
||||
DWORD sendLen = 0, recvLen;
|
||||
LONG rc;
|
||||
char *apdu;
|
||||
size_t apduLen;
|
||||
|
|
@ -734,7 +761,6 @@ PHP_FUNCTION(scard_status)
|
|||
{
|
||||
zval* conn_res;
|
||||
SCARDHANDLE hCard = 0;
|
||||
char *strReader = NULL;
|
||||
DWORD dwProtocol, dwState;
|
||||
BYTE atrBuffer[32];
|
||||
DWORD atrLen;
|
||||
|
|
@ -799,6 +825,9 @@ PHP_FUNCTION(scard_status)
|
|||
Retrieve last error code */
|
||||
PHP_FUNCTION(scard_last_errno)
|
||||
{
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
RETURN_LONG(PCSC_G(last_errno));
|
||||
}
|
||||
/* }}} */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue