<br>Here is a new diff. I remove most unrelated changes. Please review it. I very hope to merge this in the main branch so please give the detailed suggestions.<br><br>For the style problems, do u have any guide or doc for that? I can&#39;t precisely guess the style from the existing code.<br>

<br>Many thanks.<br><br>--- nginx-0.9.5/src/core/ngx_inet.c    2011-02-17 07:01:16.000000000 -0800<br>+++ nginx-0.9.5/src/core/ngx_inet2.c    2011-03-03 09:34:54.423367009 -0800<br>@@ -11,6 +11,7 @@<br> static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u);<br>

 static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);<br> static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);<br>+static ngx_int_t ngx_resolve_hostname(ngx_pool_t *pool, ngx_url_t *u);<br>

 <br> <br> in_addr_t<br>@@ -612,10 +613,9 @@<br> static ngx_int_t<br> ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)<br> {<br>-    u_char              *p, *host, *port, *last, *uri, *args;<br>+    u_char              *host, *port, *last, *uri, *args;<br>

     size_t               len;<br>     ngx_int_t            n;<br>-    struct hostent      *h;<br>     struct sockaddr_in  *sin;<br> <br>     u-&gt;socklen = sizeof(struct sockaddr_in);<br>@@ -738,23 +738,7 @@<br>         sin-&gt;sin_addr.s_addr = ngx_inet_addr(host, len);<br>

 <br>         if (sin-&gt;sin_addr.s_addr == INADDR_NONE) {<br>-            p = ngx_alloc(++len, pool-&gt;log);<br>-            if (p == NULL) {<br>-                return NGX_ERROR;<br>-            }<br>-<br>-            (void) ngx_cpystrn(p, host, len);<br>

-<br>-            h = gethostbyname((const char *) p);<br>-<br>-            ngx_free(p);<br>-<br>-            if (h == NULL || h-&gt;h_addr_list[0] == NULL) {<br>-                u-&gt;err = &quot;host not found&quot;;<br>

-                return NGX_ERROR;<br>-            }<br>-<br>-            sin-&gt;sin_addr.s_addr = *(in_addr_t *) (h-&gt;h_addr_list[0]);<br>+            return ngx_resolve_hostname(pool, u);<br>         }<br> <br>         if (sin-&gt;sin_addr.s_addr == INADDR_ANY) {<br>

@@ -782,6 +766,111 @@<br>     return NGX_OK;<br> }<br> <br>+static ngx_int_t<br>+ngx_resolve_hostname(ngx_pool_t *pool, ngx_url_t *u) {<br>+    u_char               *p;<br>+    ngx_uint_t            family;<br>+    in_addr_t             in_addr;<br>

+    struct sockaddr_in   *sin;<br>+<br>+#if (NGX_HAVE_INET6)<br>+    struct addrinfo       hints, *addrinfo;<br>+    struct in6_addr       in6_addr;<br>+    struct sockaddr_in6  *sin6;<br>+    int                   n;<br>

+#else<br>+    struct hostent       *h;<br>+#endif<br>+<br>+    /* resolve the IP address through host name.<br>+     * only the first IP address will be used.   */<br>+    p = ngx_alloc(u-&gt;host.len + 1, pool-&gt;log);<br>

+<br>+    if (p == NULL) {<br>+      return NGX_ERROR;<br>+    }<br>+<br>+    ngx_cpystrn(p, u-&gt;host.data, u-&gt;host.len + 1);<br>+<br>+#if (NGX_HAVE_INET6)<br>+<br>+    ngx_memzero (&amp;hints, sizeof (struct addrinfo));<br>

+<br>+    if (u-&gt;listen) {<br>+       hints.ai_flags = AI_PASSIVE;<br>+    } else {<br>+       hints.ai_flags = AI_CANONNAME;<br>+    }<br>+<br>+    hints.ai_protocol = IPPROTO_TCP;<br>+<br>+    n = getaddrinfo((const char *) p,<br>

+           NULL, &amp;hints, &amp;addrinfo);<br>+<br>+    if (n != NGX_OK) {<br>+       u-&gt;err = &quot;host not found&quot;;<br>+       return NGX_ERROR;<br>+    }<br>+<br>+    if (addrinfo-&gt;ai_family == AF_INET) {<br>

+       family = AF_INET;<br>+       in_addr = ((struct sockaddr_in *) addrinfo-&gt;ai_addr)-&gt;sin_addr.s_addr;<br>+<br>+    } else { /* AF_INET6 */<br>+       family = AF_INET6;<br>+       in6_addr = ((struct sockaddr_in6 *) addrinfo-&gt;ai_addr)-&gt;sin6_addr;<br>

+<br>+    }<br>+#else<br>+    h = gethostbyname((const char *) p);<br>+<br>+    if (h == NULL || h-&gt;h_addr_list[0] == NULL) {<br>+        u-&gt;err = &quot;host not found&quot;;<br>+        return NGX_ERROR;<br>+    }<br>

+<br>+    in_addr = *(in_addr_t *) (h-&gt;h_addr_list[0]);<br>+#endif<br>+<br>+    ngx_free(p);<br>+<br>+    switch (family) {<br>+<br>+#if (NGX_HAVE_INET6)<br>+    case AF_INET6:<br>+       sin6 = (struct sockaddr_in6 *) u-&gt;sockaddr;<br>

+       sin6-&gt;sin6_family = AF_INET6;<br>+       sin6-&gt;sin6_port = htons(u-&gt;port);<br>+       u-&gt;family = AF_INET6;<br>+       u-&gt;socklen = sizeof (struct sockaddr_in6);<br>+       ngx_memcpy(sin6-&gt;sin6_addr.s6_addr, in6_addr.s6_addr, 16);<br>

+<br>+       if (IN6_IS_ADDR_UNSPECIFIED(&amp;sin6-&gt;sin6_addr)) {<br>+           u-&gt;wildcard = 1;<br>+       }<br>+       break;<br>+#endif<br>+<br>+    default: /* AF_INET */<br>+       sin = (struct sockaddr_in *) u-&gt;sockaddr;<br>

+       sin-&gt;sin_family = AF_INET;<br>+       sin-&gt;sin_port = htons(u-&gt;port);<br>+       u-&gt;family = AF_INET;<br>+       u-&gt;socklen = sizeof (struct sockaddr_in);<br>+       sin-&gt;sin_addr.s_addr = in_addr;<br>

+       if (sin-&gt;sin_addr.s_addr == INADDR_ANY) {<br>+           u-&gt;wildcard = 1;<br>+       }<br>+       break;<br>+    }<br>+<br>+    if (u-&gt;listen) {<br>+        return NGX_OK;<br>+    }<br>+<br>+    return ngx_inet_resolve_host(pool, u);<br>

+}<br>+<br> <br> static ngx_int_t<br> ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)<br>@@ -901,10 +990,19 @@<br>     in_port_t            port;<br>     in_addr_t            in_addr;<br>     ngx_uint_t           i;<br>

