Mercurial > hg > nginx
comparison src/core/ngx_inet.c @ 3265:0c5c5e876391
ngx_inet6_addr()
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Nov 2009 12:50:00 +0000 |
parents | a7491af45540 |
children | 798141791ad3 |
comparison
equal
deleted
inserted
replaced
3264:ebcee0063cd8 | 3265:0c5c5e876391 |
---|---|
55 return htonl(addr); | 55 return htonl(addr); |
56 } | 56 } |
57 | 57 |
58 return INADDR_NONE; | 58 return INADDR_NONE; |
59 } | 59 } |
60 | |
61 | |
62 #if (NGX_HAVE_INET6) | |
63 | |
64 ngx_int_t | |
65 ngx_inet6_addr(u_char *p, size_t len, u_char *addr) | |
66 { | |
67 u_char c, *zero, *digit, *s, *d; | |
68 size_t len4; | |
69 ngx_uint_t n, nibbles, word; | |
70 | |
71 if (len == 0) { | |
72 return NGX_ERROR; | |
73 } | |
74 | |
75 zero = NULL; | |
76 digit = NULL; | |
77 len4 = 0; | |
78 nibbles = 0; | |
79 word = 0; | |
80 n = 8; | |
81 | |
82 if (p[0] == ':') { | |
83 p++; | |
84 len--; | |
85 } | |
86 | |
87 for (/* void */; len; len--) { | |
88 c = *p++; | |
89 | |
90 if (c == ':') { | |
91 if (nibbles) { | |
92 digit = p; | |
93 len4 = len; | |
94 *addr++ = (u_char) (word >> 8); | |
95 *addr++ = (u_char) (word & 0xff); | |
96 | |
97 if (--n) { | |
98 nibbles = 0; | |
99 word = 0; | |
100 continue; | |
101 } | |
102 | |
103 } else { | |
104 if (zero == NULL) { | |
105 digit = p; | |
106 len4 = len; | |
107 zero = addr; | |
108 continue; | |
109 } | |
110 } | |
111 | |
112 return NGX_ERROR; | |
113 } | |
114 | |
115 if (c == '.' && nibbles) { | |
116 if (n < 2) { | |
117 return NGX_ERROR; | |
118 } | |
119 | |
120 word = ngx_inet_addr(digit, len4 - 1); | |
121 if (word == INADDR_NONE) { | |
122 return NGX_ERROR; | |
123 } | |
124 | |
125 word = ntohl(word); | |
126 *addr++ = (u_char) ((word >> 24) & 0xff); | |
127 *addr++ = (u_char) ((word >> 16) & 0xff); | |
128 n--; | |
129 break; | |
130 } | |
131 | |
132 if (++nibbles > 4) { | |
133 return NGX_ERROR; | |
134 } | |
135 | |
136 if (c >= '0' && c <= '9') { | |
137 word = word * 16 + (c - '0'); | |
138 continue; | |
139 } | |
140 | |
141 c |= 0x20; | |
142 | |
143 if (c >= 'a' && c <= 'f') { | |
144 word = word * 16 + (c - 'a') + 10; | |
145 continue; | |
146 } | |
147 | |
148 return NGX_ERROR; | |
149 } | |
150 | |
151 if (nibbles == 0 && zero == NULL) { | |
152 return NGX_ERROR; | |
153 } | |
154 | |
155 *addr++ = (u_char) (word >> 8); | |
156 *addr++ = (u_char) (word & 0xff); | |
157 | |
158 if (--n) { | |
159 if (zero) { | |
160 n *= 2; | |
161 s = addr - 1; | |
162 d = s + n; | |
163 while (s >= zero) { | |
164 *d-- = *s--; | |
165 } | |
166 ngx_memzero(zero, n); | |
167 return NGX_OK; | |
168 } | |
169 | |
170 } else { | |
171 if (zero == NULL) { | |
172 return NGX_OK; | |
173 } | |
174 } | |
175 | |
176 return NGX_ERROR; | |
177 } | |
178 | |
179 #endif | |
60 | 180 |
61 | 181 |
62 size_t | 182 size_t |
63 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port) | 183 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port) |
64 { | 184 { |