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) The PHP Group |
|
||||||
+----------------------------------------------------------------------+
|
|
||||||
| Copyright (c) 1997-2006 The PHP Group |
|
|
||||||
+----------------------------------------------------------------------+
|
+----------------------------------------------------------------------+
|
||||||
| This source file is subject to version 3.01 of the PHP license, |
|
| 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 |
|
| 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_ARG_INFO(1, active_protocol)
|
||||||
ZEND_END_ARG_INFO()
|
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[]
|
/* {{{ pcsc_functions[]
|
||||||
*
|
*
|
||||||
* Every user visible function must have an entry in pcsc_functions[].
|
* Every user visible function must have an entry in pcsc_functions[].
|
||||||
*/
|
*/
|
||||||
zend_function_entry pcsc_functions[] = {
|
zend_function_entry pcsc_functions[] = {
|
||||||
PHP_FE(scard_establish_context, NULL)
|
PHP_FE(scard_establish_context, php_pcsc_scard_void)
|
||||||
PHP_FE(scard_release_context, NULL)
|
PHP_FE(scard_release_context, php_pcsc_scard_context)
|
||||||
PHP_FE(scard_is_valid_context, NULL)
|
PHP_FE(scard_is_valid_context, php_pcsc_scard_context)
|
||||||
PHP_FE(scard_list_readers, NULL)
|
PHP_FE(scard_list_readers, php_pcsc_scard_context)
|
||||||
PHP_FE(scard_connect, php_pcsc_scard_connect_arginfo)
|
PHP_FE(scard_connect, php_pcsc_scard_connect_arginfo)
|
||||||
//PHP_FE(scard_reconnect, NULL)
|
//PHP_FE(scard_reconnect, NULL)
|
||||||
PHP_FE(scard_disconnect, NULL)
|
PHP_FE(scard_disconnect, php_pcsc_scard_disconnect)
|
||||||
PHP_FE(scard_transmit, NULL)
|
PHP_FE(scard_transmit, php_pcsc_scard_transmit)
|
||||||
PHP_FE(scard_status, NULL)
|
PHP_FE(scard_status, php_pcsc_scard_card)
|
||||||
//PHP_FE(scard_get_status_change, NULL)
|
//PHP_FE(scard_get_status_change, NULL)
|
||||||
PHP_FE(scard_last_errno, NULL)
|
PHP_FE(scard_last_errno, php_pcsc_scard_void)
|
||||||
PHP_FE(scard_errstr, NULL)
|
PHP_FE(scard_errstr, php_pcsc_scard_errstr)
|
||||||
{NULL, NULL, NULL}
|
PHP_FE_END
|
||||||
};
|
};
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
|
@ -102,13 +125,13 @@ static void php_pcsc_ctx_res_dtor(zend_resource *rsrc) {
|
||||||
context=(SCARDCONTEXT)rsrc->ptr;
|
context=(SCARDCONTEXT)rsrc->ptr;
|
||||||
rc = SCardIsValidContext(context);
|
rc = SCardIsValidContext(context);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = SCardReleaseContext(context);
|
rc = SCardReleaseContext(context);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
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;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -127,7 +150,7 @@ static void php_pcsc_conn_res_dtor(zend_resource *rsrc) {
|
||||||
|
|
||||||
rc = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
|
rc = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
|
||||||
if (rc != SCARD_S_SUCCESS) {
|
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;
|
SCARDCONTEXT scard_context = 0;
|
||||||
LONG rc = 0;
|
LONG rc = 0;
|
||||||
|
|
||||||
|
if (zend_parse_parameters_none() == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
@ -539,7 +566,6 @@ PHP_FUNCTION(scard_is_valid_context)
|
||||||
Invalidate the PC/SC context */
|
Invalidate the PC/SC context */
|
||||||
PHP_FUNCTION(scard_release_context)
|
PHP_FUNCTION(scard_release_context)
|
||||||
{
|
{
|
||||||
LONG rc = 0;
|
|
||||||
zval* ctx_res;
|
zval* ctx_res;
|
||||||
SCARDCONTEXT context;
|
SCARDCONTEXT context;
|
||||||
|
|
||||||
|
|
@ -547,6 +573,7 @@ PHP_FUNCTION(scard_release_context)
|
||||||
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);
|
||||||
|
(void)context;
|
||||||
|
|
||||||
zend_hash_index_del(&EG(regular_list), Z_RES_HANDLE_P(ctx_res));
|
zend_hash_index_del(&EG(regular_list), Z_RES_HANDLE_P(ctx_res));
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
|
|
@ -669,7 +696,7 @@ PHP_FUNCTION(scard_transmit)
|
||||||
SCARD_IO_REQUEST *recvPci = NULL;
|
SCARD_IO_REQUEST *recvPci = NULL;
|
||||||
BYTE *sendBuffer;
|
BYTE *sendBuffer;
|
||||||
BYTE *recvBuffer;
|
BYTE *recvBuffer;
|
||||||
DWORD sendLen, recvLen;
|
DWORD sendLen = 0, recvLen;
|
||||||
LONG rc;
|
LONG rc;
|
||||||
char *apdu;
|
char *apdu;
|
||||||
size_t apduLen;
|
size_t apduLen;
|
||||||
|
|
@ -734,7 +761,6 @@ PHP_FUNCTION(scard_status)
|
||||||
{
|
{
|
||||||
zval* conn_res;
|
zval* conn_res;
|
||||||
SCARDHANDLE hCard = 0;
|
SCARDHANDLE hCard = 0;
|
||||||
char *strReader = NULL;
|
|
||||||
DWORD dwProtocol, dwState;
|
DWORD dwProtocol, dwState;
|
||||||
BYTE atrBuffer[32];
|
BYTE atrBuffer[32];
|
||||||
DWORD atrLen;
|
DWORD atrLen;
|
||||||
|
|
@ -799,6 +825,9 @@ PHP_FUNCTION(scard_status)
|
||||||
Retrieve last error code */
|
Retrieve last error code */
|
||||||
PHP_FUNCTION(scard_last_errno)
|
PHP_FUNCTION(scard_last_errno)
|
||||||
{
|
{
|
||||||
|
if (zend_parse_parameters_none() == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
RETURN_LONG(PCSC_G(last_errno));
|
RETURN_LONG(PCSC_G(last_errno));
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue