]> git.kaiwu.me - nginx.git/commitdiff
*) remove zero termination in ngx_inet_ntop() and ngx_sock_ntop()
authorIgor Sysoev <igor@sysoev.ru>
Thu, 21 Aug 2008 18:47:23 +0000 (18:47 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 21 Aug 2008 18:47:23 +0000 (18:47 +0000)
*) use ngx_snprintf() in ngx_inet_ntop() and ngx_sock_ntop()
   as they are called just once per connection
*) NGX_INET_ADDRSTRLEN

src/core/ngx_config.h
src/core/ngx_connection.c
src/core/ngx_inet.c
src/core/ngx_inet.h
src/http/modules/ngx_http_status_module.c
src/http/ngx_http_core_module.c
src/http/ngx_http_core_module.h
src/http/ngx_http_header_filter_module.c
src/http/ngx_http_upstream_round_robin.c
src/http/ngx_http_variables.c
src/mail/ngx_mail.c

index d2d4e043a5f43aa33bf443141ada983e529e62f8..5861bfd096182ef3c9f7630dc5ed0c415bcbdcfd 100644 (file)
@@ -116,10 +116,6 @@ typedef intptr_t        ngx_flag_t;
 #define INADDR_NONE  ((unsigned int) -1)
 #endif
 
-#ifndef INET_ADDRSTRLEN  /* Win32 */
-#define INET_ADDRSTRLEN  16
-#endif
-
 #ifdef MAXHOSTNAMELEN
 #define NGX_MAXHOSTNAMELEN  MAXHOSTNAMELEN
 #else
index 03662b398a2c5fc13988f534c60477f3cd426a39..827477501437c2d250486394db5231a48cb6acbb 100644 (file)
@@ -37,12 +37,13 @@ ngx_listening_inet_stream_socket(ngx_conf_t *cf, in_addr_t addr, in_port_t port)
 
 
     ls->addr_text.data = ngx_pnalloc(cf->pool,
-                                    INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
+                                    NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1);
     if (ls->addr_text.data == NULL) {
         return NULL;
     }
 
-    len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data, INET_ADDRSTRLEN);
+    len = ngx_inet_ntop(AF_INET, &addr, ls->addr_text.data,
+                        NGX_INET_ADDRSTRLEN);
 
     ls->addr_text.len = ngx_sprintf(ls->addr_text.data + len, ":%d", port)
                         - ls->addr_text.data;
@@ -53,7 +54,7 @@ ngx_listening_inet_stream_socket(ngx_conf_t *cf, in_addr_t addr, in_port_t port)
     ls->sockaddr = (struct sockaddr *) sin;
     ls->socklen = sizeof(struct sockaddr_in);
     ls->addr = offsetof(struct sockaddr_in, sin_addr);
-    ls->addr_text_max_len = INET_ADDRSTRLEN;
+    ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
 
     return ls;
 }
@@ -104,17 +105,17 @@ ngx_set_inherited_sockets(ngx_cycle_t *cycle)
             continue;
         }
 
-        ls[i].addr_text_max_len = INET_ADDRSTRLEN;
+        ls[i].addr_text_max_len = NGX_INET_ADDRSTRLEN;
 
         ls[i].addr_text.data = ngx_pnalloc(cycle->pool,
-                                   INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
+                                   NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1);
         if (ls[i].addr_text.data == NULL) {
             return NGX_ERROR;
         }
 
         ls[i].family = sin->sin_family;
         len = ngx_sock_ntop(ls[i].family, ls[i].sockaddr,
-                            ls[i].addr_text.data, INET_ADDRSTRLEN);
+                            ls[i].addr_text.data, NGX_INET_ADDRSTRLEN);
         if (len == 0) {
             return NGX_ERROR;
         }
index aefdfcdad963e1ea0311ac212de43323fbd4e8cf..dc0a550c6b3cf9051225221d89989bfc0c735304 100644 (file)
@@ -8,9 +8,6 @@
 #include <ngx_core.h>
 
 
-static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len);
-
-
 /* AF_INET only */
 
 in_addr_t
@@ -56,166 +53,43 @@ ngx_inet_addr(u_char *text, size_t len)
 }
 
 
