From f55fc99c77d8ace866a645fbce8b54a12accfa9f Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 13 Jul 2011 18:59:41 +0000 Subject: [PATCH] * fhandler_serial.cc (fhandler_serial::raw_read): Handle non-blocking case more thoroughly. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/fhandler_serial.cc | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 64347c435..0839a5fef 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2011-07-13 Corinna Vinschen + + * fhandler_serial.cc (fhandler_serial::raw_read): Handle non-blocking + case more thoroughly. + 2011-07-13 Christopher Faylor * setup_handler (setup_handler): Change break to goto out, missed in diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc index f8c8ab5c6..24df7c386 100644 --- a/winsup/cygwin/fhandler_serial.cc +++ b/winsup/cygwin/fhandler_serial.cc @@ -81,7 +81,17 @@ fhandler_serial::raw_read (void *ptr, size_t& ulen) } else if (GetLastError () != ERROR_IO_PENDING) goto err; - else if (!is_nonblocking ()) + else if (is_nonblocking ()) + { + PurgeComm (get_handle (), PURGE_RXABORT); + if (tot == 0) + { + tot = -1; + set_errno (EAGAIN); + } + goto out; + } + else { HANDLE w4[3] = { io_status.hEvent, signal_arrived, pthread::get_cancel_event () }; @@ -124,6 +134,16 @@ restart: /* Got something */; else if (GetLastError () != ERROR_IO_PENDING) goto err; + else if (is_nonblocking ()) + { + PurgeComm (get_handle (), PURGE_RXABORT); + if (tot == 0) + { + tot = -1; + set_errno (EAGAIN); + } + goto out; + } else if (!GetOverlappedResult (get_handle (), &io_status, &n, TRUE)) goto err;