diff src/mail/ngx_mail.c @ 7478:4f9b72a229c1

Multiple addresses in "listen". Previously only one address was used by the listen directive handler even if host name resolved to multiple addresses. Now a separate listening socket is created for each address.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 15 Mar 2019 15:45:56 +0300
parents 6c13008ad503
children 12ea1de7d87c
line wrap: on
line diff
--- a/src/mail/ngx_mail.c
+++ b/src/mail/ngx_mail.c
@@ -231,7 +231,7 @@ ngx_mail_add_ports(ngx_conf_t *cf, ngx_a
     ngx_mail_conf_port_t  *port;
     ngx_mail_conf_addr_t  *addr;
 
-    sa = &listen->sockaddr.sockaddr;
+    sa = listen->sockaddr;
     p = ngx_inet_get_port(sa);
 
     port = ports->elts;
@@ -316,7 +316,7 @@ ngx_mail_optimize_servers(ngx_conf_t *cf
                 continue;
             }
 
-            ls = ngx_create_listening(cf, &addr[i].opt.sockaddr.sockaddr,
+            ls = ngx_create_listening(cf, addr[i].opt.sockaddr,
                                       addr[i].opt.socklen);
             if (ls == NULL) {
                 return NGX_CONF_ERROR;
@@ -384,12 +384,9 @@ static ngx_int_t
 ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,
     ngx_mail_conf_addr_t *addr)
 {
-    u_char              *p;
-    size_t               len;
     ngx_uint_t           i;
     ngx_mail_in_addr_t  *addrs;
     struct sockaddr_in  *sin;
-    u_char               buf[NGX_SOCKADDR_STRLEN];
 
     mport->addrs = ngx_pcalloc(cf->pool,
                                mport->naddrs * sizeof(ngx_mail_in_addr_t));
@@ -401,26 +398,14 @@ ngx_mail_add_addrs(ngx_conf_t *cf, ngx_m
 
     for (i = 0; i < mport->naddrs; i++) {
 
-        sin = &addr[i].opt.sockaddr.sockaddr_in;
+        sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
         addrs[i].addr = sin->sin_addr.s_addr;
 
         addrs[i].conf.ctx = addr[i].opt.ctx;
 #if (NGX_MAIL_SSL)
         addrs[i].conf.ssl = addr[i].opt.ssl;
 #endif
-
-        len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, addr[i].opt.socklen,
-                            buf, NGX_SOCKADDR_STRLEN, 1);
-
-        p = ngx_pnalloc(cf->pool, len);
-        if (p == NULL) {
-            return NGX_ERROR;
-        }
-
-        ngx_memcpy(p, buf, len);
-
-        addrs[i].conf.addr_text.len = len;
-        addrs[i].conf.addr_text.data = p;
+        addrs[i].conf.addr_text = addr[i].opt.addr_text;
     }
 
     return NGX_OK;
@@ -433,12 +418,9 @@ static ngx_int_t
 ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,
     ngx_mail_conf_addr_t *addr)
 {
-    u_char               *p;
-    size_t                len;
     ngx_uint_t            i;
     ngx_mail_in6_addr_t  *addrs6;
     struct sockaddr_in6  *sin6;
-    u_char                buf[NGX_SOCKADDR_STRLEN];
 
     mport->addrs = ngx_pcalloc(cf->pool,
                                mport->naddrs * sizeof(ngx_mail_in6_addr_t));
@@ -450,26 +432,14 @@ ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_
 
     for (i = 0; i < mport->naddrs; i++) {
 
-        sin6 = &addr[i].opt.sockaddr.sockaddr_in6;
+        sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
         addrs6[i].addr6 = sin6->sin6_addr;
 
         addrs6[i].conf.ctx = addr[i].opt.ctx;
 #if (NGX_MAIL_SSL)
         addrs6[i].conf.ssl = addr[i].opt.ssl;
 #endif
-
-        len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, addr[i].opt.socklen,
-                            buf, NGX_SOCKADDR_STRLEN, 1);
-
-        p = ngx_pnalloc(cf->pool, len);
-        if (p == NULL) {
-            return NGX_ERROR;
-        }
-
-        ngx_memcpy(p, buf, len);
-
-        addrs6[i].conf.addr_text.len = len;
-        addrs6[i].conf.addr_text.data = p;
+        addrs6[i].conf.addr_text = addr[i].opt.addr_text;
     }
 
     return NGX_OK;