comparison src/core/ngx_inet.c @ 3270:7d1a04259e3f

ngx_parse_addr()
author Igor Sysoev <igor@sysoev.ru>
date Mon, 02 Nov 2009 15:20:42 +0000
parents f0d596e84634
children 98f49b2bcae8
comparison
equal deleted inserted replaced
3269:f0d596e84634 3270:7d1a04259e3f
414 414
415 return NGX_DONE; 415 return NGX_DONE;
416 } 416 }
417 417
418 418
419 ngx_addr_t *
420 ngx_parse_addr(ngx_pool_t *pool, ngx_str_t *addr)
421 {
422 size_t len;
423 in_addr_t inaddr;
424 ngx_uint_t family;
425 ngx_addr_t *a;
426 struct sockaddr_in *sin;
427 #if (NGX_HAVE_INET6)
428 struct in6_addr inaddr6;
429 struct sockaddr_in6 *sin6;
430 #endif
431
432 inaddr = ngx_inet_addr(addr->data, addr->len);
433
434 if (inaddr != INADDR_NONE) {
435 family = AF_INET;
436 len = sizeof(struct sockaddr_in);
437
438 #if (NGX_HAVE_INET6)
439 } else if (ngx_inet6_addr(addr->data, addr->len, inaddr6.s6_addr) == NGX_OK)
440 {
441 family = AF_INET6;
442 len = sizeof(struct sockaddr_in6);
443
444 #endif
445 } else {
446 return NULL;
447 }
448
449 a = ngx_palloc(pool, sizeof(ngx_addr_t));
450 if (a == NULL) {
451 return NULL;
452 }
453
454 a->sockaddr = ngx_pcalloc(pool, len);
455 if (a->sockaddr == NULL) {
456 return NULL;
457 }
458
459 a->sockaddr->sa_family = family;
460 a->socklen = len;
461 a->name = *addr;
462
463 switch (family) {
464
465 #if (NGX_HAVE_INET6)
466 case AF_INET6:
467 sin6 = (struct sockaddr_in6 *) a->sockaddr;
468 ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
469 break;
470 #endif
471
472 default: /* AF_INET */
473 sin = (struct sockaddr_in *) a->sockaddr;
474 sin->sin_addr.s_addr = inaddr;
475 break;
476 }
477
478 return a;
479 }
480
481
419 ngx_int_t 482 ngx_int_t
420 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) 483 ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u)
421 { 484 {
422 u_char *p; 485 u_char *p;
423 486