diff -ru curl-7.17.0/include/curl/curl.h curl-7.17.0.local/include/curl/curl.h
--- curl-7.17.0/include/curl/curl.h	2007-09-02 14:53:15.000000000 -0700
+++ curl-7.17.0.local/include/curl/curl.h	2007-10-01 17:26:17.000000000 -0700
@@ -246,6 +246,18 @@
                                      curl_socket_t curlfd,
                                      curlsocktype purpose);
 
+struct Curl_sockaddr {
+                                     int family;
+                                     int socktype;
+                                     int protocol;
+                                     socklen_t addrlen;
+                                     struct sockaddr addr;
+};
+
+typedef curl_socket_t (*curl_opensocket_callback)(void* clentp,
+                                     curlsocktype purpose,
+                                     struct Curl_sockaddr* address);
+
 #ifndef CURL_NO_OLDIES
   /* not used since 7.10.8, will be removed in a future release */
 typedef int (*curl_passwd_callback)(void *clientp,
@@ -1124,6 +1136,12 @@
   CINIT(NEW_FILE_PERMS, LONG, 159),
   CINIT(NEW_DIRECTORY_PERMS, LONG, 160),
 
+  /* callback function for opening socket (instead of socket(2))
+     Optionally, callback is able change the address or refuse to connect returning CURL_SOCKET_BAD. 
+     The callback should have type curl_opensocket_callback */
+  CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 161),
+  CINIT(OPENSOCKETDATA, OBJECTPOINT, 162),
+
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
 
diff -ru curl-7.17.0/lib/connect.c curl-7.17.0.local/lib/connect.c
--- curl-7.17.0/lib/connect.c	2007-09-06 00:41:45.000000000 -0700
+++ curl-7.17.0.local/lib/connect.c	2007-10-01 18:29:39.000000000 -0700
@@ -677,14 +677,30 @@
   struct SessionHandle *data = conn->data;
   curl_socket_t sockfd;
   CURLcode res;
+  char addr_storage[sizeof(struct Curl_sockaddr)-sizeof(struct sockaddr)+sizeof(struct Curl_sockaddr_storage)];
+  struct Curl_sockaddr* addr=(struct Curl_sockaddr*)&addr_storage;
 
-  sockfd = socket(ai->ai_family, conn->socktype, ai->ai_protocol);
+  addr->family=ai->ai_family;
+  addr->socktype=conn->socktype;
+  addr->protocol=ai->ai_protocol;
+  addr->addrlen=(ai->ai_addrlen<=sizeof(struct Curl_sockaddr_storage))?ai->ai_addrlen:sizeof(struct Curl_sockaddr_storage);
+  memcpy(&addr->addr, ai->ai_addr, addr->addrlen);
+
+  sockfd = (data->set.fopensocket)?
+    data->set.fopensocket(data->set.opensocket_client, CURLSOCKTYPE_IPCXN, &addr)
+    :socket(addr->family, addr->socktype, addr->protocol);
   if (sockfd == CURL_SOCKET_BAD)
     return CURL_SOCKET_BAD;
 
   *connected = FALSE; /* default is not connected */
 
-  Curl_printable_address(ai, addr_buf, sizeof(addr_buf));
+  /* FIXME: do we have Curl_printable_address-like with struct sockaddr* as argument? */
+  const void *iptoprint = &((const struct sockaddr_in*)(&addr->addr))->sin_addr;
+#ifdef ENABLE_IPV6
+  if(addr->family==AF_INET6)
+    iptoprint= &((const struct sockaddr_in6*)(&addr->addr))->sin6_addr;
+#endif
+  Curl_inet_ntop(addr->family, iptoprint, addr_buf, sizeof(addr_buf));
   infof(data, "  Trying %s... ", addr_buf);
 
   if(data->set.tcp_nodelay)
@@ -715,7 +731,7 @@
 
   /* Connect TCP sockets, bind UDP */
   if(conn->socktype == SOCK_STREAM)
-    rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
+    rc = connect(sockfd, &addr->addr, addr->addrlen);
   else
     rc = 0;
 
diff -ru curl-7.17.0/lib/url.c curl-7.17.0.local/lib/url.c
--- curl-7.17.0/lib/url.c	2007-09-02 14:53:15.000000000 -0700
+++ curl-7.17.0.local/lib/url.c	2007-10-01 17:30:56.000000000 -0700
@@ -1806,6 +1806,20 @@
     data->set.sockopt_client = va_arg(param, void *);
     break;
 
+  case CURLOPT_OPENSOCKETFUNCTION:
+    /*
+     * socket callback function: called after socket() but before connect()
+     */
+    data->set.fopensocket = va_arg(param, curl_opensocket_callback);
+    break;
+
+  case CURLOPT_OPENSOCKETDATA:
+    /*
+     * socket callback data pointer. Might be NULL.
+     */
+    data->set.opensocket_client = va_arg(param, void *);
+    break;
+
   case CURLOPT_SSL_SESSIONID_CACHE:
     data->set.ssl.sessionid = (bool)(0 != va_arg(param, long));
     break;
diff -ru curl-7.17.0/lib/urldata.h curl-7.17.0.local/lib/urldata.h
--- curl-7.17.0/lib/urldata.h	2007-09-02 14:53:15.000000000 -0700
+++ curl-7.17.0.local/lib/urldata.h	2007-10-01 17:28:54.000000000 -0700
@@ -1312,6 +1312,8 @@
   curl_ioctl_callback ioctl_func;  /* function for I/O control */
   curl_sockopt_callback fsockopt;  /* function for setting socket options */
   void *sockopt_client; /* pointer to pass to the socket options callback */
+  curl_opensocket_callback fopensocket; /* function for checking/translating the address and opening the socket */
+  void* opensocket_client;
 
   /* the 3 curl_conv_callback functions below are used on non-ASCII hosts */
   /* function to convert from the network encoding: */
