Mercurial > hg > nginx
comparison src/core/ngx_inet.c @ 2537:a472d954c534
prepare ngx_ptocidr() for IPv6
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 24 Feb 2009 14:01:40 +0000 |
parents | 095f28fc0c4a |
children | 219aa0b0fd58 |
comparison
equal
deleted
inserted
replaced
2536:a6d6d762c554 | 2537:a472d954c534 |
---|---|
224 | 224 |
225 | 225 |
226 /* AF_INET only */ | 226 /* AF_INET only */ |
227 | 227 |
228 ngx_int_t | 228 ngx_int_t |
229 ngx_ptocidr(ngx_str_t *text, void *cidr) | 229 ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr) |
230 { | 230 { |
231 u_char *addr, *mask, *last; | 231 u_char *addr, *mask, *last; |
232 ngx_int_t shift; | 232 ngx_int_t shift; |
233 ngx_inet_cidr_t *in_cidr; | 233 |
234 | |
235 in_cidr = cidr; | |
236 addr = text->data; | 234 addr = text->data; |
237 last = addr + text->len; | 235 last = addr + text->len; |
238 | 236 |
239 mask = ngx_strlchr(addr, last, '/'); | 237 mask = ngx_strlchr(addr, last, '/'); |
240 | 238 |
241 in_cidr->addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); | 239 cidr->u.in.addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); |
242 | 240 |
243 if (in_cidr->addr == INADDR_NONE) { | 241 if (cidr->u.in.addr == INADDR_NONE) { |
244 return NGX_ERROR; | 242 return NGX_ERROR; |
245 } | 243 } |
246 | 244 |
247 if (mask == NULL) { | 245 if (mask == NULL) { |
248 in_cidr->mask = 0xffffffff; | 246 cidr->family = AF_INET; |
247 cidr->u.in.mask = 0xffffffff; | |
249 return NGX_OK; | 248 return NGX_OK; |
250 } | 249 } |
251 | 250 |
252 mask++; | 251 mask++; |
253 | 252 |
254 shift = ngx_atoi(mask, last - mask); | 253 shift = ngx_atoi(mask, last - mask); |
255 if (shift == NGX_ERROR) { | 254 if (shift == NGX_ERROR) { |
256 return NGX_ERROR; | 255 return NGX_ERROR; |
257 } | 256 } |
258 | 257 |
258 cidr->family = AF_INET; | |
259 | |
259 if (shift == 0) { | 260 if (shift == 0) { |
260 | 261 |
261 /* the x86 compilers use the shl instruction that shifts by modulo 32 */ | 262 /* the x86 compilers use the shl instruction that shifts by modulo 32 */ |
262 | 263 |
263 in_cidr->mask = 0; | 264 cidr->u.in.mask = 0; |
264 | 265 |
265 if (in_cidr->addr == 0) { | 266 if (cidr->u.in.addr == 0) { |
266 return NGX_OK; | 267 return NGX_OK; |
267 } | 268 } |
268 | 269 |
269 return NGX_DONE; | 270 return NGX_DONE; |
270 } | 271 } |
271 | 272 |
272 in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); | 273 cidr->u.in.mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); |
273 | 274 |
274 if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { | 275 if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) { |
275 return NGX_OK; | 276 return NGX_OK; |
276 } | 277 } |
277 | 278 |
278 in_cidr->addr &= in_cidr->mask; | 279 cidr->u.in.addr &= cidr->u.in.mask; |
279 | 280 |
280 return NGX_DONE; | 281 return NGX_DONE; |
281 } | 282 } |
282 | 283 |
283 | 284 |