change ngx_parse_addr() interface
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index e051f7f..c54db0e 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -416,66 +416,57 @@
}
-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;
}
diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h
index 3ac2e37..f708c07 100644
--- a/src/core/ngx_inet.h
+++ b/src/core/ngx_inet.h
@@ -109,7 +109,8 @@
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
index a04aad3..b82bfa9 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -4204,22 +4204,32 @@
{
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]);
+ value = cf->args->elts;
- 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;
+ }
}