Mercurial > hg > nginx
comparison src/http/ngx_http_variables.c @ 2512:2e91aecb9e57
a prelimiary IPv6 support, HTTP listen
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sat, 21 Feb 2009 07:02:02 +0000 |
parents | 51b1097dbb67 |
children | c843171d5dc2 |
comparison
equal
deleted
inserted
replaced
2511:f91c5c964e61 | 2512:2e91aecb9e57 |
---|---|
826 | 826 |
827 static ngx_int_t | 827 static ngx_int_t |
828 ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, | 828 ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, |
829 ngx_http_variable_value_t *v, uintptr_t data) | 829 ngx_http_variable_value_t *v, uintptr_t data) |
830 { | 830 { |
831 struct sockaddr_in *sin; | 831 struct sockaddr_in *sin; |
832 | 832 #if (NGX_HAVE_INET6) |
833 /* AF_INET only */ | 833 struct sockaddr_in6 *sin6; |
834 | 834 #endif |
835 sin = (struct sockaddr_in *) r->connection->sockaddr; | 835 |
836 | 836 switch (r->connection->sockaddr->sa_family) { |
837 v->len = sizeof(in_addr_t); | 837 |
838 v->valid = 1; | 838 #if (NGX_HAVE_INET6) |
839 v->no_cacheable = 0; | 839 case AF_INET6: |
840 v->not_found = 0; | 840 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; |
841 v->data = (u_char *) &sin->sin_addr.s_addr; | 841 |
842 v->len = sizeof(struct in6_addr); | |
843 v->valid = 1; | |
844 v->no_cacheable = 0; | |
845 v->not_found = 0; | |
846 v->data = (u_char *) &sin6->sin6_addr; | |
847 | |
848 break; | |
849 #endif | |
850 | |
851 default: /* AF_INET */ | |
852 sin = (struct sockaddr_in *) r->connection->sockaddr; | |
853 | |
854 v->len = sizeof(in_addr_t); | |
855 v->valid = 1; | |
856 v->no_cacheable = 0; | |
857 v->not_found = 0; | |
858 v->data = (u_char *) &sin->sin_addr; | |
859 | |
860 break; | |
861 } | |
842 | 862 |
843 return NGX_OK; | 863 return NGX_OK; |
844 } | 864 } |
845 | 865 |
846 | 866 |
860 | 880 |
861 static ngx_int_t | 881 static ngx_int_t |
862 ngx_http_variable_remote_port(ngx_http_request_t *r, | 882 ngx_http_variable_remote_port(ngx_http_request_t *r, |
863 ngx_http_variable_value_t *v, uintptr_t data) | 883 ngx_http_variable_value_t *v, uintptr_t data) |
864 { | 884 { |
865 ngx_uint_t port; | 885 ngx_uint_t port; |
866 struct sockaddr_in *sin; | 886 struct sockaddr_in *sin; |
887 #if (NGX_HAVE_INET6) | |
888 struct sockaddr_in6 *sin6; | |
889 #endif | |
867 | 890 |
868 v->len = 0; | 891 v->len = 0; |
869 v->valid = 1; | 892 v->valid = 1; |
870 v->no_cacheable = 0; | 893 v->no_cacheable = 0; |
871 v->not_found = 0; | 894 v->not_found = 0; |
873 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); | 896 v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); |
874 if (v->data == NULL) { | 897 if (v->data == NULL) { |
875 return NGX_ERROR; | 898 return NGX_ERROR; |
876 } | 899 } |
877 | 900 |
878 /* AF_INET only */ | 901 switch (r->connection->sockaddr->sa_family) { |
879 | 902 |
880 if (r->connection->sockaddr->sa_family == AF_INET) { | 903 #if (NGX_HAVE_INET6) |
904 case AF_INET6: | |
905 sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; | |
906 port = ntohs(sin6->sin6_port); | |
907 break; | |
908 #endif | |
909 | |
910 default: /* AF_INET */ | |
881 sin = (struct sockaddr_in *) r->connection->sockaddr; | 911 sin = (struct sockaddr_in *) r->connection->sockaddr; |
882 | |
883 port = ntohs(sin->sin_port); | 912 port = ntohs(sin->sin_port); |
884 | 913 break; |
885 if (port > 0 && port < 65536) { | 914 } |
886 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; | 915 |
887 } | 916 if (port > 0 && port < 65536) { |
917 v->len = ngx_sprintf(v->data, "%ui", port) - v->data; | |
888 } | 918 } |
889 | 919 |
890 return NGX_OK; | 920 return NGX_OK; |
891 } | 921 } |
892 | 922 |
894 static ngx_int_t | 924 static ngx_int_t |
895 ngx_http_variable_server_addr(ngx_http_request_t *r, | 925 ngx_http_variable_server_addr(ngx_http_request_t *r, |
896 ngx_http_variable_value_t *v, uintptr_t data) | 926 ngx_http_variable_value_t *v, uintptr_t data) |
897 { | 927 { |
898 ngx_str_t s; | 928 ngx_str_t s; |
899 | 929 u_char addr[NGX_SOCKADDR_STRLEN]; |
900 s.data = ngx_pnalloc(r->pool, NGX_INET_ADDRSTRLEN); | 930 |
931 s.len = NGX_SOCKADDR_STRLEN; | |
932 s.data = addr; | |
933 | |
934 if (ngx_http_server_addr(r, &s) != NGX_OK) { | |
935 return NGX_ERROR; | |
936 } | |
937 | |
938 s.data = ngx_pnalloc(r->pool, s.len); | |
901 if (s.data == NULL) { | 939 if (s.data == NULL) { |
902 return NGX_ERROR; | 940 return NGX_ERROR; |
903 } | 941 } |
904 | 942 |
905 if (ngx_http_server_addr(r, &s) != NGX_OK) { | 943 ngx_memcpy(s.data, addr, s.len); |
906 return NGX_ERROR; | |
907 } | |
908 | 944 |
909 v->len = s.len; | 945 v->len = s.len; |
910 v->valid = 1; | 946 v->valid = 1; |
911 v->no_cacheable = 0; | 947 v->no_cacheable = 0; |
912 v->not_found = 0; | 948 v->not_found = 0; |