Mercurial > hg > nginx
comparison src/stream/ngx_stream_core_module.c @ 6557:6f8254ae61b8
Use ngx_cmp_sockaddr() where appropriate.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 20 May 2016 19:10:42 +0300 |
parents | 8f038068f4bc |
children | 68854ce64ec7 |
comparison
equal
deleted
inserted
replaced
6556:654d2dae97d3 | 6557:6f8254ae61b8 |
---|---|
246 | 246 |
247 | 247 |
248 static char * | 248 static char * |
249 ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | 249 ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
250 { | 250 { |
251 size_t len, off; | |
252 in_port_t port; | |
253 ngx_str_t *value; | 251 ngx_str_t *value; |
254 ngx_url_t u; | 252 ngx_url_t u; |
255 ngx_uint_t i, backlog; | 253 ngx_uint_t i, backlog; |
256 struct sockaddr *sa; | |
257 struct sockaddr_in *sin; | |
258 ngx_stream_listen_t *ls; | 254 ngx_stream_listen_t *ls; |
259 ngx_stream_core_main_conf_t *cmcf; | 255 ngx_stream_core_main_conf_t *cmcf; |
260 #if (NGX_HAVE_INET6) | |
261 struct sockaddr_in6 *sin6; | |
262 #endif | |
263 | 256 |
264 value = cf->args->elts; | 257 value = cf->args->elts; |
265 | 258 |
266 ngx_memzero(&u, sizeof(ngx_url_t)); | 259 ngx_memzero(&u, sizeof(ngx_url_t)); |
267 | 260 |
282 | 275 |
283 ls = cmcf->listen.elts; | 276 ls = cmcf->listen.elts; |
284 | 277 |
285 for (i = 0; i < cmcf->listen.nelts; i++) { | 278 for (i = 0; i < cmcf->listen.nelts; i++) { |
286 | 279 |
287 sa = &ls[i].u.sockaddr; | 280 if (ngx_cmp_sockaddr(&ls[i].u.sockaddr, ls[i].socklen, |
288 | 281 (struct sockaddr *) &u.sockaddr, u.socklen, 1) |
289 if (sa->sa_family != u.family) { | 282 != NGX_OK) |
290 continue; | |
291 } | |
292 | |
293 switch (sa->sa_family) { | |
294 | |
295 #if (NGX_HAVE_INET6) | |
296 case AF_INET6: | |
297 off = offsetof(struct sockaddr_in6, sin6_addr); | |
298 len = 16; | |
299 sin6 = &ls[i].u.sockaddr_in6; | |
300 port = sin6->sin6_port; | |
301 break; | |
302 #endif | |
303 | |
304 #if (NGX_HAVE_UNIX_DOMAIN) | |
305 case AF_UNIX: | |
306 off = offsetof(struct sockaddr_un, sun_path); | |
307 len = sizeof(((struct sockaddr_un *) sa)->sun_path); | |
308 port = 0; | |
309 break; | |
310 #endif | |
311 | |
312 default: /* AF_INET */ | |
313 off = offsetof(struct sockaddr_in, sin_addr); | |
314 len = 4; | |
315 sin = &ls[i].u.sockaddr_in; | |
316 port = sin->sin_port; | |
317 break; | |
318 } | |
319 | |
320 if (ngx_memcmp(ls[i].u.sockaddr_data + off, u.sockaddr + off, len) | |
321 != 0) | |
322 { | 283 { |
323 continue; | |
324 } | |
325 | |
326 if (port != u.port) { | |
327 continue; | 284 continue; |
328 } | 285 } |
329 | 286 |
330 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 287 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
331 "duplicate \"%V\" address and port pair", &u.url); | 288 "duplicate \"%V\" address and port pair", &u.url); |
382 continue; | 339 continue; |
383 } | 340 } |
384 | 341 |
385 if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) { | 342 if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) { |
386 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) | 343 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) |
344 size_t len; | |
387 u_char buf[NGX_SOCKADDR_STRLEN]; | 345 u_char buf[NGX_SOCKADDR_STRLEN]; |
388 | 346 |
389 sa = &ls->u.sockaddr; | 347 if (ls->u.sockaddr.sa_family == AF_INET6) { |
390 | |
391 if (sa->sa_family == AF_INET6) { | |
392 | 348 |
393 if (ngx_strcmp(&value[i].data[10], "n") == 0) { | 349 if (ngx_strcmp(&value[i].data[10], "n") == 0) { |
394 ls->ipv6only = 1; | 350 ls->ipv6only = 1; |
395 | 351 |
396 } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) { | 352 } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) { |
404 } | 360 } |
405 | 361 |
406 ls->bind = 1; | 362 ls->bind = 1; |
407 | 363 |
408 } else { | 364 } else { |
409 len = ngx_sock_ntop(sa, ls->socklen, buf, | 365 len = ngx_sock_ntop(&ls->u.sockaddr, ls->socklen, buf, |
410 NGX_SOCKADDR_STRLEN, 1); | 366 NGX_SOCKADDR_STRLEN, 1); |
411 | 367 |
412 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 368 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
413 "ipv6only is not supported " | 369 "ipv6only is not supported " |
414 "on addr \"%*s\", ignored", len, buf); | 370 "on addr \"%*s\", ignored", len, buf); |