*) refactor ngx_ptocidr()
*) allow address without bitmask
*) thus now ngx_http_geo_module accepts addresses without bitmask
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c
index 1d2987d..e7b4982 100644
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -102,43 +102,48 @@
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 9379aa3..39d3f50 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -1051,13 +1051,6 @@
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 264423b..12f0b99 100644
--- a/src/http/modules/ngx_http_access_module.c
+++ b/src/http/modules/ngx_http_access_module.c
@@ -166,14 +166,6 @@
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 9ac7200..5a79e74 100644
--- a/src/http/modules/ngx_http_realip_module.c
+++ b/src/http/modules/ngx_http_realip_module.c
@@ -251,14 +251,6 @@
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) {