[Pcsclite-cvs-commit] Drivers/ccid/src ccid_serial.c,1.2,1.3
rousseau@quantz.debian.org
rousseau@quantz.debian.org
Mon, 22 Sep 2003 16:24:29 +0200
Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory quantz:/tmp/cvs-serv19181/src
Modified Files:
ccid_serial.c
Log Message:
ReadChunk() realy reads up to min_length bytes. Add some debug messages
in the state automata.
Index: ccid_serial.c
===================================================================
RCS file: /cvsroot/pcsclite/Drivers/ccid/src/ccid_serial.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ccid_serial.c 19 Sep 2003 12:08:09 -0000 1.2
+++ ccid_serial.c 22 Sep 2003 14:24:26 -0000 1.3
@@ -204,6 +204,7 @@
echo = TRUE;
start:
+ DEBUG_COMM("start");
if ((rv = get_bytes(lun, &c, 1)) != STATUS_SUCCESS)
return rv;
@@ -214,12 +215,16 @@
goto sync;
if (c >= 0x80)
+ {
+ DEBUG_COMM2("time request: 0x%02X", c);
goto start;
+ }
DEBUG_CRITICAL2("Got 0x%02X", c);
return STATUS_COMM_ERROR;
slot_change:
+ DEBUG_COMM("slot change");
if ((rv = get_bytes(lun, &c, 1)) != STATUS_SUCCESS)
return rv;
@@ -233,6 +238,7 @@
goto start;
sync:
+ DEBUG_COMM("sync");
if ((rv = get_bytes(lun, &c, 1)) != STATUS_SUCCESS)
return rv;
@@ -246,6 +252,7 @@
return STATUS_COMM_ERROR;
nak:
+ DEBUG_COMM("nak");
if ((rv = get_bytes(lun, &c, 1)) != STATUS_SUCCESS)
return rv;
@@ -258,6 +265,7 @@
goto start;
ack:
+ DEBUG_COMM("ack");
/* normal CCID frame */
if ((rv = get_bytes(lun, buffer, 5)) != STATUS_SUCCESS)
return rv;
@@ -265,13 +273,20 @@
/* total frame size */
to_read = 10+dw2i(buffer, 1);
+ DEBUG_COMM2("frame size: %d", to_read);
if ((rv = get_bytes(lun, buffer+5, to_read-5)) != STATUS_SUCCESS)
return rv;
+#ifdef DEBUG_LEVEL_COMM
+ DEBUG_XXD("frame: ", buffer, to_read);
+#endif
+
/* lrc */
+ DEBUG_COMM("lrc");
if ((rv = get_bytes(lun, &c, 1)) != STATUS_SUCCESS)
return rv;
+ DEBUG_COMM2("lrc: 0x%02X", c);
for (i=0; i<to_read; i++)
c ^= buffer[i];
@@ -301,9 +316,12 @@
int offset = serialDevice[LunToReaderIndex(lun)].buffer_offset;
int offset_last = serialDevice[LunToReaderIndex(lun)].buffer_offset_last;
+ DEBUG_COMM3("get_bytes: available: %d, needed: %d", offset_last-offset,
+ length);
/* enough data are available */
if (offset + length <= offset_last)
{
+ DEBUG_COMM("get_bytes: data available");
memcpy(buffer, serialDevice[LunToReaderIndex(lun)].buffer + offset, length);
serialDevice[LunToReaderIndex(lun)].buffer_offset += length;
}
@@ -315,9 +333,14 @@
present = offset_last - offset;
if (present > 0)
- memcpy(buffer, serialDevice[LunToReaderIndex(lun)].buffer + offset, present);
+ {
+ DEBUG_COMM2("get_bytes: some data available: %d", present);
+ memcpy(buffer, serialDevice[LunToReaderIndex(lun)].buffer + offset,
+ present);
+ }
/* get fresh data */
+ DEBUG_COMM2("get_bytes: get more data: %d", length - present);
rv = ReadChunk(lun, serialDevice[LunToReaderIndex(lun)].buffer, sizeof(serialDevice[LunToReaderIndex(lun)].buffer), length - present);
if (rv < 0)
return STATUS_COMM_ERROR;
@@ -327,10 +350,11 @@
length - present);
serialDevice[LunToReaderIndex(lun)].buffer_offset = length - present;
serialDevice[LunToReaderIndex(lun)].buffer_offset_last = rv;
+ DEBUG_COMM3("get_bytes: offset: %d, last_offset: %d",
+ serialDevice[LunToReaderIndex(lun)].buffer_offset,
+ serialDevice[LunToReaderIndex(lun)].buffer_offset_last);
}
-DEBUG_XXD("pouet: ", buffer, length);
-
return STATUS_SUCCESS;
} /* get_bytes */
@@ -345,53 +369,53 @@
int fd = serialDevice[LunToReaderIndex(lun)].fd;
fd_set fdset;
struct timeval t;
- int i, rv;
+ int i, rv = 0;
+ int already_read;
#ifdef DEBUG_LEVEL_COMM
char debug_header[] = "<- 121234 ";
sprintf(debug_header, "<- %06X ", (int)lun);
#endif
- /* use select() to, eventually, timeout */
- FD_ZERO(&fdset);
- FD_SET(fd, &fdset);
- t.tv_sec = SERIAL_TIMEOUT;
- t.tv_usec = 0;
-
- i = select(fd+1, &fdset, NULL, NULL, &t);
- if (i == -1)
+ already_read = 0;
+ while (already_read < min_length)
{
- DEBUG_CRITICAL2("select: %s", strerror(errno));
- return -1;
- }
- else
- if (i == 0)
+ /* use select() to, eventually, timeout */
+ FD_ZERO(&fdset);
+ FD_SET(fd, &fdset);
+ t.tv_sec = SERIAL_TIMEOUT;
+ t.tv_usec = 0;
+
+ i = select(fd+1, &fdset, NULL, NULL, &t);
+ if (i == -1)
{
- DEBUG_COMM2("Timeout! (%d sec)", SERIAL_TIMEOUT);
+ DEBUG_CRITICAL2("select: %s", strerror(errno));
return -1;
}
+ else
+ if (i == 0)
+ {
+ DEBUG_COMM2("Timeout! (%d sec)", SERIAL_TIMEOUT);
+ return -1;
+ }
- rv = read(fd, buffer, buffer_length);
- if (rv < 0)
- {
- DEBUG_COMM2("read error: %s", strerror(errno));
- return -1;
- }
+ rv = read(fd, buffer + already_read, buffer_length - already_read);
+ if (rv < 0)
+ {
+ DEBUG_COMM2("read error: %s", strerror(errno));
+ return -1;
+ }
#ifdef DEBUG_LEVEL_COMM
- DEBUG_XXD(debug_header, buffer, rv);
+ DEBUG_XXD(debug_header, buffer + already_read, rv);
#endif
- /* too short */
- if (rv < min_length)
- {
- DEBUG_COMM3("ReadSerial: only %d byte(s) read, needed %d", rv,
+ already_read += rv;
+ DEBUG_COMM3("ReadChunk, read: %d, to read: %d", already_read,
min_length);
-
- return -1;
}
- return rv;
+ return already_read;
} /* ReadChunk */