diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-07-13 18:59:41 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-07-13 18:59:41 +0000 |
commit | f55fc99c77d8ace866a645fbce8b54a12accfa9f (patch) | |
tree | 100bf8d4afdd8eea5deedcd6324562197c16aa8f /winsup/cygwin/fhandler_serial.cc | |
parent | b4efd5410c4b5c1efaff3e9db73738fa3ceda14b (diff) | |
download | cygnal-f55fc99c77d8ace866a645fbce8b54a12accfa9f.tar.gz cygnal-f55fc99c77d8ace866a645fbce8b54a12accfa9f.tar.bz2 cygnal-f55fc99c77d8ace866a645fbce8b54a12accfa9f.zip |
* fhandler_serial.cc (fhandler_serial::raw_read): Handle non-blocking
case more thoroughly.
Diffstat (limited to 'winsup/cygwin/fhandler_serial.cc')
-rw-r--r-- | winsup/cygwin/fhandler_serial.cc | 22 |
1 files changed, 21 insertions, 1 deletions
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; |