From cdbba47eee87f9043e18d77e05741be3dc559db0 Mon Sep 17 00:00:00 2001 From: Emmanuel Ledoux Date: Wed, 28 May 2014 17:18:33 +0200 Subject: [PATCH] winpr-comm: CommWriteFile, completed support of WriteTotalTimeout --- channels/serial/client/serial_main.c | 10 +++++++++- winpr/libwinpr/comm/comm_io.c | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/channels/serial/client/serial_main.c b/channels/serial/client/serial_main.c index ae077535f..90b8fe9be 100644 --- a/channels/serial/client/serial_main.c +++ b/channels/serial/client/serial_main.c @@ -265,7 +265,11 @@ static void serial_process_irp_read(SERIAL_DEVICE* serial, IRP* irp) case ERROR_BAD_DEVICE: irp->IoStatus = STATUS_INVALID_DEVICE_REQUEST; break; - + + case ERROR_CANCELLED: + irp->IoStatus = STATUS_CANCELLED; + break; + default: DEBUG_SVC("unexpected last-error: 0x%x", GetLastError()); irp->IoStatus = STATUS_UNSUCCESSFUL; @@ -342,6 +346,10 @@ static void serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp) irp->IoStatus = STATUS_INVALID_DEVICE_REQUEST; break; + case ERROR_CANCELLED: + irp->IoStatus = STATUS_CANCELLED; + break; + default: DEBUG_SVC("unexpected last-error: 0x%x", GetLastError()); irp->IoStatus = STATUS_UNSUCCESSFUL; diff --git a/winpr/libwinpr/comm/comm_io.c b/winpr/libwinpr/comm/comm_io.c index e17cc9110..29eb0a103 100644 --- a/winpr/libwinpr/comm/comm_io.c +++ b/winpr/libwinpr/comm/comm_io.c @@ -318,6 +318,7 @@ BOOL CommWriteFile(HANDLE hDevice, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite { int biggestFd = -1; fd_set event_set, write_set; + int nbFds; biggestFd = pComm->fd_write; if (pComm->fd_write_event > biggestFd) @@ -332,13 +333,22 @@ BOOL CommWriteFile(HANDLE hDevice, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite FD_SET(pComm->fd_write_event, &event_set); FD_SET(pComm->fd_write, &write_set); - if (select(biggestFd+1, &event_set, &write_set, NULL, pTimeout) < 0) + nbFds = select(biggestFd+1, &event_set, &write_set, NULL, pTimeout); + if (nbFds < 0) { DEBUG_WARN("select() failure, errno=[%d] %s\n", errno, strerror(errno)); SetLastError(ERROR_IO_DEVICE); return FALSE; } + if (nbFds == 0) + { + /* timeout */ + + SetLastError(ERROR_TIMEOUT); + return FALSE; + } + /* event_set */ @@ -391,7 +401,8 @@ BOOL CommWriteFile(HANDLE hDevice, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite if (errno == EAGAIN) { - + /* keep on */ + continue; } else if (errno == EBADF) {