change ngx_parse_addr() interface

This commit is contained in:
Igor Sysoev 2009-11-02 16:11:06 +00:00
parent 72e928755b
commit 8b816d88a9
3 changed files with 33 additions and 31 deletions

View File

@ -416,66 +416,57 @@ ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)
}
ngx_addr_t *
ngx_parse_addr(ngx_pool_t *pool, ngx_str_t *addr)
ngx_int_t
ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)
{
size_t len;
in_addr_t inaddr;
ngx_uint_t family;
ngx_addr_t *a;
struct sockaddr_in *sin;
#if (NGX_HAVE_INET6)
struct in6_addr inaddr6;
struct sockaddr_in6 *sin6;
#endif
inaddr = ngx_inet_addr(addr->data, addr->len);
inaddr = ngx_inet_addr(text, len);
if (inaddr != INADDR_NONE) {
family = AF_INET;
len = sizeof(struct sockaddr_in);
#if (NGX_HAVE_INET6)
} else if (ngx_inet6_addr(addr->data, addr->len, inaddr6.s6_addr) == NGX_OK)
{
} else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {
family = AF_INET6;
len = sizeof(struct sockaddr_in6);
#endif
} else {
return NULL;
return NGX_DECLINED;
}
a = ngx_palloc(pool, sizeof(ngx_addr_t));
if (a == NULL) {
return NULL;
addr->sockaddr = ngx_pcalloc(pool, len);
if (addr->sockaddr == NULL) {
return NGX_ERROR;
}
a->sockaddr = ngx_pcalloc(pool, len);
if (a->sockaddr == NULL) {
return NULL;
}
a->sockaddr->sa_family = family;
a->socklen = len;
a->name = *addr;
addr->sockaddr->sa_family = (u_char) family;
addr->socklen = len;
switch (family) {
#if (NGX_HAVE_INET6)
case AF_INET6:
sin6 = (struct sockaddr_in6 *) a->sockaddr;
sin6 = (struct sockaddr_in6 *) addr->sockaddr;
ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
break;
#endif
default: /* AF_INET */
sin = (struct sockaddr_in *) a->sockaddr;
sin = (struct sockaddr_in *) addr->sockaddr;
sin->sin_addr.s_addr = inaddr;
break;
}
return a;
return NGX_OK;
}

View File

@ -109,7 +109,8 @@ size_t ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len,
ngx_uint_t port);
size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len);
ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr);
ngx_addr_t *ngx_parse_addr(ngx_pool_t *pool, ngx_str_t *addr);
ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,
size_t len);
ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u);
ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);

View File

@ -4204,22 +4204,32 @@ ngx_http_upsteam_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
{
char *p = conf;
ngx_int_t rc;
ngx_str_t *value;
ngx_addr_t **paddr;
paddr = (ngx_addr_t **) (p + cmd->offset);
value = cf->args->elts;
*paddr = ngx_parse_addr(cf->pool, &value[1]);
if (*paddr) {
return NGX_CONF_OK;
*paddr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
if (*paddr == NULL) {
return NGX_CONF_ERROR;
}
value = cf->args->elts;
rc = ngx_parse_addr(cf->pool, *paddr, value[1].data, value[1].len);
switch (rc) {
case NGX_OK:
(*paddr)->name = value[1];
return NGX_CONF_OK;
case NGX_DECLINED:
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid address \"%V\"", &value[1]);
default:
return NGX_CONF_ERROR;
}
}