annotate src/mail/ngx_mail.c @ 6152:3c344ea7d88b

Simplified ngx_http_init_listening(). There is no need to set "i" to 0, as it's expected to be 0 assuming the bindings are properly sorted, and we already rely on this when explicitly set hport->naddrs to 1. Remaining conditional code is replaced with identical "hport->naddrs = i + 1". Identical modifications are done in the mail and stream modules, in the ngx_mail_optimize_servers() and ngx_stream_optimize_servers() functions, respectively. No functional changes.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 20 May 2015 15:51:28 +0300
parents 53bccdc4923a
children f61049c80458
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
1
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
2 /*
444
42d11f017717 nginx-0.1.0-2004-09-29-20:00:49 import; remove years from copyright
Igor Sysoev <igor@sysoev.ru>
parents: 441
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4323
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
5 */
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 419
diff changeset
6
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_event.h>
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
11 #include <ngx_mail.h>
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
12
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
13
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
14 static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
15 static ngx_int_t ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
16 ngx_mail_listen_t *listen);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
17 static char *ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
18 static ngx_int_t ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
19 ngx_mail_conf_addr_t *addr);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
20 #if (NGX_HAVE_INET6)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
21 static ngx_int_t ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
22 ngx_mail_conf_addr_t *addr);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
23 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
24 static ngx_int_t ngx_mail_cmp_conf_addrs(const void *one, const void *two);
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
27 ngx_uint_t ngx_mail_max_module;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
28
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
29
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
30 static ngx_command_t ngx_mail_commands[] = {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
31
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
32 { ngx_string("mail"),
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
33 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
34 ngx_mail_block,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
35 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
36 0,
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
37 NULL },
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
38
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
39 ngx_null_command
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
40 };
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
41
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
42
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
43 static ngx_core_module_t ngx_mail_module_ctx = {
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
44 ngx_string("mail"),
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
45 NULL,
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
46 NULL
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
47 };
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
48
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
49
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
50 ngx_module_t ngx_mail_module = {
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 444
diff changeset
51 NGX_MODULE_V1,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
52 &ngx_mail_module_ctx, /* module context */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
53 ngx_mail_commands, /* module directives */
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
54 NGX_CORE_MODULE, /* module type */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
55 NULL, /* init master */
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
56 NULL, /* init module */
541
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
57 NULL, /* init process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
58 NULL, /* init thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
59 NULL, /* exit thread */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
60 NULL, /* exit process */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
61 NULL, /* exit master */
b09ee85d0ac8 nginx-0.1.45-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 521
diff changeset
62 NGX_MODULE_V1_PADDING
413
de9d4726e28a nginx-0.0.10-2004-08-31-23:05:39 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63 };
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
64
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
65
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
66 static char *
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
67 ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
68 {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
69 char *rv;
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
70 ngx_uint_t i, m, mi, s;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
71 ngx_conf_t pcf;
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
72 ngx_array_t ports;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
73 ngx_mail_listen_t *listen;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
74 ngx_mail_module_t *module;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
75 ngx_mail_conf_ctx_t *ctx;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
76 ngx_mail_core_srv_conf_t **cscfp;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
77 ngx_mail_core_main_conf_t *cmcf;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
78
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
79 /* the main mail context */
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
80
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
81 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
82 if (ctx == NULL) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
83 return NGX_CONF_ERROR;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
84 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
85
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
86 *(ngx_mail_conf_ctx_t **) conf = ctx;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
87
5978
eb4ba3800c31 Mail: fixed a comment.
Ruslan Ermilov <ru@nginx.com>
parents: 5808
diff changeset
88 /* count the number of the mail modules and set up their indices */
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
89
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
90 ngx_mail_max_module = 0;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
91 for (m = 0; ngx_modules[m]; m++) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
92 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
93 continue;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
94 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
95
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
96 ngx_modules[m]->ctx_index = ngx_mail_max_module++;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
97 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
98
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
99
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
100 /* the mail main_conf context, it is the same in the all mail contexts */
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
101
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
102 ctx->main_conf = ngx_pcalloc(cf->pool,
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
103 sizeof(void *) * ngx_mail_max_module);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
104 if (ctx->main_conf == NULL) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
105 return NGX_CONF_ERROR;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
106 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
107
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
108
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
109 /*
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
110 * the mail null srv_conf context, it is used to merge
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
111 * the server{}s' srv_conf's
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
112 */
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
113
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
114 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
115 if (ctx->srv_conf == NULL) {
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
116 return NGX_CONF_ERROR;
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
117 }
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
118
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
119
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
120 /*
5808
a305a4477af0 Mail: fixed a comment.
Valentin Bartenev <vbart@nginx.com>
parents: 5266
diff changeset
121 * create the main_conf's and the null srv_conf's of the all mail modules
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
122 */
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
123
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
124 for (m = 0; ngx_modules[m]; m++) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
125 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
126 continue;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
127 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
128
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
129 module = ngx_modules[m]->ctx;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
130 mi = ngx_modules[m]->ctx_index;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
131
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
132 if (module->create_main_conf) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
133 ctx->main_conf[mi] = module->create_main_conf(cf);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
134 if (ctx->main_conf[mi] == NULL) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
135 return NGX_CONF_ERROR;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
136 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
137 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
138
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
139 if (module->create_srv_conf) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
140 ctx->srv_conf[mi] = module->create_srv_conf(cf);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
141 if (ctx->srv_conf[mi] == NULL) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
142 return NGX_CONF_ERROR;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
143 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
144 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
145 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
146
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
147
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
148 /* parse inside the mail{} block */
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
149
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
150 pcf = *cf;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
151 cf->ctx = ctx;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
152
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
153 cf->module_type = NGX_MAIL_MODULE;
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
154 cf->cmd_type = NGX_MAIL_MAIN_CONF;
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
155 rv = ngx_conf_parse(cf, NULL);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
156
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
157 if (rv != NGX_CONF_OK) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
158 *cf = pcf;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
159 return rv;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
160 }
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
161
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
162
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
163 /* init mail{} main_conf's, merge the server{}s' srv_conf's */
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
164
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
165 cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
166 cscfp = cmcf->servers.elts;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
167
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
168 for (m = 0; ngx_modules[m]; m++) {
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
169 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
170 continue;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
171 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
172
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
173 module = ngx_modules[m]->ctx;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
174 mi = ngx_modules[m]->ctx_index;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
175
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
176 /* init mail{} main_conf's */
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
177
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1377
diff changeset
178 cf->ctx = ctx;
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1377
diff changeset
179
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
180 if (module->init_main_conf) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
181 rv = module->init_main_conf(cf, ctx->main_conf[mi]);
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
182 if (rv != NGX_CONF_OK) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
183 *cf = pcf;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
184 return rv;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
185 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
186 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
187
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
188 for (s = 0; s < cmcf->servers.nelts; s++) {
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
189
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
190 /* merge the server{}s' srv_conf's */
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
191
1487
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1377
diff changeset
192 cf->ctx = cscfp[s]->ctx;
f69493e8faab ngx_mail_pop3_module, ngx_mail_imap_module, and ngx_mail_smtp_module
Igor Sysoev <igor@sysoev.ru>
parents: 1377
diff changeset
193
521
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
194 if (module->merge_srv_conf) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
195 rv = module->merge_srv_conf(cf,
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
196 ctx->srv_conf[mi],
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
197 cscfp[s]->ctx->srv_conf[mi]);
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
198 if (rv != NGX_CONF_OK) {
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
199 *cf = pcf;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
200 return rv;
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
201 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
202 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
203 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
204 }
6f00349b98e5 nginx-0.1.35-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 509
diff changeset
205
577
4d9ea73a627a nginx-0.3.10-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 541
diff changeset
206 *cf = pcf;
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
207
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
208
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
209 if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_mail_conf_port_t))
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
210 != NGX_OK)
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
211 {
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
212 return NGX_CONF_ERROR;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
213 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
214
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
215 listen = cmcf->listen.elts;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
216
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
217 for (i = 0; i < cmcf->listen.nelts; i++) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
218 if (ngx_mail_add_ports(cf, &ports, &listen[i]) != NGX_OK) {
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
219 return NGX_CONF_ERROR;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
220 }
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
221 }
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
222
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
223 return ngx_mail_optimize_servers(cf, &ports);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
224 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
225
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
226
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
227 static ngx_int_t
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
228 ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
229 ngx_mail_listen_t *listen)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
230 {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
231 in_port_t p;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
232 ngx_uint_t i;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
233 struct sockaddr *sa;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
234 struct sockaddr_in *sin;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
235 ngx_mail_conf_port_t *port;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
236 ngx_mail_conf_addr_t *addr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
237 #if (NGX_HAVE_INET6)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
238 struct sockaddr_in6 *sin6;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
239 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
240
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
241 sa = (struct sockaddr *) &listen->sockaddr;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
242
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
243 switch (sa->sa_family) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
244
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
245 #if (NGX_HAVE_INET6)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
246 case AF_INET6:
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
247 sin6 = (struct sockaddr_in6 *) sa;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
248 p = sin6->sin6_port;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
249 break;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
250 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
251
4819
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
252 #if (NGX_HAVE_UNIX_DOMAIN)
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
253 case AF_UNIX:
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
254 p = 0;
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
255 break;
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
256 #endif
49a3fb31a05c Mail: fixed handling of AF_UNIX addresses in "listen".
Ruslan Ermilov <ru@nginx.com>
parents: 4817
diff changeset
257
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
258 default: /* AF_INET */
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
259 sin = (struct sockaddr_in *) sa;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
260 p = sin->sin_port;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
261 break;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
262 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
263
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
264 port = ports->elts;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
265 for (i = 0; i < ports->nelts; i++) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
266 if (p == port[i].port && sa->sa_family == port[i].family) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
267
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
268 /* a port is already in the port list */
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
269
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
270 port = &port[i];
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
271 goto found;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
272 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
273 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
274
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
275 /* add a port to the port list */
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
276
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
277 port = ngx_array_push(ports);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
278 if (port == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
279 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
280 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
281
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
282 port->family = sa->sa_family;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
283 port->port = p;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
284
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
285 if (ngx_array_init(&port->addrs, cf->temp_pool, 2,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
286 sizeof(ngx_mail_conf_addr_t))
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
287 != NGX_OK)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
288 {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
289 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
290 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
291
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
292 found:
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
293
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
294 addr = ngx_array_push(&port->addrs);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
295 if (addr == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
296 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
297 }
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
298
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
299 addr->sockaddr = (struct sockaddr *) &listen->sockaddr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
300 addr->socklen = listen->socklen;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
301 addr->ctx = listen->ctx;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
302 addr->bind = listen->bind;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
303 addr->wildcard = listen->wildcard;
4323
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
304 addr->so_keepalive = listen->so_keepalive;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
305 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
306 addr->tcp_keepidle = listen->tcp_keepidle;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
307 addr->tcp_keepintvl = listen->tcp_keepintvl;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
308 addr->tcp_keepcnt = listen->tcp_keepcnt;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
309 #endif
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
310 #if (NGX_MAIL_SSL)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
311 addr->ssl = listen->ssl;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
312 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
313 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
314 addr->ipv6only = listen->ipv6only;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
315 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
316
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
317 return NGX_OK;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
318 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
319
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
320
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
321 static char *
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
322 ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
323 {
6130
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
324 ngx_uint_t i, p, last, bind_wildcard;
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
325 ngx_listening_t *ls;
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
326 ngx_mail_port_t *mport;
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
327 ngx_mail_conf_port_t *port;
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
328 ngx_mail_conf_addr_t *addr;
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
329 ngx_mail_core_srv_conf_t *cscf;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
330
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
331 port = ports->elts;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
332 for (p = 0; p < ports->nelts; p++) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
333
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
334 ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
335 sizeof(ngx_mail_conf_addr_t), ngx_mail_cmp_conf_addrs);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
336
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
337 addr = port[p].addrs.elts;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
338 last = port[p].addrs.nelts;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
339
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
340 /*
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
341 * if there is the binding to the "*:port" then we need to bind()
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
342 * to the "*:port" only and ignore the other bindings
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
343 */
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
344
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
345 if (addr[last - 1].wildcard) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
346 addr[last - 1].bind = 1;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
347 bind_wildcard = 1;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
348
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
349 } else {
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
350 bind_wildcard = 0;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
351 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
352
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
353 i = 0;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
354
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
355 while (i < last) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
356
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
357 if (bind_wildcard && !addr[i].bind) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
358 i++;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
359 continue;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
360 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
361
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
362 ls = ngx_create_listening(cf, addr[i].sockaddr, addr[i].socklen);
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
363 if (ls == NULL) {
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
364 return NGX_CONF_ERROR;
2799
8b54548fef6e delete ngx_listening_inet_stream_socket()
Igor Sysoev <igor@sysoev.ru>
parents: 2798
diff changeset
365 }
8b54548fef6e delete ngx_listening_inet_stream_socket()
Igor Sysoev <igor@sysoev.ru>
parents: 2798
diff changeset
366
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
367 ls->addr_ntop = 1;
1136
68f30ab68bb7 Many changes:
Igor Sysoev <igor@sysoev.ru>
parents: 641
diff changeset
368 ls->handler = ngx_mail_init_connection;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
369 ls->pool_size = 256;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
370
6130
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
371 cscf = addr->ctx->srv_conf[ngx_mail_core_module.ctx_index];
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
372
fc99323a3d79 Mail: error_log support.
Vladimir Homutov <vl@nginx.com>
parents: 5978
diff changeset
373 ls->logp = cscf->error_log;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
374 ls->log.data = &ls->addr_text;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
375 ls->log.handler = ngx_accept_log_error;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
376
4323
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
377 ls->keepalive = addr[i].so_keepalive;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
378 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
379 ls->keepidle = addr[i].tcp_keepidle;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
380 ls->keepintvl = addr[i].tcp_keepintvl;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
381 ls->keepcnt = addr[i].tcp_keepcnt;
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
382 #endif
c4513d4dd024 Added the "so_keepalive=" parameter to the "listen" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 2855
diff changeset
383
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
384 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
385 ls->ipv6only = addr[i].ipv6only;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
386 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
387
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
388 mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t));
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
389 if (mport == NULL) {
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
390 return NGX_CONF_ERROR;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
391 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
392
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
393 ls->servers = mport;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
394
6152
3c344ea7d88b Simplified ngx_http_init_listening().
Maxim Dounin <mdounin@mdounin.ru>
parents: 6142
diff changeset
395 mport->naddrs = i + 1;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
396
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
397 switch (ls->sockaddr->sa_family) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
398 #if (NGX_HAVE_INET6)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
399 case AF_INET6:
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
400 if (ngx_mail_add_addrs6(cf, mport, addr) != NGX_OK) {
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
401 return NGX_CONF_ERROR;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
402 }
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
403 break;
2224
109849282793 *) listen ssl
Igor Sysoev <igor@sysoev.ru>
parents: 2197
diff changeset
404 #endif
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
405 default: /* AF_INET */
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
406 if (ngx_mail_add_addrs(cf, mport, addr) != NGX_OK) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
407 return NGX_CONF_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
408 }
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
409 break;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
410 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
411
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
412 addr++;
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
413 last--;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
414 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
415 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
416
417
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
417 return NGX_CONF_OK;
0526206251f6 nginx-0.0.10-2004-09-07-19:29:22 import
Igor Sysoev <igor@sysoev.ru>
parents: 415
diff changeset
418 }
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
419
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
420
1956
cb8c0c8e0c27 use ngx_int_t in ngx_sort() callback
Igor Sysoev <igor@sysoev.ru>
parents: 1487
diff changeset
421 static ngx_int_t
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
422 ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
423 ngx_mail_conf_addr_t *addr)
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
424 {
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
425 u_char *p;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
426 size_t len;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
427 ngx_uint_t i;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
428 ngx_mail_in_addr_t *addrs;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
429 struct sockaddr_in *sin;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
430 u_char buf[NGX_SOCKADDR_STRLEN];
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
431
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
432 mport->addrs = ngx_pcalloc(cf->pool,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
433 mport->naddrs * sizeof(ngx_mail_in_addr_t));
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
434 if (mport->addrs == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
435 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
436 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
437
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
438 addrs = mport->addrs;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
439
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
440 for (i = 0; i < mport->naddrs; i++) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
441
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
442 sin = (struct sockaddr_in *) addr[i].sockaddr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
443 addrs[i].addr = sin->sin_addr.s_addr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
444
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
445 addrs[i].conf.ctx = addr[i].ctx;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
446 #if (NGX_MAIL_SSL)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
447 addrs[i].conf.ssl = addr[i].ssl;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
448 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
449
5266
Maxim Dounin <mdounin@mdounin.ru>
parents: 5263
diff changeset
450 len = ngx_sock_ntop(addr[i].sockaddr, addr[i].socklen, buf,
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4819
diff changeset
451 NGX_SOCKADDR_STRLEN, 1);
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
452
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
453 p = ngx_pnalloc(cf->pool, len);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
454 if (p == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
455 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
456 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
457
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
458 ngx_memcpy(p, buf, len);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
459
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
460 addrs[i].conf.addr_text.len = len;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
461 addrs[i].conf.addr_text.data = p;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
462 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
463
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
464 return NGX_OK;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
465 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
466
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
467
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
468 #if (NGX_HAVE_INET6)
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
469
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
470 static ngx_int_t
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
471 ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
472 ngx_mail_conf_addr_t *addr)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
473 {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
474 u_char *p;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
475 size_t len;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
476 ngx_uint_t i;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
477 ngx_mail_in6_addr_t *addrs6;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
478 struct sockaddr_in6 *sin6;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
479 u_char buf[NGX_SOCKADDR_STRLEN];
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
480
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
481 mport->addrs = ngx_pcalloc(cf->pool,
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
482 mport->naddrs * sizeof(ngx_mail_in6_addr_t));
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
483 if (mport->addrs == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
484 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
485 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
486
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
487 addrs6 = mport->addrs;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
488
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
489 for (i = 0; i < mport->naddrs; i++) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
490
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
491 sin6 = (struct sockaddr_in6 *) addr[i].sockaddr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
492 addrs6[i].addr6 = sin6->sin6_addr;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
493
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
494 addrs6[i].conf.ctx = addr[i].ctx;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
495 #if (NGX_MAIL_SSL)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
496 addrs6[i].conf.ssl = addr[i].ssl;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
497 #endif
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
498
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4819
diff changeset
499 len = ngx_sock_ntop(addr[i].sockaddr, addr[i].socklen, buf,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 4819
diff changeset
500 NGX_SOCKADDR_STRLEN, 1);
2855
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
501
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
502 p = ngx_pnalloc(cf->pool, len);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
503 if (p == NULL) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
504 return NGX_ERROR;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
505 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
506
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
507 ngx_memcpy(p, buf, len);
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
508
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
509 addrs6[i].conf.addr_text.len = len;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
510 addrs6[i].conf.addr_text.data = p;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
511 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
512
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
513 return NGX_OK;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
514 }
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
515
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
516 #endif
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
517
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
518
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
519 static ngx_int_t
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
520 ngx_mail_cmp_conf_addrs(const void *one, const void *two)
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
521 {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
522 ngx_mail_conf_addr_t *first, *second;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
523
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
524 first = (ngx_mail_conf_addr_t *) one;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
525 second = (ngx_mail_conf_addr_t *) two;
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
526
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
527 if (first->wildcard) {
a96a8c916b0c mail proxy listen IPv6 support
Igor Sysoev <igor@sysoev.ru>
parents: 2806
diff changeset
528 /* a wildcard must be the last resort, shift it to the end */
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
529 return 1;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
530 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
531
4817
d794e59800ef Mail: fixed sorting of listen addresses (ticket #187).
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
532 if (second->wildcard) {
d794e59800ef Mail: fixed sorting of listen addresses (ticket #187).
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
533 /* a wildcard must be the last resort, shift it to the end */
d794e59800ef Mail: fixed sorting of listen addresses (ticket #187).
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
534 return -1;
d794e59800ef Mail: fixed sorting of listen addresses (ticket #187).
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
535 }
d794e59800ef Mail: fixed sorting of listen addresses (ticket #187).
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
536
641
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
537 if (first->bind && !second->bind) {
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
538 /* shift explicit bind()ed addresses to the start */
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
539 return -1;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
540 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
541
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
542 if (!first->bind && second->bind) {
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
543 /* shift explicit bind()ed addresses to the start */
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
544 return 1;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
545 }
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
546
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
547 /* do not sort by default */
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
548
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
549 return 0;
5e8fb59c18c1 nginx-0.3.42-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 577
diff changeset
550 }