* Curl 7.17.1.

* Added a patch to fix --retry in case of connection timeouts when
  --connect-timeout is used.  (--retry is still broken when
  --connect-timeout isn't used.)

svn path=/nixpkgs/trunk/; revision=9956
This commit is contained in:
Eelco Dolstra 2007-12-19 18:39:59 +00:00
parent ab5a39d40b
commit 895f7c9ab4
2 changed files with 170 additions and 3 deletions

View File

@ -0,0 +1,156 @@
diff -rc curl-7.17.1-orig/lib/connect.c curl-7.17.1/lib/connect.c
*** curl-7.17.1-orig/lib/connect.c 2007-10-22 16:30:17.000000000 +0200
--- curl-7.17.1/lib/connect.c 2007-12-19 18:30:32.000000000 +0100
***************
*** 99,105 ****
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai, /* start connecting to this */
long timeout_ms,
! bool *connected);
/*
* Curl_nonblock() set the given socket to either blocking or non-blocking
--- 99,106 ----
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai, /* start connecting to this */
long timeout_ms,
! bool *connected,
! bool *timed_out);
/*
* Curl_nonblock() set the given socket to either blocking or non-blocking
***************
*** 492,497 ****
--- 493,499 ----
{
curl_socket_t sockfd;
Curl_addrinfo *ai;
+ bool timed_out;
/* first close the failed socket */
sclose(conn->sock[sockindex]);
***************
*** 505,511 ****
ai = conn->ip_addr->ai_next;
while (ai) {
! sockfd = singleipconnect(conn, ai, 0L, connected);
if(sockfd != CURL_SOCKET_BAD) {
/* store the new socket descriptor */
conn->sock[sockindex] = sockfd;
--- 507,513 ----
ai = conn->ip_addr->ai_next;
while (ai) {
! sockfd = singleipconnect(conn, ai, 0L, connected, &timed_out);
if(sockfd != CURL_SOCKET_BAD) {
/* store the new socket descriptor */
conn->sock[sockindex] = sockfd;
***************
*** 669,675 ****
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai,
long timeout_ms,
! bool *connected)
{
char addr_buf[128];
int rc;
--- 671,678 ----
singleipconnect(struct connectdata *conn,
const Curl_addrinfo *ai,
long timeout_ms,
! bool *connected,
! bool *timed_out)
{
char addr_buf[128];
int rc;
***************
*** 689,694 ****
--- 692,699 ----
struct curl_sockaddr *addr=(struct curl_sockaddr*)&addr_storage;
const void *iptoprint;
+ *timed_out = FALSE;
+
addr->family=ai->ai_family;
addr->socktype=conn->socktype;
addr->protocol=ai->ai_protocol;
***************
*** 790,797 ****
infof(data, "connected\n");
return sockfd;
}
! else if(WAITCONN_TIMEOUT == rc)
infof(data, "Timeout\n");
else {
data->state.os_errno = error;
infof(data, "%s\n", Curl_strerror(conn, error));
--- 795,804 ----
infof(data, "connected\n");
return sockfd;
}
! else if(WAITCONN_TIMEOUT == rc) {
! *timed_out = TRUE;
infof(data, "Timeout\n");
+ }
else {
data->state.os_errno = error;
infof(data, "%s\n", Curl_strerror(conn, error));
***************
*** 822,829 ****
Curl_addrinfo *ai;
Curl_addrinfo *curr_addr;
int timeout_set = 0;
- struct timeval after;
struct timeval before = Curl_tvnow();
/*************************************************************
--- 829,836 ----
Curl_addrinfo *ai;
Curl_addrinfo *curr_addr;
int timeout_set = 0;
+ bool timed_out;
struct timeval before = Curl_tvnow();
/*************************************************************
***************
*** 891,909 ****
curr_addr = curr_addr->ai_next, aliasindex++) {
/* start connecting to the IP curr_addr points to */
! sockfd = singleipconnect(conn, curr_addr, timeout_per_addr, connected);
if(sockfd != CURL_SOCKET_BAD)
break;
! /* get a new timeout for next attempt */
! after = Curl_tvnow();
! timeout_ms -= Curl_tvdiff(after, before);
! if(timeout_ms < 0) {
failf(data, "connect() timed out!");
return CURLE_OPERATION_TIMEDOUT;
}
- before = after;
} /* end of connect-to-each-address loop */
if (sockfd == CURL_SOCKET_BAD) {
--- 898,914 ----
curr_addr = curr_addr->ai_next, aliasindex++) {
/* start connecting to the IP curr_addr points to */
! sockfd = singleipconnect(conn, curr_addr, timeout_per_addr, connected, &timed_out);
if(sockfd != CURL_SOCKET_BAD)
break;
! /* if this is the last address and it timed out, propagate the
! timeout to the caller */
! if(!curr_addr->ai_next && timed_out) {
failf(data, "connect() timed out!");
return CURLE_OPERATION_TIMEDOUT;
}
} /* end of connect-to-each-address loop */
if (sockfd == CURL_SOCKET_BAD) {

View File

@ -4,10 +4,10 @@ assert zlibSupport -> zlib != null;
assert sslSupport -> openssl != null;
stdenv.mkDerivation {
name = "curl-7.16.2";
name = "curl-7.17.1";
src = fetchurl {
url = http://curl.haxx.se/download/curl-7.16.2.tar.bz2;
sha256 = "18mzp56y8qhlvi27av7866mvsiyiigb7c5qdppjr8qizsj0kx0rf";
url = http://curl.haxx.se/download/curl-7.17.1.tar.bz2;
sha256 = "0yz50r75jhfr2ya6wqi6n90bn4ij30299pjglmlckzq6jp28wrkz";
};
buildInputs =
stdenv.lib.optional zlibSupport zlib ++
@ -19,4 +19,15 @@ stdenv.mkDerivation {
CXX = "g++";
CXXCPP = "g++ -E";
inherit sslSupport openssl;
patches = [
/* Fixes broken retry support when a timeout is used. The
select() system call (used to wait for the connection to come
up) can return slightly before the computed deadline (a few
milliseconds). Curl will think the problem is something else,
proceed with the next IP address (which usually doesn't exist),
then barf with a CURLE_COULDNT_CONNECT error, which is
considered non-transient so it won't retry. */
./connect-timeout.patch
];
}