comparison src/core/ngx_inet.c @ 4670:c070fa19511e

Support for IPv6 literals in proxy_pass and so on.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 04 Jun 2012 14:07:34 +0000
parents 215857d53cbe
children 2efa05bbbc1e 032f71d771e6
comparison
equal deleted inserted replaced
4656:90ddd4abfdd2 4670:c070fa19511e
806 return NGX_ERROR; 806 return NGX_ERROR;
807 } 807 }
808 808
809 u->uri.len = last - uri; 809 u->uri.len = last - uri;
810 u->uri.data = uri; 810 u->uri.data = uri;
811
812 last = uri;
811 } 813 }
812 814
813 if (*port == ':') { 815 if (*port == ':') {
814 port++; 816 port++;
815 817
838 if (len == 0) { 840 if (len == 0) {
839 u->err = "no host"; 841 u->err = "no host";
840 return NGX_ERROR; 842 return NGX_ERROR;
841 } 843 }
842 844
843 u->host.len = len; 845 u->host.len = len + 2;
844 u->host.data = host; 846 u->host.data = host - 1;
845 847
846 if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) { 848 if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {
847 u->err = "invalid IPv6 address"; 849 u->err = "invalid IPv6 address";
848 return NGX_ERROR; 850 return NGX_ERROR;
849 } 851 }
850 852
851 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { 853 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
852 u->wildcard = 1; 854 u->wildcard = 1;
853 }
854
855 u->family = AF_INET6;
856
857 if (u->no_resolve) {
858 return NGX_OK;
859 } 855 }
860 856
861 if (u->no_port) { 857 if (u->no_port) {
862 u->port = u->default_port; 858 u->port = u->default_port;
863 sin6->sin6_port = htons(u->default_port); 859 sin6->sin6_port = htons(u->default_port);
864 } 860 }
861
862 u->family = AF_INET6;
863 u->naddrs = 1;
864
865 u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
866 if (u->addrs == NULL) {
867 return NGX_ERROR;
868 }
869
870 sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));
871 if (sin6 == NULL) {
872 return NGX_ERROR;
873 }
874
875 ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));
876
877 u->addrs[0].sockaddr = (struct sockaddr *) sin6;
878 u->addrs[0].socklen = sizeof(struct sockaddr_in6);
879
880 p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
881 if (p == NULL) {
882 return NGX_ERROR;
883 }
884
885 u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
886 &u->host, u->port) - p;
887 u->addrs[0].name.data = p;
865 888
866 return NGX_OK; 889 return NGX_OK;
867 890
868 #else 891 #else
869 892