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