changeset 3272:98f49b2bcae8

change ngx_parse_addr() interface
author Igor Sysoev <igor@sysoev.ru>
date Mon, 02 Nov 2009 16:11:06 +0000
parents fcd98af88df3
children fe71be4a02f1
files src/core/ngx_inet.c src/core/ngx_inet.h src/http/ngx_http_upstream.c
diffstat 3 files changed, 34 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
 
 
--- 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);
 
--- 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;
+    }
 }