ngx_parse_addr()
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index 5d2f86e..e051f7f 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -416,6 +416,69 @@
}
+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)
{