Index: src/ne_socket.c
===================================================================
RCS file: /home/cvs/neon/src/ne_socket.c,v
retrieving revision 1.117
diff -u -r1.117 ne_socket.c
--- src/ne_socket.c	7 Oct 2002 21:17:13 -0000	1.117
+++ src/ne_socket.c	23 Dec 2002 18:56:39 -0000
@@ -107,18 +107,26 @@
 #define NEON_WRITE(a,b,c) send(a,b,c,0)
 #define NEON_READ(a,b,c) recv(a,b,c,0)
 #define NEON_CLOSE(s) closesocket(s)
+#define NEON_ERRNO errno
 #elif defined(WIN32)
 #define NEON_WRITE(a,b,c) send(a,b,c,0)
 #define NEON_READ(a,b,c) recv(a,b,c,0)
 #define NEON_CLOSE(s) closesocket(s)
+#define NEON_ERRNO WSAGetLastError()
 #else /* really Unix! */
 #define NEON_WRITE(a,b,c) write(a,b,c)
 #define NEON_READ(a,b,c) read(a,b,c)
 #define NEON_CLOSE(s) close(s)
+#define NEON_ERRNO errno
 #endif
 
-#if !defined(ECONNRESET) && defined(WIN32)
-#define ECONNRESET WSAECONNRESET
+#ifdef WIN32
+#define NE_ISRESET(e) ((e) == WSAECONNABORTED || (e) == WSAETIMEDOUT || \
+                       (e) == WSAECONNRESET || (e) == WSAENETRESET)
+#define NE_ISCLOSED(e) ((e) == WSAESHUTDOWN || (e) == WSAENOTCONN)
+#else /* Unix */
+#define NE_ISRESET(e) ((e) == ECONNRESET)
+#define NE_ISCLOSED(e) ((e) == EPIPE)
 #endif
 
 #ifdef NEON_SSL
@@ -181,8 +189,43 @@
 /* set_error: set socket error string to 'str'. */
 #define set_error(s, str) ne_strnzcpy((s)->error, (str), sizeof (s)->error)
 
-/* set_strerror: set socket error to system error string for 'e' */
+/* set_strerror: set socket error to system error string for 'errnum' */
+#ifdef WIN32
+static void set_strerror(ne_socket *s, int errnum)
+{
+#define ERR(code, str) case code: set_error(s, str); break
+    switch (errnum)
+    {
+        ERR(WSANOTINITIALISED, "A successful WSAStartup call "
+            "must occur before using this function.");
+        ERR(WSAENETDOWN, "The network subsystem has failed.");
+        ERR(WSAEFAULT, "Referenced data outside the process address space");
+        ERR(WSAENOTCONN, "The socket is not connected.");
+        ERR(WSAEINTR, "Call was interrupted.");
+        ERR(WSAEINPROGRESS, "A blocking call is in progess.");
+        ERR(WSAENETRESET, "The connection was reset during "
+            "keep-alive activity.");
+        ERR(WSAENOTSOCK, "The descriptor is not a socket.");
+        ERR(WSAEOPNOTSUPP, "Operation not supported for this socket type.");
+        ERR(WSAESHUTDOWN, "The socket has been shut down.");
+        ERR(WSAEMSGSIZE, "The message was too large to fit into the "
+            "specified buffer and+was truncated.");
+        ERR(WSAEINVAL, "The socket has not been bound with bind, or an "
+            "unknown/unsupported flag/operation was specified.");
+        ERR(WSAECONNABORTED, "The virtual circuit was terminated due to "
+            "a time-out or other failure.");
+        ERR(WSAETIMEDOUT, "The connection has been dropped because of a "
+            "network failure or because the peer system failed to respond.");
+        ERR(WSAECONNRESET, "The virtual circuit was reset by the remote side "
+            "executing a hard or abortive close.");
+    default:
+        ne_snprintf(s->error, sizeof s->error, "Socket error %d", errnum);
+        break;
+    }
+}
+#else /* Unix */
 #define set_strerror(s, e) ne_strerror((e), (s)->error, sizeof (s)->error)
+#endif
 
 void ne_register_progress(ne_socket *sock, ne_progress cb, void *userdata)
 {
@@ -364,7 +407,6 @@
 	    tvp->tv_sec = secs;
 	    tvp->tv_usec = 0;
 	}
-	errno = 0;
 	ret = select(fdno + 1, &rdfds, NULL, NULL, tvp);
     } while (ret < 0 && errno == EINTR);
     if (ret < 0) {
@@ -389,16 +431,16 @@
 	set_error(sock, _("Connection closed"));
 	ret = NE_SOCK_CLOSED;
     } else if (ret < 0) {
-	int errnum = errno;
-	ret = (errnum == ECONNRESET) ? NE_SOCK_RESET : NE_SOCK_ERROR;
+	int errnum = NEON_ERRNO;
+	ret = NE_ISRESET(errnum) ? NE_SOCK_RESET : NE_SOCK_ERROR;
 	set_strerror(sock, errnum);
     }
 
     return ret;
 }
 
-#define MAP_ERR(e) ((e) == EPIPE ? NE_SOCK_CLOSED : \
-((e) == ECONNRESET ? NE_SOCK_RESET : NE_SOCK_ERROR))
+#define MAP_ERR(e) (NE_ISCLOSED(e) ? NE_SOCK_CLOSED : \
+                    (NE_ISRESET(e) ? NE_SOCK_RESET : NE_SOCK_ERROR))
 
 static ssize_t write_raw(ne_socket *sock, const char *data, size_t length) 
 {
@@ -411,7 +453,7 @@
     } while ((wrote > 0 || errno == EINTR) && length > 0);
 
     if (wrote < 0) {
-	int errnum = errno;
+	int errnum = NEON_ERRNO;
 	set_strerror(sock, errnum);
 	return MAP_ERR(errnum);
     }
@@ -455,7 +497,7 @@
 		ret = NE_SOCK_TRUNC;
 	    } else {
 		/* Other socket error. */
-		err = errno;
+		err = NEON_ERRNO;
 		set_strerror(sock, err);
 		ret = MAP_ERR(err);
 	    }