-    struct hostent      *h;<br>     struct sockaddr_in  *sin;<br>+    struct sockaddr     *sa;<br>+<br>+#if (NGX_HAVE_INET6)<br>+    int                  family = -1;<br>+    struct addrinfo      hints, *addrinfo, *item;<br>

+    struct in6_addr      in6_addr;<br>+    struct sockaddr_in6 *sin6;<br>+    int                  n;<br> <br>-    /* AF_INET only */<br>+#else<br>+    struct hostent      *h;<br>+#endif<br> <br>     port = htons(u-&gt;port);<br>

 <br>@@ -918,9 +1016,33 @@<br> <br>         (void) ngx_cpystrn(host, u-&gt;host.data, u-&gt;host.len + 1);<br> <br>-        h = gethostbyname((char *) host);<br>+#if (NGX_HAVE_INET6)<br>+<br>+        ngx_memzero (&amp;hints, sizeof (struct addrinfo));<br>

 <br>-        ngx_free(host);<br>+        /* if the address is for listen, it won&#39;t enter this reslove function */<br>+        hints.ai_flags = AI_CANONNAME;<br>+        hints.ai_protocol = IPPROTO_TCP;<br>+<br>+        n = getaddrinfo((const char *) host,<br>

+              NULL, &amp;hints, &amp;addrinfo);<br>+<br>+        if (n != NGX_OK) {<br>+            u-&gt;err = &quot;host not found&quot;;<br>+            return NGX_ERROR;<br>+        }<br>+<br>+        if (u-&gt;one_addr == 0) {<br>

+            item = addrinfo;<br>+            for (i = 0; item != NULL; i++, item = item-&gt;ai_next) { /* void */ }<br>+<br>+        } else {<br>+            i = 1;<br>+        }<br>+<br>+#else<br>+<br>+        h = gethostbyname((char *) host);<br>

 <br>         if (h == NULL || h-&gt;h_addr_list[0] == NULL) {<br>             u-&gt;err = &quot;host not found&quot;;<br>@@ -933,6 +1055,9 @@<br>         } else {<br>             i = 1;<br>         }<br>+#endif<br>+<br>
