]> granicus.if.org Git - curl/commitdiff
- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
authorDaniel Stenberg <daniel@haxx.se>
Wed, 30 Jul 2008 21:55:26 +0000 (21:55 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 30 Jul 2008 21:55:26 +0000 (21:55 +0000)
  parser to allow numerical IPv6-addresses to be specified with the scope
  given, as per RFC4007 - with a percent letter that itself needs to be URL
  escaped. For example, for an address of fe80::1234%1 the HTTP URL is:
  "http://[fe80::1234%251]/"

CHANGES
RELEASE-NOTES
docs/libcurl/curl_easy_setopt.3
include/curl/curl.h
lib/connect.c
lib/url.c
lib/urldata.h

diff --git a/CHANGES b/CHANGES
index 16eb857adf005e1e8aac63bad8d49dbbc1748685..55f6a3d9219be90bf2182f9efe888f62a3d308d1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,12 @@
                                   Changelog
 
 Daniel Stenberg (30 Jul 2008)
+- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
+  parser to allow numerical IPv6-addresses to be specified with the scope
+  given, as per RFC4007 - with a percent letter that itself needs to be URL
+  escaped. For example, for an address of fe80::1234%1 the HTTP URL is:
+  "http://[fe80::1234%251]/"
+
 - PHP's bug report #43158 (http://bugs.php.net/bug.php?id=43158) identifies a
   true bug in libcurl built with OpenSSL. It made curl_easy_getinfo() more or
   less always return 0 for CURLINFO_SSL_VERIFYRESULT because the function that
index 9ea04d39cb5e373e07e4a9d191bd85d1e8ac4564..52c834e8460b59dfbd2181544f57975e0ee86bf8 100644 (file)
@@ -19,6 +19,7 @@ This release includes the following changes:
  o Added CURLINFO_APPCONNECT_TIME
  o Added test selection by key word in runtests.pl
  o the curl tool's -w option support the %{ssl_verify_result} variable
+ o Added CURLOPT_SCOPE and scope parsing of the URL according to RFC4007
 
 This release includes the following bugfixes:
 
index d8f7d826839b5605fbdfbc0908a549b0217beb5d..6191469d6c0089da1f5ea3c9aac286cfbf346be8 100644 (file)
@@ -21,7 +21,7 @@
 .\" * $Id$
 .\" **************************************************************************
 .\"
-.TH curl_easy_setopt 3 "5 Jan 2008" "libcurl 7.19.0" "libcurl Manual"
+.TH curl_easy_setopt 3 "30 Jul 2008" "libcurl 7.19.0" "libcurl Manual"
 .SH NAME
 curl_easy_setopt \- set options for a curl easy handle
 .SH SYNOPSIS
@@ -547,6 +547,9 @@ notably telnet or rlogin) small segments may need to be sent
 without delay. This is less efficient than sending larger amounts of
 data at a time, and can contribute to congestion on the network if
 overdone.
+.IP CURLOPT_ADDRESS_SCOPE
+Pass a long specifying the scope_id value to use when connecting to IPv6
+link-local or site-local addresses.
 .SH NAMES and PASSWORDS OPTIONS (Authentication)
 .IP CURLOPT_NETRC
 This parameter controls the preference of libcurl between using user names and
index af3a0d8a90b3b46e5dbfc40cdf3156b0602f7ba2..da7cc0793decf7ac161a051a3bf5fe79f2414a3a 100644 (file)
@@ -1211,6 +1211,9 @@ typedef enum {
   /* Issuer certificate */
   CINIT(ISSUERCERT, OBJECTPOINT, 170),
 
+  /* (IPv6) Address scope */
+  CINIT(ADDRESS_SCOPE, LONG, 171),
+
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
 
index 6c736a42c112ec6b76ecf2f91ba9af2a992222ba..4018eb0427fdaffcc42483f132cb14a45605f346 100644 (file)
@@ -773,6 +773,13 @@ singleipconnect(struct connectdata *conn,
 
   *connected = FALSE; /* default is not connected */
 
+#ifdef CURLRES_IPV6
+  if (conn->scope && (addr->family == AF_INET6)) {
+    struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)&addr->addr;
+    in6->sin6_scope_id = conn->scope;
+  }
+#endif
+
   /* FIXME: do we have Curl_printable_address-like with struct sockaddr* as
      argument? */
 #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
index 9baa4b3687f33bb082d8b65fa2d07e84530e38ef..170310beb5728b4209b00aba9dff9554aadb9090 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -2091,6 +2091,15 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
     }
     break;
 
+  case CURLOPT_ADDRESS_SCOPE:
+    /*
+     * We always get longs when passed plain numericals, but for this value we
+     * know that an unsigned int will always hold the value so we blindly
+     * typecast to this type
+     */
+    data->set.scope = (unsigned int) va_arg(param, long);
+    break;
+
   default:
     /* unknown tag and its companion, just ignore: */
     result = CURLE_FAILED_INIT; /* correct this */
@@ -3080,6 +3089,24 @@ static CURLcode ParseURLAndFillConnection(struct SessionHandle *data,
     path[0] = '/';
   }
 
+  if (conn->host.name[0] == '[' && !data->state.this_is_a_follow) {
+    /* This looks like an IPv6 address literal.  See if there is an address
+       scope.  */
+    char *percent = strstr (conn->host.name, "%25");
+    if (percent) {
+      char *endp;
+      conn->scope = strtoul (percent + 3, &endp, 10);
+      if (*endp == ']') {
+        /* The address scope was well formed.  Knock it out of the hostname.  */
+        strcpy (percent, "]");
+      }
+    }
+  }
+
+  if (data->set.scope)
+    /* Override any scope that was set above.  */
+    conn->scope = data->set.scope;
+
   /*
    * So if the URL was A://B/C,
    *   conn->protostr is A
index 7cdc7342ab7e791cc27bb3003329d321c67abc2c..c2fd36825a70cd2ccf7364993aa85c3357c52557 100644 (file)
@@ -903,6 +903,8 @@ struct connectdata {
      set. */
   char *ip_addr_str;
 
+  unsigned int scope;    /* address scope for IPv6 */
+
   char protostr[16];  /* store the protocol string in this buffer */
   int socktype;  /* SOCK_STREAM or SOCK_DGRAM */
 
@@ -1478,6 +1480,7 @@ struct UserDefined {
   bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
                                via an HTTP proxy */
   char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
+  unsigned int scope;    /* address scope for IPv6 */
 };
 
 struct Names {