Mercurial > hg > nginx
annotate src/core/ngx_inet.c @ 2202:2300ab9b069e
*) refactor ngx_ptocidr()
*) allow address without bitmask
*) thus now ngx_http_geo_module accepts addresses without bitmask
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 26 Aug 2008 14:19:37 +0000 |
parents | fd15c193572d |
children | 8e5bf1bc87e2 |
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:
425
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:
425
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 |
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:
425
diff
changeset
|
4 */ |
da8c5707af39
nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents:
425
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:
425
diff
changeset
|
6 |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
7 #include <ngx_config.h> |
100
7ebc8b7fb816
nginx-0.0.1-2003-06-03-19:42:58 import
Igor Sysoev <igor@sysoev.ru>
parents:
57
diff
changeset
|
8 #include <ngx_core.h> |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
9 |
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
10 |
2200 | 11 static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u); |
12 static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u); | |
13 | |
14 | |
1647 | 15 /* AF_INET only */ |
16 | |
17 in_addr_t | |
18 ngx_inet_addr(u_char *text, size_t len) | |
19 { | |
20 u_char *p, c; | |
21 in_addr_t addr; | |
22 ngx_uint_t octet, n; | |
23 | |
24 addr = 0; | |
25 octet = 0; | |
26 n = 0; | |
27 | |
28 for (p = text; p < text + len; p++) { | |
29 | |
30 c = *p; | |
31 | |
32 if (c >= '0' && c <= '9') { | |
33 octet = octet * 10 + (c - '0'); | |
34 continue; | |
35 } | |
36 | |
37 if (c == '.' && octet < 256) { | |
38 addr = (addr << 8) + octet; | |
39 octet = 0; | |
40 n++; | |
41 continue; | |
42 } | |
43 | |
44 return INADDR_NONE; | |
45 } | |
46 | |
47 if (n != 3) { | |
48 return INADDR_NONE; | |
49 } | |
50 | |
51 if (octet < 256) { | |
52 addr = (addr << 8) + octet; | |
53 return htonl(addr); | |
54 } | |
55 | |
56 return INADDR_NONE; | |
57 } | |
58 | |
59 | |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
60 /* AF_INET only */ |
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
61 |
509 | 62 size_t |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
63 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len) |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
64 { |
290
87e73f067470
nginx-0.0.2-2004-03-16-10:10:12 import
Igor Sysoev <igor@sysoev.ru>
parents:
100
diff
changeset
|
65 u_char *p; |
479 | 66 struct sockaddr_in *sin; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
67 |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
68 if (sa->sa_family == AF_INET) { |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
69 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
70 sin = (struct sockaddr_in *) sa; |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
71 p = (u_char *) &sin->sin_addr; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
72 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
73 return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
74 p[0], p[1], p[2], p[3]) |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
75 - text; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
76 } |
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
77 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
78 return 0; |
57
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
79 } |
a499e0d1f16e
nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
26
diff
changeset
|
80 |
1830 | 81 |
509 | 82 size_t |
83 ngx_inet_ntop(int family, void *addr, u_char *text, size_t len) | |
26
53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff
changeset
|
84 { |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
85 u_char *p; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
86 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
87 if (family == AF_INET) { |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
88 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
89 p = (u_char *) addr; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
90 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
91 return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
92 p[0], p[1], p[2], p[3]) |
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
93 - text; |
291
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
94 } |
117ccc7c4055
nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents:
290
diff
changeset
|
95 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
96 return 0; |
1830 | 97 } |
98 | |
99 | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
100 /* AF_INET only */ |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
101 |
509 | 102 ngx_int_t |
103 ngx_ptocidr(ngx_str_t *text, void *cidr) | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
104 { |
2202 | 105 u_char *addr, *mask, *last; |
106 ngx_int_t shift; | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
107 ngx_inet_cidr_t *in_cidr; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
108 |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
109 in_cidr = cidr; |
2202 | 110 addr = text->data; |
111 last = addr + text->len; | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
112 |
2202 | 113 mask = ngx_strlchr(addr, last, '/'); |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
114 |
2202 | 115 in_cidr->addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); |
116 | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
117 if (in_cidr->addr == INADDR_NONE) { |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
118 return NGX_ERROR; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
119 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
120 |
2202 | 121 if (mask == NULL) { |
122 in_cidr->mask = 0xffffffff; | |
123 return NGX_OK; | |
124 } | |
125 | |
126 mask++; | |
127 | |
128 shift = ngx_atoi(mask, last - mask); | |
129 if (shift == NGX_ERROR) { | |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
130 return NGX_ERROR; |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
131 } |
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
132 |
2202 | 133 if (shift == 0) { |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
134 |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
135 /* the x86 compilers use the shl instruction that shifts by modulo 32 */ |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
136 |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
137 in_cidr->mask = 0; |
2202 | 138 |
139 if (in_cidr->addr == 0) { | |
140 return NGX_OK; | |
141 } | |
142 | |
143 return NGX_DONE; | |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
144 } |
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
145 |
2202 | 146 in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); |
368
15c84a40e87d
nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents:
340
diff
changeset
|
147 |
1380
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
148 if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
149 return NGX_OK; |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
150 } |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
151 |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
152 in_cidr->addr &= in_cidr->mask; |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
153 |
b590a528fd41
ignore meaningless bits in CIDR and warn about them
Igor Sysoev <igor@sysoev.ru>
parents:
1107
diff
changeset
|
154 return NGX_DONE; |
340
0bf903191ceb
nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents:
291
diff
changeset
|
155 } |
425
bd39260a1383
nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
404
diff
changeset
|
156 |
bd39260a1383
nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents:
404
diff
changeset
|
157 |
651 | 158 ngx_int_t |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
159 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) |
651 | 160 { |
2200 | 161 u_char *p; |
651 | 162 |
163 p = u->url.data; | |
164 | |
1107
db7c468c447d
ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents:
906
diff
changeset
|
165 if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) { |
2200 | 166 return ngx_parse_unix_domain_url(pool, u); |
651 | 167 } |
168 | |
169 if ((p[0] == ':' || p[0] == '/') && !u->listen) { | |
170 u->err = "invalid host"; | |
171 return NGX_ERROR; | |
172 } | |
173 | |
2200 | 174 return ngx_parse_inet_url(pool, u); |
175 } | |
176 | |
177 | |
178 static ngx_int_t | |
179 ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) | |
180 { | |
181 #if (NGX_HAVE_UNIX_DOMAIN) | |
182 u_char *p; | |
183 size_t len; | |
184 ngx_uint_t i; | |
185 struct sockaddr_un *saun; | |
186 | |
187 len = u->url.len; | |
188 p = u->url.data; | |
189 | |
190 p += 5; | |
191 len -= 5; | |
192 | |
193 u->uri.len = len; | |
194 u->uri.data = p; | |
195 | |
196 if (u->uri_part) { | |
197 for (i = 0; i < len; i++) { | |
198 | |
199 if (p[i] == ':') { | |
200 len = i; | |
201 | |
202 u->uri.len -= len + 1; | |
203 u->uri.data += len + 1; | |
204 | |
205 break; | |
206 } | |
207 } | |
208 } | |
209 | |
210 if (len == 0) { | |
211 u->err = "no path in the unix domain socket"; | |
212 return NGX_ERROR; | |
213 } | |
214 | |
215 if (len + 1 > sizeof(saun->sun_path)) { | |
216 u->err = "too long path in the unix domain socket"; | |
217 return NGX_ERROR; | |
218 } | |
219 | |
220 u->addrs = ngx_pcalloc(pool, sizeof(ngx_peer_addr_t)); | |
221 if (u->addrs == NULL) { | |
222 return NGX_ERROR; | |
223 } | |
224 | |
225 saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un)); | |
226 if (saun == NULL) { | |
227 return NGX_ERROR; | |
228 } | |
229 | |
230 u->naddrs = 1; | |
231 | |
232 saun->sun_family = AF_UNIX; | |
233 (void) ngx_cpystrn((u_char *) saun->sun_path, p, len + 1); | |
234 | |
235 u->addrs[0].sockaddr = (struct sockaddr *) saun; | |
236 u->addrs[0].socklen = sizeof(struct sockaddr_un); | |
237 u->addrs[0].name.len = len + 5; | |
238 u->addrs[0].name.data = u->url.data; | |
239 | |
240 u->host.len = len; | |
241 u->host.data = p; | |
242 | |
243 u->unix_socket = 1; | |
244 | |
245 return NGX_OK; | |
246 | |
247 #else | |
248 | |
249 u->err = "the unix domain sockets are not supported on this platform"; | |
250 | |
251 return NGX_ERROR; | |
252 | |
253 #endif | |
254 } | |
255 | |
256 | |
257 static ngx_int_t | |
258 ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u) | |
259 { | |
260 u_char *p, *host, *port_start; | |
261 size_t len, port_len; | |
262 ngx_int_t port; | |
263 ngx_uint_t i; | |
264 struct hostent *h; | |
265 | |
266 len = u->url.len; | |
267 p = u->url.data; | |
268 | |
651 | 269 u->host.data = p; |
906 | 270 |
271 port_start = NULL; | |
272 port_len = 0; | |
651 | 273 |
274 for (i = 0; i < len; i++) { | |
275 | |
276 if (p[i] == ':') { | |
906 | 277 port_start = &p[i + 1]; |
651 | 278 u->host.len = i; |
279 | |
280 if (!u->uri_part) { | |
906 | 281 port_len = len - (i + 1); |
651 | 282 break; |
283 } | |
284 } | |
285 | |
286 if (p[i] == '/') { | |
287 u->uri.len = len - i; | |
288 u->uri.data = &p[i]; | |
289 | |
290 if (u->host.len == 0) { | |
291 u->host.len = i; | |
292 } | |
293 | |
906 | 294 if (port_start == NULL) { |
884 | 295 u->no_port = 1; |
296 goto no_port; | |
651 | 297 } |
298 | |
906 | 299 port_len = &p[i] - port_start; |
651 | 300 |
906 | 301 if (port_len == 0) { |
651 | 302 u->err = "invalid port"; |
303 return NGX_ERROR; | |
304 } | |
305 | |
306 break; | |
307 } | |
308 } | |
309 | |
906 | 310 if (port_start) { |
651 | 311 |
906 | 312 if (port_len == 0) { |
313 port_len = &p[i] - port_start; | |
651 | 314 |
906 | 315 if (port_len == 0) { |
651 | 316 u->err = "invalid port"; |
317 return NGX_ERROR; | |
318 } | |
319 } | |
320 | |
906 | 321 port = ngx_atoi(port_start, port_len); |
651 | 322 |
323 if (port == NGX_ERROR || port < 1 || port > 65536) { | |
324 u->err = "invalid port"; | |
325 return NGX_ERROR; | |
326 } | |
327 | |
1671
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
328 u->port_text.len = port_len; |
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
329 u->port_text.data = port_start; |
8075179cae21
ngx_parse_url() saves port text, this allows to use it in proxy host header
Igor Sysoev <igor@sysoev.ru>
parents:
1647
diff
changeset
|
330 |
651 | 331 } else { |
332 port = ngx_atoi(p, len); | |
333 | |
334 if (port == NGX_ERROR) { | |
335 u->host.len = len; | |
884 | 336 u->no_port = 1; |
651 | 337 |
884 | 338 goto no_port; |
651 | 339 } |
340 | |
341 u->wildcard = 1; | |
342 } | |
343 | |
906 | 344 u->port = (in_port_t) port; |
651 | 345 |
884 | 346 no_port: |
651 | 347 |
348 if (u->listen) { | |
884 | 349 |
906 | 350 if (u->port == 0) { |
351 if (u->default_port == 0) { | |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
352 u->err = "no port"; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
353 return NGX_ERROR; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
354 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
355 |
906 | 356 u->port = u->default_port; |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
357 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
358 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
359 if (u->host.len == 1 && u->host.data[0] == '*') { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
360 u->host.len = 0; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
361 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
362 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
363 /* AF_INET only */ |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
364 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
365 if (u->host.len) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
366 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
367 host = ngx_alloc(u->host.len + 1, pool->log); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
368 if (host == NULL) { |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
369 return NGX_ERROR; |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
370 } |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
371 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
372 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
373 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
374 u->addr.in_addr = inet_addr((const char *) host); |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
375 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
376 if (u->addr.in_addr == INADDR_NONE) { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
377 h = gethostbyname((const char *) host); |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
378 |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
379 if (h == NULL || h->h_addr_list[0] == NULL) { |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
380 ngx_free(host); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
381 u->err = "host not found"; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
382 return NGX_ERROR; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
383 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
384 |
906 | 385 u->addr.in_addr = *(in_addr_t *) (h->h_addr_list[0]); |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
386 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
387 |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
388 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
389 |
804
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
390 } else { |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
391 u->addr.in_addr = INADDR_ANY; |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
392 } |
472cd9768ac2
now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents:
712
diff
changeset
|
393 |
651 | 394 return NGX_OK; |
395 } | |
396 | |
397 if (u->host.len == 0) { | |
398 u->err = "no host"; | |
399 return NGX_ERROR; | |
400 } | |
401 | |
884 | 402 if (u->no_resolve) { |
403 return NGX_OK; | |
651 | 404 } |
405 | |
906 | 406 if (u->no_port) { |
407 u->port = u->default_port; | |
408 } | |
409 | |
410 if (u->port == 0) { | |
411 u->err = "no port"; | |
412 return NGX_ERROR; | |
413 } | |
414 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
415 if (ngx_inet_resolve_host(pool, u) != NGX_OK) { |
651 | 416 return NGX_ERROR; |
417 } | |
418 | |
419 return NGX_OK; | |
420 } | |
421 | |
422 | |
884 | 423 ngx_int_t |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
424 ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u) |
651 | 425 { |
906 | 426 u_char *p, *host; |
651 | 427 size_t len; |
428 in_addr_t in_addr; | |
429 ngx_uint_t i; | |
430 struct hostent *h; | |
431 struct sockaddr_in *sin; | |
432 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
433 host = ngx_alloc(u->host.len + 1, pool->log); |
651 | 434 if (host == NULL) { |
884 | 435 return NGX_ERROR; |
651 | 436 } |
437 | |
884 | 438 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); |
651 | 439 |
440 /* AF_INET only */ | |
441 | |
442 in_addr = inet_addr((char *) host); | |
443 | |
444 if (in_addr == INADDR_NONE) { | |
445 h = gethostbyname((char *) host); | |
446 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
447 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
448 |
651 | 449 if (h == NULL || h->h_addr_list[0] == NULL) { |
884 | 450 u->err = "host not found"; |
451 return NGX_ERROR; | |
651 | 452 } |
453 | |
884 | 454 if (u->one_addr == 0) { |
455 for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ } | |
456 | |
457 } else { | |
458 i = 1; | |
459 } | |
651 | 460 |
461 /* MP: ngx_shared_palloc() */ | |
462 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
463 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_peer_addr_t)); |
884 | 464 if (u->addrs == NULL) { |
465 return NGX_ERROR; | |
651 | 466 } |
467 | |
884 | 468 u->naddrs = i; |
651 | 469 |
470 for (i = 0; h->h_addr_list[i] != NULL; i++) { | |
471 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
472 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in)); |
651 | 473 if (sin == NULL) { |
884 | 474 return NGX_ERROR; |
651 | 475 } |
476 | |
477 sin->sin_family = AF_INET; | |
906 | 478 sin->sin_port = htons(u->port); |
651 | 479 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]); |
480 | |
884 | 481 u->addrs[i].sockaddr = (struct sockaddr *) sin; |
482 u->addrs[i].socklen = sizeof(struct sockaddr_in); | |
651 | 483 |
2197
74477ea8074f
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents:
2049
diff
changeset
|
484 len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1; |
651 | 485 |
2049 | 486 p = ngx_pnalloc(pool, len); |
906 | 487 if (p == NULL) { |
884 | 488 return NGX_ERROR; |
651 | 489 } |
490 | |
2198
5975975eedc0
ngx_sock_ntop() takes family from sockaddr, remove duplicate field
Igor Sysoev <igor@sysoev.ru>
parents:
2197
diff
changeset
|
491 len = ngx_sock_ntop((struct sockaddr *) sin, p, len); |
651 | 492 |
906 | 493 u->addrs[i].name.len = ngx_sprintf(&p[len], ":%d", u->port) - p; |
494 u->addrs[i].name.data = p; | |
651 | 495 } |
496 | |
497 } else { | |
498 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
499 ngx_free(host); |
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
500 |
651 | 501 /* MP: ngx_shared_palloc() */ |
502 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
503 u->addrs = ngx_pcalloc(pool, sizeof(ngx_peer_addr_t)); |
884 | 504 if (u->addrs == NULL) { |
505 return NGX_ERROR; | |
651 | 506 } |
507 | |
1559
fe11e2a3946d
use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents:
1380
diff
changeset
|
508 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in)); |
651 | 509 if (sin == NULL) { |
884 | 510 return NGX_ERROR; |
651 | 511 } |
512 | |
884 | 513 u->naddrs = 1; |
651 | 514 |
515 sin->sin_family = AF_INET; | |
906 | 516 sin->sin_port = htons(u->port); |
651 | 517 sin->sin_addr.s_addr = in_addr; |
518 | |
884 | 519 u->addrs[0].sockaddr = (struct sockaddr *) sin; |
520 u->addrs[0].socklen = sizeof(struct sockaddr_in); | |
651 | 521 |
2049 | 522 p = ngx_pnalloc(pool, u->host.len + sizeof(":65536") - 1); |
906 | 523 if (p == NULL) { |
884 | 524 return NGX_ERROR; |
651 | 525 } |
526 | |
906 | 527 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d", &u->host, u->port) - p; |
528 u->addrs[0].name.data = p; | |
651 | 529 } |
530 | |
884 | 531 return NGX_OK; |
651 | 532 } |