diff options
author | Igor Sysoev <igor@sysoev.ru> | 2009-02-21 07:02:02 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2009-02-21 07:02:02 +0000 |
commit | a35eaccdec4788e8fb9a883b26fc7c4dcfe1d8f8 (patch) | |
tree | b42648c4cb4eb2cb4a1e585ed7870ede0f551600 /src/http/ngx_http_variables.c | |
parent | a883361c47c4fa1abf35fe2497e2bb74d9299e3e (diff) | |
download | nginx-a35eaccdec4788e8fb9a883b26fc7c4dcfe1d8f8.tar.gz nginx-a35eaccdec4788e8fb9a883b26fc7c4dcfe1d8f8.zip |
a prelimiary IPv6 support, HTTP listen
Diffstat (limited to 'src/http/ngx_http_variables.c')
-rw-r--r-- | src/http/ngx_http_variables.c | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/src/http/ngx_http_variables.c b/src/http/ngx_http_variables.c index 98fef371b..81c8528fe 100644 --- a/src/http/ngx_http_variables.c +++ b/src/http/ngx_http_variables.c @@ -828,17 +828,37 @@ static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { - struct sockaddr_in *sin; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif - /* AF_INET only */ + switch (r->connection->sockaddr->sa_family) { - sin = (struct sockaddr_in *) r->connection->sockaddr; +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; - v->len = sizeof(in_addr_t); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) &sin->sin_addr.s_addr; + v->len = sizeof(struct in6_addr); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) &sin6->sin6_addr; + + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) r->connection->sockaddr; + + v->len = sizeof(in_addr_t); + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = (u_char *) &sin->sin_addr; + + break; + } return NGX_OK; } @@ -862,8 +882,11 @@ static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { - ngx_uint_t port; - struct sockaddr_in *sin; + ngx_uint_t port; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif v->len = 0; v->valid = 1; @@ -875,16 +898,23 @@ ngx_http_variable_remote_port(ngx_http_request_t *r, return NGX_ERROR; } - /* AF_INET only */ + switch (r->connection->sockaddr->sa_family) { - if (r->connection->sockaddr->sa_family == AF_INET) { - sin = (struct sockaddr_in *) r->connection->sockaddr; +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; + port = ntohs(sin6->sin6_port); + break; +#endif + default: /* AF_INET */ + sin = (struct sockaddr_in *) r->connection->sockaddr; port = ntohs(sin->sin_port); + break; + } - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } + if (port > 0 && port < 65536) { + v->len = ngx_sprintf(v->data, "%ui", port) - v->data; } return NGX_OK; @@ -896,16 +926,22 @@ ngx_http_variable_server_addr(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { ngx_str_t s; + u_char addr[NGX_SOCKADDR_STRLEN]; - s.data = ngx_pnalloc(r->pool, NGX_INET_ADDRSTRLEN); - if (s.data == NULL) { + s.len = NGX_SOCKADDR_STRLEN; + s.data = addr; + + if (ngx_http_server_addr(r, &s) != NGX_OK) { return NGX_ERROR; } - if (ngx_http_server_addr(r, &s) != NGX_OK) { + s.data = ngx_pnalloc(r->pool, s.len); + if (s.data == NULL) { return NGX_ERROR; } + ngx_memcpy(s.data, addr, s.len); + v->len = s.len; v->valid = 1; v->no_cacheable = 0; |