annotate src/core/ngx_inet.c @ 6564:19db5a6bc34e

Realip: port support in X-Real-IP and X-Forwarded-For. Now, the module extracts optional port which may accompany an IP address. This custom extension is introduced, among other things, in order to facilitate logging of original client ports. Addresses with ports are expected to be in the RFC 3986 format, that is, with IPv6 addresses in square brackets. E.g., "X-Real-IP: [2001:0db8::1]:12345" sets client port ($remote_port) to 12345.
author Dmitry Volyntsev <xeioex@nginx.com>
date Mon, 23 May 2016 18:44:23 +0300
parents adf25b8d0431
children 5d8f16859ced
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 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
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4227
diff changeset
4 * Copyright (C) Nginx, Inc.
441
da8c5707af39 nginx-0.1.0-2004-09-28-12:34:51 import; set copyright and remove unused files
Igor Sysoev <igor@sysoev.ru>
parents: 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
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
7
26
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #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
9 #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
10
53cb81681040 nginx-0.0.1-2002-12-15-09:25:09 import
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
12 static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u);
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
13 static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
14 static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
15
1647
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
16
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
17 in_addr_t
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
18 ngx_inet_addr(u_char *text, size_t len)
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
19 {
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
20 u_char *p, c;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
21 in_addr_t addr;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
22 ngx_uint_t octet, n;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
23
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
24 addr = 0;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
25 octet = 0;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
26 n = 0;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
27
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
28 for (p = text; p < text + len; p++) {
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
29 c = *p;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
30
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
31 if (c >= '0' && c <= '9') {
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
32 octet = octet * 10 + (c - '0');
6138
bc47a7a8159c Fixed overflow detection in ngx_inet_addr().
Valentin Bartenev <vbart@nginx.com>
parents: 6012
diff changeset
33
bc47a7a8159c Fixed overflow detection in ngx_inet_addr().
Valentin Bartenev <vbart@nginx.com>
parents: 6012
diff changeset
34 if (octet > 255) {
bc47a7a8159c Fixed overflow detection in ngx_inet_addr().
Valentin Bartenev <vbart@nginx.com>
parents: 6012
diff changeset
35 return INADDR_NONE;
bc47a7a8159c Fixed overflow detection in ngx_inet_addr().
Valentin Bartenev <vbart@nginx.com>
parents: 6012
diff changeset
36 }
bc47a7a8159c Fixed overflow detection in ngx_inet_addr().
Valentin Bartenev <vbart@nginx.com>
parents: 6012
diff changeset
37
1647
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
38 continue;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
39 }
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
40
6012
550212836c8f Overflow detection in ngx_inet_addr().
Ruslan Ermilov <ru@nginx.com>
parents: 5473
diff changeset
41 if (c == '.') {
1647
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
42 addr = (addr << 8) + octet;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
43 octet = 0;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
44 n++;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
45 continue;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
46 }
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
47
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
48 return INADDR_NONE;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
49 }
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
50
6012
550212836c8f Overflow detection in ngx_inet_addr().
Ruslan Ermilov <ru@nginx.com>
parents: 5473
diff changeset
51 if (n == 3) {
1647
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
52 addr = (addr << 8) + octet;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
53 return htonl(addr);
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
54 }
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
55
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
56 return INADDR_NONE;
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
57 }
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
58
c68477afa410 ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 1559
diff changeset
59
3265
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
60 #if (NGX_HAVE_INET6)
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
61
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
62 ngx_int_t
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
63 ngx_inet6_addr(u_char *p, size_t len, u_char *addr)
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
64 {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
65 u_char c, *zero, *digit, *s, *d;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
66 size_t len4;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
67 ngx_uint_t n, nibbles, word;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
68
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
69 if (len == 0) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
70 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
71 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
72
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
73 zero = NULL;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
74 digit = NULL;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
75 len4 = 0;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
76 nibbles = 0;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
77 word = 0;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
78 n = 8;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
79
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
80 if (p[0] == ':') {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
81 p++;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
82 len--;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
83 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
84
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
85 for (/* void */; len; len--) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
86 c = *p++;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
87
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
88 if (c == ':') {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
89 if (nibbles) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
90 digit = p;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
91 len4 = len;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
92 *addr++ = (u_char) (word >> 8);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
93 *addr++ = (u_char) (word & 0xff);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
94
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
95 if (--n) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
96 nibbles = 0;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
97 word = 0;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
98 continue;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
99 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
100
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
101 } else {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
102 if (zero == NULL) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
103 digit = p;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
104 len4 = len;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
105 zero = addr;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
106 continue;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
107 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
108 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
109
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
110 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
111 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
112
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
113 if (c == '.' && nibbles) {
3894
4d4b5770616f fix segfault in IPv6 parsing while processing invalid IPv4 address X.YYYY.Z
Igor Sysoev <igor@sysoev.ru>
parents: 3864
diff changeset
114 if (n < 2 || digit == NULL) {
3265
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
115 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
116 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
117
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
118 word = ngx_inet_addr(digit, len4 - 1);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
119 if (word == INADDR_NONE) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
120 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
121 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
122
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
123 word = ntohl(word);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
124 *addr++ = (u_char) ((word >> 24) & 0xff);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
125 *addr++ = (u_char) ((word >> 16) & 0xff);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
126 n--;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
127 break;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
128 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
129
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
130 if (++nibbles > 4) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
131 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
132 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
133
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
134 if (c >= '0' && c <= '9') {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
135 word = word * 16 + (c - '0');
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
136 continue;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
137 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
138
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
139 c |= 0x20;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
140
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
141 if (c >= 'a' && c <= 'f') {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
142 word = word * 16 + (c - 'a') + 10;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
143 continue;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
144 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
145
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
146 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
147 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
148
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
149 if (nibbles == 0 && zero == NULL) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
150 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
151 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
152
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
153 *addr++ = (u_char) (word >> 8);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
154 *addr++ = (u_char) (word & 0xff);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
155
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
156 if (--n) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
157 if (zero) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
158 n *= 2;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
159 s = addr - 1;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
160 d = s + n;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
161 while (s >= zero) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
162 *d-- = *s--;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
163 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
164 ngx_memzero(zero, n);
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
165 return NGX_OK;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
166 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
167
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
168 } else {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
169 if (zero == NULL) {
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
170 return NGX_OK;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
171 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
172 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
173
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
174 return NGX_ERROR;
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
175 }
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
176
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
177 #endif
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
178
0c5c5e876391 ngx_inet6_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3230
diff changeset
179
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
180 size_t
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
181 ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
182 ngx_uint_t port)
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
183 {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
184 u_char *p;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
185 struct sockaddr_in *sin;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
186 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
187 size_t n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
188 struct sockaddr_in6 *sin6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
189 #endif
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
190 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
191 struct sockaddr_un *saun;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
192 #endif
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
193
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
194 switch (sa->sa_family) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
195
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
196 case AF_INET:
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
197
2197
74477ea8074f *) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
198 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
199 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
200
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
201 if (port) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
202 p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud:%d",
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
203 p[0], p[1], p[2], p[3], ntohs(sin->sin_port));
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
204 } else {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
205 p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
206 p[0], p[1], p[2], p[3]);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
207 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
208
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
209 return (p - text);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
210
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
211 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
212
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
213 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
214
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
215 sin6 = (struct sockaddr_in6 *) sa;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
216
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
217 n = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
218
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
219 if (port) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
220 text[n++] = '[';
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
221 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
222
3268
c6a40c815d45 use sin6_addr.s6_addr instead of "(u_char *) & .sin6_addr"
Igor Sysoev <igor@sysoev.ru>
parents: 3267
diff changeset
223 n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
224
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
225 if (port) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
226 n = ngx_sprintf(&text[1 + n], "]:%d",
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
227 ntohs(sin6->sin6_port)) - text;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
228 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
229
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
230 return n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
231 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
232
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
233 #if (NGX_HAVE_UNIX_DOMAIN)
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
234
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
235 case AF_UNIX:
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
236 saun = (struct sockaddr_un *) sa;
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
237
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
238 /* on Linux sockaddr might not include sun_path at all */
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
239
5313
1fe5f7fb6ced Fixed build with signed socklen_t and unix sockets.
Maxim Dounin <mdounin@mdounin.ru>
parents: 5312
diff changeset
240 if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)) {
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
241 p = ngx_snprintf(text, len, "unix:%Z");
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
242
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
243 } else {
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
244 p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path);
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
245 }
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
246
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
247 /* we do not include trailing zero in address length */
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
248
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
249 return (p - text - 1);
3230
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
250
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
251 #endif
a7491af45540 http listen unix domain sockets
Igor Sysoev <igor@sysoev.ru>
parents: 2856
diff changeset
252
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
253 default:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
254 return 0;
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
255 }
57
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
256 }
a499e0d1f16e nginx-0.0.1-2003-01-30-10:28:09 import
Igor Sysoev <igor@sysoev.ru>
parents: 26
diff changeset
257
1830
cac010479ea0 change order
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
258
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
259 size_t
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
260 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
261 {
2197
74477ea8074f *) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
262 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
263
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
264 switch (family) {
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
265
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
266 case AF_INET:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
267
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
268 p = addr;
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
269
2197
74477ea8074f *) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
Igor Sysoev <igor@sysoev.ru>
parents: 2049
diff changeset
270 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
271 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
272 - text;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
273
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
274 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
275
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
276 case AF_INET6:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
277 return ngx_inet6_ntop(addr, text, len);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
278
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
279 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
280
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
281 default:
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
282 return 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
283 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
284 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
285
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
286
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
287 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
288
3276
beaf94f2f265 make ngx_inet6_ntop() non-static
Igor Sysoev <igor@sysoev.ru>
parents: 3272
diff changeset
289 size_t
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
290 ngx_inet6_ntop(u_char *p, u_char *text, size_t len)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
291 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
292 u_char *dst;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
293 size_t max, n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
294 ngx_uint_t i, zero, last;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
295
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
296 if (len < NGX_INET6_ADDRSTRLEN) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
297 return 0;
291
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
298 }
117ccc7c4055 nginx-0.0.3-2004-03-16-16:35:20 import
Igor Sysoev <igor@sysoev.ru>
parents: 290
diff changeset
299
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
300 zero = (ngx_uint_t) -1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
301 last = (ngx_uint_t) -1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
302 max = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
303 n = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
304
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
305 for (i = 0; i < 16; i += 2) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
306
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
307 if (p[i] || p[i + 1]) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
308
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
309 if (max < n) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
310 zero = last;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
311 max = n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
312 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
313
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
314 n = 0;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
315 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
316 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
317
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
318 if (n++ == 0) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
319 last = i;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
320 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
321 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
322
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
323 if (max < n) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
324 zero = last;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
325 max = n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
326 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
327
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
328 dst = text;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
329 n = 16;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
330
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
331 if (zero == 0) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
332
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
333 if ((max == 5 && p[10] == 0xff && p[11] == 0xff)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
334 || (max == 6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
335 || (max == 7 && p[14] != 0 && p[15] != 1))
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
336 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
337 n = 12;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
338 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
339
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
340 *dst++ = ':';
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
341 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
342
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
343 for (i = 0; i < n; i += 2) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
344
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
345 if (i == zero) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
346 *dst++ = ':';
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
347 i += (max - 1) * 2;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
348 continue;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
349 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
350
6509
7640d6c213e1 Removed redundant "u" format specifier.
Ruslan Ermilov <ru@nginx.com>
parents: 6481
diff changeset
351 dst = ngx_sprintf(dst, "%xd", p[i] * 256 + p[i + 1]);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
352
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
353 if (i < 14) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
354 *dst++ = ':';
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
355 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
356 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
357
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
358 if (n == 12) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
359 dst = ngx_sprintf(dst, "%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
360 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
361
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
362 return dst - text;
1830
cac010479ea0 change order
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
363 }
cac010479ea0 change order
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
364
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
365 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
366
1830
cac010479ea0 change order
Igor Sysoev <igor@sysoev.ru>
parents: 1671
diff changeset
367
509
9b8c906f6e63 nginx-0.1.29-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 501
diff changeset
368 ngx_int_t
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2517
diff changeset
369 ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
370 {
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
371 u_char *addr, *mask, *last;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
372 size_t len;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
373 ngx_int_t shift;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
374 #if (NGX_HAVE_INET6)
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
375 ngx_int_t rc;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
376 ngx_uint_t s, i;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
377 #endif
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
378
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
379 addr = text->data;
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
380 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
381
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
382 mask = ngx_strlchr(addr, last, '/');
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
383 len = (mask ? mask : last) - addr;
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
384
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
385 cidr->u.in.addr = ngx_inet_addr(addr, len);
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
386
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
387 if (cidr->u.in.addr != INADDR_NONE) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
388 cidr->family = AF_INET;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
389
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
390 if (mask == NULL) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
391 cidr->u.in.mask = 0xffffffff;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
392 return NGX_OK;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
393 }
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
394
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
395 #if (NGX_HAVE_INET6)
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
396 } else if (ngx_inet6_addr(addr, len, cidr->u.in6.addr.s6_addr) == NGX_OK) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
397 cidr->family = AF_INET6;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
398
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
399 if (mask == NULL) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
400 ngx_memset(cidr->u.in6.mask.s6_addr, 0xff, 16);
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
401 return NGX_OK;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
402 }
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
403
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
404 #endif
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
405 } else {
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
406 return NGX_ERROR;
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
407 }
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
408
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
409 mask++;
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
410
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
411 shift = ngx_atoi(mask, last - mask);
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
412 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
413 return NGX_ERROR;
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
414 }
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
415
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
416 switch (cidr->family) {
2537
a472d954c534 prepare ngx_ptocidr() for IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 2517
diff changeset
417
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
418 #if (NGX_HAVE_INET6)
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
419 case AF_INET6:
4573
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
420 if (shift > 128) {
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
421 return NGX_ERROR;
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
422 }
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
423
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
424 addr = cidr->u.in6.addr.s6_addr;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
425 mask = cidr->u.in6.mask.s6_addr;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
426 rc = NGX_OK;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
427
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
428 for (i = 0; i < 16; i++) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
429
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
430 s = (shift > 8) ? 8 : shift;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
431 shift -= s;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
432
4582
a8881886a5f7 Improved readability of the code that produces bitmask from prefix.
Ruslan Ermilov <ru@nginx.com>
parents: 4573
diff changeset
433 mask[i] = (u_char) (0xffu << (8 - s));
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
434
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
435 if (addr[i] != (addr[i] & mask[i])) {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
436 rc = NGX_DONE;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
437 addr[i] &= mask[i];
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
438 }
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
439 }
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
440
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
441 return rc;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
442 #endif
368
15c84a40e87d nginx-0.0.7-2004-06-24-20:07:04 import
Igor Sysoev <igor@sysoev.ru>
parents: 340
diff changeset
443
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
444 default: /* AF_INET */
4573
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
445 if (shift > 32) {
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
446 return NGX_ERROR;
98a2518a98dc In ngx_ptocidr(), check that the supplied prefix length is within
Ruslan Ermilov <ru@nginx.com>
parents: 4572
diff changeset
447 }
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
448
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
449 if (shift) {
4582
a8881886a5f7 Improved readability of the code that produces bitmask from prefix.
Ruslan Ermilov <ru@nginx.com>
parents: 4573
diff changeset
450 cidr->u.in.mask = htonl((uint32_t) (0xffffffffu << (32 - shift)));
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
451
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
452 } else {
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
453 /* x86 compilers use a shl instruction that shifts by modulo 32 */
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
454 cidr->u.in.mask = 0;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
455 }
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
456
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
457 if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) {
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
458 return NGX_OK;
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
459 }
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
460
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
461 cidr->u.in.addr &= cidr->u.in.mask;
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
462
2202
2300ab9b069e *) refactor ngx_ptocidr()
Igor Sysoev <igor@sysoev.ru>
parents: 2200
diff changeset
463 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
464 }
340
0bf903191ceb nginx-0.0.3-2004-05-25-19:28:46 import
Igor Sysoev <igor@sysoev.ru>
parents: 291
diff changeset
465 }
425
bd39260a1383 nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
466
bd39260a1383 nginx-0.0.10-2004-09-14-19:55:24 import
Igor Sysoev <igor@sysoev.ru>
parents: 404
diff changeset
467
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
468 ngx_int_t
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
469 ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
470 {
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
471 in_addr_t inaddr;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
472 ngx_uint_t family;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
473 struct sockaddr_in *sin;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
474 #if (NGX_HAVE_INET6)
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
475 struct in6_addr inaddr6;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
476 struct sockaddr_in6 *sin6;
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
477
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
478 /*
4572
67653855682e Fixed spelling in multiline C comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4412
diff changeset
479 * prevent MSVC8 warning:
3277
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
480 * potentially uninitialized local variable 'inaddr6' used
f8ec17eeeaa6 ngx_ptocidr() supports IPv6
Igor Sysoev <igor@sysoev.ru>
parents: 3276
diff changeset
481 */
4983
2677c561127b Properly initialize "struct in6_addr" with zeroes.
Ruslan Ermilov <ru@nginx.com>
parents: 4971
diff changeset
482 ngx_memzero(&inaddr6, sizeof(struct in6_addr));
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
483 #endif
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
484
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
485 inaddr = ngx_inet_addr(text, len);
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
486
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
487 if (inaddr != INADDR_NONE) {
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
488 family = AF_INET;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
489 len = sizeof(struct sockaddr_in);
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
490
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
491 #if (NGX_HAVE_INET6)
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
492 } else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
493 family = AF_INET6;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
494 len = sizeof(struct sockaddr_in6);
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
495
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
496 #endif
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
497 } else {
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
498 return NGX_DECLINED;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
499 }
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
500
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
501 addr->sockaddr = ngx_pcalloc(pool, len);
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
502 if (addr->sockaddr == NULL) {
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
503 return NGX_ERROR;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
504 }
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
505
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
506 addr->sockaddr->sa_family = (u_char) family;
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
507 addr->socklen = len;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
508
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
509 switch (family) {
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
510
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
511 #if (NGX_HAVE_INET6)
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
512 case AF_INET6:
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
513 sin6 = (struct sockaddr_in6 *) addr->sockaddr;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
514 ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
515 break;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
516 #endif
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
517
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
518 default: /* AF_INET */
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
519 sin = (struct sockaddr_in *) addr->sockaddr;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
520 sin->sin_addr.s_addr = inaddr;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
521 break;
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
522 }
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
523
3272
98f49b2bcae8 change ngx_parse_addr() interface
Igor Sysoev <igor@sysoev.ru>
parents: 3270
diff changeset
524 return NGX_OK;
3270
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
525 }
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
526
7d1a04259e3f ngx_parse_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3269
diff changeset
527
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
528 ngx_int_t
6564
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
529 ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text,
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
530 size_t len)
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
531 {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
532 u_char *p, *last;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
533 size_t plen;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
534 ngx_int_t rc, port;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
535 struct sockaddr_in *sin;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
536 #if (NGX_HAVE_INET6)
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
537 struct sockaddr_in6 *sin6;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
538 #endif
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
539
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
540 rc = ngx_parse_addr(pool, addr, text, len);
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
541
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
542 if (rc != NGX_DECLINED) {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
543 return rc;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
544 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
545
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
546 last = text + len;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
547
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
548 #if (NGX_HAVE_INET6)
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
549 if (len && text[0] == '[') {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
550
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
551 p = ngx_strlchr(text, last, ']');
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
552
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
553 if (p == NULL || p == last - 1 || *++p != ':') {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
554 return NGX_DECLINED;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
555 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
556
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
557 text++;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
558 len -= 2;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
559
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
560 } else
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
561 #endif
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
562
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
563 {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
564 p = ngx_strlchr(text, last, ':');
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
565
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
566 if (p == NULL) {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
567 return NGX_DECLINED;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
568 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
569 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
570
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
571 p++;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
572 plen = last - p;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
573
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
574 port = ngx_atoi(p, plen);
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
575
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
576 if (port < 1 || port > 65535) {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
577 return NGX_DECLINED;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
578 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
579
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
580 len -= plen + 1;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
581
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
582 rc = ngx_parse_addr(pool, addr, text, len);
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
583
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
584 if (rc != NGX_OK) {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
585 return rc;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
586 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
587
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
588 switch (addr->sockaddr->sa_family) {
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
589
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
590 #if (NGX_HAVE_INET6)
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
591 case AF_INET6:
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
592 sin6 = (struct sockaddr_in6 *) addr->sockaddr;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
593 sin6->sin6_port = htons(port);
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
594 break;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
595 #endif
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
596
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
597 default: /* AF_INET */
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
598 sin = (struct sockaddr_in *) addr->sockaddr;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
599 sin->sin_port = htons(port);
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
600 break;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
601 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
602
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
603 return NGX_OK;
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
604 }
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
605
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
606
19db5a6bc34e Realip: port support in X-Real-IP and X-Forwarded-For.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6559
diff changeset
607 ngx_int_t
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
608 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
609 {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
610 u_char *p;
6463
5df5d7d771f6 Core: allow strings without null-termination in ngx_parse_url().
Piotr Sikora <piotrsikora@google.com>
parents: 6138
diff changeset
611 size_t len;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
612
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
613 p = u->url.data;
6463
5df5d7d771f6 Core: allow strings without null-termination in ngx_parse_url().
Piotr Sikora <piotrsikora@google.com>
parents: 6138
diff changeset
614 len = u->url.len;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
615
6463
5df5d7d771f6 Core: allow strings without null-termination in ngx_parse_url().
Piotr Sikora <piotrsikora@google.com>
parents: 6138
diff changeset
616 if (len >= 5 && ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
617 return ngx_parse_unix_domain_url(pool, u);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
618 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
619
6463
5df5d7d771f6 Core: allow strings without null-termination in ngx_parse_url().
Piotr Sikora <piotrsikora@google.com>
parents: 6138
diff changeset
620 if (len && p[0] == '[') {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
621 return ngx_parse_inet6_url(pool, u);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
622 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
623
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
624 return ngx_parse_inet_url(pool, u);
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
625 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
626
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
627
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
628 static ngx_int_t
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
629 ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u)
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
630 {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
631 #if (NGX_HAVE_UNIX_DOMAIN)
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
632 u_char *path, *uri, *last;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
633 size_t len;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
634 struct sockaddr_un *saun;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
635
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
636 len = u->url.len;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
637 path = u->url.data;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
638
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
639 path += 5;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
640 len -= 5;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
641
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
642 if (u->uri_part) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
643
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
644 last = path + len;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
645 uri = ngx_strlchr(path, last, ':');
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
646
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
647 if (uri) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
648 len = uri - path;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
649 uri++;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
650 u->uri.len = last - uri;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
651 u->uri.data = uri;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
652 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
653 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
654
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
655 if (len == 0) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
656 u->err = "no path in the unix domain socket";
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
657 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
658 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
659
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
660 u->host.len = len++;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
661 u->host.data = path;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
662
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
663 if (len > sizeof(saun->sun_path)) {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
664 u->err = "too long path in the unix domain socket";
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
665 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
666 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
667
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
668 u->socklen = sizeof(struct sockaddr_un);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
669 saun = (struct sockaddr_un *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
670 saun->sun_family = AF_UNIX;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
671 (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
672
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
673 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
674 if (u->addrs == NULL) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
675 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
676 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
677
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
678 saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
679 if (saun == NULL) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
680 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
681 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
682
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
683 u->family = AF_UNIX;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
684 u->naddrs = 1;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
685
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
686 saun->sun_family = AF_UNIX;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
687 (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
688
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
689 u->addrs[0].sockaddr = (struct sockaddr *) saun;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
690 u->addrs[0].socklen = sizeof(struct sockaddr_un);
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
691 u->addrs[0].name.len = len + 4;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
692 u->addrs[0].name.data = u->url.data;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
693
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
694 return NGX_OK;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
695
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
696 #else
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
697
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
698 u->err = "the unix domain sockets are not supported on this platform";
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
699
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
700 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
701
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
702 #endif
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
703 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
704
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
705
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
706 static ngx_int_t
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
707 ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
708 {
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
709 u_char *p, *host, *port, *last, *uri, *args;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
710 size_t len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
711 ngx_int_t n;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
712 struct sockaddr_in *sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
713 #if (NGX_HAVE_INET6)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
714 struct sockaddr_in6 *sin6;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
715 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
716
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
717 u->socklen = sizeof(struct sockaddr_in);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
718 sin = (struct sockaddr_in *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
719 sin->sin_family = AF_INET;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
720
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
721 u->family = AF_INET;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
722
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
723 host = u->url.data;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
724
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
725 last = host + u->url.len;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
726
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
727 port = ngx_strlchr(host, last, ':');
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
728
2283
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
729 uri = ngx_strlchr(host, last, '/');
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
730
2284
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
731 args = ngx_strlchr(host, last, '?');
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
732
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
733 if (args) {
4652
215857d53cbe Code reduction (no functional changes).
Ruslan Ermilov <ru@nginx.com>
parents: 4642
diff changeset
734 if (uri == NULL || args < uri) {
2284
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
735 uri = args;
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
736 }
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
737 }
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
738
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
739 if (uri) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
740 if (u->listen || !u->uri_part) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
741 u->err = "invalid host";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
742 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
743 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
744
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
745 u->uri.len = last - uri;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
746 u->uri.data = uri;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
747
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
748 last = uri;
2283
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
749
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
750 if (uri < port) {
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
751 port = NULL;
2301
148c2e840c2b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2284
diff changeset
752 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
753 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
754
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
755 if (port) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
756 port++;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
757
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
758 len = last - port;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
759
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
760 n = ngx_atoi(port, len);
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
761
4227
4af8ea9c3a86 Fixed port range checking.
Ruslan Ermilov <ru@nginx.com>
parents: 3894
diff changeset
762 if (n < 1 || n > 65535) {
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
763 u->err = "invalid port";
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
764 return NGX_ERROR;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
765 }
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
766
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
767 u->port = (in_port_t) n;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
768 sin->sin_port = htons((in_port_t) n);
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
769
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
770 u->port_text.len = len;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
771 u->port_text.data = port;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
772
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
773 last = port - 1;
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
774
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
775 } else {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
776 if (uri == NULL) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
777
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
778 if (u->listen) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
779
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
780 /* test value as port only */
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
781
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
782 n = ngx_atoi(host, last - host);
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
783
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
784 if (n != NGX_ERROR) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
785
4227
4af8ea9c3a86 Fixed port range checking.
Ruslan Ermilov <ru@nginx.com>
parents: 3894
diff changeset
786 if (n < 1 || n > 65535) {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
787 u->err = "invalid port";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
788 return NGX_ERROR;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
789 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
790
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
791 u->port = (in_port_t) n;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
792 sin->sin_port = htons((in_port_t) n);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
793
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
794 u->port_text.len = last - host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
795 u->port_text.data = host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
796
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
797 u->wildcard = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
798
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
799 return NGX_OK;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
800 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
801 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
802 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
803
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
804 u->no_port = 1;
5005
c9059bd5445b Fixed "proxy_pass" with IP address and no port (ticket #276).
Ruslan Ermilov <ru@nginx.com>
parents: 4983
diff changeset
805 u->port = u->default_port;
c9059bd5445b Fixed "proxy_pass" with IP address and no port (ticket #276).
Ruslan Ermilov <ru@nginx.com>
parents: 4983
diff changeset
806 sin->sin_port = htons(u->default_port);
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
807 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
808
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
809 len = last - host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
810
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
811 if (len == 0) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
812 u->err = "no host";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
813 return NGX_ERROR;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
814 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
815
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
816 u->host.len = len;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
817 u->host.data = host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
818
4969
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
819 if (u->listen && len == 1 && *host == '*') {
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
820 sin->sin_addr.s_addr = INADDR_ANY;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
821 u->wildcard = 1;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
822 return NGX_OK;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
823 }
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
824
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
825 sin->sin_addr.s_addr = ngx_inet_addr(host, len);
3267
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
826
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
827 if (sin->sin_addr.s_addr != INADDR_NONE) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
828
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
829 if (sin->sin_addr.s_addr == INADDR_ANY) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
830 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
831 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
832
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
833 u->naddrs = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
834
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
835 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
836 if (u->addrs == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
837 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
838 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
839
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
840 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
841 if (sin == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
842 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
843 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
844
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6534
diff changeset
845 ngx_memcpy(sin, &u->sockaddr, sizeof(struct sockaddr_in));
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
846
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
847 u->addrs[0].sockaddr = (struct sockaddr *) sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
848 u->addrs[0].socklen = sizeof(struct sockaddr_in);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
849
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
850 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
4969
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
851 if (p == NULL) {
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
852 return NGX_ERROR;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
853 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
854
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
855 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
856 &u->host, u->port) - p;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
857 u->addrs[0].name.data = p;
4969
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
858
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
859 return NGX_OK;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
860 }
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 712
diff changeset
861
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
862 if (u->no_resolve) {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
863 return NGX_OK;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
864 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
865
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
866 if (ngx_inet_resolve_host(pool, u) != NGX_OK) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
867 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
868 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
869
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
870 u->family = u->addrs[0].sockaddr->sa_family;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
871 u->socklen = u->addrs[0].socklen;
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6534
diff changeset
872 ngx_memcpy(&u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
873
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
874 switch (u->family) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
875
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
876 #if (NGX_HAVE_INET6)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
877 case AF_INET6:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
878 sin6 = (struct sockaddr_in6 *) &u->sockaddr;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
879
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
880 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
881 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
882 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
883
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
884 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
885 #endif
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
886
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
887 default: /* AF_INET */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
888 sin = (struct sockaddr_in *) &u->sockaddr;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
889
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
890 if (sin->sin_addr.s_addr == INADDR_ANY) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
891 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
892 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
893
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
894 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
895 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
896
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
897 return NGX_OK;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
898 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
899
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
900
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
901 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
902 ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
903 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
904 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
905 u_char *p, *host, *port, *last, *uri;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
906 size_t len;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
907 ngx_int_t n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
908 struct sockaddr_in6 *sin6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
909
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
910 u->socklen = sizeof(struct sockaddr_in6);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
911 sin6 = (struct sockaddr_in6 *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
912 sin6->sin6_family = AF_INET6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
913
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
914 host = u->url.data + 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
915
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
916 last = u->url.data + u->url.len;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
917
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
918 p = ngx_strlchr(host, last, ']');
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
919
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
920 if (p == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
921 u->err = "invalid host";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
922 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
923 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
924
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
925 port = p + 1;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
926
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
927 uri = ngx_strlchr(port, last, '/');
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
928
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
929 if (uri) {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
930 if (u->listen || !u->uri_part) {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
931 u->err = "invalid host";
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
932 return NGX_ERROR;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
933 }
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
934
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
935 u->uri.len = last - uri;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
936 u->uri.data = uri;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
937
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
938 last = uri;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
939 }
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
940
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
941 if (port < last) {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
942 if (*port != ':') {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
943 u->err = "invalid host";
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
944 return NGX_ERROR;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
945 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
946
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
947 port++;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
948
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
949 len = last - port;
6533
b358d670c654 Core: fixed port handling in ngx_parse_inet6_url().
Valentin Bartenev <vbart@nginx.com>
parents: 6509
diff changeset
950
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
951 n = ngx_atoi(port, len);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
952
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
953 if (n < 1 || n > 65535) {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
954 u->err = "invalid port";
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
955 return NGX_ERROR;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
956 }
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
957
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
958 u->port = (in_port_t) n;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
959 sin6->sin6_port = htons((in_port_t) n);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
960
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
961 u->port_text.len = len;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
962 u->port_text.data = port;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
963
6534
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
964 } else {
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
965 u->no_port = 1;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
966 u->port = u->default_port;
19a54ba76c04 Removed a surplus condition from ngx_parse_inet6_url().
Ruslan Ermilov <ru@nginx.com>
parents: 6533
diff changeset
967 sin6->sin6_port = htons(u->default_port);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
968 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
969
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
970 len = p - host;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
971
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
972 if (len == 0) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
973 u->err = "no host";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
974 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
975 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
976
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
977 u->host.len = len + 2;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
978 u->host.data = host - 1;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
979
3268
c6a40c815d45 use sin6_addr.s6_addr instead of "(u_char *) & .sin6_addr"
Igor Sysoev <igor@sysoev.ru>
parents: 3267
diff changeset
980 if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
981 u->err = "invalid IPv6 address";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
982 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
983 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
984
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
985 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
986 u->wildcard = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
987 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
988
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
989 u->family = AF_INET6;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
990 u->naddrs = 1;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
991
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
992 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
993 if (u->addrs == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
994 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
995 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
996
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
997 sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
998 if (sin6 == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
999 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1000 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1001
6559
adf25b8d0431 Introduced the ngx_sockaddr_t type.
Ruslan Ermilov <ru@nginx.com>
parents: 6534
diff changeset
1002 ngx_memcpy(sin6, &u->sockaddr, sizeof(struct sockaddr_in6));
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1003
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1004 u->addrs[0].sockaddr = (struct sockaddr *) sin6;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1005 u->addrs[0].socklen = sizeof(struct sockaddr_in6);
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1006
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1007 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1008 if (p == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1009 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1010 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1011
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1012 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1013 &u->host, u->port) - p;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1014 u->addrs[0].name.data = p;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
1015
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1016 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1017
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1018 #else
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1019
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1020 u->err = "the INET6 sockets are not supported on this platform";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1021
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1022 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1023
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1024 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1025 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1026
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1027
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1028 #if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1029
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1030 ngx_int_t
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1031 ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1032 {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1033 u_char *p, *host;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1034 size_t len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1035 in_port_t port;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1036 ngx_uint_t i;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1037 struct addrinfo hints, *res, *rp;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1038 struct sockaddr_in *sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1039 struct sockaddr_in6 *sin6;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1040
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1041 port = htons(u->port);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1042
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1043 host = ngx_alloc(u->host.len + 1, pool->log);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1044 if (host == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1045 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1046 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1047
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1048 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1049
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1050 ngx_memzero(&hints, sizeof(struct addrinfo));
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1051 hints.ai_family = AF_UNSPEC;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1052 hints.ai_socktype = SOCK_STREAM;
5314
0300d97c6084 Core: guard use of AI_ADDRCONFIG.
Ruslan Ermilov <ru@nginx.com>
parents: 5313
diff changeset
1053 #ifdef AI_ADDRCONFIG
5312
ec8594b9bf11 Core: only resolve address families configured on the local system.
Ruslan Ermilov <ru@nginx.com>
parents: 5263
diff changeset
1054 hints.ai_flags = AI_ADDRCONFIG;
5314
0300d97c6084 Core: guard use of AI_ADDRCONFIG.
Ruslan Ermilov <ru@nginx.com>
parents: 5313
diff changeset
1055 #endif
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1056
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1057 if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1058 u->err = "host not found";
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1059 ngx_free(host);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1060 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1061 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1062
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1063 ngx_free(host);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1064
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1065 for (i = 0, rp = res; rp != NULL; rp = rp->ai_next) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1066
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1067 switch (rp->ai_family) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1068
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1069 case AF_INET:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1070 case AF_INET6:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1071 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1072
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1073 default:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1074 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1075 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1076
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1077 i++;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1078 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1079
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1080 if (i == 0) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1081 u->err = "host not found";
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1082 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1083 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1084
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1085 /* MP: ngx_shared_palloc() */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1086
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1087 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1088 if (u->addrs == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1089 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1090 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1091
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1092 u->naddrs = i;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1093
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1094 i = 0;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1095
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1096 /* AF_INET addresses first */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1097
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1098 for (rp = res; rp != NULL; rp = rp->ai_next) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1099
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1100 if (rp->ai_family != AF_INET) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1101 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1102 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1103
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1104 sin = ngx_pcalloc(pool, rp->ai_addrlen);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1105 if (sin == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1106 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1107 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1108
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1109 ngx_memcpy(sin, rp->ai_addr, rp->ai_addrlen);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1110
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1111 sin->sin_port = port;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1112
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1113 u->addrs[i].sockaddr = (struct sockaddr *) sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1114 u->addrs[i].socklen = rp->ai_addrlen;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1115
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1116 len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1117
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1118 p = ngx_pnalloc(pool, len);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1119 if (p == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1120 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1121 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1122
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1123 len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1);
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1124
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1125 u->addrs[i].name.len = len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1126 u->addrs[i].name.data = p;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1127
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1128 i++;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1129 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1130
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1131 for (rp = res; rp != NULL; rp = rp->ai_next) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1132
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1133 if (rp->ai_family != AF_INET6) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1134 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1135 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1136
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1137 sin6 = ngx_pcalloc(pool, rp->ai_addrlen);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1138 if (sin6 == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1139 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1140 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1141
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1142 ngx_memcpy(sin6, rp->ai_addr, rp->ai_addrlen);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1143
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1144 sin6->sin6_port = port;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1145
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1146 u->addrs[i].sockaddr = (struct sockaddr *) sin6;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1147 u->addrs[i].socklen = rp->ai_addrlen;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1148
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1149 len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1150
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1151 p = ngx_pnalloc(pool, len);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1152 if (p == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1153 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1154 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1155
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1156 len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1157 len, 1);
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1158
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1159 u->addrs[i].name.len = len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1160 u->addrs[i].name.data = p;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1161
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1162 i++;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1163 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1164
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1165 freeaddrinfo(res);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1166 return NGX_OK;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1167
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1168 failed:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1169
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1170 freeaddrinfo(res);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1171 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1172 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1173
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1174 #else /* !NGX_HAVE_GETADDRINFO || !NGX_HAVE_INET6 */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1175
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1176 ngx_int_t
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1177 ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1178 {
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1179 u_char *p, *host;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1180 size_t len;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1181 in_port_t port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1182 in_addr_t in_addr;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1183 ngx_uint_t i;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1184 struct hostent *h;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1185 struct sockaddr_in *sin;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1186
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1187 /* AF_INET only */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1188
2517
095f28fc0c4a fix upstream port, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
1189 port = htons(u->port);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1190
3267
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1191 in_addr = ngx_inet_addr(u->host.data, u->host.len);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1192
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1193 if (in_addr == INADDR_NONE) {
3267
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1194 host = ngx_alloc(u->host.len + 1, pool->log);
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1195 if (host == NULL) {
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1196 return NGX_ERROR;
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1197 }
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1198
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1199 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1200
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1201 h = gethostbyname((char *) host);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1202
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1203 ngx_free(host);
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1204
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1205 if (h == NULL || h->h_addr_list[0] == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1206 u->err = "host not found";
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1207 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1208 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1209
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1210 for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1211
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1212 /* MP: ngx_shared_palloc() */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1213
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
1214 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1215 if (u->addrs == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1216 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1217 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1218
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1219 u->naddrs = i;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1220
3864
8e77b5216894 fix u->one_addr handling in ngx_inet_resolve_host()
Igor Sysoev <igor@sysoev.ru>
parents: 3377
diff changeset
1221 for (i = 0; i < u->naddrs; i++) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1222
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1223 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1224 if (sin == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1225 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1226 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1227
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1228 sin->sin_family = AF_INET;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1229 sin->sin_port = port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1230 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1231
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1232 u->addrs[i].sockaddr = (struct sockaddr *) sin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1233 u->addrs[i].socklen = sizeof(struct sockaddr_in);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1234
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1235 len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1236
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1862
diff changeset
1237 p = ngx_pnalloc(pool, len);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1238 if (p == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1239 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1240 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1241
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1242 len = ngx_sock_ntop((struct sockaddr *) sin,
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1243 sizeof(struct sockaddr_in), p, len, 1);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1244
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1245 u->addrs[i].name.len = len;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1246 u->addrs[i].name.data = p;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1247 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1248
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1249 } else {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1250
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1251 /* MP: ngx_shared_palloc() */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1252
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
1253 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1254 if (u->addrs == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1255 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1256 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1257
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1258 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1259 if (sin == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1260 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1261 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1262
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1263 u->naddrs = 1;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1264
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1265 sin->sin_family = AF_INET;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1266 sin->sin_port = port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1267 sin->sin_addr.s_addr = in_addr;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1268
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1269 u->addrs[0].sockaddr = (struct sockaddr *) sin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1270 u->addrs[0].socklen = sizeof(struct sockaddr_in);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1271
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1272 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1273 if (p == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1274 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1275 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1276
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1277 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1278 &u->host, ntohs(port)) - p;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1279 u->addrs[0].name.data = p;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1280 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1281
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1282 return NGX_OK;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1283 }
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1284
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1285 #endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1286
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1287
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1288 ngx_int_t
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1289 ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1290 struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1291 {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1292 struct sockaddr_in *sin1, *sin2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1293 #if (NGX_HAVE_INET6)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1294 struct sockaddr_in6 *sin61, *sin62;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1295 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1296 #if (NGX_HAVE_UNIX_DOMAIN)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1297 struct sockaddr_un *saun1, *saun2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1298 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1299
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1300 if (sa1->sa_family != sa2->sa_family) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1301 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1302 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1303
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1304 switch (sa1->sa_family) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1305
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1306 #if (NGX_HAVE_INET6)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1307 case AF_INET6:
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1308
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1309 sin61 = (struct sockaddr_in6 *) sa1;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1310 sin62 = (struct sockaddr_in6 *) sa2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1311
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1312 if (cmp_port && sin61->sin6_port != sin62->sin6_port) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1313 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1314 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1315
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1316 if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1317 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1318 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1319
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1320 break;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1321 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1322
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1323 #if (NGX_HAVE_UNIX_DOMAIN)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1324 case AF_UNIX:
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1325
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1326 /* TODO length */
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1327
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1328 saun1 = (struct sockaddr_un *) sa1;
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1329 saun2 = (struct sockaddr_un *) sa2;
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1330
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1331 if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path,
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1332 sizeof(saun1->sun_path))
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1333 != 0)
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1334 {
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1335 return NGX_DECLINED;
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1336 }
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1337
6474
Ruslan Ermilov <ru@nginx.com>
parents: 6463
diff changeset
1338 break;
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1339 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1340
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1341 default: /* AF_INET */
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1342
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1343 sin1 = (struct sockaddr_in *) sa1;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1344 sin2 = (struct sockaddr_in *) sa2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1345
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1346 if (cmp_port && sin1->sin_port != sin2->sin_port) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1347 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1348 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1349
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1350 if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1351 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1352 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1353
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1354 break;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1355 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1356
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1357 return NGX_OK;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1358 }