From 9c388c0a7fc86beeb584744b5bd5884884111732 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Tue, 26 Aug 2008 14:19:37 +0000 Subject: [PATCH] *) refactor ngx_ptocidr() *) allow address without bitmask *) thus now ngx_http_geo_module accepts addresses without bitmask --- src/core/ngx_inet.c | 41 +++++++++++++---------- src/event/ngx_event.c | 7 ---- src/http/modules/ngx_http_access_module.c | 8 ----- src/http/modules/ngx_http_realip_module.c | 8 ----- 4 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 1d2987d62..e7b49821a 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -102,43 +102,48 @@ 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 m; - ngx_uint_t i; + u_char *addr, *mask, *last; + ngx_int_t shift; ngx_inet_cidr_t *in_cidr; in_cidr = cidr; + addr = text->data; + last = addr + text->len; - for (i = 0; i < text->len; i++) { - if (text->data[i] == '/') { - break; - } - } + mask = ngx_strlchr(addr, last, '/'); - if (i == text->len) { - return NGX_ERROR; - } + in_cidr->addr = ngx_inet_addr(addr, (mask ? mask : last) - addr); - text->data[i] = '\0'; - in_cidr->addr = inet_addr((char *) text->data); - text->data[i] = '/'; if (in_cidr->addr == INADDR_NONE) { return NGX_ERROR; } - m = ngx_atoi(&text->data[i + 1], text->len - (i + 1)); - if (m == NGX_ERROR) { + if (mask == NULL) { + in_cidr->mask = 0xffffffff; + return NGX_OK; + } + + mask++; + + shift = ngx_atoi(mask, last - mask); + if (shift == NGX_ERROR) { return NGX_ERROR; } - if (m == 0) { + if (shift == 0) { /* the x86 compilers use the shl instruction that shifts by modulo 32 */ in_cidr->mask = 0; - return NGX_OK; + + if (in_cidr->addr == 0) { + return NGX_OK; + } + + return NGX_DONE; } - in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - m)))); + in_cidr->mask = htonl((ngx_uint_t) (0 - (1 << (32 - shift)))); if (in_cidr->addr == (in_cidr->addr & in_cidr->mask)) { return NGX_OK; diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 9379aa30c..39d3f5029 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -1051,13 +1051,6 @@ ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_ERROR; } - dc->addr = inet_addr((char *) value[1].data); - - if (dc->addr != INADDR_NONE) { - dc->mask = 0xffffffff; - return NGX_CONF_OK; - } - rc = ngx_ptocidr(&value[1], &in_cidr); if (rc == NGX_DONE) { diff --git a/src/http/modules/ngx_http_access_module.c b/src/http/modules/ngx_http_access_module.c index 264423beb..12f0b9922 100644 --- a/src/http/modules/ngx_http_access_module.c +++ b/src/http/modules/ngx_http_access_module.c @@ -166,14 +166,6 @@ ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) return NGX_CONF_OK; } - rule->addr = inet_addr((char *) value[1].data); - - if (rule->addr != INADDR_NONE) { - rule->mask = 0xffffffff; - - return NGX_CONF_OK; - } - rc = ngx_ptocidr(&value[1], &in_cidr); if (rc == NGX_ERROR) { diff --git a/src/http/modules/ngx_http_realip_module.c b/src/http/modules/ngx_http_realip_module.c index 9ac720058..5a79e7483 100644 --- a/src/http/modules/ngx_http_realip_module.c +++ b/src/http/modules/ngx_http_realip_module.c @@ -251,14 +251,6 @@ ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) value = cf->args->elts; - from->addr = inet_addr((char *) value[1].data); - - if (from->addr != INADDR_NONE) { - from->mask = 0xffffffff; - - return NGX_CONF_OK; - } - rc = ngx_ptocidr(&value[1], &in_cidr); if (rc == NGX_ERROR) {