-/*
- * 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,
- * they had been implemented long before the ngx_sprintf() had appeared
- * and they are faster by 1.5-2.5 times, so it is worth to keep them.
- *
- * By the way, the implementation using ngx_sprintf() is faster by 2.5-3 times
- * than using FreeBSD libc's snprintf().
- */
-
 /* AF_INET only */
 
 size_t
 ngx_sock_ntop(int family, struct sockaddr *sa, u_char *text, size_t len)
 {
     u_char              *p;
-    size_t               n;
-    ngx_uint_t           i;
     struct sockaddr_in  *sin;
 
-    if (len == 0) {
-        return 0;
-    }
+    if (family == AF_INET) {
 
-    if (family != AF_INET) {
-        return 0;
-    }
+        sin = (struct sockaddr_in *) sa;
+        p = (u_char *) &sin->sin_addr;
 
-    sin = (struct sockaddr_in *) sa;
-    p = (u_char *) &sin->sin_addr;
-
-    if (len > INET_ADDRSTRLEN) {
-        len = INET_ADDRSTRLEN;
+        return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",
+                            p[0], p[1], p[2], p[3])
+               - text;
     }
 
-    n = ngx_sprint_uchar(text, p[0], len);
-
-    i = 1;
-
-    do {
-        if (len == n) {
-            text[n - 1] = '\0';
-            return n;
-        }
-
-        text[n++] = '.';
-
-        if (len == n) {
-            text[n - 1] = '\0';
-            return n;
-        }
-
-        n += ngx_sprint_uchar(&text[n], p[i++], len - n);
-
-    } while (i < 4);
-
-    if (len == n) {
-        text[n] = '\0';
-        return n;
-    }
-
-    text[n] = '\0';
-
-    return n;
+    return 0;
 }
 
 
 size_t
 ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)
 {
-    u_char      *p;
-    size_t       n;
-    ngx_uint_t   i;
-
-    if (len == 0) {
-        return 0;
-    }
+    u_char  *p;
 
-    if (family != AF_INET) {
-        return 0;
-    }
+    if (family == AF_INET) {
 
-    p = (u_char *) addr;
+        p = (u_char *) addr;
 
-    if (len > INET_ADDRSTRLEN) {
-        len = INET_ADDRSTRLEN;
+        return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud",
+                            p[0], p[1], p[2], p[3])
+               - text;
     }
 
-    n = ngx_sprint_uchar(text, p[0], len);
-
-    i = 1;
-
-    do {
-        if (len == n) {
-            text[n - 1] = '\0';
-            return n;
-        }
-
-        text[n++] = '.';
-
-        if (len == n) {
-            text[n - 1] = '\0';
-            return n;
-        }
-
-        n += ngx_sprint_uchar(&text[n], p[i++], len - n);
-
-    } while (i < 4);
-
-    if (len == n) {
-        text[n] = '\0';
-        return n;
-    }
-
-    text[n] = '\0';
-
-    return n;
-}
-
-
-static size_t
-ngx_sprint_uchar(u_char *text, u_char c, size_t len)
-{
-    size_t      n;
-    ngx_uint_t  c1, c2;
-
-    n = 0;
-
-    if (len == n) {
-        return n;
-    }
-
-    c1 = c / 100;
-
-    if (c1) {
-        *text++ = (u_char) (c1 + '0');
-        n++;
-
-        if (len == n) {
-            return n;
-        }
-    }
-
-    c2 = (c % 100) / 10;
-
-    if (c1 || c2) {
-        *text++ = (u_char) (c2 + '0');
-        n++;
-
-        if (len == n) {
-            return n;
-        }
-    }
-
-    c2 = c % 10;
-
-    *text = (u_char) (c2 + '0');
-    n++;
-
-    return n;
+    return 0;
 }
 
 
@@ -576,7 +450,7 @@ ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u)
             u->addrs[i].sockaddr = (struct sockaddr *) sin;
             u->addrs[i].socklen = sizeof(struct sockaddr_in);
 
-            len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1;
+            len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
 
             p = ngx_pnalloc(pool, len);
             if (p == NULL) {
index 509f80ab6b5d272a302b20dc536966e4fa03df98..95ba30ba7e0cf866081db5838973813d29d00fca 100644 (file)
@@ -12,6 +12,9 @@
 #include <ngx_core.h>
 
 
+#define NGX_INET_ADDRSTRLEN  (sizeof("255.255.255.255") - 1)
+
+
 typedef struct {
     in_addr_t         addr;
     in_addr_t         mask;
index a2e2dbc07f36c14a3ae5fe2a94f9ed2089bba72d..000d9a8e4b277a3bc2461b66006499d4f761a632 100644 (file)
@@ -155,7 +155,7 @@ static ngx_int_t ngx_http_status(ngx_http_status_ctx_t *ctx)
             len = NGX_INT64_LEN                       /* pid */
                   + 1 + NGX_INT32_LEN                 /* connection */
                   + 1 + 1                             /* state */
-                  + 1 + INET_ADDRSTRLEN
+                  + 1 + NGX_INET_ADDRSTRLEN
                   + 1 + (r->server_name ? cmcf->max_server_name_len : 1)
                   + 2;                                /* "\r\n" */
 
@@ -204,7 +204,7 @@ static ngx_int_t ngx_http_status(ngx_http_status_ctx_t *ctx)
             *(b->last++) = ' ';
             b->last = ngx_cpymem(b->last, c[i].addr_text.data,
                                  c[i].addr_text.len);
-            for (n = c[i].addr_text.len; n < INET_ADDRSTRLEN; n++) {
+            for (n = c[i].addr_text.len; n < NGX_INET_ADDRSTRLEN; n++) {
                  *(b->last++) = ' ';
             }
 
index 8a5e9d261a603d10d71d4b01e1bd46819c1dd17c..30b2c0c507283199920b68ebf16816fa6da7f725 100644 (file)
@@ -1626,7 +1626,7 @@ ngx_http_server_addr(ngx_http_request_t *r, ngx_str_t *s)
     }
 
     s->len = ngx_inet_ntop(c->listening->family, &r->in_addr,
-                           s->data, INET_ADDRSTRLEN);
+                           s->data, NGX_INET_ADDRSTRLEN);
 
     return NGX_OK;
 }
