- added functions for simplified debugging
- changed functions to pass pointers instead of structs and using realloc instead of malloc to reduce memory overhead/usage - changed functions to return opensc-errors to pass printout-debugging to the top level - included functionality of get_RDR_to_PC_Parameters in perform_PC_to_RDR_GetParamters git-svn-id: https://vsmartcard.svn.sourceforge.net/svnroot/vsmartcard@31 96b47cad-a561-4643-ad3b-153ac7d7599c
This commit is contained in:
1022
ccid/ccid.c
1022
ccid/ccid.c
File diff suppressed because it is too large
Load Diff
@@ -265,11 +265,11 @@ struct hid_class_descriptor {
|
|||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
int ccid_initialize(int reader_id, int verbose);
|
int ccid_initialize(int reader_id, int verbose);
|
||||||
int ccid_shutdown();
|
void ccid_shutdown();
|
||||||
|
|
||||||
int ccid_parse_bulkin(const __u8* inbuf, __u8** outbuf);
|
int ccid_parse_bulkin(const __u8* inbuf, __u8** outbuf);
|
||||||
int ccid_parse_control(struct usb_ctrlrequest *setup, __u8 **outbuf);
|
int ccid_parse_control(struct usb_ctrlrequest *setup, __u8 **outbuf);
|
||||||
int ccid_state_changed(RDR_to_PC_NotifySlotChange_t *slotchange);
|
int ccid_state_changed(RDR_to_PC_NotifySlotChange_t **slotchange, int timeout);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
25
ccid/usb.c
25
ccid/usb.c
@@ -940,22 +940,20 @@ static void *ccid (void *param)
|
|||||||
pthread_cleanup_push (close_fd, &status_fd);
|
pthread_cleanup_push (close_fd, &status_fd);
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
RDR_to_PC_NotifySlotChange_t slotchange;
|
RDR_to_PC_NotifySlotChange_t *slotchange;
|
||||||
do {
|
do {
|
||||||
|
|
||||||
/* original LinuxThreads cancelation didn't work right */
|
/* original LinuxThreads cancelation didn't work right */
|
||||||
/* so test for it explicitly. */
|
/* so test for it explicitly. */
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
|
|
||||||
if (ccid_state_changed(&slotchange)) {
|
if (ccid_state_changed(&slotchange, -1)) {
|
||||||
/* don't bother host, when nothing changed */
|
/* don't bother host, when nothing changed */
|
||||||
if (debug)
|
if (debug)
|
||||||
fprintf(stderr, "interrupt loop: writing RDR_to_PC_NotifySlotChange... ");
|
fprintf(stderr, "interrupt loop: writing RDR_to_PC_NotifySlotChange... ");
|
||||||
result = write(status_fd, &slotchange, sizeof slotchange);
|
result = write(status_fd, slotchange, sizeof *slotchange);
|
||||||
if (debug)
|
if (debug)
|
||||||
fprintf(stderr, "done.\n");
|
fprintf(stderr, "done.\n");
|
||||||
}
|
}
|
||||||
sleep(10);
|
|
||||||
} while (result >= 0);
|
} while (result >= 0);
|
||||||
|
|
||||||
if (errno != ESHUTDOWN || result < 0) {
|
if (errno != ESHUTDOWN || result < 0) {
|
||||||
@@ -979,14 +977,6 @@ static void *ccid (void *param)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void close_pcsc()
|
|
||||||
{
|
|
||||||
if (!ccid_shutdown())
|
|
||||||
fprintf(stderr, "pc/sc error\n");
|
|
||||||
else if (verbose)
|
|
||||||
fprintf(stderr, "closed connection\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
char **names = (char **) param;
|
char **names = (char **) param;
|
||||||
char *source_name = names[0];
|
char *source_name = names[0];
|
||||||
char *sink_name = names[1];
|
char *sink_name = names[1];
|
||||||
@@ -1009,7 +999,7 @@ static void *ccid (void *param)
|
|||||||
}
|
}
|
||||||
pthread_cleanup_push (close_fd, &sink_fd);
|
pthread_cleanup_push (close_fd, &sink_fd);
|
||||||
|
|
||||||
pthread_cleanup_push (close_pcsc, NULL);
|
pthread_cleanup_push (ccid_shutdown, NULL);
|
||||||
|
|
||||||
if (doint) {
|
if (doint) {
|
||||||
static char * interruptnames[1];
|
static char * interruptnames[1];
|
||||||
@@ -1027,7 +1017,7 @@ static void *ccid (void *param)
|
|||||||
__u8 *outbuf = NULL;
|
__u8 *outbuf = NULL;
|
||||||
pthread_cleanup_push (free, outbuf);
|
pthread_cleanup_push (free, outbuf);
|
||||||
size_t bufsize = 512;
|
size_t bufsize = 512;
|
||||||
__u8 *inbuf = (__u8 *) malloc(bufsize);
|
__u8 *inbuf = malloc(bufsize);
|
||||||
pthread_cleanup_push (free, inbuf);
|
pthread_cleanup_push (free, inbuf);
|
||||||
if (inbuf == NULL) {
|
if (inbuf == NULL) {
|
||||||
if (debug)
|
if (debug)
|
||||||
@@ -1101,7 +1091,7 @@ static void *hid (void *param)
|
|||||||
__u8 *outbuf = NULL;
|
__u8 *outbuf = NULL;
|
||||||
pthread_cleanup_push (free, outbuf);
|
pthread_cleanup_push (free, outbuf);
|
||||||
size_t bufsize = 512;
|
size_t bufsize = 512;
|
||||||
__u8 *inbuf = (__u8 *) malloc(bufsize);
|
__u8 *inbuf = malloc(bufsize);
|
||||||
pthread_cleanup_push (free, inbuf);
|
pthread_cleanup_push (free, inbuf);
|
||||||
if (inbuf == NULL) {
|
if (inbuf == NULL) {
|
||||||
if (debug)
|
if (debug)
|
||||||
@@ -1507,6 +1497,7 @@ special:
|
|||||||
if (debug)
|
if (debug)
|
||||||
fprintf(stderr, "done.\n");
|
fprintf(stderr, "done.\n");
|
||||||
free(outbuf);
|
free(outbuf);
|
||||||
|
outbuf = NULL; // XXX
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
goto stall;
|
goto stall;
|
||||||
} return;
|
} return;
|
||||||
@@ -1854,7 +1845,7 @@ main (int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ccid_initialize(usb_reader_num, verbose)) {
|
if (ccid_initialize(usb_reader_num, verbose) < 0) {
|
||||||
perror("can't initialize ccid");
|
perror("can't initialize ccid");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user