changeset 2806:a445bd4eb571

ngx_create_listening()
author Igor Sysoev <igor@sysoev.ru>
date Tue, 05 May 2009 17:33:26 +0000
parents 60551422e150
children 6ad4bba6313e
files src/core/ngx_connection.c src/core/ngx_connection.h src/http/ngx_http.c src/mail/ngx_mail.c
diffstat 4 files changed, 69 insertions(+), 91 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -12,6 +12,64 @@
 ngx_os_io_t  ngx_io;
 
 
+ngx_listening_t *
+ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
+{
+    ngx_listening_t  *ls;
+    struct sockaddr  *sa;
+    u_char            text[NGX_SOCKADDR_STRLEN];
+
+    ls = ngx_array_push(&cf->cycle->listening);
+    if (ls == NULL) {
+        return NULL;
+    }
+
+    ngx_memzero(ls, sizeof(ngx_listening_t));
+
+    sa = ngx_palloc(cf->pool, socklen);
+    if (sa == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(sa, sockaddr, socklen);
+
+    ls->sockaddr = sa;
+    ls->socklen = socklen;
+
+    ls->addr_text.len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
+
+    ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len);
+    if (ls->addr_text.data == NULL) {
+        return NULL;
+    }
+
+    ngx_memcpy(ls->addr_text.data, text, ls->addr_text.len);
+
+    ls->fd = (ngx_socket_t) -1;
+    ls->type = SOCK_STREAM;
+
+    switch (ls->sockaddr->sa_family) {
+#if (NGX_HAVE_INET6)
+    case AF_INET6:
+         ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
+         break;
+#endif
+    case AF_INET:
+         ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
+         break;
+    default:
+         ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;
+         break;
+    }
+
+    ls->backlog = NGX_LISTEN_BACKLOG;
+    ls->rcvbuf = -1;
+    ls->sndbuf = -1;
+
+    return ls;
+}
+
+
 ngx_int_t
 ngx_set_inherited_sockets(ngx_cycle_t *cycle)
 {
--- a/src/core/ngx_connection.h
+++ b/src/core/ngx_connection.h
@@ -163,6 +163,8 @@ struct ngx_connection_s {
 };
 
 
+ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, void *sockaddr,
+    socklen_t socklen);
 ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);
 ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);
 void ngx_configure_listening_sockets(ngx_cycle_t *cycle);
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -1688,54 +1688,14 @@ static ngx_listening_t *
 ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
 {
     ngx_listening_t           *ls;
-    struct sockaddr           *sa;
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
-    u_char                     text[NGX_SOCKADDR_STRLEN];
 
-    ls = ngx_array_push(&cf->cycle->listening);
+    ls = ngx_create_listening(cf, addr->sockaddr, addr->socklen);
     if (ls == NULL) {
         return NULL;
     }
 
-    ngx_memzero(ls, sizeof(ngx_listening_t));
-
-    sa = ngx_palloc(cf->pool, addr->socklen);
-    if (sa == NULL) {
-        return NULL;
-    }
-
-    ngx_memcpy(sa, addr->sockaddr, addr->socklen);
-
-    ls->sockaddr = sa;
-    ls->socklen = addr->socklen;
-
-    ls->addr_text.len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
-
-    ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len);
-    if (ls->addr_text.data == NULL) {
-        return NULL;
-    }
-
-    ngx_memcpy(ls->addr_text.data, text, ls->addr_text.len);
-
-    ls->fd = (ngx_socket_t) -1;
-    ls->type = SOCK_STREAM;
-
-    switch (ls->sockaddr->sa_family) {
-#if (NGX_HAVE_INET6)
-    case AF_INET6:
-         ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
-         break;
-#endif
-    case AF_INET:
-         ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
-         break;
-    default:
-         ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;
-         break;
-    }
-
     ls->addr_ntop = 1;
 
     ls->handler = ngx_http_init_connection;
--- a/src/mail/ngx_mail.c
+++ b/src/mail/ngx_mail.c
@@ -72,15 +72,13 @@ ngx_mail_block(ngx_conf_t *cf, ngx_comma
     ngx_listening_t             *ls;
     ngx_mail_listen_t           *mls;
     ngx_mail_module_t           *module;
-    struct sockaddr             *sa;
-    struct sockaddr_in          *sin;
+    struct sockaddr_in           sin;
     ngx_mail_in_port_t          *mip;
     ngx_mail_conf_ctx_t         *ctx;
     ngx_mail_conf_in_port_t     *in_port;
     ngx_mail_conf_in_addr_t     *in_addr;
     ngx_mail_core_srv_conf_t   **cscfp;
     ngx_mail_core_main_conf_t   *cmcf;
-    u_char                       buf[NGX_SOCKADDR_STRLEN];
 
     if (cmd->name.data[0] == 'i') {
         ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
@@ -302,57 +300,17 @@ ngx_mail_block(ngx_conf_t *cf, ngx_comma
                 continue;
             }
 
-            ls = ngx_array_push(&cf->cycle->listening);
+            ngx_memzero(&sin, sizeof(struct sockaddr_in));
+
+            sin.sin_family = AF_INET;
+            sin.sin_addr.s_addr = in_addr[a].addr;
+            sin.sin_port = htons(in_port[p].port);
+
+            ls = ngx_create_listening(cf, &sin, sizeof(struct sockaddr_in));
             if (ls == NULL) {
                 return NULL;
             }
 
-            ngx_memzero(ls, sizeof(ngx_listening_t));
-
-            sin = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in));
-            if (sin == NULL) {
-                return NULL;
-            }
-
-            sin->sin_family = AF_INET;
-            sin->sin_addr.s_addr = in_addr[a].addr;
-            sin->sin_port = htons(in_port[p].port);
-
-            sa = (struct sockaddr *) sin;
-
-            ls->sockaddr = sa;
-            ls->socklen = sizeof(struct sockaddr_in);
-
-            ls->addr_text.len = ngx_sock_ntop(sa, buf, NGX_SOCKADDR_STRLEN, 1);
-
-            ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len);
-            if (ls->addr_text.data == NULL) {
-                return NULL;
-            }
-
-            ngx_memcpy(ls->addr_text.data, buf, ls->addr_text.len);
-
-            ls->fd = (ngx_socket_t) -1;
-            ls->type = SOCK_STREAM;
-
-            switch (ls->sockaddr->sa_family) {
-#if (NGX_HAVE_INET6)
-            case AF_INET6:
-                 ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
-                 break;
-#endif
-            case AF_INET:
-                 ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
-                 break;
-            default:
-                 ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;
-                 break;
-            }
-
-            ls->backlog = NGX_LISTEN_BACKLOG;
-            ls->rcvbuf = -1;
-            ls->sndbuf = -1;
-
             ls->addr_ntop = 1;
             ls->handler = ngx_mail_init_connection;
             ls->pool_size = 256;