Mercurial > hg > nginx
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 |