On Thu, 7 Jan 2010, Adrian Michel wrote:
Unfortunately, I applied the patch and now I get a connection failure error
immediately, even in the case where the unpatched version was able to
connect.
Really? Can you double-check with the new patch I attach here - I updated it
with a proper include so that no compiler warning happens when applied.
I've ran all tests fine with this applied (both with 7.19.7 and current CVS)
and I've also tried very slow connects to see that it still works - and a
bunch of random hosts off the net that I could think of.
I have this fun little test name called 'bad10.haxx.se' which resolves to 5
different IPs, 4 of them are 10.10.10.X (with X being 1 to 4) and one is
127.0.0.1 and the 10.10.10.X ones just get stuck for me so it makes it a fun
test "target". And it seemed to work fine as well.
--
/ daniel.haxx.se
Index: lib/connect.c
===================================================================
RCS file: /cvsroot/curl/curl/lib/connect.c,v
retrieving revision 1.224
diff -u -p -r1.224 connect.c
--- lib/connect.c 30 Dec 2009 17:59:56 -0000 1.224
+++ lib/connect.c 7 Jan 2010 22:51:36 -0000
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <[email protected]>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <[email protected]>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -89,6 +89,7 @@
#include "inet_ntop.h"
#include "inet_pton.h"
#include "sslgen.h" /* for Curl_ssl_check_cxn() */
+#include "progress.h"
/* The last #include file should be: */
#include "memdebug.h"
@@ -192,7 +193,8 @@ long Curl_timeleft(struct connectdata *c
#define WAITCONN_FDSET_ERROR 2
static
-int waitconnect(curl_socket_t sockfd, /* socket */
+int waitconnect(struct connectdata *conn,
+ curl_socket_t sockfd, /* socket */
long timeout_msec)
{
int rc;
@@ -203,21 +205,34 @@ int waitconnect(curl_socket_t sockfd, /*
(void)verifyconnect(sockfd, NULL);
#endif
- /* now select() until we get connect or timeout */
- rc = Curl_socket_ready(CURL_SOCKET_BAD, sockfd, (int)timeout_msec);
- if(-1 == rc)
- /* error, no connect here, try next */
- return WAITCONN_SELECT_ERROR;
-
- else if(0 == rc)
- /* timeout, no connect today */
- return WAITCONN_TIMEOUT;
-
- if(rc & CURL_CSELECT_ERR)
- /* error condition caught */
- return WAITCONN_FDSET_ERROR;
+ while(1) {
- /* we have a connect! */
+ /* now select() until we get connect or timeout */
+ rc = Curl_socket_ready(CURL_SOCKET_BAD, sockfd, (int)(timeout_msec>1000?
+ 1000:timeout_msec));
+
+ if(Curl_pgrsUpdate(conn))
+ return CURLE_ABORTED_BY_CALLBACK;
+
+ if(-1 == rc)
+ /* error, no connect here, try next */
+ return WAITCONN_SELECT_ERROR;
+
+ else if(0 == rc) {
+ /* timeout */
+ timeout_msec -= 1000;
+ if(timeout_msec <= 0)
+ return WAITCONN_TIMEOUT;
+
+ continue;
+ }
+
+ if(rc & CURL_CSELECT_ERR)
+ /* error condition caught */
+ return WAITCONN_FDSET_ERROR;
+
+ break;
+ }
return WAITCONN_CONNECTED;
}
@@ -553,7 +568,7 @@ CURLcode Curl_is_connected(struct connec
Curl_expire(data, allow);
/* check for connect without timeout as we want to return immediately */
- rc = waitconnect(sockfd, 0);
+ rc = waitconnect(conn, sockfd, 0);
if(WAITCONN_CONNECTED == rc) {
int error;
@@ -823,7 +838,7 @@ singleipconnect(struct connectdata *conn
case EAGAIN:
#endif
#endif
- rc = waitconnect(sockfd, timeout_ms);
+ rc = waitconnect(conn, sockfd, timeout_ms);
break;
default:
/* unknown error, fallthrough and try another address! */
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html