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);