annotate src/imap/ngx_imap.c @ 196:8759b346e431 NGINX_0_3_45

nginx 0.3.45 *) Feature: the "ssl_verify_client", "ssl_verify_depth", and "ssl_client_certificate" directives. *) Change: the $request_method variable now returns the main request method. *) Change: the ° symbol codes were changed in koi-win conversion table. *) Feature: the euro É N symbols were added to koi-win conversion table. *) Bugfix: if nginx distributed the requests among several backends and some backend failed, then requests intended for this backend was directed to one live backend only instead of being distributed among the rest.
author Igor Sysoev <http://sysoev.ru>
date Sat, 06 May 2006 00:00:00 +0400
parents 3689cd4e3228
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 #include <ngx_event.h>
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 #include <ngx_imap.h>
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 static char *ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
14 static int ngx_libc_cdecl ngx_imap_cmp_conf_in_addrs(const void *one,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
15 const void *two);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 ngx_uint_t ngx_imap_max_module;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 static ngx_command_t ngx_imap_commands[] = {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23 { ngx_string("imap"),
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 ngx_imap_block,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 0,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 NULL },
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30 ngx_null_command
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31 };
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
33
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 static ngx_core_module_t ngx_imap_module_ctx = {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 ngx_string("imap"),
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 NULL,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37 NULL
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
38 };
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41 ngx_module_t ngx_imap_module = {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 NGX_MODULE_V1,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
43 &ngx_imap_module_ctx, /* module context */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44 ngx_imap_commands, /* module directives */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45 NGX_CORE_MODULE, /* module type */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
46 NULL, /* init master */
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 NULL, /* init module */
90
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
48 NULL, /* init process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
49 NULL, /* init thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
50 NULL, /* exit thread */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
51 NULL, /* exit process */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
52 NULL, /* exit master */
71c46860eb55 nginx 0.1.45
Igor Sysoev <http://sysoev.ru>
parents: 76
diff changeset
53 NGX_MODULE_V1_PADDING
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54 };
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 static char *
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58 ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60 char *rv;
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
61 u_char *text;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
62 size_t len;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
63 ngx_uint_t i, a, l, m, mi, s, p, last, bind_all, done;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 ngx_conf_t pcf;
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
65 ngx_array_t in_ports;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
66 ngx_listening_t *ls;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
67 ngx_imap_listen_t *imls;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 ngx_imap_module_t *module;
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
69 ngx_imap_in_port_t *imip;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
70 ngx_imap_conf_ctx_t *ctx;
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
71 ngx_imap_conf_in_port_t *in_port;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
72 ngx_imap_conf_in_addr_t *in_addr;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 ngx_imap_core_srv_conf_t **cscfp;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 ngx_imap_core_main_conf_t *cmcf;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 /* the main imap context */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_imap_conf_ctx_t));
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 if (ctx == NULL) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 return NGX_CONF_ERROR;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 *(ngx_imap_conf_ctx_t **) conf = ctx;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 /* count the number of the http modules and set up their indices */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 ngx_imap_max_module = 0;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88 for (m = 0; ngx_modules[m]; m++) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 if (ngx_modules[m]->type != NGX_IMAP_MODULE) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 continue;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 ngx_modules[m]->ctx_index = ngx_imap_max_module++;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 /* the imap main_conf context, it is the same in the all imap contexts */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 ctx->main_conf = ngx_pcalloc(cf->pool,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 sizeof(void *) * ngx_imap_max_module);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 if (ctx->main_conf == NULL) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 return NGX_CONF_ERROR;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 /*
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 * the imap null srv_conf context, it is used to merge
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 * the server{}s' srv_conf's
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_imap_max_module);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 if (ctx->srv_conf == NULL) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 return NGX_CONF_ERROR;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 /*
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 * create the main_conf's, the null srv_conf's, and the null loc_conf's
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119 * of the all imap modules
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122 for (m = 0; ngx_modules[m]; m++) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 if (ngx_modules[m]->type != NGX_IMAP_MODULE) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 continue;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127 module = ngx_modules[m]->ctx;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128 mi = ngx_modules[m]->ctx_index;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
130 if (module->create_main_conf) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
131 ctx->main_conf[mi] = module->create_main_conf(cf);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
132 if (ctx->main_conf[mi] == NULL) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
133 return NGX_CONF_ERROR;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
134 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
135 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
136
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
137 if (module->create_srv_conf) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
138 ctx->srv_conf[mi] = module->create_srv_conf(cf);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
139 if (ctx->srv_conf[mi] == NULL) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
140 return NGX_CONF_ERROR;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
141 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
142 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
143 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
144
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
145
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
146 /* parse inside the imap{} block */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
147
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
148 pcf = *cf;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
149 cf->ctx = ctx;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
150
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
151 cf->module_type = NGX_IMAP_MODULE;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
152 cf->cmd_type = NGX_IMAP_MAIN_CONF;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
153 rv = ngx_conf_parse(cf, NULL);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
154
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
155 if (rv != NGX_CONF_OK) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
156 *cf = pcf;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
157 return rv;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
158 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
159
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
160
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
161 /* init imap{} main_conf's, merge the server{}s' srv_conf's */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
162
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
163 cmcf = ctx->main_conf[ngx_imap_core_module.ctx_index];
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
164 cscfp = cmcf->servers.elts;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
165
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
166 for (m = 0; ngx_modules[m]; m++) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
167 if (ngx_modules[m]->type != NGX_IMAP_MODULE) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
168 continue;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
169 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
170
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
171 module = ngx_modules[m]->ctx;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
172 mi = ngx_modules[m]->ctx_index;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
173
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
174 /* init imap{} main_conf's */
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
175
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
176 if (module->init_main_conf) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
177 rv = module->init_main_conf(cf, ctx->main_conf[mi]);
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
178 if (rv != NGX_CONF_OK) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
179 *cf = pcf;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
180 return rv;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
182 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
183
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
184 for (s = 0; s < cmcf->servers.nelts; s++) {
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
185
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
186 /* merge the server{}s' srv_conf's */
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
187
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
188 if (module->merge_srv_conf) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
189 rv = module->merge_srv_conf(cf,
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
190 ctx->srv_conf[mi],
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191 cscfp[s]->ctx->srv_conf[mi]);
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
192 if (rv != NGX_CONF_OK) {
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
193 *cf = pcf;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
194 return rv;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
196 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
197 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198 }
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
199
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
200 /* imap{}'s cf->ctx was needed while the configuration merging */
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
201
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 90
diff changeset
202 *cf = pcf;
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
203
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
204
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
205 if (ngx_array_init(&in_ports, cf->temp_pool, 4,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
206 sizeof(ngx_imap_conf_in_port_t))
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
207 != NGX_OK)
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
208 {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
209 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
210 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
211
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
212 imls = cmcf->listen.elts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
213
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
214 for (l = 0; l < cmcf->listen.nelts; l++) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
215
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
216 /* AF_INET only */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
217
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
218 in_port = in_ports.elts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
219 for (p = 0; p < in_ports.nelts; p++) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
220 if (in_port[p].port == imls[l].port) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
221 in_port = &in_port[p];
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
222 goto found;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
223 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
224 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
225
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
226 in_port = ngx_array_push(&in_ports);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
227 if (in_port == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
228 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
229 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
230
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
231 in_port->port = imls[l].port;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
232
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
233 if (ngx_array_init(&in_port->addrs, cf->temp_pool, 2,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
234 sizeof(ngx_imap_conf_in_addr_t))
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
235 != NGX_OK)
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
236 {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
237 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
238 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
239
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
240 found:
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
241
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
242 in_addr = ngx_array_push(&in_port->addrs);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
243 if (in_addr == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
244 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
245 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
246
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
247 in_addr->addr = imls[l].addr;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
248 in_addr->ctx = imls[l].ctx;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
249 in_addr->bind = imls[l].bind;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
250 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
251
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
252 /* optimize the lists of ports and addresses */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
253
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
254 /* AF_INET only */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
255
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
256 in_port = in_ports.elts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
257 for (p = 0; p < in_ports.nelts; p++) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
258
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
259 ngx_qsort(in_port[p].addrs.elts, (size_t) in_port[p].addrs.nelts,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
260 sizeof(ngx_imap_conf_in_addr_t), ngx_imap_cmp_conf_in_addrs);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
261
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
262 in_addr = in_port[p].addrs.elts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
263 last = in_port[p].addrs.nelts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
264
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
265 /*
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
266 * if there is the binding to the "*:port" then we need to bind()
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
267 * to the "*:port" only and ignore the other bindings
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
268 */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
269
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
270 if (in_addr[last - 1].addr == INADDR_ANY) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
271 in_addr[last - 1].bind = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
272 bind_all = 0;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
273
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
274 } else {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
275 bind_all = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
276 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
277
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
278 for (a = 0; a < last; /* void */ ) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
279
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
280 if (!bind_all && !in_addr[a].bind) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
281 a++;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
282 continue;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
283 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
284
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
285 ls = ngx_listening_inet_stream_socket(cf, in_addr[a].addr,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
286 in_port[p].port);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
287 if (ls == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
288 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
289 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
290
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
291 ls->backlog = -1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
292 ls->rcvbuf = -1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
293 ls->sndbuf = -1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
294
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
295 ls->addr_ntop = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
296 ls->handler = ngx_imap_init_connection;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
297 ls->pool_size = 256;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
298
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
299 /* STUB */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
300 ls->log = *cf->cycle->new_log;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
301 ls->log.data = &ls->addr_text;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
302 ls->log.handler = ngx_accept_log_error;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
303 /**/
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
304
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
305 imip = ngx_palloc(cf->pool, sizeof(ngx_imap_in_port_t));
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
306 if (imip == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
307 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
308 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
309
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
310 ls->servers = imip;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
311
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
312 in_addr = in_port[p].addrs.elts;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
313
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
314 if (in_addr[a].bind && in_addr[a].addr != INADDR_ANY) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
315 imip->naddrs = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
316 done = 0;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
317
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
318 } else if (in_port[p].addrs.nelts > 1
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
319 && in_addr[last - 1].addr == INADDR_ANY)
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
320 {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
321 imip->naddrs = last;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
322 done = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
323
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
324 } else {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
325 imip->naddrs = 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
326 done = 0;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
327 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
328
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
329 #if 0
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
330 ngx_log_error(NGX_LOG_ALERT, cf->log, 0,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
331 "%ui: %V %d %ui %ui",
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
332 a, &ls->addr_text, in_addr[a].bind,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
333 imip->naddrs, last);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
334 #endif
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
335
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
336 imip->addrs = ngx_pcalloc(cf->pool,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
337 imip->naddrs * sizeof(ngx_imap_in_addr_t));
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
338 if (imip->addrs == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
339 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
340 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
341
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
342 for (i = 0; i < imip->naddrs; i++) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
343 imip->addrs[i].addr = in_addr[i].addr;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
344 imip->addrs[i].ctx = in_addr[i].ctx;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
345
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
346 text = ngx_palloc(cf->pool,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
347 INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
348 if (text == NULL) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
349 return NGX_CONF_ERROR;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
350 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
351
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
352 len = ngx_inet_ntop(AF_INET, &in_addr[i].addr, text,
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
353 INET_ADDRSTRLEN);
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
354
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
355 len = ngx_sprintf(text + len, ":%d", in_port[p].port) - text;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
356
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
357 imip->addrs[i].addr_text.len = len;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
358 imip->addrs[i].addr_text.data = text;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
359 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
360
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
361 if (done) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
362 break;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
363 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
364
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
365 in_addr++;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
366 in_port[p].addrs.elts = in_addr;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
367 last--;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
368
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
369 a = 0;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
370 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
371 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
372
76
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373 return NGX_CONF_OK;
da9a3b14312d nginx 0.1.38
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
374 }
190
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
375
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
376
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
377 static int ngx_libc_cdecl
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
378 ngx_imap_cmp_conf_in_addrs(const void *one, const void *two)
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
379 {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
380 ngx_imap_conf_in_addr_t *first, *second;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
381
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
382 first = (ngx_imap_conf_in_addr_t *) one;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
383 second = (ngx_imap_conf_in_addr_t *) two;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
384
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
385 if (first->addr == INADDR_ANY) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
386 /* the INADDR_ANY must be the last resort, shift it to the end */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
387 return 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
388 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
389
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
390 if (first->bind && !second->bind) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
391 /* shift explicit bind()ed addresses to the start */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
392 return -1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
393 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
394
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
395 if (!first->bind && second->bind) {
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
396 /* shift explicit bind()ed addresses to the start */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
397 return 1;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
398 }
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
399
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
400 /* do not sort by default */
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
401
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
402 return 0;
3689cd4e3228 nginx 0.3.42
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
403 }