# HG changeset patch # User Igor Sysoev # Date 1257178266 0 # Node ID 98f49b2bcae8cd2f9feea3b06dd24b1a262385b1 # Parent fcd98af88df3313db0c1b23aace8bfe30f2dd54a change ngx_parse_addr() interface diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -416,66 +416,57 @@ ngx_ptocidr(ngx_str_t *text, ngx_cidr_t } -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; - } - - a = ngx_palloc(pool, sizeof(ngx_addr_t)); - if (a == NULL) { - return NULL; + return NGX_DECLINED; } - a->sockaddr = ngx_pcalloc(pool, len); - if (a->sockaddr == NULL) { - return NULL; + addr->sockaddr = ngx_pcalloc(pool, len); + if (addr->sockaddr == NULL) { + return NGX_ERROR; } - 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; } diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h --- a/src/core/ngx_inet.h +++ b/src/core/ngx_inet.h @@ -109,7 +109,8 @@ size_t ngx_sock_ntop(struct sockaddr *sa 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); diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c +++ b/src/http/ngx_http_upstream.c @@ -4204,22 +4204,32 @@ ngx_http_upsteam_bind_set_slot(ngx_conf_ { 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; } - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid address \"%V\"", &value[1]); - - 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; + } }