diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ngx_inet.c | 27 | ||||
| -rw-r--r-- | src/core/ngx_inet.h | 75 |
2 files changed, 62 insertions, 40 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 497d84a3c..a5b137d94 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -226,26 +226,25 @@ ngx_inet6_ntop(u_char *p, u_char *text, size_t len) /* AF_INET only */ ngx_int_t -ngx_ptocidr(ngx_str_t *text, void *cidr) +ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr) { - u_char *addr, *mask, *last; - ngx_int_t shift; - ngx_inet_cidr_t *in_cidr; + u_char *addr, *mask, *last; + ngx_int_t shift; - in_cidr = cidr; addr = text->data; last = addr + text->len; mask = ngx_strlchr(addr, last, '/'); - in_cidr->addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); + cidr->u.in.addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); - if (in_cidr->addr == INADDR_NONE) { + if (cidr->u.in.addr == INADDR_NONE) { return NGX_ERROR; } if (mask == NULL) { - in_cidr->mask = 0xffffffff; + cidr->family = AF_INET; + cidr->u.in.mask = 0xffffffff; return NGX_OK; } @@ -256,26 +255,28 @@ ngx_ptocidr(ngx_str_t *text, void *cidr) return NGX_ERROR; } + cidr->family = AF_INET; + if (shift == 0) { /* the x86 compilers use the shl instruction that shifts by modulo 32 */ - in_cidr->mask = 0; + cidr->u.in.mask = 0; - if (in_cidr->addr == 0) { + if (cidr->u.in.addr == 0) { return NGX_OK; } return NGX_DONE; } - in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); + cidr->u.in.mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); - if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { + if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) { return NGX_OK; } - in_cidr->addr &= in_cidr->mask; + cidr->u.in.addr &= cidr->u.in.mask; return NGX_DONE; } diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h index 20d9844dc..482b0e475 100644 --- a/src/core/ngx_inet.h +++ b/src/core/ngx_inet.h @@ -35,50 +35,71 @@ typedef struct { - in_addr_t addr; - in_addr_t mask; -} ngx_inet_cidr_t; + struct in6_addr addr; + struct in6_addr mask; +} ngx_in6_cidr_t; + + +#if (NGX_HAVE_INET6) + +typedef struct { + in_addr_t addr; + in_addr_t mask; +} ngx_in_cidr_t; + +#endif + + +typedef struct { + ngx_uint_t family; + union { + ngx_in_cidr_t in; +#if (NGX_HAVE_INET6) + ngx_in6_cidr_t in6; +#endif + } u; +} ngx_cidr_t; typedef union { - in_addr_t in_addr; + in_addr_t in_addr; } ngx_url_addr_t; typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; + struct sockaddr *sockaddr; + socklen_t socklen; + ngx_str_t name; } ngx_peer_addr_t; typedef struct { - ngx_str_t url; - ngx_str_t host; - ngx_str_t port_text; - ngx_str_t uri; + ngx_str_t url; + ngx_str_t host; + ngx_str_t port_text; + ngx_str_t uri; - in_port_t port; - in_port_t default_port; - int family; + in_port_t port; + in_port_t default_port; + int family; - unsigned listen:1; - unsigned uri_part:1; - unsigned no_resolve:1; - unsigned one_addr:1; + unsigned listen:1; + unsigned uri_part:1; + unsigned no_resolve:1; + unsigned one_addr:1; - unsigned no_port:1; - unsigned wildcard:1; + unsigned no_port:1; + unsigned wildcard:1; - ngx_url_addr_t addr; + ngx_url_addr_t addr; - socklen_t socklen; - u_char sockaddr[NGX_SOCKADDRLEN]; + socklen_t socklen; + u_char sockaddr[NGX_SOCKADDRLEN]; - ngx_peer_addr_t *addrs; - ngx_uint_t naddrs; + ngx_peer_addr_t *addrs; + ngx_uint_t naddrs; - char *err; + char *err; } ngx_url_t; @@ -86,7 +107,7 @@ in_addr_t ngx_inet_addr(u_char *text, size_t len); size_t ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port); size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len); -ngx_int_t ngx_ptocidr(ngx_str_t *text, void *cidr); +ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr); ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u); ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u); |
