comparison src/core/ngx_inet.c @ 3265:0c5c5e876391

ngx_inet6_addr()
author Igor Sysoev <igor@sysoev.ru>
date Mon, 02 Nov 2009 12:50:00 +0000
parents a7491af45540
children 798141791ad3
comparison
equal deleted inserted replaced
3264:ebcee0063cd8 3265:0c5c5e876391
55 return htonl(addr); 55 return htonl(addr);
56 } 56 }
57 57
58 return INADDR_NONE; 58 return INADDR_NONE;
59 } 59 }
60
61
62 #if (NGX_HAVE_INET6)
63
64 ngx_int_t
65 ngx_inet6_addr(u_char *p, size_t len, u_char *addr)
66 {
67 u_char c, *zero, *digit, *s, *d;
68 size_t len4;
69 ngx_uint_t n, nibbles, word;
70
71 if (len == 0) {
72 return NGX_ERROR;
73 }
74
75 zero = NULL;
76 digit = NULL;
77 len4 = 0;
78 nibbles = 0;
79 word = 0;
80 n = 8;
81
82 if (p[0] == ':') {
83 p++;
84 len--;
85 }
86
87 for (/* void */; len; len--) {
88 c = *p++;
89
90 if (c == ':') {
91 if (nibbles) {
92 digit = p;
93 len4 = len;
94 *addr++ = (u_char) (word >> 8);
95 *addr++ = (u_char) (word & 0xff);
96
97 if (--n) {
98 nibbles = 0;
99 word = 0;
100 continue;
101 }
102
103 } else {
104 if (zero == NULL) {
105 digit = p;
106 len4 = len;
107 zero = addr;
108 continue;
109 }
110 }
111
112 return NGX_ERROR;
113 }
114
115 if (c == '.' && nibbles) {
116 if (n < 2) {
117 return NGX_ERROR;
118 }
119
120 word = ngx_inet_addr(digit, len4 - 1);
121 if (word == INADDR_NONE) {
122 return NGX_ERROR;
123 }
124
125 word = ntohl(word);
126 *addr++ = (u_char) ((word >> 24) & 0xff);
127 *addr++ = (u_char) ((word >> 16) & 0xff);
128 n--;
129 break;
130 }
131
132 if (++nibbles > 4) {
133 return NGX_ERROR;
134 }
135
136 if (c >= '0' && c <= '9') {
137 word = word * 16 + (c - '0');
138 continue;
139 }
140
141 c |= 0x20;
142
143 if (c >= 'a' && c <= 'f') {
144 word = word * 16 + (c - 'a') + 10;
145 continue;
146 }
147
148 return NGX_ERROR;
149 }
150
151 if (nibbles == 0 && zero == NULL) {
152 return NGX_ERROR;
153 }
154
155 *addr++ = (u_char) (word >> 8);
156 *addr++ = (u_char) (word & 0xff);
157
158 if (--n) {
159 if (zero) {
160 n *= 2;
161 s = addr - 1;
162 d = s + n;
163 while (s >= zero) {
164 *d-- = *s--;
165 }
166 ngx_memzero(zero, n);
167 return NGX_OK;
168 }
169
170 } else {
171 if (zero == NULL) {
172 return NGX_OK;
173 }
174 }
175
176 return NGX_ERROR;
177 }
178
179 #endif
60 180
61 181
62 size_t 182 size_t
63 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port) 183 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port)
64 { 184 {