diff options
author | Igor Sysoev <igor@sysoev.ru> | 2007-11-23 16:59:24 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2007-11-23 16:59:24 +0000 |
commit | 36b634cdbca03d09b5a9c9353e706677c42b4688 (patch) | |
tree | 2648e7d5721895ec0d6cd93f1bc517597d8d7fdc /src | |
parent | 48bf997e10aacba1f1747248790fcb70503623d3 (diff) | |
download | nginx-36b634cdbca03d09b5a9c9353e706677c42b4688.tar.gz nginx-36b634cdbca03d09b5a9c9353e706677c42b4688.zip |
ngx_inet_addr()
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ngx_inet.c | 45 | ||||
-rw-r--r-- | src/core/ngx_inet.h | 1 |
2 files changed, 46 insertions, 0 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 5595d7cae..d7a3cd1fa 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -8,6 +8,51 @@ #include <ngx_core.h> +/* AF_INET only */ + +in_addr_t +ngx_inet_addr(u_char *text, size_t len) +{ + u_char *p, c; + in_addr_t addr; + ngx_uint_t octet, n; + + addr = 0; + octet = 0; + n = 0; + + for (p = text; p < text + len; p++) { + + c = *p; + + if (c >= '0' && c <= '9') { + octet = octet * 10 + (c - '0'); + continue; + } + + if (c == '.' && octet < 256) { + addr = (addr << 8) + octet; + octet = 0; + n++; + continue; + } + + return INADDR_NONE; + } + + if (n != 3) { + return INADDR_NONE; + } + + if (octet < 256) { + addr = (addr << 8) + octet; + return htonl(addr); + } + + return INADDR_NONE; +} + + /* * ngx_sock_ntop() and ngx_inet_ntop() may be implemented as * "ngx_sprintf(text, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3])", however, diff --git a/src/core/ngx_inet.h b/src/core/ngx_inet.h index a3d624e4d..b2444b98c 100644 --- a/src/core/ngx_inet.h +++ b/src/core/ngx_inet.h @@ -58,6 +58,7 @@ typedef struct { } ngx_url_t; +in_addr_t ngx_inet_addr(u_char *text, size_t len); size_t ngx_sock_ntop(int family, struct sockaddr *sa, u_char *text, size_t len); 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); |