annotate src/core/ngx_inet.c @ 7479:8be88b22fe81

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