浏览代码

POSIX error codes (errno.h) are different from WinSock codes (winsock.h)

Both codes are already defined, so we must not use "#if !defined".
xtne6f 6 年之前
父节点
当前提交
ea12f586d6
共有 1 个文件被更改,包括 29 次插入29 次删除
  1. 29 29
      src/civetweb.c

+ 29 - 29
src/civetweb.c

@@ -533,12 +533,6 @@ typedef long off_t;
 #if !defined(W_OK)
 #define W_OK (2) /* http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx */
 #endif
-#if !defined(EWOULDBLOCK)
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#endif /* !EWOULDBLOCK */
-#if !defined(ECONNRESET)
-#define ECONNRESET WSAECONNRESET
-#endif /* !ECONNRESET */
 #define _POSIX_
 #define INT64_FMT "I64d"
 #define UINT64_FMT "I64u"
@@ -8756,7 +8750,7 @@ connect_socket(struct mg_context *ctx /* may be NULL */,
 {
 	int ip_ver = 0;
 	int conn_ret = -1;
-	int ret;
+	int sockerr = 0;
 	*sock = INVALID_SOCKET;
 	memset(sa, 0, sizeof(*sa));
 
@@ -8899,20 +8893,18 @@ connect_socket(struct mg_context *ctx /* may be NULL */,
 	}
 #endif
 
-#if defined(_WIN32)
 	if (conn_ret != 0) {
-		DWORD err = WSAGetLastError(); /* could return WSAEWOULDBLOCK */
-		conn_ret = (int)err;
-#if !defined(EINPROGRESS)
-#define EINPROGRESS (WSAEWOULDBLOCK) /* Winsock equivalent */
-#endif                               /* if !defined(EINPROGRESS) */
+		sockerr = ERRNO;
 	}
-#endif
 
-	if ((conn_ret != 0) && (conn_ret != EINPROGRESS)) {
+#if defined(_WIN32)
+	if ((conn_ret != 0) && (sockerr == WSAEWOULDBLOCK)) {
+#else
+	if ((conn_ret != 0) && (sockerr == EINPROGRESS)) {
+#endif
 		/* Data for getsockopt */
-		int sockerr = -1;
 		void *psockerr = &sockerr;
+		int ret;
 
 #if defined(_WIN32)
 		int len = (int)sizeof(sockerr);
@@ -8955,22 +8947,26 @@ connect_socket(struct mg_context *ctx /* may be NULL */,
 		ret = getsockopt(*sock, SOL_SOCKET, SO_ERROR, psockerr, &len);
 #endif
 
-		if ((ret != 0) || (sockerr != 0)) {
-			/* Not connected */
-			mg_snprintf(NULL,
-			            NULL, /* No truncation check for ebuf */
-			            ebuf,
-			            ebuf_len,
-			            "connect(%s:%d): error %s",
-			            host,
-			            port,
-			            strerror(sockerr));
-			closesocket(*sock);
-			*sock = INVALID_SOCKET;
-			return 0;
+		if ((ret == 0) && (sockerr == 0)) {
+			conn_ret = 0;
 		}
 	}
 
+	if (conn_ret != 0) {
+		/* Not connected */
+		mg_snprintf(NULL,
+		            NULL, /* No truncation check for ebuf */
+		            ebuf,
+		            ebuf_len,
+		            "connect(%s:%d): error %s",
+		            host,
+		            port,
+		            strerror(sockerr));
+		closesocket(*sock);
+		*sock = INVALID_SOCKET;
+		return 0;
+	}
+
 	return 1;
 }
 
@@ -16278,7 +16274,11 @@ close_socket_gracefully(struct mg_connection *conn)
 		                "%s: getsockopt(SOL_SOCKET SO_ERROR) failed: %s",
 		                __func__,
 		                strerror(ERRNO));
+#if defined(_WIN32)
+	} else if (error_code == WSAECONNRESET) {
+#else
 	} else if (error_code == ECONNRESET) {
+#endif
 		/* Socket already closed by client/peer, close socket without linger
 		 */
 	} else {