From c9d4c12a3bbfc1774311b57aaf4d88d923583015 Mon Sep 17 00:00:00 2001 From: frankmorgner Date: Sat, 13 Nov 2010 13:32:57 +0000 Subject: [PATCH] - driver data is now allocated and destroyed by drivers - new type driver_data_t, driver data is not stored in struct rf_driver. - added some comments and better debug messages git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@357 96b47cad-a561-4643-ad3b-153ac7d7599c --- pcsc-relay/src/lnfc.c | 19 ++++++++++-------- pcsc-relay/src/opicc.c | 40 ++++++++++++++++++------------------- pcsc-relay/src/pcsc-relay.c | 28 +++++++++++++++----------- pcsc-relay/src/pcsc-relay.h | 10 +++++----- 4 files changed, 51 insertions(+), 46 deletions(-) diff --git a/pcsc-relay/src/lnfc.c b/pcsc-relay/src/lnfc.c index 3b7793f..a563c58 100644 --- a/pcsc-relay/src/lnfc.c +++ b/pcsc-relay/src/lnfc.c @@ -99,7 +99,7 @@ static size_t get_historical_bytes(unsigned char *atr, size_t atrlen, } -static int lnfc_connect(void **driver_data) +static int lnfc_connect(driver_data_t **driver_data) { struct lnfc_data *data; /* data derived from German (test) identity card issued 2010 */ @@ -131,10 +131,11 @@ static int lnfc_connect(void **driver_data) } if (verbose >= 0) - printf("Connected to %s\n", data->pndTarget->acName); + printf("Connected to %s\n", nfc_device_name(data->pndTarget)); + DEBUG("Waiting for a command that is not part of the anti-collision...\n"); if (!nfc_target_init (data->pndTarget, &ntEmulatedTarget, data->abtCapdu, &data->szCapduLen)) { - ERROR("Initialization of NFC emulator failed"); + ERROR("nfc_target_init: %s\n", nfc_strerror(data->pndTarget)); nfc_disconnect (data->pndTarget); return 0; } @@ -144,18 +145,21 @@ static int lnfc_connect(void **driver_data) return 1; } -static int lnfc_disconnect(void *driver_data) +static int lnfc_disconnect(driver_data_t *driver_data) { struct lnfc_data *data = driver_data; - nfc_disconnect (data->pndTarget); + if (data) { + nfc_disconnect (data->pndTarget); + free(data); + } return 1; } -static int lnfc_receive_capdu(void *driver_data, +static int lnfc_receive_capdu(driver_data_t *driver_data, unsigned char **capdu, size_t *len) { struct lnfc_data *data = driver_data; @@ -185,7 +189,7 @@ static int lnfc_receive_capdu(void *driver_data, return 1; } -static int lnfc_send_rapdu(void *driver_data, +static int lnfc_send_rapdu(driver_data_t *driver_data, const unsigned char *rapdu, size_t len) { struct lnfc_data *data = driver_data; @@ -205,7 +209,6 @@ static int lnfc_send_rapdu(void *driver_data, struct rf_driver driver_libnfc = { - .data = NULL, .connect = lnfc_connect, .disconnect = lnfc_disconnect, .receive_capdu = lnfc_receive_capdu, diff --git a/pcsc-relay/src/opicc.c b/pcsc-relay/src/opicc.c index 9b8e9a6..dcdf7a2 100644 --- a/pcsc-relay/src/opicc.c +++ b/pcsc-relay/src/opicc.c @@ -52,11 +52,14 @@ int picc_encode_rapdu(const unsigned char *inbuf, size_t inlen, return 0; } *outbuf = p; + *outlen = length; - sprintf(*outbuf, "%04X:", inlen); + /* write length of R-APDU */ + sprintf(p, "%04X:", inlen); + /* next points to the next byte to encode */ next = inbuf; - /* let p point behind ':' */ + /* let p point behind ':' to write hex encoded bytes */ p += 5; while (inbuf+inlen > next) { sprintf(p," %02X",*next); @@ -64,7 +67,6 @@ int picc_encode_rapdu(const unsigned char *inbuf, size_t inlen, p += 3; } - *outlen = length; return 1; } @@ -115,7 +117,7 @@ int picc_decode_apdu(const char *inbuf, size_t inlen, } -static int picc_connect(void **driver_data) +static int picc_connect(driver_data_t **driver_data) { struct picc_data *data; @@ -128,15 +130,15 @@ static int picc_connect(void **driver_data) return 0; *driver_data = data; + data->buf = NULL; + data->bufmax = 0; + data->fd = fopen(PICCDEV, "a+"); /*O_NOCTTY ?*/ if (!data->fd) { ERROR("Error opening %s: %s\n", PICCDEV, strerror(errno)); return 0; } - data->buf = NULL; - data->bufmax = 0; - if (verbose >= 0) printf("Connected to %s\n", PICCDEV); @@ -144,7 +146,7 @@ static int picc_connect(void **driver_data) return 1; } -static int picc_disconnect(void *driver_data) +static int picc_disconnect(driver_data_t *driver_data) { struct picc_data *data = driver_data; @@ -152,17 +154,15 @@ static int picc_disconnect(void *driver_data) if (data) { if (data->fd) fclose(data->fd); - data->fd = NULL; free(data->buf); - data->buf = NULL; - data->bufmax = 0; + free(data); } return 1; } -static int picc_receive_capdu(void *driver_data, +static int picc_receive_capdu(driver_data_t *driver_data, unsigned char **capdu, size_t *len) { ssize_t linelen; @@ -184,7 +184,8 @@ static int picc_receive_capdu(void *driver_data, *len = 0; return 1; } - fflush(data->fd); + if (fflush(data->fd) != 0) + ERROR("Warning, fflush failed: %s\n", strerror(errno)); DEBUG("%s\n", data->buf); @@ -193,7 +194,7 @@ static int picc_receive_capdu(void *driver_data, return picc_decode_apdu(data->buf, linelen, capdu, len); } -static int picc_send_rapdu(void *driver_data, +static int picc_send_rapdu(driver_data_t *driver_data, const unsigned char *rapdu, size_t len) { struct picc_data *data = driver_data; @@ -213,14 +214,12 @@ static int picc_send_rapdu(void *driver_data, /* write R-APDU */ DEBUG("INF: Writing R-APDU\r\n%s\r\n", data->buf); - if (fprintf(data->fd,"%s\r\n", (char *) data->buf) < 0) { - ERROR("fprintf: %s\n", strerror(errno)); - return 0; - } - if (fflush(data->fd) != 0) { - ERROR("fflush: %s\n", strerror(errno)); + if (fprintf(data->fd,"%s\r\n", data->buf) < 0) { + ERROR("Error writing to %s: %s\n", PICCDEV, strerror(errno)); return 0; } + if (fflush(data->fd) != 0) + ERROR("Warning, fflush failed: %s\n", strerror(errno)); return 1; @@ -228,7 +227,6 @@ static int picc_send_rapdu(void *driver_data, struct rf_driver driver_openpicc = { - .data = NULL, .connect = picc_connect, .disconnect = picc_disconnect, .receive_capdu = picc_receive_capdu, diff --git a/pcsc-relay/src/pcsc-relay.c b/pcsc-relay/src/pcsc-relay.c index 934f652..8ad0847 100644 --- a/pcsc-relay/src/pcsc-relay.c +++ b/pcsc-relay/src/pcsc-relay.c @@ -59,6 +59,7 @@ static int dodaemon = 1; int verbose = 0; static unsigned int readernum = 0; static struct rf_driver *driver = &driver_openpicc; +static driver_data_t *driver_data = NULL; static LPSTR readers = NULL; @@ -66,12 +67,12 @@ static SCARDCONTEXT hContext = 0; static SCARDHANDLE hCard = 0; /* Forward declaration */ -static void daemonize(); +static void daemonize(void); static void cleanup_exit(int signo); static void cleanup(void); -void daemonize() { +void daemonize(void) { pid_t pid, sid; /* Fork and continue as child process */ @@ -117,7 +118,8 @@ void cleanup_exit(int signo){ } void cleanup(void) { - driver->disconnect(driver->data); + driver->disconnect(driver_data); + driver_data = NULL; pcsc_disconnect(hContext, hCard, readers); } @@ -195,12 +197,6 @@ int main (int argc, char **argv) } - if (dodaemon) { - verbose = -1; - daemonize(); - } - - /* Register signal handlers */ new_sig.sa_handler = cleanup_exit; sigemptyset(&new_sig.sa_mask); @@ -213,7 +209,7 @@ int main (int argc, char **argv) /* Open the device */ - if (!driver->connect(&driver->data)) + if (!driver->connect(&driver_data)) goto err; @@ -224,9 +220,16 @@ int main (int argc, char **argv) goto err; + if (dodaemon) { + INFO("Forking to background...\n"); + verbose = -1; + daemonize(); + } + + while(1) { /* get C-APDU */ - if (!driver->receive_capdu(driver->data, &buf, &buflen)) + if (!driver->receive_capdu(driver_data, &buf, &buflen)) goto err; if (!buflen || !buf) continue; @@ -246,10 +249,11 @@ int main (int argc, char **argv) if (verbose >= 0) printb("R-APDU:\n", outputBuffer, outputLength); - if (!driver->send_rapdu(driver->data, outputBuffer, outputLength)) + if (!driver->send_rapdu(driver_data, outputBuffer, outputLength)) goto err; } + err: cleanup(); diff --git a/pcsc-relay/src/pcsc-relay.h b/pcsc-relay/src/pcsc-relay.h index 74e39f6..2ce58d0 100644 --- a/pcsc-relay/src/pcsc-relay.h +++ b/pcsc-relay/src/pcsc-relay.h @@ -27,13 +27,13 @@ extern "C" { #endif +typedef void driver_data_t; struct rf_driver { - void *data; - int (*connect) (void **driver_data); - int (*disconnect) (void *driver_data); - int (*receive_capdu) (void *driver_data, + int (*connect) (driver_data_t **driver_data); + int (*disconnect) (driver_data_t *driver_data); + int (*receive_capdu) (driver_data_t *driver_data, unsigned char **capdu, size_t *len); - int (*send_rapdu) (void *driver_data, + int (*send_rapdu) (driver_data_t *driver_data, const unsigned char *rapdu, size_t len); };