1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

fix getinfo CURLINFO_LOCAL* for reused connections (take 2) follow-up

- Show address string from proper buffer in case of connection failure.

- Try next address when inet_ntop() fails.
This commit is contained in:
Yang Tse 2010-12-03 14:29:06 +01:00
parent d97fa56fd4
commit 46a0062dff

View File

@ -559,19 +559,21 @@ static bool getaddressinfo(struct sockaddr* sa, char* addr,
case AF_INET: case AF_INET:
si = (struct sockaddr_in*) sa; si = (struct sockaddr_in*) sa;
if(Curl_inet_ntop(sa->sa_family, &si->sin_addr, if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
addr, MAX_IPADR_LEN) == NULL) addr, MAX_IPADR_LEN)) {
return FALSE; us_port = ntohs(si->sin_port);
us_port = ntohs(si->sin_port); *port = us_port;
*port = us_port; return TRUE;
}
break; break;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
case AF_INET6: case AF_INET6:
si6 = (struct sockaddr_in6*)sa; si6 = (struct sockaddr_in6*)sa;
if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr, if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr,
addr, MAX_IPADR_LEN) == NULL) addr, MAX_IPADR_LEN)) {
return FALSE; us_port = ntohs(si6->sin6_port);
us_port = ntohs(si6->sin6_port); *port = us_port;
*port = us_port; return TRUE;
}
break; break;
#endif #endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX) #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
@ -579,13 +581,16 @@ static bool getaddressinfo(struct sockaddr* sa, char* addr,
su = (struct sockaddr_un*)sa; su = (struct sockaddr_un*)sa;
snprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path); snprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
*port = 0; *port = 0;
break; return TRUE;
#endif #endif
default: default:
addr[0] = '\0'; break;
*port = 0;
} }
return TRUE;
addr[0] = '\0';
*port = 0;
return FALSE;
} }
/* retrieves the start/end point information of a socket of an established /* retrieves the start/end point information of a socket of an established
@ -817,7 +822,6 @@ singleipconnect(struct connectdata *conn,
bool *connected) bool *connected)
{ {
struct Curl_sockaddr_ex addr; struct Curl_sockaddr_ex addr;
char addr_buf[128];
int rc; int rc;
int error; int error;
bool isconnected; bool isconnected;
@ -878,9 +882,12 @@ singleipconnect(struct connectdata *conn,
/* store remote address and port used in this connection attempt */ /* store remote address and port used in this connection attempt */
if(!getaddressinfo((struct sockaddr*)&addr.sa_addr, if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
conn->primary_ip, &conn->primary_port)) { conn->primary_ip, &conn->primary_port)) {
/* malformed address or bug in inet_ntop, try next address */
error = ERRNO; error = ERRNO;
failf(data, "sa_addr inet_ntop() failed with errno %d: %s", failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
error, Curl_strerror(conn, error)); error, Curl_strerror(conn, error));
sclose(sockfd);
return CURLE_OK;
} }
memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN); memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
infof(data, " Trying %s... ", conn->ip_addr_str); infof(data, " Trying %s... ", conn->ip_addr_str);
@ -950,7 +957,7 @@ singleipconnect(struct connectdata *conn,
default: default:
/* unknown error, fallthrough and try another address! */ /* unknown error, fallthrough and try another address! */
failf(data, "Failed to connect to %s: %s", failf(data, "Failed to connect to %s: %s",
addr_buf, Curl_strerror(conn,error)); conn->ip_addr_str, Curl_strerror(conn,error));
data->state.os_errno = error; data->state.os_errno = error;
break; break;
} }