<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: Times New Roman; font-size: 12pt; color: #000000'><span style="font-family: 'Times New Roman'; font-size: 12pt; "><meta charset="utf-8"><span class="Apple-style-span" style="font-family: Arial; font-size: medium; ">Hey, guys. I've implement a parse URL to IPv6 function which is discussed in "http://forum.nginx.org/read.php?2,177146,177190". I change "ngx_parse_url" and add an function "ngx_parse_host" to resolve a host (IP or text) to either IPv4 or IPv6 functions. And I change "ngx_inet_resolve_host" to let it accept IPv4/IPv6. Besides I add another function "ngx_inet_sock_addr" to parse string with format "ipv4:port" and "[ipv6]:port" to the addr structure. Seems I can't upload the attachment so I past them here. I've do the unit test to them. Hope you can take regression test and merge them to the nginx main branch.<br style="clear: both; "><br style="clear: both; ">If u wish,
I can also past the unit test I write. The change is a big one so I recommend directly submit a source code. But as convention, here is the diff:</span></span><div><font class="Apple-style-span" face="Arial"><br></font></div><div><font class="Apple-style-span" face="Arial">===============ngx_inet.c=====================<br></font><div><span id="c36bdcf5-53de-4e6c-8964-8cfc63e6a230"><font class="Apple-style-span" face="Arial"><div>12,13c12</div><div>< static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);</div><div>< static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);</div><div>---</div><div>> static ngx_int_t ngx_parse_host(ngx_pool_t *pool, ngx_url_t *u);</div><div>449d447</div><div>< </div><div>509d506</div><div>< </div><div>513c510,518</div><div>< u_char *p;</div><div>---</div><div>> u_char *p, *host, *port, *last, *uri, *args;</div><div>> size_t
len;</div><div>> ngx_int_t n;</div><div>> struct sockaddr_in *sin;</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> struct sockaddr_in6 *sin6;</div><div>> ngx_flag_t ipv6 = 0;</div><div>> #endif</div><div>526,528c531</div><div>< if (p[0] == '[') {</div><div>< return ngx_parse_inet6_url(pool, u);</div><div>< }</div><div>---</div><div>> host = u->url.data;</div><div>530,531c533</div><div>< return ngx_parse_inet_url(pool, u);</div><div>< }</div><div>---</div><div>> last = host + u->url.len;</div><div>532a535</div><div>> len = 0;</div><div>534,543c537,538</div><div>< static ngx_int_t</div><div>< ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u)</div><div>< {</div><div>< #if (NGX_HAVE_
UNIX_DOMAIN)</div><div>< u_char *path, *uri, *last;</div><div>< size_t len;</div><div>< struct sockaddr_un *saun;</div><div>< </div><div>< len = u->url.len;</div><div>< path = u->url.data;</div><div>---</div><div>> #if (NGX_HAVE_INET6)</div><div>> if (host[0] == '[') {</div><div>545,546c540</div><div>< path += 5;</div><div>< len -= 5;</div><div>---</div><div>> ipv6 = 1;</div><div>548c542</div><div>< if (u->uri_part) {</div><div>---</div><div>> host = u->url.data + 1;</div><div>550,551c544</div><div>< last = path + len;</div><div>< uri = ngx_strlchr(path, last, ':');</div><div>---
</div><div>> p = ngx_strlchr(host, last, ']');</div><div>553,557c546,548</div><div>< if (uri) {</div><div>< len = uri - path;</div><div>< uri++;</div><div>< u->uri.len = last - uri;</div><div>< u->uri.data = uri;</div><div>---</div><div>> if (p == NULL) {</div><div>> u->err = "invalid host";</div><div>> return NGX_ERROR;</div><div>559,577d549</div><div>< }</div><div>< </div><div>< if (len == 0) {</div><div>< u->err = "no path in the unix domain socket";</div><div>< return NGX_ERROR;</div><div><
}</div><div>< </div><div>< u->host.len = len++;</div><div>< u->host.data = path;</div><div>< </div><div>< if (len > sizeof(saun->sun_path)) {</div><div>< u->err = "too long path in the unix domain socket";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>< u->socklen = sizeof(struct sockaddr_un);</div><div>< saun = (struct sockaddr_un *) &u->sockaddr;</div><div>< saun->sun_family = AF_UNIX;</div><div>< (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);</div><div>579,582c551</div><div>< u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));</div><div>< if (u->addrs == NULL) {</div><div>< return NGX_ERROR;</div><div>< &nbs
p; }</div><div>---</div><div>> u->family = AF_INET6;</div><div>584,586d552</div><div>< saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));</div><div>< if (saun == NULL) {</div><div>< return NGX_ERROR;</div><div>588,607d553</div><div>< </div><div>< u->family = AF_UNIX;</div><div>< u->naddrs = 1;</div><div>< </div><div>< saun->sun_family = AF_UNIX;</div><div>< (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);</div><div>< </div><div>< u->addrs[0].sockaddr = (struct sockaddr *) saun;</div><div>< u->addrs[0].socklen = sizeof(struct sockaddr_un);</div><div>< u->addrs[0].name.len = len + 4;</div><div>< u->addrs[0].name.data = u->url.data;</div><div>< </div><div>< ret
urn NGX_OK;</div><div>< </div><div>< #else</div><div>< </div><div>< u->err = "the unix domain sockets are not supported on this platform";</div><div>< </div><div>< return NGX_ERROR;</div><div>< </div><div>609,631d554</div><div>< }</div><div>< </div><div>< </div><div>< static ngx_int_t</div><div>< ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)</div><div>< {</div><div>< u_char *p, *host, *port, *last, *uri, *args;</div><div>< size_t len;</div><div>< ngx_int_t n;</div><div>< struct hostent *h;</div><div>< struct sockaddr_in *sin;</div><div>< </div><div>< u->socklen = sizeof(struct sockaddr_in);</div><div
>< sin = (struct sockaddr_in *) &u->sockaddr;</div><div>< sin->sin_family = AF_INET;</div><div>< </div><div>< u->family = AF_INET;</div><div>< </div><div>< host = u->url.data;</div><div>< </div><div>< last = host + u->url.len;</div><div>< </div><div>< port = ngx_strlchr(host, last, ':');</div><div>633c556</div><div>< uri = ngx_strlchr(host, last, '/');</div><div>---</div><div>> port = ngx_strlchr(p, last, ':');</div><div>635c558</div><div>< args = ngx_strlchr(host, last, '?');</div><div>---</div><div>> uri = ngx_strlchr(p, last, '/');</div><div>637,639c560</div><div>< if (args) {</div><div>< if (uri == NULL) {</div><div>< uri = args;</div><div>---</div><div>> &nbs
p; args = ngx_strlchr(p, last, '?');</div><div>641,643c562,563</div><div>< } else if (args < uri) {</div><div>< uri = args;</div><div>< }</div><div>---</div><div>> if (args && (uri == NULL || args < uri)) {</div><div>> uri = args;</div><div>648c568</div><div>< u->err = "invalid host";</div><div>---</div><div>> u->err = "invalid url to listen";</div><div>680,681d599</div><div>< sin->sin_port = htons((in_port_t) n);</div><div>< </div><div>688,692c606,607</div><div>< if (uri == NULL) {</div><div>< </div><div>< if (u->listen) {</div><div>< </div><div>< &
nbsp; /* test value as port only */</div><div>---</div><div>> if (uri == NULL && u->listen) {</div><div>> /* test value as port only */</div><div>694c609</div><div>< n = ngx_atoi(host, last - host);</div><div>---</div><div>> n = ngx_atoi(u->url.data, u->url.len);</div><div>696,704c611,614</div><div>< if (n != NGX_ERROR) {</div><div>< </div><div>< if (n < 1 || n > 65536) {</div><div>< u->err = "invalid port";</div><div>< return NGX_ERROR;
</div><div>< }</div><div>< </div><div>< u->port = (in_port_t) n;</div><div>< sin->sin_port = htons((in_port_t) n);</div><div>---</div><div>> if (n < 1 || n > 65536) {</div><div>> u->err = "invalid port";</div><div>> return NGX_ERROR;</div><div>> }</div><div>706,707c616,625</div><div>< u->port_text.len = last - host;</div><div>< u->port_text.data = host;</div><div>---</div><div>> &n
bsp; u->family = AF_INET;</div><div>> u->port = (in_port_t) n;</div><div>> sin = (struct sockaddr_in *)u->sockaddr;</div><div>> sin->sin_family = AF_INET;</div><div>> sin->sin_addr.s_addr = INADDR_ANY;</div><div>> sin->sin_port = htons((in_port_t) n);</div><div>> u->port_text.len = len;</div><div>> u->port_text.data = port;</div><div>> u->socklen = sizeof (struct sockaddr_in);</div><div>> u->wildcard = 1;</div><div>709c627</div><div>< u->w
ildcard = 1;</div><div>---</div><div>> return NGX_OK;</div><div>711,713c629,630</div><div>< return NGX_OK;</div><div>< }</div><div>< }</div><div>---</div><div>> } else {</div><div>> u->no_port = 1;</div><div>714a632</div><div>> }</div><div>716c634,641</div><div>< u->no_port = 1;</div><div>---</div><div>> #if (NGX_HAVE_INET6)</div><div>> if (ipv6) {</div><div>> if (*(last - 1) == ']' && last > host) {</div><div>> last--;</div><div>> } else {</div><div>> &nbs
p; u->err = "invalid host";</div><div>> return NGX_ERROR;</div><div>> }</div><div>717a643</div><div>> #endif</div><div>721,725d646</div><div>< if (len == 0) {</div><div>< u->err = "no host";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>727a649,654</div><div>> u->family = AF_INET;</div><div>> u->socklen = sizeof (struct sockaddr_in);</div><div>> u->wildcard = 1;</div><div>> sin = (struct sockaddr_in *)u->sockaddr;</div><div>> sin->sin_family = AF_INET;</div><div>> sin->sin_addr.s_addr = INADDR_ANY;</div><div>737,766c664,666</div><div>< if (len) {</div>
<div>< sin->sin_addr.s_addr = ngx_inet_addr(host, len);</div><div>< </div><div>< if (sin->sin_addr.s_addr == INADDR_NONE) {</div><div>< p = ngx_alloc(++len, pool->log);</div><div>< if (p == NULL) {</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>< (void) ngx_cpystrn(p, host, len);</div><div>< </div><div>< h = gethostbyname((const char *) p);</div><div>< </div><div>< ngx_free(p);</div><div>< </div><div>< if (h == NULL || h->h_addr_list[0] == NULL) {</div><div><
u->err = "host not found";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>< sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[0]);</div><div>< }</div><div>< </div><div>< if (sin->sin_addr.s_addr == INADDR_ANY) {</div><div>< u->wildcard = 1;</div><div>< }</div><div>< </div><div>< } else {</div><div>< sin->sin_addr.s_addr = INADDR_ANY;</div><div>< u->wildcard = 1;</div><div>---</div><div>> if(u->host.len > 0 && ngx_parse_host(pool, u) == NGX_ERROR) {</div><div>>
u->err = "invalid host";</div><div>> return NGX_ERROR;</div><div>771c671,683</div><div>< sin->sin_port = htons(u->default_port);</div><div>---</div><div>> }</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> if (u->family == AF_INET6) {</div><div>> sin6 = (struct sockaddr_in6 *)u->sockaddr;</div><div>> sin6->sin6_port = htons (u->port);</div><div>> </div><div>> }</div><div>> else</div><div>> #endif</div><div>> {</div><div>> sin = (struct sockaddr_in *)u->sockaddr;</div><div>> sin->sin_port = htons (u->port);</div><div>787c699</div><div>< ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)</div><div>---</div><div>> ngx_parse_unix_d
omain_url(ngx_pool_t *pool, ngx_url_t *u)</div><div>789,803c701,704</div><div>< #if (NGX_HAVE_INET6)</div><div>< u_char *p, *host, *port, *last, *uri;</div><div>< size_t len;</div><div>< ngx_int_t n;</div><div>< struct sockaddr_in6 *sin6;</div><div>< </div><div>< u->socklen = sizeof(struct sockaddr_in6);</div><div>< sin6 = (struct sockaddr_in6 *) &u->sockaddr;</div><div>< sin6->sin6_family = AF_INET6;</div><div>< </div><div>< host = u->url.data + 1;</div><div>< </div><div>< last = u->url.data + u->url.len;</div><div>< </div><div>< p = ngx_strlchr(host, last, ']');</div><div>---</div><div>> #if (NGX_H
AVE_UNIX_DOMAIN)</div><div>> u_char *path, *uri, *last;</div><div>> size_t len;</div><div>> struct sockaddr_un *saun;</div><div>805,808c706,707</div><div>< if (p == NULL) {</div><div>< u->err = "invalid host";</div><div>< return NGX_ERROR;</div><div>< }</div><div>---</div><div>> len = u->url.len;</div><div>> path = u->url.data;</div><div>810c709,710</div><div>< if (last - p) {</div><div>---</div><div>> path += 5;</div><div>> len -= 5;</div><div>812c712</div><div>< port = p + 1;</div><div>---</div><div>> if (u->uri_part) {</div><div>814c714,715</div><div>< u
ri = ngx_strlchr(port, last, '/');</div><div>---</div><div>> last = path + len;</div><div>> uri = ngx_strlchr(path, last, ':');</div><div>817,821c718,719</div><div>< if (u->listen || !u->uri_part) {</div><div>< u->err = "invalid host";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>---</div><div>> len = uri - path;</div><div>> uri++;</div><div>824a723</div><div>> }</div><div>826,851c725,727</div><div>< if (*port == ':') {</div><div>< port++;</div><div>< </div><div>< &nb
sp; len = last - port;</div><div>< </div><div>< if (len == 0) {</div><div>< u->err = "invalid port";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>< n = ngx_atoi(port, len);</div><div>< </div><div>< if (n < 1 || n > 65536) {</div><div>< u->err = "invalid port";</div><div>< return NGX_ERROR;</div><div>< }</div><div>< </div><div>< u->port = (in_port_t) n;</div><div>< &n
bsp; sin6->sin6_port = htons((in_port_t) n);</div><div>< </div><div>< u->port_text.len = len;</div><div>< u->port_text.data = port;</div><div>< </div><div>< } else {</div><div>< u->no_port = 1;</div><div>< }</div><div>---</div><div>> if (len == 0) {</div><div>> u->err = "no path in the unix domain socket";</div><div>> return NGX_ERROR;</div><div>854c730,731</div><div>< len = p - host;</div><div>---</div><div>> u->host.len = len++;</div><div>> u->host.data = path;</div><div>856,857c733,734</div><div>< if (len == 0) {</div><div>< u->err = "no host";</div><
div>---</div><div>> if (len > sizeof(saun->sun_path)) {</div><div>> u->err = "too long path in the unix domain socket";</div><div>861,862c738,741</div><div>< u->host.len = len;</div><div>< u->host.data = host;</div><div>---</div><div>> u->socklen = sizeof(struct sockaddr_un);</div><div>> saun = (struct sockaddr_un *) &u->sockaddr;</div><div>> saun->sun_family = AF_UNIX;</div><div>> (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);</div><div>864,865c743,744</div><div>< if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {</div><div>< u->err = "invalid IPv6 address";</div><div>---</div><div>> u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));</div><div>> if (u->addrs == NULL) {</div><di
v>869,870c748,750</div><div>< if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {</div><div>< u->wildcard = 1;</div><div>---</div><div>> saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));</div><div>> if (saun == NULL) {</div><div>> return NGX_ERROR;</div><div>873c753,754</div><div>< u->family = AF_INET6;</div><div>---</div><div>> u->family = AF_UNIX;</div><div>> u->naddrs = 1;</div><div>875,877c756,757</div><div>< if (u->no_resolve) {</div><div>< return NGX_OK;</div><div>< }</div><div>---</div><div>> saun->sun_family = AF_UNIX;</div><div>> (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);</div><div>879,882c759,762</div><div>< if (u->no_port) {</div><div>< &nb
sp; u->port = u->default_port;</div><div>< sin6->sin6_port = htons(u->default_port);</div><div>< }</div><div>---</div><div>> u->addrs[0].sockaddr = (struct sockaddr *) saun;</div><div>> u->addrs[0].socklen = sizeof(struct sockaddr_un);</div><div>> u->addrs[0].name.len = len + 4;</div><div>> u->addrs[0].name.data = u->url.data;</div><div>888c768</div><div>< u->err = "the INET6 sockets are not supported on this platform";</div><div>---</div><div>> u->err = "the unix domain sockets are not supported on this platform";</div><div>894a775,891</div><div>> static ngx_int_t</div><div>> ngx_parse_host(ngx_pool_t *pool, ngx_url_t *u) {</div><div>> u_char *p;</div><div>> ngx_uint_t &nbs
p; family, n;</div><div>> in_addr_t inaddr;</div><div>> struct sockaddr_in *sin;</div><div>> struct addrinfo hints, *addrinfo;</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> struct in6_addr inaddr6;</div><div>> struct sockaddr_in6 *sin6;</div><div>> </div><div>> if (u->family == AF_INET6) {</div><div>> /* u->family has been set to AF_INET6 means the host</div><div>> * to be parsed should be IPv6 address so no need to parse</div><div>> * it as IPv4 or resolve host</div><div>> */</div><div>> ngx_memzero(inaddr6.s6_addr, sizeof(struct in6_addr));</div><div>> &nb
sp; if (ngx_inet6_addr(u->host.data, u->host.len, inaddr6.s6_addr) == NGX_OK) {</div><div>> family = AF_INET6;</div><div>> goto done;</div><div>> } else {</div><div>> u->err = "invalid host";</div><div>> return NGX_ERROR;</div><div>> }</div><div>> }</div><div>> #endif</div><div>> </div><div>> inaddr = ngx_inet_addr(u->host.data, u->host.len);</div><div>> </div><div>> if (inaddr != INADDR_NONE) {</div><div>> family = AF_INET;</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> } else if (ngx_inet6_addr(u->host.data, u->host.len, inaddr6.s6_addr) == NGX_OK) {</div><div>> &nb
sp; family = AF_INET6;</div><div>> </div><div>> #endif</div><div>> } else {</div><div>> /* resolve the IP address through host name</div><div>> only the first IP address will be used */</div><div>> p = ngx_alloc(u->host.len + 1, pool->log);</div><div>> if (p == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> ngx_cpystrn(p, u->host.data, u->host.len + 1);</div><div>> </div><div>> ngx_memzero (&hints, sizeof (struct addrinfo));</div><div>> </div><div>> if (u->listen) {</div><div>> hints.ai_flags = AI_PASSIVE;</div><div>> } else
{</div><div>> hints.ai_flags = AI_CANONNAME;</div><div>> }</div><div>> </div><div>> hints.ai_protocol = IPPROTO_TCP;</div><div>> </div><div>> n = getaddrinfo((const char *) p,</div><div>> NULL, &hints, &addrinfo);</div><div>> </div><div>> ngx_free (p);</div><div>> </div><div>> if (n != NGX_OK) {</div><div>> u->err = "error in host resolve";</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> if (addrinfo->ai_family == AF_INET) {</div><div>> family = AF_INET;</div><div>
> inaddr = ((struct sockaddr_in *) addrinfo->ai_addr)->sin_addr.s_addr;</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> } else if (addrinfo->ai_family == AF_INET6) {</div><div>> family = AF_INET6;</div><div>> inaddr6 = ((struct sockaddr_in6 *) addrinfo->ai_addr)->sin6_addr;</div><div>> </div><div>> #endif</div><div>> } else {</div><div>> u->err = "unknown address family";</div><div>> return NGX_ERROR;</div><div>> }</div><div>> }</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> done:</div><div>> #endif</div><div>> </div><div>> switch (family) {<
/div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> case AF_INET6:</div><div>> sin6 = (struct sockaddr_in6 *) u->sockaddr;</div><div>> sin6->sin6_family = AF_INET6;</div><div>> u->family = AF_INET6;</div><div>> u->socklen = sizeof (struct sockaddr_in6);</div><div>> ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);</div><div>> </div><div>> if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {</div><div>> u->wildcard = 1;</div><div>> }</div><div>> break;</div><div>> #endif</div><div>> </div><div>> default: /* AF_INET */</div><div>> sin = (struct sockaddr_in *) u->sockaddr
;</div><div>> sin->sin_family = AF_INET;</div><div>> u->family = AF_INET;</div><div>> u->socklen = sizeof (struct sockaddr_in);</div><div>> sin->sin_addr.s_addr = inaddr;</div><div>> if (sin->sin_addr.s_addr == INADDR_ANY) {</div><div>> u->wildcard = 1;</div><div>> }</div><div>> break;</div><div>> }</div><div>> </div><div>> return NGX_OK;</div><div>> }</div><div>902,904c899,901</div><div>< in_addr_t in_addr;</div><div>< ngx_uint_t i;</div><div>< struct hostent *h;</div><div>---</div><div>> in_addr_t  
; inaddr;</div><div>> ngx_uint_t i, n;</div><div>> struct addrinfo hints, *addrinfo, *item;</div><div>907c904,913</div><div>< /* AF_INET only */</div><div>---</div><div>> #if (NGX_HAVE_INET6)</div><div>> struct in6_addr inaddr6;</div><div>> struct sockaddr_in6 *sin6;</div><div>> </div><div>> /*</div><div>> * prevent MSVC8 waring:</div><div>> * potentially uninitialized local variable 'inaddr6' used</div><div>> */</div><div>> ngx_memzero(inaddr6.s6_addr, sizeof(struct in6_addr));</div><div>> #endif</div><div>911c917</div><div>< in_addr = ngx_inet_addr(u->host.data, u->host.len);</div><div>---</div><div>> inaddr = ngx_i
net_addr(u->host.data, u->host.len);</div><div>913,915c919,923</div><div>< if (in_addr == INADDR_NONE) {</div><div>< host = ngx_alloc(u->host.len + 1, pool->log);</div><div>< if (host == NULL) {</div><div>---</div><div>> if (inaddr != INADDR_NONE) {</div><div>> /* MP: ngx_shared_palloc() */</div><div>> </div><div>> u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));</div><div>> if (u->addrs == NULL) {</div><div>919c927,930</div><div>< (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);</div><div>---</div><div>> sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));</div><div>> if (sin == NULL) {</div><div>> return NGX_ERR
OR;</div><div>> }</div><div>921c932</div><div>< h = gethostbyname((char *) host);</div><div>---</div><div>> u->naddrs = 1;</div><div>923c934,936</div><div>< ngx_free(host);</div><div>---</div><div>> sin->sin_family = AF_INET;</div><div>> sin->sin_port = port;</div><div>> sin->sin_addr.s_addr = inaddr;</div><div>925,926c938,942</div><div>< if (h == NULL || h->h_addr_list[0] == NULL) {</div><div>< u->err = "host not found";</div><div>---</div><div>> u->addrs[0].sockaddr = (struct sockaddr *) sin;</div><div>> u->addrs[0].socklen = sizeof(struct sockaddr_in);</div><div>> </div><div>>  
; p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);</div><div>> if (p == NULL) {</div><div>930,931c946,948</div><div>< if (u->one_addr == 0) {</div><div>< for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }</div><div>---</div><div>> u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",</div><div>> &u->host, ntohs(port)) - p;</div><div>> u->addrs[0].name.data = p;</div><div>933,934c950,957</div><div>< } else {</div><div>< i = 1;</div><div>---</div><div>> return NGX_OK;</div><div>> }</div><di
v>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> if(ngx_inet6_addr(u->host.data, u->host.len, inaddr6.s6_addr) == NGX_OK) {</div><div>> u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));</div><div>> if (u->addrs == NULL) {</div><div>> return NGX_ERROR;</div><div>937c960,963</div><div>< /* MP: ngx_shared_palloc() */</div><div>---</div><div>> sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));</div><div>> if (sin6 == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>939,940c965,974</div><div>< u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));</div><div>< if (u->addrs == NULL) {</di
v><div>---</div><div>> u->naddrs = 1;</div><div>> </div><div>> sin6->sin6_family = AF_INET6;</div><div>> sin6->sin6_port = port;</div><div>> ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);</div><div>> u->addrs[0].sockaddr = (struct sockaddr *) sin6;</div><div>> u->addrs[0].socklen = sizeof(struct sockaddr_in6);</div><div>> </div><div>> p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);</div><div>> if (p == NULL) {</div><div>944c978,1007</div><div>< u->naddrs = i;</div><div>---</div><div>> u->addrs[0].name.len = ngx_sprintf(p, "[%V]:%d",</div><div>> &nbs
p; &u->host, ntohs(port)) - p;</div><div>> u->addrs[0].name.data = p;</div><div>> </div><div>> return NGX_OK;</div><div>> }</div><div>> #endif</div><div>> </div><div>> /* resolve all the IP address for this host */</div><div>> host = ngx_alloc(u->host.len + 1, pool->log);</div><div>> if (host == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> ngx_cpystrn(host, u->host.data, u->host.len + 1);</div><div>> </div><div>> ngx_memzero (&hints, sizeof (struct addrinfo));</div><div>> </div><div>> /* if the address is for listen, it won't enter this reslove function */</div><div>>  
; hints.ai_flags = AI_CANONNAME;</div><div>> hints.ai_protocol = IPPROTO_TCP;</div><div>> </div><div>> n = getaddrinfo((const char *) host,</div><div>> NULL, &hints, &addrinfo);</div><div>> </div><div>> ngx_free (host);</div><div>> </div><div>> if (n != NGX_OK) {</div><div>> u->err = "error in host resolve";</div><div>> return NGX_ERROR;</div><div>> }</div><div>946c1009</div><div>< for (i = 0; h->h_addr_list[i] != NULL; i++) {</div><div>---</div><div>> i = 0;</div><div>947a1011,1030</div><div>> if (u->one_addr == 0) {</div><div>> item = addrinfo;</div><div>> for (i = 0; item != NULL; i++, item = item->ai_next) { /* void */ }</div><div>>
</div><div>> } else {</div><div>> i = 1;</div><div>> }</div><div>> </div><div>> /* MP: ngx_shared_palloc() */</div><div>> </div><div>> u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));</div><div>> if (u->addrs == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> u->naddrs = i;</div><div>> </div><div>> for (i = 0; i < u->naddrs; i++, addrinfo = addrinfo->ai_next) {</div><div>> </div><div>> if (addrinfo->ai_family == AF_INET) {</div><div>955,956c1038,1039</div><div>< sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);</div><div>< </div><div>---</div><div>> &nbs
p; inaddr = ((struct sockaddr_in *) addrinfo->ai_addr)->sin_addr.s_addr;</div><div>> sin->sin_addr.s_addr = inaddr;</div><div>960a1044,1052</div><div>> p = ngx_pnalloc(pool, len);</div><div>> if (p == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> len = ngx_sock_ntop((struct sockaddr *) sin, p, len, sin->sin_port);</div><div>> </div><div>> u->addrs[i].name.len = len;</div><div>> u->addrs[i].name.data = p;</div><div>961a1054,1068</div><div>> #if (NGX_HAVE_INET6)</div><div>> } else if (addrinfo->ai_famil
y == AF_INET6) {</div><div>> sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));</div><div>> if (sin6 == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> sin6->sin6_family = AF_INET6;</div><div>> sin6->sin6_port = port;</div><div>> inaddr6 = ((struct sockaddr_in6 *) addrinfo->ai_addr)->sin6_addr;</div><div>> ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);</div><div>> u->addrs[i].sockaddr = (struct sockaddr *) sin6;</div><div>> u->addrs[i].socklen = si
zeof(struct sockaddr_in6);</div><div>> </div><div>> len = NGX_INET6_ADDRSTRLEN + sizeof(":65535") - 1;</div><div>967c1074</div><div>< len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1);</div><div>---</div><div>> len = ngx_sock_ntop((struct sockaddr *) sin6, p, len, sin6->sin6_port);</div><div>970a1078,1081</div><div>> #endif</div><div>> } else {</div><div>> u->err = "unknown address family";</div><div>> return NGX_ERROR;</div><div>971a1083</div><div>> }</div><div>973c1085,1086</div><div>< } else {</div><div>---</div><div>> return NGX_OK;</div><div>> }</div><div>975c1088,1093</div><div>< /* MP: ngx_shared_palloc() */</d
iv><div>---</div><div>> ngx_int_t</div><div>> ngx_inet_sock_addr (u_char * p, size_t len, struct sockaddr * sockaddr)</div><div>> {</div><div>> u_char *port, *last;</div><div>> ngx_int_t n;</div><div>> struct sockaddr_in *sin;</div><div>977,978c1095,1116</div><div>< u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));</div><div>< if (u->addrs == NULL) {</div><div>---</div><div>> #if (NGX_HAVE_INET6)</div><div>> struct sockaddr_in6 *sin6;</div><div>> u_char *q;</div><div>> #endif</div><div>> </div><div>> if (len == 0) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><di
v>> last = p + len;</div><div>> </div><div>> port = NULL;</div><div>> </div><div>> #if (NGX_HAVE_INET6)</div><div>> </div><div>> if (*p == '[') {</div><div>> </div><div>> p++;</div><div>> </div><div>> q = ngx_strlchr(p, last, ']');</div><div>> </div><div>> if (q == NULL) {</div><div>982,983c1120,1122</div><div>< sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));</div><div>< if (sin == NULL) {</div><div>---</div><div>> if (q < last - 2 && *(q + 1) == ':') {</div><div>> port = q + 2;</div><div>> } else {</div><div>987c1126,1152</div><div>< u->naddrs = 1;</div><div>---</div>
<div>> sin6 = (struct sockaddr_in6 *)sockaddr;</div><div>> </div><div>> sin6->sin6_family = AF_INET6;</div><div>> </div><div>> if (ngx_inet6_addr(p, q - p, sin6->sin6_addr.s6_addr) == NGX_ERROR) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> n = ngx_atoi(port, last - port);</div><div>> </div><div>> if (n == NGX_ERROR || n < 1 || n > 65535) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> sin6->sin6_port = htons(n);</div><div>> </div><div>> }</div><div>> else</div><div>> #endif</div><div>> &
nbsp; {</div><div>> port = ngx_strlchr(p, last, ':');</div><div>> </div><div>> if (port == NULL) {</div><div>> return NGX_ERROR;</div><div>> }</div><div>> </div><div>> sin = (struct sockaddr_in *)sockaddr;</div><div>990,991d1154</div><div>< sin->sin_port = port;</div><div>< sin->sin_addr.s_addr = in_addr;</div><div>993,994c1156</div><div>< u->addrs[0].sockaddr = (struct sockaddr *) sin;</div><div>< u->addrs[0].socklen = sizeof(struct sockaddr_in);</div><div>---</div><div>> sin->sin_addr.s_addr = ngx_inet_addr (p, port - p);</div><div>996,997c1158</div><div>< p = ngx_pnalloc(pool, u->host.len +
sizeof(":65535") - 1);</div><div>< if (p == NULL) {</div><div>---</div><div>> if (sin->sin_addr.s_addr == INADDR_NONE) {</div><div>1001,1003c1162,1171</div><div>< u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",</div><div>< &u->host, ntohs(port)) - p;</div><div>< u->addrs[0].name.data = p;</div><div>---</div><div>> port++;</div><div>> </div><div>> n = ngx_atoi(port, last - port);</div><div>> </div><div>> if (n == NGX_ERROR || n < 1 || n > 65535) {</div><div>> return NGX_ERROR;</div><div>> }</div><d
iv>> </div><div>> sin->sin_port = htons(n);</div><div>> </div></font><div><span id="c36bdcf5-53de-4e6c-8964-8cfc63e6a230"><br></span></div><div><span id="c36bdcf5-53de-4e6c-8964-8cfc63e6a230"><br></span></div><meta charset="utf-8"><span class="Apple-style-span" style="font-family: Arial; ">===============ngx_inet.h=====================</span></span></div><div><span id="c36bdcf5-53de-4e6c-8964-8cfc63e6a230"><font class="Apple-style-span" face="Arial"> </font></span>110a111,112</div><div>> ngx_int_t ngx_inet_sock_addr (u_char * p, size_t len,</div><div>> struct sockaddr * sockaddr);</div><div><br></div><div><span id="c36bdcf5-53de-4e6c-8964-8cfc63e6a230"><font class="Apple-style-span" face="Arial"><br></font><font class="Apple-style-span" face="'Times New Roman'" size="3">-- </font><br><font class="Apple-style-span" face="'Times New Roman'" size="3"><span name="x"></span>Jiankuan Xing ~~<span name="x"><
/span></font><br></span></div></div></div></body></html>