Spurious EWOULDBLOCKs on NT4.0

Christopher Faylor cgf@redhat.com
Mon Oct 29 21:38:00 GMT 2001

I thought that I would try to duplicate the ftpd/rsync problems on
my laptop under NT4.0.  However, I'm now noticing that I'm getting
occasional EWOULDBLOCK/EAGAIN errors from ssh.  I repeatedly get
them when copying a 1K+ file, on close.  Not every time, though.

The actual winsock error is WSAEWOULDBLOCK.

I think that this is due to the relatively "recent" addition of the
setsockopt(...LINGER...) in fhandler_socket::close.  This is borne out
by the fact that I can't duplicate the problem in 1.3.2.

The code below seems to "fix" this problem but I'm not sure it is
correct.  According to SUSv2, close is supposed to be a quick operation
unless SO_LINGER is used...

Hmm.  In fact, it must be wrong since this could make close block

Another way of doing this is to ignore WSAEWOULDBLOCK errors in
fhandler_socket::close.  Maybe that's more correct.

Anyone know what's happening here?  Corinna?


Index: fhandler_socket.cc
RCS file: /cvs/uberbaum/winsup/cygwin/fhandler_socket.cc,v
retrieving revision 1.32
diff -u -p -r1.32 fhandler_socket.cc
--- fhandler_socket.cc	2001/10/29 05:28:24	1.32
+++ fhandler_socket.cc	2001/10/30 05:30:36
@@ -287,11 +287,9 @@ fhandler_socket::close ()
   setsockopt (get_socket (), SOL_SOCKET, SO_LINGER,
 	      (const char *)&linger, sizeof linger);
-  if (closesocket (get_socket ()))
-    {
-      set_winsock_errno ();
-      res = -1;
-    }
+  while (closesocket (get_socket ())
+         && WSAGetLastError () == WSAEWOULDBLOCK)
+    continue;
   close_secret_event ();

More information about the Cygwin-developers mailing list