@@ -2971,7 +2971,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ls->conf.rcvbuf = -1;
     ls->conf.sndbuf = -1;
 
-    n = ngx_inet_ntop(AF_INET, &ls->addr, ls->conf.addr, INET_ADDRSTRLEN + 6);
+    n = ngx_inet_ntop(AF_INET, &ls->addr, ls->conf.addr, NGX_INET_ADDRSTRLEN);
     ngx_sprintf(&ls->conf.addr[n], ":%ui", ls->port);
 
     if (cf->args->nelts == 2) {
index 3ecc7c33aeb6781e131a0c38ffe83d8e558b57f5..a42b0dac89c19b971059268fdce44192b9f71304 100644 (file)
@@ -47,7 +47,7 @@ typedef struct {
     ngx_uint_t                 deferred_accept;
 #endif
 
-    u_char                     addr[INET_ADDRSTRLEN + 6];
+    u_char                     addr[NGX_INET_ADDRSTRLEN + sizeof(":65535")];
 
 } ngx_http_listen_conf_t;
 
index 7714873e028bdd5b0289422fa331718978bb81dc..de953339115a917e5fa32294960ba3059882f2f9 100644 (file)
@@ -162,7 +162,7 @@ ngx_http_header_filter(ngx_http_request_t *r)
     ngx_http_core_loc_conf_t  *clcf;
     ngx_http_core_srv_conf_t  *cscf;
     /* AF_INET only */
-    u_char                     addr[INET_ADDRSTRLEN];
+    u_char                     addr[NGX_INET_ADDRSTRLEN];
 
     r->header_sent = 1;
 
index e36e68529fd7021fc827efb1130d03a6da56b8c2..d9450c95c2ff63c27c1a7557879c167a9fd869d2 100644 (file)
@@ -281,14 +281,14 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
 
     for (i = 0; i < ur->naddrs; i++) {
 
-        len = INET_ADDRSTRLEN - 1 + 1 + sizeof(":65536") - 1;
+        len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
 
         p = ngx_pnalloc(r->pool, len);
         if (p == NULL) {
             return NGX_ERROR;
         }
 
-        len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, INET_ADDRSTRLEN);
+        len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
         len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
 
         sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
index cd706a2a945e2e9f2319c97d90dd2debf1a77276..15d1c6d0ce9fe52af0a3df98e10566dfcff71461 100644 (file)
@@ -872,7 +872,7 @@ ngx_http_variable_server_addr(ngx_http_request_t *r,
 {
     ngx_str_t  s;
 
-    s.data = ngx_pnalloc(r->pool, INET_ADDRSTRLEN);
+    s.data = ngx_pnalloc(r->pool, NGX_INET_ADDRSTRLEN);
     if (s.data == NULL) {
         return NGX_ERROR;
     }
index edfa245ee42fe3ebdbc9c52ff9380eb00f2b8d2c..73668a53822bd8c9e78f825922b1a642f764ed00 100644 (file)
@@ -358,13 +358,13 @@ ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
                 imip->addrs[i].ctx = in_addr[i].ctx;
 
                 text = ngx_pnalloc(cf->pool,
-                                   INET_ADDRSTRLEN - 1 + sizeof(":65535") - 1);
+                                   NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1);
                 if (text == NULL) {
                     return NGX_CONF_ERROR;
                 }
 
                 len = ngx_inet_ntop(AF_INET, &in_addr[i].addr, text,
-                                    INET_ADDRSTRLEN);
+                                    NGX_INET_ADDRSTRLEN);
 
                 len = ngx_sprintf(text + len, ":%d", in_port[p].port) - text;