Commit 8fcc67f308e465dc712ef432496d142f0704ae30

Con Kolivas 2012-12-09T13:39:37

Remove dependency on mstcpip.h for windows build by making curl version >= 7.25.0 mandatory on windows builds, and use curl functions for keepalive whenever possible instead.

diff --git a/configure.ac b/configure.ac
index e83f7fe..ad81803 100644
--- a/configure.ac
+++ b/configure.ac
@@ -358,7 +358,13 @@ fi
 AC_SUBST(LIBUSB_LIBS)
 AC_SUBST(LIBUSB_CFLAGS)
 
-PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.18.2], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.18.2])])
+if test "x$have_win32" != xtrue; then
+	PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.25.0], [AC_DEFINE([CURL_HAS_KEEPALIVE], [1], [Defined if version of curl supports keepalive.])],
+		[PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.18.2], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.18.2])])])
+else
+	PKG_CHECK_MODULES([LIBCURL], [libcurl >= 7.25.0], ,[AC_MSG_ERROR([Missing required libcurl dev >= 7.25.0])])
+	AC_DEFINE([CURL_HAS_KEEPALIVE], [1])
+fi
 AC_SUBST(LIBCURL_LIBS)
 
 dnl CCAN wants to know a lot of vars.
diff --git a/util.c b/util.c
index afc1685..33e83c6 100644
--- a/util.c
+++ b/util.c
@@ -29,7 +29,6 @@
 # include <netdb.h>
 #else
 # include <winsock2.h>
-# include <mstcpip.h>
 # include <ws2tcpip.h>
 #endif
 
@@ -196,16 +195,30 @@ out:
 	return ptrlen;
 }
 
-static int keep_sockalive(SOCKETTYPE fd)
+#if CURL_HAS_KEEPALIVE
+static void keep_curlalive(CURL *curl)
 {
 	const int tcp_keepidle = 60;
 	const int tcp_keepintvl = 60;
-	const int keepalive = 1;
-	int ret = 0;
+	const long int keepalive = 1;
 
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, keepalive);
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, tcp_keepidle);
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, tcp_keepintvl);
+}
 
-#ifndef WIN32
+static void keep_alive(CURL *curl, __maybe_unused SOCKETTYPE fd)
+{
+	keep_curlalive(curl);
+}
+#else
+static int keep_sockalive(SOCKETTYPE fd)
+{
+	const int tcp_keepidle = 60;
+	const int tcp_keepintvl = 60;
+	const int keepalive = 1;
 	const int tcp_keepcnt = 5;
+	int ret = 0;
 
 	if (unlikely(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive))))
 		ret = 1;
@@ -228,37 +241,22 @@ static int keep_sockalive(SOCKETTYPE fd)
 
 # endif /* __APPLE_CC__ */
 
-#else /* WIN32 */
-
-	const int zero = 0;
-	struct tcp_keepalive vals;
-	vals.onoff = 1;
-	vals.keepalivetime = tcp_keepidle * 1000;
-	vals.keepaliveinterval = tcp_keepintvl * 1000;
-
-	DWORD outputBytes;
-
-	if (unlikely(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (const char *)&keepalive, sizeof(keepalive))))
-		ret = 1;
-
-	if (unlikely(WSAIoctl(fd, SIO_KEEPALIVE_VALS, &vals, sizeof(vals), NULL, 0, &outputBytes, NULL, NULL)))
-		ret = 1;
+	return ret;
+}
 
-	/* Windows happily submits indefinitely to the send buffer blissfully
-	 * unaware nothing is getting there without gracefully failing unless
-	 * we disable the send buffer */
-	if (unlikely(setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const char *)&zero, sizeof(zero))))
-		ret = 1;
-#endif /* WIN32 */
+static void keep_curlalive(CURL *curl)
+{
+	SOCKETTYPE sock;
 
-	return ret;
+	curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, (long *)&sock);
+	keep_sockalive(sock);
 }
 
-int json_rpc_call_sockopt_cb(void __maybe_unused *userdata, curl_socket_t fd,
-			     curlsocktype __maybe_unused purpose)
+static void keep_alive(CURL __maybe_unused *curl, SOCKETTYPE fd)
 {
-	return keep_sockalive(fd);
+	keep_sockalive(fd);
 }
+#endif
 
 static void last_nettime(struct timeval *last)
 {
@@ -334,7 +332,7 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 		curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 	}
 	if (longpoll)
-		curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, json_rpc_call_sockopt_cb);
+		keep_curlalive(curl);
 	curl_easy_setopt(curl, CURLOPT_POST, 1);
 
 	if (opt_protocol)
@@ -1362,7 +1360,7 @@ bool initiate_stratum(struct pool *pool)
 		goto out;
 	}
 	curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, (long *)&pool->sock);
-	keep_sockalive(pool->sock);
+	keep_alive(curl, pool->sock);
 
 	sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++);
 
diff --git a/windows-build.txt b/windows-build.txt
index 7fcd0af..9de4280 100644
--- a/windows-build.txt
+++ b/windows-build.txt
@@ -44,29 +44,6 @@ I just selected all the check boxes (excluding "Fortran Compiler") so that every
 was installed.
 
 **************************************************************************************
-* Create mstcpip.h                                                                   *
-**************************************************************************************
-Open notepad and copy the following into it. Save it as "\MinGW\include\mstcpip.h".
-Make sure it does not have the ".txt" extension (If it does then rename it).
-
-struct tcp_keepalive
-{
-    u_long onoff;
-    u_long keepalivetime;
-    u_long keepaliveinterval;
-};
-
-#ifndef USE_WS_PREFIX
-
-#define SIO_KEEPALIVE_VALS    _WSAIOW(IOC_VENDOR, 4)
-
-#else
-
-#define WS_SIO_KEEPALIVE_VALS    _WSAIOW(WS_IOC_VENDOR, 4)
-
-#endif
-
-**************************************************************************************
 * Run the MSYS shell for the first time to create your user directory                *
 **************************************************************************************
 (Start Icon/keyboard key ==> All Programs ==> MinGW ==> MinGW Shell).