aboutsummaryrefslogtreecommitdiff
path: root/lib/ftp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ftp.c')
-rw-r--r--lib/ftp.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index c1dc6689a..e5b1682fc 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -753,6 +753,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
unsigned short port_min = 0;
unsigned short port_max = 0;
unsigned short port;
+ bool possibly_non_local = TRUE;
char *addr = NULL;
@@ -869,6 +870,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
break;
}
host = hbuf; /* use this host name */
+ possibly_non_local = FALSE; /* we know it is local now */
}
/* resolv ip/host to ip */
@@ -932,12 +934,12 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
if(bind(portsock, sa, sslen) ) {
/* It failed. */
error = SOCKERRNO;
- if(error == EADDRNOTAVAIL) {
-
+ if(possibly_non_local && (error == EADDRNOTAVAIL)) {
/* The requested bind address is not local. Use the address used for
* the control connection instead and restart the port loop
*/
- failf(data, "bind(port=%hu) failed: %s", port,
+
+ infof(data, "bind(port=%hu) on non-local address failed: %s", port,
Curl_strerror(conn, error) );
sslen = sizeof(ss);
@@ -948,6 +950,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
return CURLE_FTP_PORT_FAILED;
}
port = port_min;
+ possibly_non_local = FALSE; /* don't try this again */
continue;
}
else if(error != EADDRINUSE && error != EACCES) {