]> granicus.if.org Git - curl/commitdiff
Enabled support for IPv6-style IP-addresses if ENABLE_IPV6 is set. If it isn't,
authorDaniel Stenberg <daniel@haxx.se>
Tue, 23 Jan 2001 10:21:30 +0000 (10:21 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 23 Jan 2001 10:21:30 +0000 (10:21 +0000)
curl will return an error when such an address is used.

lib/url.c

index ab50613a34a8f32445d7115384e0525746eec10c..4c990d28c6b102b0a1ad8b266074182d1c12459d 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -635,6 +635,7 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect)
   char resumerange[40]="";
   struct UrlData *data = curl;
   struct connectdata *conn;
+  char endbracket;
 #ifdef HAVE_SIGACTION
   struct sigaction sigact;
 #endif
@@ -1146,15 +1147,40 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect)
     }
   }
 
+  /* No matter if we use a proxy or not, we have to figure out the remote
+     port number of various reasons.
+     
+     To be able to detect port number flawlessly, we must not confuse them
+     IPv6-specified addresses in the [0::1] style.
+  */
+  if((1 == sscanf(conn->name, "[%*39[0-9a-fA-F:]%c", &endbracket)) &&
+     (']' == endbracket)) {
+    /* this is a IPv6-style specified IP-address */
+#ifndef ENABLE_IPV6
+    failf(data, "You haven't enabled IPv6 support");
+    return CURLE_URL_MALFORMAT;
+#else
+    tmp = strchr(conn->name, ']');
+
+    tmp++; /* pass the ending bracket */
+    if(':' != *tmp)
+      tmp = NULL; /* no port number available */
+#endif
+  }
+  else {
+    /* traditional IPv4-style port-extracting */
+    tmp = strchr(conn->name, ':');
+  }
+
+  if (tmp) {
+    *tmp++ = '\0'; /* cut off the name there */
+    data->remote_port = atoi(tmp);
+  }
+
   if(!data->bits.httpproxy) {
     /* If not connecting via a proxy, extract the port from the URL, if it is
      * there, thus overriding any defaults that might have been set above. */
-    tmp = strchr(conn->name, ':');
-    if (tmp) {
-      *tmp++ = '\0';
-      data->port = atoi(tmp);
-    }
-    data->remote_port = data->port; /* it is the same port */
+    data->port =  data->remote_port; /* it is the same port */
 
     /* Connect to target host right on */
     conn->hp = Curl_gethost(data, conn->name, &conn->hostent_buf);
@@ -1179,14 +1205,6 @@ static CURLcode _connect(CURL *curl, CURLconnect **in_connect)
       return CURLE_OUT_OF_MEMORY;
     }
 
-    /* we use proxy all right, but we wanna know the remote port for SSL
-       reasons */
-    tmp = strchr(conn->name, ':');
-    if (tmp) {
-      *tmp++ = '\0'; /* cut off the name there */
-      data->remote_port = atoi(tmp);
-    }
-
     /* Daniel Dec 10, 1998:
        We do the proxy host string parsing here. We want the host name and the
        port name. Accept a protocol:// prefix, even though it should just be