summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/w32.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/w32.c b/src/w32.c
index d298f47ae99..998f696bdf8 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -8654,6 +8654,19 @@ sys_write (int fd, const void * buffer, unsigned int count)
nchars = pfn_send (SOCK_HANDLE (fd), buffer, count, 0);
+ if (nchars == SOCKET_ERROR)
+ {
+ set_errno ();
+ /* If this is a non-blocking socket whose connection is in
+ progress, return the proper error code to the caller;
+ ENOTCONN is not what they expect . */
+ if (errno == ENOTCONN && (fd_info[fd].flags & FILE_CONNECT) != 0)
+ errno = EWOULDBLOCK;
+ else
+ DebPrint (("sys_write.send failed with error %d on socket %ld\n",
+ pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
+ }
+
/* Set the socket back to non-blocking if it was before,
for other operations that support it. */
if (fd_info[fd].flags & FILE_NDELAY)
@@ -8661,13 +8674,6 @@ sys_write (int fd, const void * buffer, unsigned int count)
nblock = 1;
pfn_ioctlsocket (SOCK_HANDLE (fd), FIONBIO, &nblock);
}
-
- if (nchars == SOCKET_ERROR)
- {
- DebPrint (("sys_write.send failed with error %d on socket %ld\n",
- pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
- set_errno ();
- }
}
else
{