]> granicus.if.org Git - php/commitdiff
Add IPv6 support to stream_socket_client/server()
authorSara Golemon <pollita@php.net>
Sat, 5 Apr 2003 02:42:12 +0000 (02:42 +0000)
committerSara Golemon <pollita@php.net>
Sat, 5 Apr 2003 02:42:12 +0000 (02:42 +0000)
main/streams/xp_socket.c

index 56ae6dba754fe04c93b76ad99f47d7a2cfd22063..2b6015ac60b10b578e7266cedd479837aefdb84c 100644 (file)
@@ -380,9 +380,24 @@ static inline int parse_unix_address(php_stream_xport_param *xparam, struct sock
 static inline char *parse_ip_address(php_stream_xport_param *xparam, int *portno TSRMLS_DC)
 {
        char *colon;
-       char *host = NULL;
+       char *p, *host = NULL;
+
+#ifdef HAVE_IPV6
+       if (*(xparam->inputs.name) == '[') {
+               /* IPV6 notation to specify raw address with port (i.e. [fe80::1]:80) */
+               p = memchr(xparam->inputs.name + 1, ']', xparam->inputs.namelen - 2);
+               if (!p || *(p + 1) != ':') {
+                       if (xparam->want_errortext) {
+                               spprintf(&xparam->outputs.error_text, 0, "Failed to parse IPv6 address \"%s\"", xparam->inputs.name);
+                       }
+                       return NULL;
+               }
+               *portno = atoi(p + 2);
+               return estrndup(xparam->inputs.name + 1, p - xparam->inputs.name - 1);
+       }
+#endif
 
-       colon = memchr(xparam->inputs.name, ':', xparam->inputs.namelen);
+       colon = memchr(xparam->inputs.name, ':', xparam->inputs.namelen - 1);
        if (colon) {
                *portno = atoi(colon + 1);
                host = estrndup(xparam->inputs.name, colon - xparam->inputs.name);