changeset 3270:7d1a04259e3f

ngx_parse_addr()
author Igor Sysoev <igor@sysoev.ru>
date Mon, 02 Nov 2009 15:20:42 +0000
parents f0d596e84634
children fcd98af88df3
files src/core/ngx_inet.c src/core/ngx_inet.h
diffstat 2 files changed, 64 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -416,6 +416,69 @@ ngx_ptocidr(ngx_str_t *text, ngx_cidr_t 
 }
 
 
+ngx_addr_t *
+ngx_parse_addr(ngx_pool_t *pool, ngx_str_t *addr)
+{
+    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);
+
+    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)
+    {
+        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;
+    }
+
+    a->sockaddr = ngx_pcalloc(pool, len);
+    if (a->sockaddr == NULL) {
+        return NULL;
+    }
+
+    a->sockaddr->sa_family = family;
+    a->socklen = len;
+    a->name = *addr;
+
+    switch (family) {
+
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+        sin6 = (struct sockaddr_in6 *) a->sockaddr;
+        ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
+        break;
+#endif
+
+    default: /* AF_INET */
+        sin = (struct sockaddr_in *) a->sockaddr;
+        sin->sin_addr.s_addr = inaddr;
+        break;
+    }
+
+    return a;
+}
+
+
 ngx_int_t
 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)
 {
--- a/src/core/ngx_inet.h
+++ b/src/core/ngx_inet.h
@@ -109,6 +109,7 @@ 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_url(ngx_pool_t *pool, ngx_url_t *u);
 ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u);