annotate src/core/ngx_inet.c @ 556:25255878df91 NGINX_0_8_30

nginx 0.8.30 *) Change: now the default buffer size of the "large_client_header_buffers" directive is 8K. Thanks to Andrew Cholakian. *) Feature: the conf/fastcgi.conf for simple FastCGI configurations. *) Bugfix: nginx/Windows tried to rename a temporary file twice if the file should replace an already existent file. *) Bugfix: of "double free or corruption" error issued if host could not be resolved; the bug had appeared in 0.8.22. Thanks to Konstantin Svist. *) Bugfix: in libatomic usage on some platforms. Thanks to W-Mark Kubacki.
author Igor Sysoev <http://sysoev.ru>
date Tue, 15 Dec 2009 00:00:00 +0300
parents c04fa65fe604
children bb20316269e4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
11 static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
12 static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u);
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
13 static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u);
362
54fad6c4b555 nginx 0.6.25
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
14
348
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
15
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
16 in_addr_t
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
17 ngx_inet_addr(u_char *text, size_t len)
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
18 {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
19 u_char *p, c;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
20 in_addr_t addr;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
21 ngx_uint_t octet, n;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
22
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
23 addr = 0;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
24 octet = 0;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
25 n = 0;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
26
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
27 for (p = text; p < text + len; p++) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
28
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
29 c = *p;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
30
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
31 if (c >= '0' && c <= '9') {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
32 octet = octet * 10 + (c - '0');
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
33 continue;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
34 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
35
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
36 if (c == '.' && octet < 256) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
37 addr = (addr << 8) + octet;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
38 octet = 0;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
39 n++;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
40 continue;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
41 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
42
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
43 return INADDR_NONE;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
44 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
45
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
46 if (n != 3) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
47 return INADDR_NONE;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
48 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
49
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
50 if (octet < 256) {
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
51 addr = (addr << 8) + octet;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
52 return htonl(addr);
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
53 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
54
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
55 return INADDR_NONE;
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
56 }
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
57
e10168d6e371 nginx 0.6.18
Igor Sysoev <http://sysoev.ru>
parents: 340
diff changeset
58
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
59 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
60
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
61 ngx_int_t
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
62 ngx_inet6_addr(u_char *p, size_t len, u_char *addr)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
63 {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
64 u_char c, *zero, *digit, *s, *d;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
65 size_t len4;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
66 ngx_uint_t n, nibbles, word;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
67
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
68 if (len == 0) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
69 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
70 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
71
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
72 zero = NULL;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
73 digit = NULL;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
74 len4 = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
75 nibbles = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
76 word = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
77 n = 8;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
78
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
79 if (p[0] == ':') {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
80 p++;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
81 len--;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
82 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
83
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
84 for (/* void */; len; len--) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
85 c = *p++;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
86
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
87 if (c == ':') {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
88 if (nibbles) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
89 digit = p;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
90 len4 = len;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
91 *addr++ = (u_char) (word >> 8);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
92 *addr++ = (u_char) (word & 0xff);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
93
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
94 if (--n) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
95 nibbles = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
96 word = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
97 continue;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
98 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
99
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
100 } else {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
101 if (zero == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
102 digit = p;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
103 len4 = len;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
104 zero = addr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
105 continue;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
106 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
107 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
108
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
109 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
110 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
111
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
112 if (c == '.' && nibbles) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
113 if (n < 2) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
114 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
115 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
116
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
117 word = ngx_inet_addr(digit, len4 - 1);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
118 if (word == INADDR_NONE) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
119 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
120 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
121
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
122 word = ntohl(word);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
123 *addr++ = (u_char) ((word >> 24) & 0xff);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
124 *addr++ = (u_char) ((word >> 16) & 0xff);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
125 n--;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
126 break;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
127 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
128
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
129 if (++nibbles > 4) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
130 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
131 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
132
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
133 if (c >= '0' && c <= '9') {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
134 word = word * 16 + (c - '0');
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
135 continue;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
136 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
137
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
138 c |= 0x20;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
139
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
140 if (c >= 'a' && c <= 'f') {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
141 word = word * 16 + (c - 'a') + 10;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
142 continue;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
143 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
144
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
145 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
146 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
147
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
148 if (nibbles == 0 && zero == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
149 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
150 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
151
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
152 *addr++ = (u_char) (word >> 8);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
153 *addr++ = (u_char) (word & 0xff);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
154
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
155 if (--n) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
156 if (zero) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
157 n *= 2;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
158 s = addr - 1;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
159 d = s + n;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
160 while (s >= zero) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
161 *d-- = *s--;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
162 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
163 ngx_memzero(zero, n);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
164 return NGX_OK;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
165 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
166
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
167 } else {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
168 if (zero == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
169 return NGX_OK;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
170 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
171 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
172
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
173 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
174 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
175
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
176 #endif
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
177
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
178
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
179 size_t
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
180 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
181 {
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
182 u_char *p;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
183 struct sockaddr_in *sin;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
184 #if (NGX_HAVE_INET6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
185 size_t n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
186 struct sockaddr_in6 *sin6;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
187 #endif
538
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
188 #if (NGX_HAVE_UNIX_DOMAIN)
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
189 struct sockaddr_un *saun;
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
190 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
191
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
192 switch (sa->sa_family) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
193
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
194 case AF_INET:
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
195
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
196 sin = (struct sockaddr_in *) sa;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
197 p = (u_char *) &sin->sin_addr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
198
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
199 if (port) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
200 p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud:%d",
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
201 p[0], p[1], p[2], p[3], ntohs(sin->sin_port));
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
202 } else {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
203 p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
204 p[0], p[1], p[2], p[3]);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
205 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
206
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
207 return (p - text);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
208
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
209 #if (NGX_HAVE_INET6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
210
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
211 case AF_INET6:
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
212
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
213 sin6 = (struct sockaddr_in6 *) sa;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
214
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
215 n = 0;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
216
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
217 if (port) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
218 text[n++] = '[';
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
219 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
220
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
221 n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len);
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
222
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
223 if (port) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
224 n = ngx_sprintf(&text[1 + n], "]:%d",
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
225 ntohs(sin6->sin6_port)) - text;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
226 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
227
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
228 return n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
229 #endif
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
230
538
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
231 #if (NGX_HAVE_UNIX_DOMAIN)
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
232
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
233 case AF_UNIX:
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
234 saun = (struct sockaddr_un *) sa;
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
235
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
236 /* we do not include trailing zero in address length */
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
237
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
238 return ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path) - text - 1;
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
239
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
240 #endif
1dcf6adad484 nginx 0.8.21
Igor Sysoev <http://sysoev.ru>
parents: 492
diff changeset
241
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
242 default:
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
243 return 0;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
244 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
245 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
246
362
54fad6c4b555 nginx 0.6.25
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
247
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
248 size_t
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
249 ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
250 {
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
251 u_char *p;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
252
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
253 switch (family) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
254
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
255 case AF_INET:
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
256
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
257 p = addr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
258
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
259 return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
260 p[0], p[1], p[2], p[3])
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
261 - text;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
262
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
263 #if (NGX_HAVE_INET6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
264
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
265 case AF_INET6:
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
266 return ngx_inet6_ntop(addr, text, len);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
267
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
268 #endif
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
269
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
270 default:
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
271 return 0;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
272 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
273 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
274
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
275
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
276 #if (NGX_HAVE_INET6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
277
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
278 size_t
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
279 ngx_inet6_ntop(u_char *p, u_char *text, size_t len)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
280 {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
281 u_char *dst;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
282 size_t max, n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
283 ngx_uint_t i, zero, last;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
284
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
285 if (len < NGX_INET6_ADDRSTRLEN) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
286 return 0;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
287 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
288
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
289 zero = (ngx_uint_t) -1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
290 last = (ngx_uint_t) -1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
291 max = 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
292 n = 0;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
293
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
294 for (i = 0; i < 16; i += 2) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
295
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
296 if (p[i] || p[i + 1]) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
297
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
298 if (max < n) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
299 zero = last;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
300 max = n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
301 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
302
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
303 n = 0;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
304 continue;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
305 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
306
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
307 if (n++ == 0) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
308 last = i;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
309 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
310 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
311
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
312 if (max < n) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
313 zero = last;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
314 max = n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
315 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
316
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
317 dst = text;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
318 n = 16;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
319
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
320 if (zero == 0) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
321
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
322 if ((max == 5 && p[10] == 0xff && p[11] == 0xff)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
323 || (max == 6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
324 || (max == 7 && p[14] != 0 && p[15] != 1))
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
325 {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
326 n = 12;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
327 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
328
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
329 *dst++ = ':';
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
330 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
331
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
332 for (i = 0; i < n; i += 2) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
333
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
334 if (i == zero) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
335 *dst++ = ':';
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
336 i += (max - 1) * 2;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
337 continue;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
338 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
339
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
340 dst = ngx_sprintf(dst, "%uxi", p[i] * 256 + p[i + 1]);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
341
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
342 if (i < 14) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
343 *dst++ = ':';
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
344 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
345 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
346
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
347 if (n == 12) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
348 dst = ngx_sprintf(dst, "%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
349 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
350
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
351 return dst - text;
362
54fad6c4b555 nginx 0.6.25
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
352 }
54fad6c4b555 nginx 0.6.25
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
353
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
354 #endif
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
355
362
54fad6c4b555 nginx 0.6.25
Igor Sysoev <http://sysoev.ru>
parents: 354
diff changeset
356
58
b55cbf18157e nginx 0.1.29
Igor Sysoev <http://sysoev.ru>
parents: 50
diff changeset
357 ngx_int_t
454
a8424ffa495c nginx 0.7.39
Igor Sysoev <http://sysoev.ru>
parents: 450
diff changeset
358 ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr)
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
359 {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
360 u_char *addr, *mask, *last;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
361 size_t len;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
362 ngx_int_t shift;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
363 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
364 ngx_int_t rc;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
365 ngx_uint_t s, i;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
366 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
367
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
368 addr = text->data;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
369 last = addr + text->len;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
370
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
371 mask = ngx_strlchr(addr, last, '/');
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
372 len = (mask ? mask : last) - addr;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
373
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
374 cidr->u.in.addr = ngx_inet_addr(addr, len);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
375
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
376 if (cidr->u.in.addr != INADDR_NONE) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
377 cidr->family = AF_INET;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
378
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
379 if (mask == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
380 cidr->u.in.mask = 0xffffffff;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
381 return NGX_OK;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
382 }
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
383
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
384 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
385 } else if (ngx_inet6_addr(addr, len, cidr->u.in6.addr.s6_addr) == NGX_OK) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
386 cidr->family = AF_INET6;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
387
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
388 if (mask == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
389 ngx_memset(cidr->u.in6.mask.s6_addr, 0xff, 16);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
390 return NGX_OK;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
391 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
392
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
393 #endif
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
394 } else {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
395 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
396 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
397
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
398 mask++;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
399
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
400 shift = ngx_atoi(mask, last - mask);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
401 if (shift == NGX_ERROR) {
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
402 return NGX_ERROR;
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
403 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
404
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
405 switch (cidr->family) {
454
a8424ffa495c nginx 0.7.39
Igor Sysoev <http://sysoev.ru>
parents: 450
diff changeset
406
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
407 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
408 case AF_INET6:
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
409 addr = cidr->u.in6.addr.s6_addr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
410 mask = cidr->u.in6.mask.s6_addr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
411 rc = NGX_OK;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
412
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
413 for (i = 0; i < 16; i++) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
414
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
415 s = (shift > 8) ? 8 : shift;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
416 shift -= s;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
417
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
418 mask[i] = (u_char) (0 - (1 << (8 - s)));
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
419
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
420 if (addr[i] != (addr[i] & mask[i])) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
421 rc = NGX_DONE;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
422 addr[i] &= mask[i];
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
423 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
424 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
425
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
426 return rc;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
427 #endif
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
428
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
429 default: /* AF_INET */
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
430
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
431 if (shift) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
432 cidr->u.in.mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift))));
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
433
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
434 } else {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
435 /* x86 compilers use a shl instruction that shifts by modulo 32 */
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
436 cidr->u.in.mask = 0;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
437 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
438
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
439 if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) {
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
440 return NGX_OK;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
441 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
442
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
443 cidr->u.in.addr &= cidr->u.in.mask;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
444
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
445 return NGX_DONE;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
446 }
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
447 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
448
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
449
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
450 ngx_int_t
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
451 ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
452 {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
453 in_addr_t inaddr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
454 ngx_uint_t family;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
455 struct sockaddr_in *sin;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
456 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
457 struct in6_addr inaddr6;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
458 struct sockaddr_in6 *sin6;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
459
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
460 /*
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
461 * prevent MSVC8 waring:
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
462 * potentially uninitialized local variable 'inaddr6' used
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
463 */
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
464 ngx_memzero(inaddr6.s6_addr, sizeof(struct in6_addr));
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
465 #endif
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
466
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
467 inaddr = ngx_inet_addr(text, len);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
468
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
469 if (inaddr != INADDR_NONE) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
470 family = AF_INET;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
471 len = sizeof(struct sockaddr_in);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
472
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
473 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
474 } else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
475 family = AF_INET6;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
476 len = sizeof(struct sockaddr_in6);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
477
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
478 #endif
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
479 } else {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
480 return NGX_DECLINED;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
481 }
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
482
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
483 addr->sockaddr = ngx_pcalloc(pool, len);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
484 if (addr->sockaddr == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
485 return NGX_ERROR;
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
486 }
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
487
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
488 addr->sockaddr->sa_family = (u_char) family;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
489 addr->socklen = len;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
490
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
491 switch (family) {
326
9fc4ab6673f9 nginx 0.6.7
Igor Sysoev <http://sysoev.ru>
parents: 286
diff changeset
492
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
493 #if (NGX_HAVE_INET6)
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
494 case AF_INET6:
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
495 sin6 = (struct sockaddr_in6 *) addr->sockaddr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
496 ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
497 break;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
498 #endif
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
499
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
500 default: /* AF_INET */
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
501 sin = (struct sockaddr_in *) addr->sockaddr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
502 sin->sin_addr.s_addr = inaddr;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
503 break;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
504 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
505
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
506 return NGX_OK;
0
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
507 }
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
508
f0b350454894 nginx 0.1.0
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
509
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
510 ngx_int_t
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
511 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
512 {
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
513 u_char *p;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
514
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
515 p = u->url.data;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
516
286
5bef04fc3fd5 nginx 0.5.13
Igor Sysoev <http://sysoev.ru>
parents: 266
diff changeset
517 if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) {
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
518 return ngx_parse_unix_domain_url(pool, u);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
519 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
520
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
521 if ((p[0] == ':' || p[0] == '/') && !u->listen) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
522 u->err = "invalid host";
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
523 return NGX_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
524 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
525
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
526 if (p[0] == '[') {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
527 return ngx_parse_inet6_url(pool, u);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
528 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
529
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
530 return ngx_parse_inet_url(pool, u);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
531 }
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
532
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
533
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
534 static ngx_int_t
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
535 ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u)
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
536 {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
537 #if (NGX_HAVE_UNIX_DOMAIN)
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
538 u_char *path, *uri, *last;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
539 size_t len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
540 struct sockaddr_un *saun;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
541
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
542 len = u->url.len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
543 path = u->url.data;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
544
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
545 path += 5;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
546 len -= 5;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
547
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
548 if (u->uri_part) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
549
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
550 last = path + len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
551 uri = ngx_strlchr(path, last, ':');
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
552
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
553 if (uri) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
554 len = uri - path;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
555 uri++;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
556 u->uri.len = last - uri;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
557 u->uri.data = uri;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
558 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
559 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
560
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
561 if (len == 0) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
562 u->err = "no path in the unix domain socket";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
563 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
564 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
565
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
566 u->host.len = len++;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
567 u->host.data = path;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
568
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
569 if (len > sizeof(saun->sun_path)) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
570 u->err = "too long path in the unix domain socket";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
571 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
572 }
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
573
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
574 u->socklen = sizeof(struct sockaddr_un);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
575 saun = (struct sockaddr_un *) &u->sockaddr;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
576 saun->sun_family = AF_UNIX;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
577 (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
578
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
579 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
580 if (u->addrs == NULL) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
581 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
582 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
583
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
584 saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un));
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
585 if (saun == NULL) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
586 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
587 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
588
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
589 u->family = AF_UNIX;
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
590 u->naddrs = 1;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
591
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
592 saun->sun_family = AF_UNIX;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
593 (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
594
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
595 u->addrs[0].sockaddr = (struct sockaddr *) saun;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
596 u->addrs[0].socklen = sizeof(struct sockaddr_un);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
597 u->addrs[0].name.len = len + 4;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
598 u->addrs[0].name.data = u->url.data;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
599
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
600 return NGX_OK;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
601
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
602 #else
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
603
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
604 u->err = "the unix domain sockets are not supported on this platform";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
605
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
606 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
607
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
608 #endif
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
609 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
610
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
611
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
612 static ngx_int_t
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
613 ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u)
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
614 {
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
615 u_char *p, *host, *port, *last, *uri, *args;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
616 size_t len;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
617 ngx_int_t n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
618 struct hostent *h;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
619 struct sockaddr_in *sin;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
620
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
621 u->socklen = sizeof(struct sockaddr_in);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
622 sin = (struct sockaddr_in *) &u->sockaddr;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
623 sin->sin_family = AF_INET;
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
624
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
625 u->family = AF_INET;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
626
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
627 host = u->url.data;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
628
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
629 last = host + u->url.len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
630
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
631 port = ngx_strlchr(host, last, ':');
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
632
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
633 uri = ngx_strlchr(host, last, '/');
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
634
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
635 args = ngx_strlchr(host, last, '?');
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
636
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
637 if (args) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
638 if (uri == NULL) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
639 uri = args;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
640
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
641 } else if (args < uri) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
642 uri = args;
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
643 }
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
644 }
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
645
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
646 if (uri) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
647 if (u->listen || !u->uri_part) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
648 u->err = "invalid host";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
649 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
650 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
651
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
652 u->uri.len = last - uri;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
653 u->uri.data = uri;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
654
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
655 last = uri;
416
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
656
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
657 if (uri < port) {
b4f69f2ef02c nginx 0.7.20
Igor Sysoev <http://sysoev.ru>
parents: 400
diff changeset
658 port = NULL;
418
ff86d646f9df nginx 0.7.21
Igor Sysoev <http://sysoev.ru>
parents: 416
diff changeset
659 }
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
660 }
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
661
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
662 if (port) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
663 port++;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
664
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
665 len = last - port;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
666
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
667 if (len == 0) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
668 u->err = "invalid port";
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
669 return NGX_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
670 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
671
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
672 n = ngx_atoi(port, len);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
673
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
674 if (n < 1 || n > 65536) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
675 u->err = "invalid port";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
676 return NGX_ERROR;
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
677 }
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
678
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
679 u->port = (in_port_t) n;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
680 sin->sin_port = htons((in_port_t) n);
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
681
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
682 u->port_text.len = len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
683 u->port_text.data = port;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
684
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
685 last = port - 1;
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
686
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
687 } else {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
688 if (uri == NULL) {
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
689
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
690 if (u->listen) {
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
691
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
692 /* test value as port only */
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
693
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
694 n = ngx_atoi(host, last - host);
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
695
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
696 if (n != NGX_ERROR) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
697
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
698 if (n < 1 || n > 65536) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
699 u->err = "invalid port";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
700 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
701 }
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
702
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
703 u->port = (in_port_t) n;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
704 sin->sin_port = htons((in_port_t) n);
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
705
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
706 u->port_text.len = last - host;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
707 u->port_text.data = host;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
708
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
709 u->wildcard = 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
710
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
711 return NGX_OK;
252
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
712 }
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
713 }
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
714 }
644510700914 nginx 0.4.11
Igor Sysoev <http://sysoev.ru>
parents: 236
diff changeset
715
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
716 u->no_port = 1;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
717 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
718
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
719 len = last - host;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
720
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
721 if (len == 0) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
722 u->err = "no host";
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
723 return NGX_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
724 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
725
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
726 if (len == 1 && *host == '*') {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
727 len = 0;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
728 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
729
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
730 u->host.len = len;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
731 u->host.data = host;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
732
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
733 if (u->no_resolve) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
734 return NGX_OK;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
735 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
736
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
737 if (len) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
738 sin->sin_addr.s_addr = ngx_inet_addr(host, len);
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
739
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
740 if (sin->sin_addr.s_addr == INADDR_NONE) {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
741 p = ngx_alloc(++len, pool->log);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
742 if (p == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
743 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
744 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
745
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
746 (void) ngx_cpystrn(p, host, len);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
747
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
748 h = gethostbyname((const char *) p);
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
749
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
750 ngx_free(p);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
751
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
752 if (h == NULL || h->h_addr_list[0] == NULL) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
753 u->err = "host not found";
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
754 return NGX_ERROR;
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
755 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
756
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
757 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[0]);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
758 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
759
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
760 if (sin->sin_addr.s_addr == INADDR_ANY) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
761 u->wildcard = 1;
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
762 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
763
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
764 } else {
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
765 sin->sin_addr.s_addr = INADDR_ANY;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
766 u->wildcard = 1;
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
767 }
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
768
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
769 if (u->no_port) {
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
770 u->port = u->default_port;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
771 sin->sin_port = htons(u->default_port);
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
772 }
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
773
400
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
774 if (u->listen) {
6ebbca3d5ed7 nginx 0.7.12
Igor Sysoev <http://sysoev.ru>
parents: 382
diff changeset
775 return NGX_OK;
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
776 }
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
777
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
778 if (ngx_inet_resolve_host(pool, u) != NGX_OK) {
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
779 return NGX_ERROR;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
780 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
781
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
782 return NGX_OK;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
783 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
784
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
785
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
786 static ngx_int_t
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
787 ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
788 {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
789 #if (NGX_HAVE_INET6)
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
790 u_char *p, *host, *port, *last, *uri;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
791 size_t len;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
792 ngx_int_t n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
793 struct sockaddr_in6 *sin6;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
794
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
795 u->socklen = sizeof(struct sockaddr_in6);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
796 sin6 = (struct sockaddr_in6 *) &u->sockaddr;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
797 sin6->sin6_family = AF_INET6;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
798
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
799 host = u->url.data + 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
800
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
801 last = u->url.data + u->url.len;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
802
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
803 p = ngx_strlchr(host, last, ']');
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
804
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
805 if (p == NULL) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
806 u->err = "invalid host";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
807 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
808 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
809
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
810 if (last - p) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
811
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
812 port = p + 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
813
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
814 uri = ngx_strlchr(port, last, '/');
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
815
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
816 if (uri) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
817 if (u->listen || !u->uri_part) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
818 u->err = "invalid host";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
819 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
820 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
821
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
822 u->uri.len = last - uri;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
823 u->uri.data = uri;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
824 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
825
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
826 if (*port == ':') {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
827 port++;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
828
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
829 len = last - port;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
830
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
831 if (len == 0) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
832 u->err = "invalid port";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
833 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
834 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
835
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
836 n = ngx_atoi(port, len);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
837
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
838 if (n < 1 || n > 65536) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
839 u->err = "invalid port";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
840 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
841 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
842
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
843 u->port = (in_port_t) n;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
844 sin6->sin6_port = htons((in_port_t) n);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
845
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
846 u->port_text.len = len;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
847 u->port_text.data = port;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
848
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
849 } else {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
850 u->no_port = 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
851 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
852 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
853
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
854 len = p - host;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
855
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
856 if (len == 0) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
857 u->err = "no host";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
858 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
859 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
860
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
861 u->host.len = len;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
862 u->host.data = host;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
863
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
864 if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
865 u->err = "invalid IPv6 address";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
866 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
867 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
868
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
869 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
870 u->wildcard = 1;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
871 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
872
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
873 u->family = AF_INET6;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
874
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
875 if (u->no_resolve) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
876 return NGX_OK;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
877 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
878
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
879 if (u->no_port) {
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
880 u->port = u->default_port;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
881 sin6->sin6_port = htons(u->default_port);
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
882 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
883
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
884 return NGX_OK;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
885
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
886 #else
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
887
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
888 u->err = "the INET6 sockets are not supported on this platform";
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
889
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
890 return NGX_ERROR;
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
891
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
892 #endif
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
893 }
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
894
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
895
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
896 ngx_int_t
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
897 ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
898 {
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
899 u_char *p, *host;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
900 size_t len;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
901 in_port_t port;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
902 in_addr_t in_addr;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
903 ngx_uint_t i;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
904 struct hostent *h;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
905 struct sockaddr_in *sin;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
906
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
907 /* AF_INET only */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
908
450
20962db0117c nginx 0.7.37
Igor Sysoev <http://sysoev.ru>
parents: 448
diff changeset
909 port = htons(u->port);
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
910
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
911 in_addr = ngx_inet_addr(u->host.data, u->host.len);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
912
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
913 if (in_addr == INADDR_NONE) {
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
914 host = ngx_alloc(u->host.len + 1, pool->log);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
915 if (host == NULL) {
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
916 return NGX_ERROR;
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
917 }
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
918
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
919 (void) ngx_cpystrn(host, u->host.data, u->host.len + 1);
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
920
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
921 h = gethostbyname((char *) host);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
922
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
923 ngx_free(host);
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
924
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
925 if (h == NULL || h->h_addr_list[0] == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
926 u->err = "host not found";
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
927 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
928 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
929
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
930 if (u->one_addr == 0) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
931 for (i = 0; h->h_addr_list[i] != NULL; i++) { /* void */ }
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
932
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
933 } else {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
934 i = 1;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
935 }
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
936
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
937 /* MP: ngx_shared_palloc() */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
938
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
939 u->addrs = ngx_pcalloc(pool, i * sizeof(ngx_addr_t));
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
940 if (u->addrs == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
941 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
942 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
943
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
944 u->naddrs = i;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
945
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
946 for (i = 0; h->h_addr_list[i] != NULL; i++) {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
947
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
948 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
949 if (sin == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
950 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
951 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
952
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
953 sin->sin_family = AF_INET;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
954 sin->sin_port = port;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
955 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
956
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
957 u->addrs[i].sockaddr = (struct sockaddr *) sin;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
958 u->addrs[i].socklen = sizeof(struct sockaddr_in);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
959
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
960 len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
961
382
984bb0b1399b nginx 0.7.3
Igor Sysoev <http://sysoev.ru>
parents: 364
diff changeset
962 p = ngx_pnalloc(pool, len);
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
963 if (p == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
964 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
965 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
966
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
967 len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
968
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
969 u->addrs[i].name.len = len;
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
970 u->addrs[i].name.data = p;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
971 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
972
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
973 } else {
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
974
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
975 /* MP: ngx_shared_palloc() */
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
976
540
c04fa65fe604 nginx 0.8.22
Igor Sysoev <http://sysoev.ru>
parents: 538
diff changeset
977 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
978 if (u->addrs == NULL) {
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
979 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
980 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
981
340
10cc350ed8a1 nginx 0.6.14
Igor Sysoev <http://sysoev.ru>
parents: 326
diff changeset
982 sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in));
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
983 if (sin == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
984 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
985 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
986
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
987 u->naddrs = 1;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
988
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
989 sin->sin_family = AF_INET;
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
990 sin->sin_port = port;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
991 sin->sin_addr.s_addr = in_addr;
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
992
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
993 u->addrs[0].sockaddr = (struct sockaddr *) sin;
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
994 u->addrs[0].socklen = sizeof(struct sockaddr_in);
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
995
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
996 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
997 if (p == NULL) {
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
998 return NGX_ERROR;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
999 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
1000
448
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
1001 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
76a79816b771 nginx 0.7.36
Igor Sysoev <http://sysoev.ru>
parents: 418
diff changeset
1002 &u->host, ntohs(port)) - p;
266
251bcd11a5b8 nginx 0.5.3
Igor Sysoev <http://sysoev.ru>
parents: 262
diff changeset
1003 u->addrs[0].name.data = p;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
1004 }
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
1005
260
0effe91f6083 nginx 0.5.0
Igor Sysoev <http://sysoev.ru>
parents: 252
diff changeset
1006 return NGX_OK;
200
d2ae1c9f1fd3 nginx 0.3.47
Igor Sysoev <http://sysoev.ru>
parents: 180
diff changeset
1007 }