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_int_t
ngx_parse_addr(ngx_pool_t *pool, ngx_str_t *addr) ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)
{ {
size_t len;
in_addr_t inaddr; in_addr_t inaddr;
ngx_uint_t family; ngx_uint_t family;
ngx_addr_t *a;
struct sockaddr_in *sin; struct sockaddr_in *sin;
#if (NGX_HAVE_INET6) #if (NGX_HAVE_INET6)
struct in6_addr inaddr6; struct in6_addr inaddr6;
struct sockaddr_in6 *sin6; struct sockaddr_in6 *sin6;
#endif #endif
inaddr = ngx_inet_addr(addr->data, addr->len); inaddr = ngx_inet_addr(text, len);
if (inaddr != INADDR_NONE) { if (inaddr != INADDR_NONE) {
family = AF_INET; family = AF_INET;
len = sizeof(struct sockaddr_in); len = sizeof(struct sockaddr_in);
#if (NGX_HAVE_INET6) #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; family = AF_INET6;
len = sizeof(struct sockaddr_in6); len = sizeof(struct sockaddr_in6);
#endif #endif
} else { } else {
return NULL; return NGX_DECLINED;
} }
a = ngx_palloc(pool, sizeof(ngx_addr_t)); addr->sockaddr = ngx_pcalloc(pool, len);
if (a == NULL) { if (addr->sockaddr == NULL) {
return NULL; return NGX_ERROR;
} }
a->sockaddr = ngx_pcalloc(pool, len); addr->sockaddr->sa_family = (u_char) family;
if (a->sockaddr == NULL) { addr->socklen = len;
return NULL;
}
a->sockaddr->sa_family = family;
a->socklen = len;
a->name = *addr;
switch (family) { switch (family) {
#if (NGX_HAVE_INET6) #if (NGX_HAVE_INET6)
case AF_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); ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
break; break;
#endif #endif
default: /* AF_INET */ default: /* AF_INET */
sin = (struct sockaddr_in *) a->sockaddr; sin = (struct sockaddr_in *) addr->sockaddr;
sin->sin_addr.s_addr = inaddr; sin->sin_addr.s_addr = inaddr;
break; 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); ngx_uint_t port);
size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len); 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_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_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); 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; char *p = conf;
ngx_int_t rc;
ngx_str_t *value; ngx_str_t *value;
ngx_addr_t **paddr; ngx_addr_t **paddr;
paddr = (ngx_addr_t **) (p + cmd->offset); paddr = (ngx_addr_t **) (p + cmd->offset);
value = cf->args->elts; *paddr = ngx_palloc(cf->pool, sizeof(ngx_addr_t));
if (*paddr == NULL) {
*paddr = ngx_parse_addr(cf->pool, &value[1]); return NGX_CONF_ERROR;
if (*paddr) {
return NGX_CONF_OK;
} }
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, value = cf->args->elts;
"invalid address \"%V\"", &value[1]);
return NGX_CONF_ERROR; 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;
}
} }