<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'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->socklen = sizeof(struct sockaddr_in);<br>@@ -738,23 +738,7 @@<br> sin->sin_addr.s_addr = ngx_inet_addr(host, len);<br>
<br> if (sin->sin_addr.s_addr == INADDR_NONE) {<br>- p = ngx_alloc(++len, pool->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->h_addr_list[0] == NULL) {<br>- u->err = "host not found";<br>
- return NGX_ERROR;<br>- }<br>-<br>- sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[0]);<br>+ return ngx_resolve_hostname(pool, u);<br> }<br> <br> if (sin->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->host.len + 1, pool->log);<br>
+<br>+ if (p == NULL) {<br>+ return NGX_ERROR;<br>+ }<br>+<br>+ ngx_cpystrn(p, u->host.data, u->host.len + 1);<br>+<br>+#if (NGX_HAVE_INET6)<br>+<br>+ ngx_memzero (&hints, sizeof (struct addrinfo));<br>
+<br>+ if (u->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, &hints, &addrinfo);<br>+<br>+ if (n != NGX_OK) {<br>+ u->err = "host not found";<br>+ return NGX_ERROR;<br>+ }<br>+<br>+ if (addrinfo->ai_family == AF_INET) {<br>
+ family = AF_INET;<br>+ in_addr = ((struct sockaddr_in *) addrinfo->ai_addr)->sin_addr.s_addr;<br>+<br>+ } else { /* AF_INET6 */<br>+ family = AF_INET6;<br>+ in6_addr = ((struct sockaddr_in6 *) addrinfo->ai_addr)->sin6_addr;<br>
+<br>+ }<br>+#else<br>+ h = gethostbyname((const char *) p);<br>+<br>+ if (h == NULL || h->h_addr_list[0] == NULL) {<br>+ u->err = "host not found";<br>+ return NGX_ERROR;<br>+ }<br>
+<br>+ in_addr = *(in_addr_t *) (h->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->sockaddr;<br>
+ sin6->sin6_family = AF_INET6;<br>+ sin6->sin6_port = htons(u->port);<br>+ u->family = AF_INET6;<br>+ u->socklen = sizeof (struct sockaddr_in6);<br>+ ngx_memcpy(sin6->sin6_addr.s6_addr, in6_addr.s6_addr, 16);<br>
+<br>+ if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {<br>+ u->wildcard = 1;<br>+ }<br>+ break;<br>+#endif<br>+<br>+ default: /* AF_INET */<br>+ sin = (struct sockaddr_in *) u->sockaddr;<br>
+ sin->sin_family = AF_INET;<br>+ sin->sin_port = htons(u->port);<br>+ u->family = AF_INET;<br>+ u->socklen = sizeof (struct sockaddr_in);<br>+ sin->sin_addr.s_addr = in_addr;<br>
+ if (sin->sin_addr.s_addr == INADDR_ANY) {<br>+ u->wildcard = 1;<br>+ }<br>+ break;<br>+ }<br>+<br>+ if (u->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->port);<br>
<br>@@ -918,9 +1016,33 @@<br> <br> (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);<br> <br>- h = gethostbyname((char *) host);<br>+#if (NGX_HAVE_INET6)<br>+<br>+ ngx_memzero (&hints, sizeof (struct addrinfo));<br>
<br>- ngx_free(host);<br>+ /* if the address is for listen, it won'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, &hints, &addrinfo);<br>+<br>+ if (n != NGX_OK) {<br>+ u->err = "host not found";<br>+ return NGX_ERROR;<br>+ }<br>+<br>+ if (u->one_addr == 0) {<br>
+ item = addrinfo;<br>+ for (i = 0; item != NULL; i++, item = item->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->h_addr_list[0] == NULL) {<br> u->err = "host not found";<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 < u->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->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->ai_addr)->sin_addr.s_addr;<br>+ sin->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->ai_addr)->sin6_addr;<br>+ ngx_memcpy(sin6->sin6_addr.s6_addr, in6_addr.s6_addr, 16);<br> }<br> <br>
- sin->sin_family = AF_INET;<br>
- sin->sin_port = port;<br>+ addrinfo = addrinfo->ai_next;<br>+<br>+#else<br>+ sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));<br> sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);<br>
+#endif<br> <br>- u->addrs[i].sockaddr = (struct sockaddr *) sin;<br>- u->addrs[i].socklen = sizeof(struct sockaddr_in);<br>+#if (NGX_HAVE_INET6)<br>+ if (family == AF_INET6) {<br> <br>
- len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;<br>+ sin6->sin6_family = AF_INET6;<br>+ sin6->sin6_port = port;<br>+ sa = (struct sockaddr *)sin6;<br>
+ u->addrs[i].sockaddr = sa;<br>+ u->addrs[i].socklen = sizeof(struct sockaddr_in6);<br>+ len = NGX_INET6_ADDRSTRLEN + sizeof("[]") - 1 + sizeof(":65535") - 1;<br>
+ }<br>+ else<br>+#endif<br>+ {<br>+ sin->sin_family = AF_INET;<br>+ sin->sin_port = port;<br>+ sa = (struct sockaddr *)sin;<br>+ u->addrs[i].sockaddr = sa;<br>
+ u->addrs[i].socklen = sizeof(struct sockaddr_in);<br>+ len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 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->addrs[i].name.len = len;<br>
u->addrs[i].name.data = p;<br>