diff --git a/CHANGES b/CHANGES
index d6ea8d6a6..3726effe3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,12 @@
Changelog
+Daniel Stenberg (6 Jun 2008)
+- Added CURLINFO_PRIMARY_IP as a new information retrievable with
+ curl_easy_getinfo. It returns a pointer to a string with the most recently
+ used IP address. Modified test case 500 to also verify this feature. The
+ implementing of this feature was sponsored by Lenny Rachitsky at NeuStar.
+
Version 7.18.2 (4 June 2008)
Daniel Fandrich (3 Jun 2008)
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index ed5b6d655..573acce9b 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -10,7 +10,7 @@ Curl and libcurl 7.18.3
This release includes the following changes:
- o
+ o Added CURLINFO_PRIMARY_IP
This release includes the following bugfixes:
@@ -31,6 +31,6 @@ New curl mirrors:
This release would not have looked like this without help, code, reports and
advice from friends like these:
-
+ Lenny Rachitsky
Thanks! (and sorry if I forgot to mention someone)
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index be0f060d4..9837d417d 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -159,6 +159,12 @@ counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
how many times libcurl successfully reused existing connection(s) or not. See
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
to make persistent connections to save time. (Added in 7.12.3)
+.IP CURLINFO_PRIMARY_IP
+Pass a pointer to a char pointer to receive the pointer to a zero-terminated
+string holding the IP address of the most recent connection done with this
+\fBcurl\fP handle. This string may be IPv6 if that's enabled. Note that you
+get a pointer to a memory area that will be re-used at next request so you
+need to copy the string if you want to keep the information. (Added in 7.18.3)
.IP CURLINFO_COOKIELIST
Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all
cookies cURL knows (expired ones, too). Don't forget to
diff --git a/include/curl/curl.h b/include/curl/curl.h
index d87942376..b42f0b31b 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -1596,9 +1596,10 @@ typedef enum {
CURLINFO_LASTSOCKET = CURLINFO_LONG + 29,
CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30,
CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31,
+ CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32,
/* Fill in new entries below here! */
- CURLINFO_LASTONE = 31
+ CURLINFO_LASTONE = 32
} CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
diff --git a/lib/connect.c b/lib/connect.c
index b3928ef1e..e398f61fb 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -775,9 +775,12 @@ singleipconnect(struct connectdata *conn,
/* FIXME: do we have Curl_printable_address-like with struct sockaddr* as
argument? */
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
- if(addr->family==AF_UNIX)
+ if(addr->family==AF_UNIX) {
infof(data, " Trying %s... ",
((const struct sockaddr_un*)(&addr->addr))->sun_path);
+ snprintf(data->info.ip, MAX_IPADR_LEN, "%s",
+ ((const struct sockaddr_un*)(&addr->addr))->sun_path);
+ }
else
#endif
{
@@ -789,8 +792,10 @@ singleipconnect(struct connectdata *conn,
iptoprint = &((const struct sockaddr_in*)(&addr->addr))->sin_addr;
if(Curl_inet_ntop(addr->family, iptoprint, addr_buf,
- sizeof(addr_buf)) != NULL)
+ sizeof(addr_buf)) != NULL) {
infof(data, " Trying %s... ", addr_buf);
+ snprintf(data->info.ip, MAX_IPADR_LEN, "%s", addr_buf);
+ }
}
if(data->set.tcp_nodelay)
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 078154246..bef2ebac4 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -210,6 +210,10 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
option had been enabled! */
*param_charp = data->info.wouldredirect;
break;
+ case CURLINFO_PRIMARY_IP:
+ /* Return the ip address of the most recent (primary) connection */
+ *param_charp = data->info.ip;
+ break;
default:
return CURLE_BAD_FUNCTION_ARGUMENT;
}
diff --git a/lib/urldata.h b/lib/urldata.h
index fa93a6454..1f9d3ebd2 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -48,6 +48,8 @@
#define CURL_DEFAULT_USER "anonymous"
#define CURL_DEFAULT_PASSWORD "ftp@example.com"
+#define MAX_IPADR_LEN (4*9) /* should be enough to hold the longest ipv6 one */
+
#include "cookie.h"
#include "formdata.h"
@@ -1036,6 +1038,9 @@ struct PureInfo {
long numconnects; /* how many new connection did libcurl created */
char *contenttype; /* the content type of the object */
char *wouldredirect; /* URL this would've been redirected to if asked to */
+ char ip[MAX_IPADR_LEN]; /* this buffer gets the numerical ip version stored
+ at the connect *attempt* so it will get the last
+ tried connect IP even on failures */
};
diff --git a/tests/data/test500 b/tests/data/test500
index bf4407fea..33a3a7959 100644
--- a/tests/data/test500
+++ b/tests/data/test500
@@ -32,13 +32,16 @@ lib500
simple libcurl HTTP GET tool
-http://%HOSTIP:%HTTPPORT/500
+http://%HOSTIP:%HTTPPORT/500 log/ip500
#
# Verify data after the test has been "shot"
+
+IP: %HOSTIP
+
GET /500 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
diff --git a/tests/libtest/lib500.c b/tests/libtest/lib500.c
index d22aecdbc..c28f5d0c9 100644
--- a/tests/libtest/lib500.c
+++ b/tests/libtest/lib500.c
@@ -14,6 +14,7 @@ int test(char *URL)
{
CURLcode res;
CURL *curl;
+ char *ipstr=NULL;
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
@@ -31,7 +32,17 @@ int test(char *URL)
res = curl_easy_perform(curl);
- curl_easy_cleanup(curl);
+ if(!res) {
+ FILE *moo;
+ res = curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ipstr);
+ moo = fopen(libtest_arg2, "wb");
+ if(moo) {
+ fprintf(moo, "IP: %s\n", ipstr);
+ fclose(moo);
+ }
+ }
+
+ curl_easy_cleanup(curl);
curl_global_cleanup();
return (int)res;