annotate src/core/ngx_inet.c @ 6231:5def760fe95e

Updated OpenSSL used for win32 builds. Note that as of OpenSSL 1.0.0, the "ms\do_ms" script (previously documented to be used if one doesn't want to use the assembly language files) tries to use MASM. Additionally, OpenSSL 1.0.2 finally broke MASM support. To fix this, we now explicitly use "no-asm" in OpenSSL options.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 17 Aug 2015 18:09:20 +0300
parents bc47a7a8159c
children 5df5d7d771f6
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
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
351 dst = ngx_sprintf(dst, "%uxi", p[i] * 256 + p[i + 1]);
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
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
529 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
530 {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
531 u_char *p;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
532
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
533 p = u->url.data;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
534
1107
db7c468c447d ngx_strcasecmp()/ngx_strncasecmp()
Igor Sysoev <igor@sysoev.ru>
parents: 906
diff changeset
535 if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
536 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
537 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
538
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
539 if (p[0] == '[') {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
540 return ngx_parse_inet6_url(pool, u);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
541 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
542
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
543 return ngx_parse_inet_url(pool, u);
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
544 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
545
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
546
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
547 static ngx_int_t
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
548 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
549 {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
550 #if (NGX_HAVE_UNIX_DOMAIN)
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
551 u_char *path, *uri, *last;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
552 size_t len;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
553 struct sockaddr_un *saun;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
554
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
555 len = u->url.len;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
556 path = u->url.data;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
557
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
558 path += 5;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
559 len -= 5;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
560
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
561 if (u->uri_part) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
562
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
563 last = path + len;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
564 uri = ngx_strlchr(path, last, ':');
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
565
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
566 if (uri) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
567 len = uri - path;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
568 uri++;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
569 u->uri.len = last - uri;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
570 u->uri.data = uri;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
571 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
572 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
573
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
574 if (len == 0) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
575 u->err = "no path in the unix domain socket";
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
576 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
577 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
578
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
579 u->host.len = len++;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
580 u->host.data = path;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
581
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
582 if (len > sizeof(saun->sun_path)) {
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
583 u->err = "too long path in the unix domain socket";
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
584 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
585 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
586
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
587 u->socklen = sizeof(struct sockaddr_un);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
588 saun = (struct sockaddr_un *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
589 saun->sun_family = AF_UNIX;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
590 (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
591
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
592 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
593 if (u->addrs == NULL) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
594 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
595 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
596
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
597 saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
598 if (saun == NULL) {
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
599 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
600 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
601
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
602 u->family = AF_UNIX;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
603 u->naddrs = 1;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
604
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
605 saun->sun_family = AF_UNIX;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
606 (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
607
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
608 u->addrs[0].sockaddr = (struct sockaddr *) saun;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
609 u->addrs[0].socklen = sizeof(struct sockaddr_un);
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
610 u->addrs[0].name.len = len + 4;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
611 u->addrs[0].name.data = u->url.data;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
612
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
613 return NGX_OK;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
614
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
615 #else
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
616
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
617 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
618
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
619 return NGX_ERROR;
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
620
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
621 #endif
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
622 }
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
623
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
624
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
625 static ngx_int_t
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
626 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
627 {
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
628 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
629 size_t len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
630 ngx_int_t n;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
631 struct sockaddr_in *sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
632 #if (NGX_HAVE_INET6)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
633 struct sockaddr_in6 *sin6;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
634 #endif
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
635
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
636 u->socklen = sizeof(struct sockaddr_in);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
637 sin = (struct sockaddr_in *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
638 sin->sin_family = AF_INET;
2200
fd15c193572d split ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2198
diff changeset
639
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
640 u->family = AF_INET;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
641
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
642 host = u->url.data;
2200
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 = host + u->url.len;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
645
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
646 port = ngx_strlchr(host, last, ':');
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
647
2283
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
648 uri = ngx_strlchr(host, last, '/');
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
649
2284
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
650 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
651
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
652 if (args) {
4652
215857d53cbe Code reduction (no functional changes).
Ruslan Ermilov <ru@nginx.com>
parents: 4642
diff changeset
653 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
654 uri = args;
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
655 }
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
656 }
c3035feb6638 fix case proxy_pass URL is evaluted to http://host?args
Igor Sysoev <igor@sysoev.ru>
parents: 2283
diff changeset
657
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
658 if (uri) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
659 if (u->listen || !u->uri_part) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
660 u->err = "invalid host";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
661 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
662 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
663
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
664 u->uri.len = last - uri;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
665 u->uri.data = uri;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
666
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
667 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
668
231b52f8adc0 fix case when URL has no port, but has ":" in URI part,
Igor Sysoev <igor@sysoev.ru>
parents: 2206
diff changeset
669 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
670 port = NULL;
2301
148c2e840c2b style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents: 2284
diff changeset
671 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
672 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
673
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
674 if (port) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
675 port++;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
676
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
677 len = last - port;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
678
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
679 n = ngx_atoi(port, len);
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
680
4227
4af8ea9c3a86 Fixed port range checking.
Ruslan Ermilov <ru@nginx.com>
parents: 3894
diff changeset
681 if (n < 1 || n > 65535) {
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
682 u->err = "invalid port";
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
683 return NGX_ERROR;
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
684 }
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
685
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
686 u->port = (in_port_t) n;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
687 sin->sin_port = htons((in_port_t) n);
2206
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
688
6ea36910aa57 fix bugs introduced in r2204
Igor Sysoev <igor@sysoev.ru>
parents: 2203
diff changeset
689 u->port_text.len = len;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
690 u->port_text.data = port;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
691
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
692 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
693
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
694 } else {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
695 if (uri == NULL) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
696
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
697 if (u->listen) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
698
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
699 /* test value as port only */
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
700
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
701 n = ngx_atoi(host, last - host);
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
702
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
703 if (n != NGX_ERROR) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
704
4227
4af8ea9c3a86 Fixed port range checking.
Ruslan Ermilov <ru@nginx.com>
parents: 3894
diff changeset
705 if (n < 1 || n > 65535) {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
706 u->err = "invalid port";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
707 return NGX_ERROR;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
708 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
709
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
710 u->port = (in_port_t) n;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
711 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
712
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
713 u->port_text.len = last - host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
714 u->port_text.data = host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
715
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
716 u->wildcard = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
717
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
718 return NGX_OK;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
719 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
720 }
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
721 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
722
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
723 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
724 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
725 sin->sin_port = htons(u->default_port);
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
726 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
727
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
728 len = last - host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
729
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
730 if (len == 0) {
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
731 u->err = "no host";
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
732 return NGX_ERROR;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
733 }
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
734
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
735 u->host.len = len;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
736 u->host.data = host;
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
737
4969
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
738 if (u->listen && len == 1 && *host == '*') {
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
739 sin->sin_addr.s_addr = INADDR_ANY;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
740 u->wildcard = 1;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
741 return NGX_OK;
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
742 }
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
743
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
744 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
745
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
746 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
747
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
748 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
749 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
750 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
751
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
752 u->naddrs = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
753
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
754 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
755 if (u->addrs == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
756 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
757 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
758
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
759 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
760 if (sin == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
761 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
762 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
763
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
764 ngx_memcpy(sin, u->sockaddr, sizeof(struct sockaddr_in));
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
765
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
766 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
767 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
768
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
769 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
770 if (p == NULL) {
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
771 return NGX_ERROR;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
772 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
773
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
774 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
775 &u->host, u->port) - p;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
776 u->addrs[0].name.data = p;
4969
2efa05bbbc1e Simplified URL parsing code.
Ruslan Ermilov <ru@nginx.com>
parents: 4670
diff changeset
777
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
778 return NGX_OK;
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
779 }
804
472cd9768ac2 now the "listen" directives use ngx_parse_url()
Igor Sysoev <igor@sysoev.ru>
parents: 712
diff changeset
780
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
781 if (u->no_resolve) {
2203
8e5bf1bc87e2 *) refactor ngx_parse_inet_url()
Igor Sysoev <igor@sysoev.ru>
parents: 2202
diff changeset
782 return NGX_OK;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
783 }
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
784
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
785 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
786 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
787 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
788
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
789 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
790 u->socklen = u->addrs[0].socklen;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
791 ngx_memcpy(u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
792
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
793 switch (u->family) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
794
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
795 #if (NGX_HAVE_INET6)
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
796 case AF_INET6:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
797 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
798
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
799 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
800 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
801 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
802
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
803 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
804 #endif
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
805
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
806 default: /* AF_INET */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
807 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
808
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
809 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
810 u->wildcard = 1;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
811 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
812
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
813 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
814 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
815
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
816 return NGX_OK;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
817 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
818
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
819
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
820 static ngx_int_t
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
821 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
822 {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
823 #if (NGX_HAVE_INET6)
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
824 u_char *p, *host, *port, *last, *uri;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
825 size_t len;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
826 ngx_int_t n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
827 struct sockaddr_in6 *sin6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
828
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
829 u->socklen = sizeof(struct sockaddr_in6);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
830 sin6 = (struct sockaddr_in6 *) &u->sockaddr;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
831 sin6->sin6_family = AF_INET6;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
832
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
833 host = u->url.data + 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
834
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
835 last = u->url.data + u->url.len;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
836
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
837 p = ngx_strlchr(host, last, ']');
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
838
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
839 if (p == NULL) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
840 u->err = "invalid host";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
841 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
842 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
843
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
844 if (last - p) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
845
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
846 port = p + 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
847
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
848 uri = ngx_strlchr(port, last, '/');
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
849
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
850 if (uri) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
851 if (u->listen || !u->uri_part) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
852 u->err = "invalid host";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
853 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
854 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
855
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
856 u->uri.len = last - uri;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
857 u->uri.data = uri;
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
858
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
859 last = uri;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
860 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
861
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
862 if (*port == ':') {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
863 port++;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
864
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
865 len = last - port;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
866
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
867 n = ngx_atoi(port, len);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
868
4227
4af8ea9c3a86 Fixed port range checking.
Ruslan Ermilov <ru@nginx.com>
parents: 3894
diff changeset
869 if (n < 1 || n > 65535) {
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
870 u->err = "invalid port";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
871 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
872 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
873
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
874 u->port = (in_port_t) n;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
875 sin6->sin6_port = htons((in_port_t) n);
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
876
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
877 u->port_text.len = len;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
878 u->port_text.data = port;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
879
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
880 } else {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
881 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
882 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
883 sin6->sin6_port = htons(u->default_port);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
884 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
885 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
886
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
887 len = p - host;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
888
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
889 if (len == 0) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
890 u->err = "no host";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
891 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
892 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
893
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
894 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
895 u->host.data = host - 1;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
896
3268
c6a40c815d45 use sin6_addr.s6_addr instead of "(u_char *) & .sin6_addr"
Igor Sysoev <igor@sysoev.ru>
parents: 3267
diff changeset
897 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
898 u->err = "invalid IPv6 address";
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
899 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
900 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
901
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
902 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
903 u->wildcard = 1;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
904 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
905
4670
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
906 u->family = AF_INET6;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
907 u->naddrs = 1;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
908
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
909 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
910 if (u->addrs == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
911 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
912 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
913
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
914 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
915 if (sin6 == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
916 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
917 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
918
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
919 ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
920
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
921 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
922 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
923
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
924 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
925 if (p == NULL) {
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
926 return NGX_ERROR;
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
927 }
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
928
c070fa19511e Support for IPv6 literals in proxy_pass and so on.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4652
diff changeset
929 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
930 &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
931 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
932
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
933 return NGX_OK;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
934
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
935 #else
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
936
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
937 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
938
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
939 return NGX_ERROR;
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
940
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
941 #endif
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
942 }
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
943
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
944
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
945 #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
946
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
947 ngx_int_t
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
948 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
949 {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
950 u_char *p, *host;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
951 size_t len;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
952 in_port_t port;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
953 ngx_uint_t i;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
954 struct addrinfo hints, *res, *rp;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
955 struct sockaddr_in *sin;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
956 struct sockaddr_in6 *sin6;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
957
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
958 port = htons(u->port);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
959
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
960 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
961 if (host == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
962 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
963 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
964
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
965 (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
966
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
967 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
968 hints.ai_family = AF_UNSPEC;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
969 hints.ai_socktype = SOCK_STREAM;
5314
0300d97c6084 Core: guard use of AI_ADDRCONFIG.
Ruslan Ermilov <ru@nginx.com>
parents: 5313
diff changeset
970 #ifdef AI_ADDRCONFIG
5312
ec8594b9bf11 Core: only resolve address families configured on the local system.
Ruslan Ermilov <ru@nginx.com>
parents: 5263
diff changeset
971 hints.ai_flags = AI_ADDRCONFIG;
5314
0300d97c6084 Core: guard use of AI_ADDRCONFIG.
Ruslan Ermilov <ru@nginx.com>
parents: 5313
diff changeset
972 #endif
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
973
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
974 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
975 u->err = "host not found";
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
976 ngx_free(host);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
977 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
978 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
979
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
980 ngx_free(host);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
981
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
982 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
983
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
984 switch (rp->ai_family) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
985
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
986 case AF_INET:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
987 case AF_INET6:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
988 break;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
989
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
990 default:
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
991 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
992 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
993
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
994 i++;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
995 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
996
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
997 if (i == 0) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
998 u->err = "host not found";
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
999 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1000 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1001
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1002 /* MP: ngx_shared_palloc() */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1003
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1004 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
1005 if (u->addrs == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1006 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1007 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1008
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1009 u->naddrs = i;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1010
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1011 i = 0;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1012
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1013 /* AF_INET addresses first */
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1014
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1015 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
1016
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1017 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
1018 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1019 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1020
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1021 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
1022 if (sin == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1023 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1024 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1025
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1026 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
1027
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1028 sin->sin_port = port;
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 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
1031 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
1032
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1033 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
1034
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1035 p = ngx_pnalloc(pool, len);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1036 if (p == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1037 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1038 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1039
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1040 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
1041
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1042 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
1043 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
1044
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1045 i++;
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 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
1049
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1050 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
1051 continue;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1052 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1053
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1054 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
1055 if (sin6 == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1056 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1057 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1058
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1059 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
1060
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1061 sin6->sin6_port = port;
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 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
1064 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
1065
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1066 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
1067
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1068 p = ngx_pnalloc(pool, len);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1069 if (p == NULL) {
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1070 goto failed;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1071 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1072
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1073 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
1074 len, 1);
4971
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 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
1077 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
1078
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1079 i++;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1080 }
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1081
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1082 freeaddrinfo(res);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1083 return NGX_OK;
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 failed:
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 freeaddrinfo(res);
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1088 return NGX_ERROR;
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1089 }
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 #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
1092
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1093 ngx_int_t
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1094 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
1095 {
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1096 u_char *p, *host;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1097 size_t len;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1098 in_port_t port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1099 in_addr_t in_addr;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1100 ngx_uint_t i;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1101 struct hostent *h;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1102 struct sockaddr_in *sin;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1103
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1104 /* AF_INET only */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1105
2517
095f28fc0c4a fix upstream port, introduced in r2513
Igor Sysoev <igor@sysoev.ru>
parents: 2512
diff changeset
1106 port = htons(u->port);
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1107
3267
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1108 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
1109
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1110 if (in_addr == INADDR_NONE) {
3267
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1111 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
1112 if (host == NULL) {
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1113 return NGX_ERROR;
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1114 }
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1115
fb4f7605505f replace inet_addr() with ngx_inet_addr()
Igor Sysoev <igor@sysoev.ru>
parents: 3266
diff changeset
1116 (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
1117
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1118 h = gethostbyname((char *) host);
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1119
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1120 ngx_free(host);
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1121
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1122 if (h == NULL || h->h_addr_list[0] == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1123 u->err = "host not found";
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1124 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1125 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1126
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1127 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
1128
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1129 /* MP: ngx_shared_palloc() */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1130
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
1131 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1132 if (u->addrs == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1133 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1134 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1135
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1136 u->naddrs = i;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1137
3864
8e77b5216894 fix u->one_addr handling in ngx_inet_resolve_host()
Igor Sysoev <igor@sysoev.ru>
parents: 3377
diff changeset
1138 for (i = 0; i < u->naddrs; i++) {
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1139
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1140 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
1141 if (sin == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1142 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1143 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1144
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1145 sin->sin_family = AF_INET;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1146 sin->sin_port = port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1147 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
1148
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1149 u->addrs[i].sockaddr = (struct sockaddr *) sin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1150 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
1151
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1152 len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1153
2049
2a92804f4109 *) back out r2040
Igor Sysoev <igor@sysoev.ru>
parents: 1862
diff changeset
1154 p = ngx_pnalloc(pool, len);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1155 if (p == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1156 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1157 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1158
5263
05ba5bce31e0 Core: extended ngx_sock_ntop() with socklen parameter.
Vladimir Homutov <vl@nginx.com>
parents: 5005
diff changeset
1159 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
1160 sizeof(struct sockaddr_in), p, len, 1);
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1161
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1162 u->addrs[i].name.len = len;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1163 u->addrs[i].name.data = p;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1164 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1165
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1166 } else {
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1167
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1168 /* MP: ngx_shared_palloc() */
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1169
3269
f0d596e84634 rename ngx_peer_addr_t to ngx_addr_t
Igor Sysoev <igor@sysoev.ru>
parents: 3268
diff changeset
1170 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1171 if (u->addrs == NULL) {
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1172 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1173 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1174
1559
fe11e2a3946d use pool instead of ngx_conf_t
Igor Sysoev <igor@sysoev.ru>
parents: 1380
diff changeset
1175 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
1176 if (sin == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1177 return NGX_ERROR;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1178 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1179
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1180 u->naddrs = 1;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1181
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1182 sin->sin_family = AF_INET;
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1183 sin->sin_port = port;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1184 sin->sin_addr.s_addr = in_addr;
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1185
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1186 u->addrs[0].sockaddr = (struct sockaddr *) sin;
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1187 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
1188
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1189 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1190 if (p == NULL) {
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1191 return NGX_ERROR;
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
2512
2e91aecb9e57 a prelimiary IPv6 support, HTTP listen
Igor Sysoev <igor@sysoev.ru>
parents: 2301
diff changeset
1194 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
1195 &u->host, ntohs(port)) - p;
906
a0310ac2814f rewritten upstream
Igor Sysoev <igor@sysoev.ru>
parents: 892
diff changeset
1196 u->addrs[0].name.data = p;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1197 }
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1198
884
4d68c486fcb0 upstream choice modules
Igor Sysoev <igor@sysoev.ru>
parents: 808
diff changeset
1199 return NGX_OK;
651
39b7d7b33c91 nginx-0.3.47-RELEASE import
Igor Sysoev <igor@sysoev.ru>
parents: 631
diff changeset
1200 }
4971
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1201
eaf95350d75c Implemented IPv6 support for URLs specified using domain names.
Ruslan Ermilov <ru@nginx.com>
parents: 4970
diff changeset
1202 #endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */
5473
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1203
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1204
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1205 ngx_int_t
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1206 ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1,
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1207 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
1208 {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1209 struct sockaddr_in *sin1, *sin2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1210 #if (NGX_HAVE_INET6)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1211 struct sockaddr_in6 *sin61, *sin62;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1212 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1213 #if (NGX_HAVE_UNIX_DOMAIN)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1214 struct sockaddr_un *saun1, *saun2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1215 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1216
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1217 if (sa1->sa_family != sa2->sa_family) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1218 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1219 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1220
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1221 switch (sa1->sa_family) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1222
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1223 #if (NGX_HAVE_INET6)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1224 case AF_INET6:
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1225
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1226 sin61 = (struct sockaddr_in6 *) sa1;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1227 sin62 = (struct sockaddr_in6 *) sa2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1228
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1229 if (cmp_port && sin61->sin6_port != sin62->sin6_port) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1230 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1231 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1232
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1233 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
1234 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1235 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1236
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1237 break;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1238 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1239
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1240 #if (NGX_HAVE_UNIX_DOMAIN)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1241 case AF_UNIX:
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1242
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1243 /* TODO length */
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1244
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1245 saun1 = (struct sockaddr_un *) sa1;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1246 saun2 = (struct sockaddr_un *) sa2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1247
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1248 if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path,
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1249 sizeof(saun1->sun_path))
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1250 != 0)
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1251 {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1252 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1253 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1254
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1255 break;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1256 #endif
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1257
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1258 default: /* AF_INET */
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1259
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1260 sin1 = (struct sockaddr_in *) sa1;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1261 sin2 = (struct sockaddr_in *) sa2;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1262
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1263 if (cmp_port && sin1->sin_port != sin2->sin_port) {
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1264 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1265 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1266
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1267 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
1268 return NGX_DECLINED;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1269 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1270
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1271 break;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1272 }
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1273
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1274 return NGX_OK;
d39ef821d03e Core: externalized ngx_cmp_sockaddr().
Ruslan Ermilov <ru@nginx.com>
parents: 5314
diff changeset
1275 }