28 for (p = text; p < text + len; p++) {
32 if (c >=
'0' && c <=
'9') {
33 octet = octet * 10 + (c -
'0');
37 if (c ==
'.' && octet < 256) {
38 addr = (addr << 8) + octet;
47 if (n == 3 && octet < 256) {
48 addr = (addr << 8) + octet;
59 ngx_inet6_addr(u_char *p,
size_t len, u_char *addr)
61 u_char c, *zero, *digit, *s, *d;
88 *addr++ = (u_char) (word >> 8);
89 *addr++ = (u_char) (word & 0xff);
109 if (c ==
'.' && nibbles) {
110 if (n < 2 || digit == NULL) {
120 *addr++ = (u_char) ((word >> 24) & 0xff);
121 *addr++ = (u_char) ((word >> 16) & 0xff);
130 if (c >=
'0' && c <=
'9') {
131 word = word * 16 + (c -
'0');
137 if (c >=
'a' && c <=
'f') {
138 word = word * 16 + (c -
'a') + 10;
145 if (nibbles == 0 && zero == NULL) {
149 *addr++ = (u_char) (word >> 8);
150 *addr++ = (u_char) (word & 0xff);
180 struct sockaddr_in *sin;
183 struct sockaddr_in6 *sin6;
185 #if (NGX_HAVE_UNIX_DOMAIN)
186 struct sockaddr_un *saun;
189 switch (sa->sa_family) {
193 sin = (
struct sockaddr_in *) sa;
194 p = (u_char *) &sin->sin_addr;
198 p[0], p[1], p[2], p[3], ntohs(sin->sin_port));
201 p[0], p[1], p[2], p[3]);
210 sin6 = (
struct sockaddr_in6 *) sa;
218 n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len);
222 ntohs(sin6->sin6_port)) - text;
228 #if (NGX_HAVE_UNIX_DOMAIN)
231 saun = (
struct sockaddr_un *) sa;
235 return ngx_snprintf(text, len,
"unix:%s%Z", saun->sun_path) - text - 1;
257 p[0], p[1], p[2], p[3])
263 return ngx_inet6_ntop(addr, text, len);
276 ngx_inet6_ntop(u_char *p, u_char *text,
size_t len)
291 for (i = 0; i < 16; i += 2) {
293 if (p[i] || p[i + 1]) {
319 if ((max == 5 && p[10] == 0xff && p[11] == 0xff)
321 || (max == 7 && p[14] != 0 && p[15] != 1))
329 for (i = 0; i < n; i += 2) {
337 dst =
ngx_sprintf(dst,
"%uxi", p[i] * 256 + p[i + 1]);
345 dst =
ngx_sprintf(dst,
"%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]);
357 u_char *addr, *mask, *last;
366 last = addr + text->
len;
368 mask = ngx_strlchr(addr, last,
'/');
369 len = (mask ? mask : last) - addr;
382 }
else if (ngx_inet6_addr(addr, len, cidr->
u.in6.addr.s6_addr) ==
NGX_OK) {
397 shift =
ngx_atoi(mask, last - mask);
410 addr = cidr->
u.in6.addr.s6_addr;
411 mask = cidr->
u.in6.mask.s6_addr;
414 for (i = 0; i < 16; i++) {
416 s = (shift > 8) ? 8 : shift;
419 mask[
i] = (u_char) (0xffu << (8 - s));
421 if (addr[i] != (addr[i] & mask[i])) {
436 cidr->
u.
in.
mask = htonl((uint32_t) (0xffffffffu << (32 - shift)));
459 struct sockaddr_in *sin;
461 struct in6_addr inaddr6;
462 struct sockaddr_in6 *sin6;
475 len =
sizeof(
struct sockaddr_in);
478 }
else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) ==
NGX_OK) {
480 len =
sizeof(
struct sockaddr_in6);
492 addr->
sockaddr->sa_family = (u_char) family;
499 sin6 = (
struct sockaddr_in6 *) addr->
sockaddr;
500 ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);
505 sin = (
struct sockaddr_in *) addr->
sockaddr;
506 sin->sin_addr.s_addr = inaddr;
522 return ngx_parse_unix_domain_url(pool, u);
526 return ngx_parse_inet6_url(pool, u);
529 return ngx_parse_inet_url(pool, u);
536 #if (NGX_HAVE_UNIX_DOMAIN)
537 u_char *path, *uri, *last;
539 struct sockaddr_un *saun;
550 uri = ngx_strlchr(path, last,
':');
561 u->
err =
"no path in the unix domain socket";
568 if (len >
sizeof(saun->sun_path)) {
569 u->
err =
"too long path in the unix domain socket";
573 u->
socklen =
sizeof(
struct sockaddr_un);
574 saun = (
struct sockaddr_un *) &u->
sockaddr;
575 saun->sun_family = AF_UNIX;
576 (
void)
ngx_cpystrn((u_char *) saun->sun_path, path, len);
579 if (u->
addrs == NULL) {
583 saun =
ngx_pcalloc(pool,
sizeof(
struct sockaddr_un));
591 saun->sun_family = AF_UNIX;
592 (void)
ngx_cpystrn((u_char *) saun->sun_path, path, len);
603 u->
err =
"the unix domain sockets are not supported on this platform";
614 u_char *p, *host, *port, *last, *uri, *args;
617 struct sockaddr_in *sin;
619 struct sockaddr_in6 *sin6;
622 u->
socklen =
sizeof(
struct sockaddr_in);
623 sin = (
struct sockaddr_in *) &u->
sockaddr;
624 sin->sin_family = AF_INET;
632 port = ngx_strlchr(host, last,
':');
634 uri = ngx_strlchr(host, last,
'/');
636 args = ngx_strlchr(host, last,
'?');
639 if (uri == NULL || args < uri) {
646 u->
err =
"invalid host";
667 if (n < 1 || n > 65535) {
668 u->
err =
"invalid port";
672 u->
port = (in_port_t) n;
673 sin->sin_port = htons((in_port_t) n);
691 if (n < 1 || n > 65535) {
692 u->
err =
"invalid port";
696 u->
port = (in_port_t) n;
697 sin->sin_port = htons((in_port_t) n);
724 if (u->
listen && len == 1 && *host ==
'*') {
725 sin->sin_addr.s_addr = INADDR_ANY;
734 if (sin->sin_addr.s_addr == INADDR_ANY) {
741 if (u->
addrs == NULL) {
745 sin =
ngx_pcalloc(pool,
sizeof(
struct sockaddr_in));
783 sin6 = (
struct sockaddr_in6 *) &u->
sockaddr;
785 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
793 sin = (
struct sockaddr_in *) &u->
sockaddr;
795 if (sin->sin_addr.s_addr == INADDR_ANY) {
810 u_char *p, *host, *port, *last, *uri;
813 struct sockaddr_in6 *sin6;
815 u->
socklen =
sizeof(
struct sockaddr_in6);
816 sin6 = (
struct sockaddr_in6 *) &u->
sockaddr;
817 sin6->sin6_family = AF_INET6;
823 p = ngx_strlchr(host, last,
']');
826 u->
err =
"invalid host";
834 uri = ngx_strlchr(port, last,
'/');
838 u->
err =
"invalid host";
855 if (n < 1 || n > 65535) {
856 u->
err =
"invalid port";
860 u->
port = (in_port_t) n;
861 sin6->sin6_port = htons((in_port_t) n);
883 if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) !=
NGX_OK) {
884 u->
err =
"invalid IPv6 address";
888 if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
896 if (u->
addrs == NULL) {
900 sin6 =
ngx_pcalloc(pool,
sizeof(
struct sockaddr_in6));
923 u->
err =
"the INET6 sockets are not supported on this platform";
931 #if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6)
940 struct addrinfo hints, *res, *rp;
941 struct sockaddr_in *sin;
942 struct sockaddr_in6 *sin6;
944 port = htons(u->
port);
954 hints.ai_family = AF_UNSPEC;
955 hints.ai_socktype = SOCK_STREAM;
957 if (getaddrinfo((
char *) host, NULL, &hints, &res) != 0) {
958 u->
err =
"host not found";
965 for (i = 0, rp = res; rp != NULL; rp = rp->ai_next) {
967 switch (rp->ai_family) {
981 u->
err =
"host not found";
988 if (u->
addrs == NULL) {
998 for (rp = res; rp != NULL; rp = rp->ai_next) {
1000 if (rp->ai_family != AF_INET) {
1009 ngx_memcpy(sin, rp->ai_addr, rp->ai_addrlen);
1011 sin->sin_port = port;
1031 for (rp = res; rp != NULL; rp = rp->ai_next) {
1033 if (rp->ai_family != AF_INET6) {
1042 ngx_memcpy(sin6, rp->ai_addr, rp->ai_addrlen);
1044 sin6->sin6_port = port;
1084 struct sockaddr_in *sin;
1088 port = htons(u->
port);
1100 h = gethostbyname((
char *) host);
1104 if (h == NULL || h->h_addr_list[0] == NULL) {
1105 u->
err =
"host not found";
1109 for (i = 0; h->h_addr_list[
i] != NULL; i++) { }
1114 if (u->
addrs == NULL) {
1120 for (i = 0; i < u->
naddrs; i++) {
1122 sin =
ngx_pcalloc(pool,
sizeof(
struct sockaddr_in));
1127 sin->sin_family = AF_INET;
1128 sin->sin_port = port;
1129 sin->sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]);
1152 if (u->
addrs == NULL) {
1156 sin =
ngx_pcalloc(pool,
sizeof(
struct sockaddr_in));
1163 sin->sin_family = AF_INET;
1164 sin->sin_port = port;
1165 sin->sin_addr.s_addr = in_addr;
1176 &u->
host, ntohs(port)) - p;