diff options
-rw-r--r-- | sesman/chansrv/pcsc/xrdp_pcsc.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/sesman/chansrv/pcsc/xrdp_pcsc.c b/sesman/chansrv/pcsc/xrdp_pcsc.c index b9ede3fa..35c0b7b4 100644 --- a/sesman/chansrv/pcsc/xrdp_pcsc.c +++ b/sesman/chansrv/pcsc/xrdp_pcsc.c @@ -52,12 +52,11 @@ typedef struct _SCARD_IO_REQUEST #define SCARD_PROTOCOL_T1 0x0002 /**< T=1 active protocol. */ #define SCARD_PROTOCOL_RAW 0x0004 /**< Raw active protocol. */ -PCSC_API SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_T0, 8 }; +PCSC_API SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 }; PCSC_API SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 }; -PCSC_API SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_RAW, 8 }; +PCSC_API SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 }; #define LLOG_LEVEL 5 -//#define LLOG_LEVEL 11 #define LLOGLN(_level, _args) \ do { if (_level < LLOG_LEVEL) { printf _args ; printf("\n"); } } while (0) @@ -268,6 +267,7 @@ get_message(int *code, char *data, int *bytes) char header[8]; int max_bytes; int error; + int recv_rv; int max; int lcode; struct timeval time; @@ -293,7 +293,9 @@ get_message(int *code, char *data, int *bytes) error = select(max, &rd_set, 0, 0, &time); if (error == 1) { - if (recv(g_sck, header, 8, MSG_PEEK) == 8) + /* just take a look at the next message */ + recv_rv = recv(g_sck, header, 8, MSG_PEEK); + if (recv_rv == 8) { lcode = GET_UINT32(header, 4); if (lcode == *code) @@ -301,9 +303,29 @@ get_message(int *code, char *data, int *bytes) /* still have mutex lock */ break; } + else + { + LLOGLN(10, ("get_message: lcode %d *code %d", + lcode, *code)); + } + } + else if (recv_rv == 0) + { + pthread_mutex_unlock(&g_mutex); + LLOGLN(0, ("get_message: recv_rv 0, disconnect")); + return 1; } + else + { + LLOGLN(10, ("get_message: recv_rv %d", recv_rv)); + } + } + else + { + LLOGLN(10, ("get_message: select return %d", error)); } pthread_mutex_unlock(&g_mutex); + usleep(1000); } } |