annotate src/mail/ngx_mail.c @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 984bb0b1399b
children 6ebbca3d5ed7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_mail.h>
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
14 static ngx_int_t ngx_mail_cmp_conf_in_addrs(const void *one, const void *two);
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 ngx_uint_t ngx_mail_max_module;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 static ngx_command_t ngx_mail_commands[] = {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 { ngx_string("mail"),
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 ngx_mail_block,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 NULL },
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 { ngx_string("imap"),
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 ngx_mail_block,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 NULL },
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 ngx_null_command
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 };
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 static ngx_core_module_t ngx_mail_module_ctx = {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 ngx_string("mail"),
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 NULL,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 NULL
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 };
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 ngx_module_t ngx_mail_module = {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 NGX_MODULE_V1,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 &ngx_mail_module_ctx, /* module context */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 ngx_mail_commands, /* module directives */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 NGX_CORE_MODULE, /* module type */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 NULL, /* init master */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 NULL, /* init module */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 NULL, /* init process */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 NULL, /* init thread */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56 NULL, /* exit thread */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 NULL, /* exit process */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 NULL, /* exit master */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 NGX_MODULE_V1_PADDING
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 };
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 static char *
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66 char *rv;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 u_char *text;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 size_t len;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 ngx_uint_t i, a, l, m, mi, s, p, last, bind_all, done;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 ngx_conf_t pcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 ngx_array_t in_ports;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72 ngx_listening_t *ls;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_mail_listen_t *imls;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 ngx_mail_module_t *module;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 ngx_mail_in_port_t *imip;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 ngx_mail_conf_ctx_t *ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 ngx_mail_conf_in_port_t *in_port;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 ngx_mail_conf_in_addr_t *in_addr;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 ngx_mail_core_srv_conf_t **cscfp;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 ngx_mail_core_main_conf_t *cmcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 if (cmd->name.data[0] == 'i') {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84 "the \"imap\" directive is deprecated, "
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 "use the \"mail\" directive instead");
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 /* the main mail context */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t));
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 if (ctx == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 *(ngx_mail_conf_ctx_t **) conf = ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 /* count the number of the http modules and set up their indices */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 ngx_mail_max_module = 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 for (m = 0; ngx_modules[m]; m++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 continue;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105 ngx_modules[m]->ctx_index = ngx_mail_max_module++;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 /* the mail main_conf context, it is the same in the all mail contexts */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 ctx->main_conf = ngx_pcalloc(cf->pool,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 sizeof(void *) * ngx_mail_max_module);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 if (ctx->main_conf == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 /*
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 * the mail null srv_conf context, it is used to merge
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 * the server{}s' srv_conf's
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121 */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 if (ctx->srv_conf == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 /*
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 * create the main_conf's, the null srv_conf's, and the null loc_conf's
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 * of the all mail modules
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 for (m = 0; ngx_modules[m]; m++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136 continue;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 module = ngx_modules[m]->ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 mi = ngx_modules[m]->ctx_index;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 if (module->create_main_conf) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 ctx->main_conf[mi] = module->create_main_conf(cf);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144 if (ctx->main_conf[mi] == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 if (module->create_srv_conf) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150 ctx->srv_conf[mi] = module->create_srv_conf(cf);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 if (ctx->srv_conf[mi] == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 /* parse inside the mail{} block */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160 pcf = *cf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 cf->ctx = ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 cf->module_type = NGX_MAIL_MODULE;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 cf->cmd_type = NGX_MAIL_MAIN_CONF;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165 rv = ngx_conf_parse(cf, NULL);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 if (rv != NGX_CONF_OK) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 *cf = pcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 return rv;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173 /* init mail{} main_conf's, merge the server{}s' srv_conf's */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175 cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index];
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 cscfp = cmcf->servers.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
177
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 for (m = 0; ngx_modules[m]; m++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 if (ngx_modules[m]->type != NGX_MAIL_MODULE) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 continue;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183 module = ngx_modules[m]->ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 mi = ngx_modules[m]->ctx_index;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
185
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 /* init mail{} main_conf's */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
187
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
188 cf->ctx = ctx;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
189
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 if (module->init_main_conf) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 rv = module->init_main_conf(cf, ctx->main_conf[mi]);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 if (rv != NGX_CONF_OK) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 *cf = pcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 return rv;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 for (s = 0; s < cmcf->servers.nelts; s++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
200 /* merge the server{}s' srv_conf's */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
201
336
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
202 cf->ctx = cscfp[s]->ctx;
1c519aff5c0c nginx 0.6.12
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
203
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
204 if (module->merge_srv_conf) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
205 rv = module->merge_srv_conf(cf,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
206 ctx->srv_conf[mi],
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
207 cscfp[s]->ctx->srv_conf[mi]);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
208 if (rv != NGX_CONF_OK) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
209 *cf = pcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
210 return rv;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
211 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
212 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
213 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
214 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
215
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
216 *cf = pcf;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
217
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
218
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
219 if (ngx_array_init(&in_ports, cf->temp_pool, 4,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
220 sizeof(ngx_mail_conf_in_port_t))
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
221 != NGX_OK)
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
222 {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
223 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
224 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
225
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
226 imls = cmcf->listen.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
227
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
228 for (l = 0; l < cmcf->listen.nelts; l++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
229
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
230 /* AF_INET only */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
231
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
232 in_port = in_ports.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
233 for (p = 0; p < in_ports.nelts; p++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
234 if (in_port[p].port == imls[l].port) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
235 in_port = &in_port[p];
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
236 goto found;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
237 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
238 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
239
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
240 in_port = ngx_array_push(&in_ports);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
241 if (in_port == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
242 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
243 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 in_port->port = imls[l].port;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
247 if (ngx_array_init(&in_port->addrs, cf->temp_pool, 2,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
248 sizeof(ngx_mail_conf_in_addr_t))
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
249 != NGX_OK)
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
251 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
253
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254 found:
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
255
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
256 in_addr = ngx_array_push(&in_port->addrs);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
257 if (in_addr == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
259 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
260
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
261 in_addr->addr = imls[l].addr;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
262 in_addr->ctx = imls[l].ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
263 in_addr->bind = imls[l].bind;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
264 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
265
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
266 /* optimize the lists of ports and addresses */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
267
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
268 /* AF_INET only */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
269
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
270 in_port = in_ports.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
271 for (p = 0; p < in_ports.nelts; p++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
272
302
9b7db0df50f0 nginx 0.5.21
Igor Sysoev <http://sysoev.ru>
parents: 290
diff changeset
273 ngx_sort(in_port[p].addrs.elts, (size_t) in_port[p].addrs.nelts,
9b7db0df50f0 nginx 0.5.21
Igor Sysoev <http://sysoev.ru>
parents: 290
diff changeset
274 sizeof(ngx_mail_conf_in_addr_t), ngx_mail_cmp_conf_in_addrs);
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
275
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
276 in_addr = in_port[p].addrs.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
277 last = in_port[p].addrs.nelts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
278
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
279 /*
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
280 * if there is the binding to the "*:port" then we need to bind()
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
281 * to the "*:port" only and ignore the other bindings
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
282 */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
283
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
284 if (in_addr[last - 1].addr == INADDR_ANY) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
285 in_addr[last - 1].bind = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
286 bind_all = 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288 } else {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
289 bind_all = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
290 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
291
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
292 for (a = 0; a < last; /* void */ ) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
293
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
294 if (!bind_all && !in_addr[a].bind) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
295 a++;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
296 continue;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
297 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
298
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
299 ls = ngx_listening_inet_stream_socket(cf, in_addr[a].addr,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
300 in_port[p].port);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
301 if (ls == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
302 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
303 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
304
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 302
diff changeset
305 ls->backlog = NGX_LISTEN_BACKLOG;
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
306 ls->rcvbuf = -1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
307 ls->sndbuf = -1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
308
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
309 ls->addr_ntop = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
310 ls->handler = ngx_mail_init_connection;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
311 ls->pool_size = 256;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
312
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
313 /* STUB */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
314 ls->log = *cf->cycle->new_log;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
315 ls->log.data = &ls->addr_text;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
316 ls->log.handler = ngx_accept_log_error;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
317 /**/
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
318
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
319 imip = ngx_palloc(cf->pool, sizeof(ngx_mail_in_port_t));
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
320 if (imip == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
321 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
322 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
323
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
324 ls->servers = imip;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
325
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
326 in_addr = in_port[p].addrs.elts;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
327
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
328 if (in_addr[a].bind && in_addr[a].addr != INADDR_ANY) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
329 imip->naddrs = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
330 done = 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
331
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
332 } else if (in_port[p].addrs.nelts > 1
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
333 && in_addr[last - 1].addr == INADDR_ANY)
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
334 {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
335 imip->naddrs = last;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
336 done = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
337
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
338 } else {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
339 imip->naddrs = 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
340 done = 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
341 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
342
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
343 #if 0
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
344 ngx_log_error(NGX_LOG_ALERT, cf->log, 0,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
345 "%ui: %V %d %ui %ui",
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
346 a, &ls->addr_text, in_addr[a].bind,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
347 imip->naddrs, last);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
348 #endif
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
349
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
350 imip->addrs = ngx_pcalloc(cf->pool,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
351 imip->naddrs * sizeof(ngx_mail_in_addr_t));
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
352 if (imip->addrs == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
353 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
354 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
355
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
356 for (i = 0; i < imip->naddrs; i++) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
357 imip->addrs[i].addr = in_addr[i].addr;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
358 imip->addrs[i].ctx = in_addr[i].ctx;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 372
diff changeset
360 text = ngx_pnalloc(cf->pool,
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 372
diff changeset
361 INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
362 if (text == NULL) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
363 return NGX_CONF_ERROR;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
364 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
365
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
366 len = ngx_inet_ntop(AF_INET, &in_addr[i].addr, text,
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367 INET_ADDRSTRLEN);
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
368
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
369 len = ngx_sprintf(text + len, ":%d", in_port[p].port) - text;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
371 imip->addrs[i].addr_text.len = len;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
372 imip->addrs[i].addr_text.data = text;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
375 if (done) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
376 break;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
377 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
378
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
379 in_addr++;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
380 in_port[p].addrs.elts = in_addr;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
381 last--;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
382
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
383 a = 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
384 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
385 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
386
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
387 return NGX_CONF_OK;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
388 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
389
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
390
372
6639b93e81b2 nginx 0.6.30
Igor Sysoev <http://sysoev.ru>
parents: 336
diff changeset
391 static ngx_int_t
290
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
392 ngx_mail_cmp_conf_in_addrs(const void *one, const void *two)
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
393 {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
394 ngx_mail_conf_in_addr_t *first, *second;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 first = (ngx_mail_conf_in_addr_t *) one;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397 second = (ngx_mail_conf_in_addr_t *) two;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
398
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
399 if (first->addr == INADDR_ANY) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
400 /* the INADDR_ANY must be the last resort, shift it to the end */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
401 return 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404 if (first->bind && !second->bind) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
405 /* shift explicit bind()ed addresses to the start */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
406 return -1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
407 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
408
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
409 if (!first->bind && second->bind) {
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
410 /* shift explicit bind()ed addresses to the start */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
411 return 1;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
412 }
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
413
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
414 /* do not sort by default */
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
415
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
416 return 0;
f745bf973510 nginx 0.5.15
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
417 }