comparison 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
comparison
equal deleted inserted replaced
7477:c74904a17021 7478:4f9b72a229c1
229 ngx_uint_t i; 229 ngx_uint_t i;
230 struct sockaddr *sa; 230 struct sockaddr *sa;
231 ngx_mail_conf_port_t *port; 231 ngx_mail_conf_port_t *port;
232 ngx_mail_conf_addr_t *addr; 232 ngx_mail_conf_addr_t *addr;
233 233
234 sa = &listen->sockaddr.sockaddr; 234 sa = listen->sockaddr;
235 p = ngx_inet_get_port(sa); 235 p = ngx_inet_get_port(sa);
236 236
237 port = ports->elts; 237 port = ports->elts;
238 for (i = 0; i < ports->nelts; i++) { 238 for (i = 0; i < ports->nelts; i++) {
239 if (p == port[i].port && sa->sa_family == port[i].family) { 239 if (p == port[i].port && sa->sa_family == port[i].family) {
314 if (bind_wildcard && !addr[i].opt.bind) { 314 if (bind_wildcard && !addr[i].opt.bind) {
315 i++; 315 i++;
316 continue; 316 continue;
317 } 317 }
318 318
319 ls = ngx_create_listening(cf, &addr[i].opt.sockaddr.sockaddr, 319 ls = ngx_create_listening(cf, addr[i].opt.sockaddr,
320 addr[i].opt.socklen); 320 addr[i].opt.socklen);
321 if (ls == NULL) { 321 if (ls == NULL) {
322 return NGX_CONF_ERROR; 322 return NGX_CONF_ERROR;
323 } 323 }
324 324
382 382
383 static ngx_int_t 383 static ngx_int_t
384 ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport, 384 ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,
385 ngx_mail_conf_addr_t *addr) 385 ngx_mail_conf_addr_t *addr)
386 { 386 {
387 u_char *p;
388 size_t len;
389 ngx_uint_t i; 387 ngx_uint_t i;
390 ngx_mail_in_addr_t *addrs; 388 ngx_mail_in_addr_t *addrs;
391 struct sockaddr_in *sin; 389 struct sockaddr_in *sin;
392 u_char buf[NGX_SOCKADDR_STRLEN];
393 390
394 mport->addrs = ngx_pcalloc(cf->pool, 391 mport->addrs = ngx_pcalloc(cf->pool,
395 mport->naddrs * sizeof(ngx_mail_in_addr_t)); 392 mport->naddrs * sizeof(ngx_mail_in_addr_t));
396 if (mport->addrs == NULL) { 393 if (mport->addrs == NULL) {
397 return NGX_ERROR; 394 return NGX_ERROR;
399 396
400 addrs = mport->addrs; 397 addrs = mport->addrs;
401 398
402 for (i = 0; i < mport->naddrs; i++) { 399 for (i = 0; i < mport->naddrs; i++) {
403 400
404 sin = &addr[i].opt.sockaddr.sockaddr_in; 401 sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
405 addrs[i].addr = sin->sin_addr.s_addr; 402 addrs[i].addr = sin->sin_addr.s_addr;
406 403
407 addrs[i].conf.ctx = addr[i].opt.ctx; 404 addrs[i].conf.ctx = addr[i].opt.ctx;
408 #if (NGX_MAIL_SSL) 405 #if (NGX_MAIL_SSL)
409 addrs[i].conf.ssl = addr[i].opt.ssl; 406 addrs[i].conf.ssl = addr[i].opt.ssl;
410 #endif 407 #endif
411 408 addrs[i].conf.addr_text = addr[i].opt.addr_text;
412 len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, addr[i].opt.socklen,
413 buf, NGX_SOCKADDR_STRLEN, 1);
414
415 p = ngx_pnalloc(cf->pool, len);
416 if (p == NULL) {
417 return NGX_ERROR;
418 }
419
420 ngx_memcpy(p, buf, len);
421
422 addrs[i].conf.addr_text.len = len;
423 addrs[i].conf.addr_text.data = p;
424 } 409 }
425 410
426 return NGX_OK; 411 return NGX_OK;
427 } 412 }
428 413
431 416
432 static ngx_int_t 417 static ngx_int_t
433 ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport, 418 ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,
434 ngx_mail_conf_addr_t *addr) 419 ngx_mail_conf_addr_t *addr)
435 { 420 {
436 u_char *p;
437 size_t len;
438 ngx_uint_t i; 421 ngx_uint_t i;
439 ngx_mail_in6_addr_t *addrs6; 422 ngx_mail_in6_addr_t *addrs6;
440 struct sockaddr_in6 *sin6; 423 struct sockaddr_in6 *sin6;
441 u_char buf[NGX_SOCKADDR_STRLEN];
442 424
443 mport->addrs = ngx_pcalloc(cf->pool, 425 mport->addrs = ngx_pcalloc(cf->pool,
444 mport->naddrs * sizeof(ngx_mail_in6_addr_t)); 426 mport->naddrs * sizeof(ngx_mail_in6_addr_t));
445 if (mport->addrs == NULL) { 427 if (mport->addrs == NULL) {
446 return NGX_ERROR; 428 return NGX_ERROR;
448 430
449 addrs6 = mport->addrs; 431 addrs6 = mport->addrs;
450 432
451 for (i = 0; i < mport->naddrs; i++) { 433 for (i = 0; i < mport->naddrs; i++) {
452 434
453 sin6 = &addr[i].opt.sockaddr.sockaddr_in6; 435 sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
454 addrs6[i].addr6 = sin6->sin6_addr; 436 addrs6[i].addr6 = sin6->sin6_addr;
455 437
456 addrs6[i].conf.ctx = addr[i].opt.ctx; 438 addrs6[i].conf.ctx = addr[i].opt.ctx;
457 #if (NGX_MAIL_SSL) 439 #if (NGX_MAIL_SSL)
458 addrs6[i].conf.ssl = addr[i].opt.ssl; 440 addrs6[i].conf.ssl = addr[i].opt.ssl;
459 #endif 441 #endif
460 442 addrs6[i].conf.addr_text = addr[i].opt.addr_text;
461 len = ngx_sock_ntop(&addr[i].opt.sockaddr.sockaddr, addr[i].opt.socklen,
462 buf, NGX_SOCKADDR_STRLEN, 1);
463
464 p = ngx_pnalloc(cf->pool, len);
465 if (p == NULL) {
466 return NGX_ERROR;
467 }
468
469 ngx_memcpy(p, buf, len);
470
471 addrs6[i].conf.addr_text.len = len;
472 addrs6[i].conf.addr_text.data = p;
473 } 443 }
474 444
475 return NGX_OK; 445 return NGX_OK;
476 } 446 }
477 447