+        ngx_free (host);<br>
 <br>         /* MP: ngx_shared_palloc() */<br> <br>@@ -945,26 +1070,59 @@<br> <br>         for (i = 0; i &lt; u-&gt;naddrs; i++) {<br> <br>-            sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br>-            if (sin == NULL) {<br>

-                return NGX_ERROR;<br>+#if (NGX_HAVE_INET6)<br>+            if (addrinfo-&gt;ai_family == AF_INET) {<br>+                family = AF_INET;<br>+                sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br>

+                if (sin == NULL) {<br>+                    return NGX_ERROR;<br>+                }<br>+                in_addr = ((struct sockaddr_in *) addrinfo-&gt;ai_addr)-&gt;sin_addr.s_addr;<br>+                sin-&gt;sin_addr.s_addr = in_addr;<br>

+            } else {<br>+                family = AF_INET6;<br>+                sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));<br>+                if (sin6 == NULL) {<br>+                    return NGX_ERROR;<br>

+                }<br>+                in6_addr = ((struct sockaddr_in6 *) addrinfo-&gt;ai_addr)-&gt;sin6_addr;<br>+                ngx_memcpy(sin6-&gt;sin6_addr.s6_addr, in6_addr.s6_addr, 16);<br>             }<br> <br>
-            sin-&gt;sin_family = AF_INET;<br>
-            sin-&gt;sin_port = port;<br>+            addrinfo = addrinfo-&gt;ai_next;<br>+<br>+#else<br>+            sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br>             sin-&gt;sin_addr.s_addr = *(in_addr_t *) (h-&gt;h_addr_list[i]);<br>

+#endif<br> <br>-            u-&gt;addrs[i].sockaddr = (struct sockaddr *) sin;<br>-            u-&gt;addrs[i].socklen = sizeof(struct sockaddr_in);<br>+#if (NGX_HAVE_INET6)<br>+            if (family == AF_INET6) {<br> <br>

-            len = NGX_INET_ADDRSTRLEN + sizeof(&quot;:65535&quot;) - 1;<br>+                sin6-&gt;sin6_family = AF_INET6;<br>+                sin6-&gt;sin6_port = port;<br>+                sa = (struct sockaddr *)sin6;<br>

+                u-&gt;addrs[i].sockaddr = sa;<br>+                u-&gt;addrs[i].socklen = sizeof(struct sockaddr_in6);<br>+                len = NGX_INET6_ADDRSTRLEN + sizeof(&quot;[]&quot;) - 1 + sizeof(&quot;:65535&quot;) - 1;<br>

+            }<br>+            else<br>+#endif<br>+            {<br>+                sin-&gt;sin_family = AF_INET;<br>+                sin-&gt;sin_port = port;<br>+                sa = (struct sockaddr *)sin;<br>+                u-&gt;addrs[i].sockaddr = sa;<br>

+                u-&gt;addrs[i].socklen = sizeof(struct sockaddr_in);<br>+                len = NGX_INET_ADDRSTRLEN + sizeof(&quot;:65535&quot;) - 1;<br>+            }<br> <br>             p = ngx_pnalloc(pool, len);<br>
             if (p == NULL) {<br>
                 return NGX_ERROR;<br>             }<br> <br>-            len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1);<br>+            len = ngx_sock_ntop(sa, p, len, 1);<br> <br>             u-&gt;addrs[i].name.len = len;<br>

             u-&gt;addrs[i].name.data = p;<br>