+
+#ifdef HAVE_INET_PTON
+ if (*ptr == '[') {
+ char *error = NULL, *tmp = memchr(ptr, ']', end - ptr);
+
+ if (tmp) {
+ size_t addrlen = tmp - ptr + 1;
+ char buf[16], *addr = estrndup(ptr + 1, addrlen - 2);
+ int rv = inet_pton(AF_INET6, addr, buf);
+
+ efree(addr);
+ if (rv == 1) {
+ url->buffer[url->offset] = '[';
+ url->host = &url->buffer[url->offset];
+ inet_ntop(AF_INET6, buf, url->host + 1, url->maxlen - url->offset);
+ url->offset += strlen(url->host);
+ url->buffer[url->offset++] = ']';
+ url->buffer[url->offset++] = 0;
+ ptr = tmp + 1;
+ } else if (rv == -1) {
+ error = strerror(errno);
+ } else {
+ error = "unexpected '['";
+ }
+ } else {
+ error = "expected ']'";
+ }
+
+ if (error) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to parse hostinfo; %s", error);
+ return FAILURE;
+ }
+ }
+#endif
+ if (ptr != end) do {