getinfo: added *_PRIMARY_PORT, *_LOCAL_IP and *_LOCAL_PORT

This commit is contained in:
Frank Meier
2010-06-05 00:29:09 +02:00
committed by Daniel Stenberg
parent 605207a3a6
commit 8098d9417c
10 changed files with 107 additions and 9 deletions

View File

@@ -523,6 +523,50 @@ static bool trynextip(struct connectdata *conn,
return TRUE;
}
/* retrieves ip address and port from a sockaddr structure */
static void getaddressinfo(struct sockaddr* sa, char* addr,
long* port)
{
struct sockaddr_in* si = NULL;
#ifdef ENABLE_IPV6
struct sockaddr_in6* si6 = NULL;
#endif
switch (sa->sa_family) {
case AF_INET:
si = (struct sockaddr_in*) sa;
Curl_inet_ntop(sa->sa_family, &(si->sin_addr), addr, MAX_IPADR_LEN);
*port = ntohs(si->sin_port);
break;
#ifdef ENABLE_IPV6
case AF_INET6:
si6 = (struct sockaddr_in6*)sa;
Curl_inet_ntop(sa->sa_family, &(si6->sin6_addr), addr, MAX_IPADR_LEN);
*port = ntohs(si6->sin6_port);
break;
#endif
default:
addr[0] = '\0';
*port = 0;
}
}
/* retrieves the start/end point information of a socket of an established
connection */
void Curl_updateconninfo(curl_socket_t sockfd, struct PureInfo* info)
{
struct Curl_sockaddr_storage ssrem;
struct Curl_sockaddr_storage ssloc;
socklen_t len = sizeof(struct Curl_sockaddr_storage);
getpeername(sockfd, (struct sockaddr*) &ssrem, &len);
getsockname(sockfd, (struct sockaddr*) &ssloc, &len);
getaddressinfo((struct sockaddr*)&ssrem, info->ip, &info->port);
getaddressinfo((struct sockaddr*)&ssloc, info->localip, &info->localport);
}
/*
* Curl_is_connected() is used from the multi interface to check if the
* firstsocket has connected.
@@ -577,6 +621,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
*connected = TRUE;
Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
Curl_verboseconnect(conn);
Curl_updateconninfo(sockfd, &(data->info));
return CURLE_OK;
}
/* nope, not connected for real */
@@ -866,6 +912,7 @@ singleipconnect(struct connectdata *conn,
/* we are connected, awesome! */
*connected = TRUE; /* this is a true connect */
infof(data, "connected\n");
Curl_updateconninfo(sockfd, &(data->info));
return sockfd;
}
else if(WAITCONN_TIMEOUT == rc)