[pacman-dev] [PATCH] dload: use curl's keepalive mechanism

Dave Reisner dreisner at archlinux.org
Mon Nov 7 15:21:22 UTC 2016


This does exactly the same thing as it code it replaces, but punt to
curl to do it for brevity. Requires curl 7.25.0, which we already cover.
---
 lib/libalpm/dload.c | 46 +++-------------------------------------------
 1 file changed, 3 insertions(+), 43 deletions(-)

diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 9d80358..ccd70d9 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -246,47 +246,6 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
 	return realsize;
 }
 
-static int dload_sockopt_cb(void *userdata, curl_socket_t curlfd,
-		curlsocktype purpose)
-{
-	alpm_handle_t *handle = userdata;
-	int optval = 1;
-
-	/* this whole method is to prevent FTP control connections from going sour
-	 * during a long data transfer; crappy firewalls love to drop otherwise idle
-	 * connections if there is no traffic. */
-	if(purpose != CURLSOCKTYPE_IPCXN) {
-		return 0;
-	}
-
-	/* don't abort operation if any setsockopt fails, just log to debug */
-	if(setsockopt(curlfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&optval,
-				sizeof(optval)) < 0) {
-		_alpm_log(handle, ALPM_LOG_DEBUG,
-				"Failed to set SO_KEEPALIVE on fd %d\n", curlfd);
-	}
-	else {
-#ifdef TCP_KEEPIDLE
-		optval = 60;
-		if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPIDLE, (void *)&optval,
-					sizeof(optval)) < 0) {
-			_alpm_log(handle, ALPM_LOG_DEBUG,
-					"Failed to set TCP_KEEPIDLE on fd %d\n", curlfd);
-		}
-#endif
-#ifdef TCP_KEEPINTVL
-		optval = 60;
-		if(setsockopt(curlfd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&optval,
-					sizeof(optval)) < 0) {
-			_alpm_log(handle, ALPM_LOG_DEBUG,
-					"Failed to set TCP_KEEPINTVL on fd %d\n", curlfd);
-		}
-#endif
-	}
-
-	return 0;
-}
-
 static void curl_set_handle_opts(struct dload_payload *payload,
 		CURL *curl, char *error_buffer)
 {
@@ -310,8 +269,9 @@ static void curl_set_handle_opts(struct dload_payload *payload,
 	curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, dload_parseheader_cb);
 	curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)payload);
 	curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
-	curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, dload_sockopt_cb);
-	curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, (void *)handle);
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 60L);
+	curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
 	curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 
 	_alpm_log(handle, ALPM_LOG_DEBUG, "url: %s\n", payload->fileurl);
-- 
2.10.2


More information about the pacman-dev mailing list