summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_serial.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2011-07-13 18:59:41 +0000
committerCorinna Vinschen <corinna@vinschen.de>2011-07-13 18:59:41 +0000
commitf55fc99c77d8ace866a645fbce8b54a12accfa9f (patch)
tree100bf8d4afdd8eea5deedcd6324562197c16aa8f /winsup/cygwin/fhandler_serial.cc
parentb4efd5410c4b5c1efaff3e9db73738fa3ceda14b (diff)
downloadcygnal-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.cc22
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;