diff options
author | Yang Tse <yangsita@gmail.com> | 2010-11-30 22:14:37 +0100 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2010-11-30 22:14:37 +0100 |
commit | 11cddb68e0ff73c8297b85e51bebaf6f968a8d62 (patch) | |
tree | 92c287a27561496b0be9f35faba35ef9c6bcc580 /lib/connect.c | |
parent | 1b2b93e0746ed09daf62ffc55cff1dcaaa3dff09 (diff) |
fix getinfo CURLINFO_LOCAL* for reused connections (take 2)
Diffstat (limited to 'lib/connect.c')
-rw-r--r-- | lib/connect.c | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/lib/connect.c b/lib/connect.c index 3d829f7b7..0e5a73cb0 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -532,6 +532,16 @@ static CURLcode trynextip(struct connectdata *conn, return CURLE_COULDNT_CONNECT; } +/* Copies connection info into the session handle to make it available + when the session handle is no longer associated with a connection. */ +void Curl_persistconninfo(struct connectdata *conn) +{ + memcpy(conn->data->info.conn_primary_ip, conn->primary_ip, MAX_IPADR_LEN); + memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN); + conn->data->info.conn_primary_port = conn->primary_port; + conn->data->info.conn_local_port = conn->local_port; +} + /* retrieves ip address and port from a sockaddr structure */ static bool getaddressinfo(struct sockaddr* sa, char* addr, long* port) @@ -587,43 +597,45 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd) struct Curl_sockaddr_storage ssrem; struct Curl_sockaddr_storage ssloc; struct SessionHandle *data = conn->data; - struct PureInfo *info = &conn->data->info; - if(conn->bits.reuse) - /* reusing same connection */ - return; + if(!conn->bits.reuse) { - len = sizeof(struct Curl_sockaddr_storage); - if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) { - error = SOCKERRNO; - failf(data, "getpeername() failed with errno %d: %s", - error, Curl_strerror(conn, error)); - return; - } + len = sizeof(struct Curl_sockaddr_storage); + if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) { + error = SOCKERRNO; + failf(data, "getpeername() failed with errno %d: %s", + error, Curl_strerror(conn, error)); + return; + } - len = sizeof(struct Curl_sockaddr_storage); - if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) { - error = SOCKERRNO; - failf(data, "getsockname() failed with errno %d: %s", - error, Curl_strerror(conn, error)); - return; - } + len = sizeof(struct Curl_sockaddr_storage); + if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) { + error = SOCKERRNO; + failf(data, "getsockname() failed with errno %d: %s", + error, Curl_strerror(conn, error)); + return; + } - if(!getaddressinfo((struct sockaddr*)&ssrem, - info->primary_ip, &info->primary_port)) { - error = ERRNO; - failf(data, "ssrem inet_ntop() failed with errno %d: %s", - error, Curl_strerror(conn, error)); - return; - } + if(!getaddressinfo((struct sockaddr*)&ssrem, + conn->primary_ip, &conn->primary_port)) { + error = ERRNO; + failf(data, "ssrem inet_ntop() failed with errno %d: %s", + error, Curl_strerror(conn, error)); + return; + } + + if(!getaddressinfo((struct sockaddr*)&ssloc, + conn->local_ip, &conn->local_port)) { + error = ERRNO; + failf(data, "ssloc inet_ntop() failed with errno %d: %s", + error, Curl_strerror(conn, error)); + return; + } - if(!getaddressinfo((struct sockaddr*)&ssloc, - info->local_ip, &info->local_port)) { - error = ERRNO; - failf(data, "ssloc inet_ntop() failed with errno %d: %s", - error, Curl_strerror(conn, error)); - return; } + + /* persist connection info in session handle */ + Curl_persistconninfo(conn); } /* @@ -865,14 +877,16 @@ singleipconnect(struct connectdata *conn, /* store remote address and port used in this connection attempt */ if(!getaddressinfo((struct sockaddr*)&addr.sa_addr, - data->info.primary_ip, &data->info.primary_port)) { + conn->primary_ip, &conn->primary_port)) { error = ERRNO; failf(data, "sa_addr inet_ntop() failed with errno %d: %s", error, Curl_strerror(conn, error)); } - strcpy(conn->ip_addr_str, data->info.primary_ip); + memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN); infof(data, " Trying %s... ", conn->ip_addr_str); + Curl_persistconninfo(conn); + #ifdef ENABLE_IPV6 if(addr.family == AF_INET6) conn->bits.ipv6 = TRUE; |