| @@ -1,16 +1,16 @@ | | | @@ -1,16 +1,16 @@ |
1 | /* $NetBSD: ifwatchd.c,v 1.40 2016/10/06 11:13:57 roy Exp $ */ | | 1 | /* $NetBSD: ifwatchd.c,v 1.41 2016/10/07 15:49:58 christos Exp $ */ |
2 | #include <sys/cdefs.h> | | 2 | #include <sys/cdefs.h> |
3 | __RCSID("$NetBSD: ifwatchd.c,v 1.40 2016/10/06 11:13:57 roy Exp $"); | | 3 | __RCSID("$NetBSD: ifwatchd.c,v 1.41 2016/10/07 15:49:58 christos Exp $"); |
4 | | | 4 | |
5 | /*- | | 5 | /*- |
6 | * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. | | 6 | * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. |
7 | * All rights reserved. | | 7 | * All rights reserved. |
8 | * | | 8 | * |
9 | * This code is derived from software contributed to The NetBSD Foundation | | 9 | * This code is derived from software contributed to The NetBSD Foundation |
10 | * by Martin Husemann <martin@NetBSD.org>. | | 10 | * by Martin Husemann <martin@NetBSD.org>. |
11 | * | | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | | 12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions | | 13 | * modification, are permitted provided that the following conditions |
14 | * are met: | | 14 | * are met: |
15 | * 1. Redistributions of source code must retain the above copyright | | 15 | * 1. Redistributions of source code must retain the above copyright |
16 | * notice, this list of conditions and the following disclaimer. | | 16 | * notice, this list of conditions and the following disclaimer. |
| @@ -179,27 +179,26 @@ main(int argc, char **argv) | | | @@ -179,27 +179,26 @@ main(int argc, char **argv) |
179 | | | 179 | |
180 | while (argc > 0) { | | 180 | while (argc > 0) { |
181 | list_interfaces(argv[0]); | | 181 | list_interfaces(argv[0]); |
182 | argv++; | | 182 | argv++; |
183 | argc--; | | 183 | argc--; |
184 | } | | 184 | } |
185 | | | 185 | |
186 | if (!verbose) | | 186 | if (!verbose) |
187 | daemon(0, 0); | | 187 | daemon(0, 0); |
188 | | | 188 | |
189 | s = socket(PF_ROUTE, SOCK_RAW, 0); | | 189 | s = socket(PF_ROUTE, SOCK_RAW, 0); |
190 | if (s < 0) { | | 190 | if (s < 0) { |
191 | syslog(LOG_ERR, "error opening routing socket: %m"); | | 191 | syslog(LOG_ERR, "error opening routing socket: %m"); |
192 | perror("open routing socket"); | | | |
193 | exit(EXIT_FAILURE); | | 192 | exit(EXIT_FAILURE); |
194 | } | | 193 | } |
195 | | | 194 | |
196 | if (!inhibit_initial) | | 195 | if (!inhibit_initial) |
197 | run_initial_ups(); | | 196 | run_initial_ups(); |
198 | | | 197 | |
199 | iov[0].iov_base = buf; | | 198 | iov[0].iov_base = buf; |
200 | iov[0].iov_len = sizeof(buf); | | 199 | iov[0].iov_len = sizeof(buf); |
201 | memset(&msg, 0, sizeof(msg)); | | 200 | memset(&msg, 0, sizeof(msg)); |
202 | msg.msg_iov = iov; | | 201 | msg.msg_iov = iov; |
203 | msg.msg_iovlen = 1; | | 202 | msg.msg_iovlen = 1; |
204 | | | 203 | |
205 | for (;;) { | | 204 | for (;;) { |
| @@ -348,49 +347,48 @@ invoke_script(const char *ifname, enum e | | | @@ -348,49 +347,48 @@ invoke_script(const char *ifname, enum e |
348 | char addr[NI_MAXHOST], daddr[NI_MAXHOST]; | | 347 | char addr[NI_MAXHOST], daddr[NI_MAXHOST]; |
349 | const char *script; | | 348 | const char *script; |
350 | int status; | | 349 | int status; |
351 | | | 350 | |
352 | if (ifname == NULL) | | 351 | if (ifname == NULL) |
353 | return; | | 352 | return; |
354 | | | 353 | |
355 | script = *scripts[ev]; | | 354 | script = *scripts[ev]; |
356 | if (script == NULL) | | 355 | if (script == NULL) |
357 | return; | | 356 | return; |
358 | | | 357 | |
359 | addr[0] = daddr[0] = 0; | | 358 | addr[0] = daddr[0] = 0; |
360 | if (sa != NULL) { | | 359 | if (sa != NULL) { |
| | | 360 | const struct sockaddr_in *sin; |
| | | 361 | const struct sockaddr_in6 *sin6; |
| | | 362 | |
361 | if (sa->sa_len == 0) { | | 363 | if (sa->sa_len == 0) { |
362 | fprintf(stderr, | | 364 | syslog(LOG_ERR, |
363 | "illegal socket address (sa_len == 0)\n"); | | 365 | "illegal socket address (sa_len == 0)"); |
364 | return; | | 366 | return; |
365 | } | | 367 | } |
366 | switch (sa->sa_family) { | | 368 | switch (sa->sa_family) { |
367 | case AF_INET: | | 369 | case AF_INET: |
368 | { | | | |
369 | const struct sockaddr_in *sin; | | | |
370 | | | | |
371 | sin = (const struct sockaddr_in *)sa; | | 370 | sin = (const struct sockaddr_in *)sa; |
372 | if (sin->sin_addr.s_addr == INADDR_ANY || | | 371 | if (sin->sin_addr.s_addr == INADDR_ANY || |
373 | sin->sin_addr.s_addr == INADDR_BROADCAST) | | 372 | sin->sin_addr.s_addr == INADDR_BROADCAST) |
374 | return; | | 373 | return; |
375 | } | | 374 | break; |
376 | case AF_INET6: | | 375 | case AF_INET6: |
377 | { | | | |
378 | const struct sockaddr_in6 *sin6; | | | |
379 | | | | |
380 | sin6 = (const struct sockaddr_in6 *)sa; | | 376 | sin6 = (const struct sockaddr_in6 *)sa; |
381 | if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) | | 377 | if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) |
382 | return; | | 378 | return; |
383 | } | | 379 | break; |
| | | 380 | default: |
| | | 381 | break; |
384 | } | | 382 | } |
385 | | | 383 | |
386 | if (getnameinfo(sa, sa->sa_len, addr, sizeof addr, NULL, 0, | | 384 | if (getnameinfo(sa, sa->sa_len, addr, sizeof addr, NULL, 0, |
387 | NI_NUMERICHOST)) { | | 385 | NI_NUMERICHOST)) { |
388 | if (verbose) | | 386 | if (verbose) |
389 | printf("getnameinfo failed\n"); | | 387 | printf("getnameinfo failed\n"); |
390 | return; /* this address can not be handled */ | | 388 | return; /* this address can not be handled */ |
391 | } | | 389 | } |
392 | } | | 390 | } |
393 | | | 391 | |
394 | if (dest != NULL) { | | 392 | if (dest != NULL) { |
395 | if (getnameinfo(dest, dest->sa_len, daddr, sizeof daddr, | | 393 | if (getnameinfo(dest, dest->sa_len, daddr, sizeof daddr, |
396 | NULL, 0, NI_NUMERICHOST)) { | | 394 | NULL, 0, NI_NUMERICHOST)) { |
| @@ -399,34 +397,33 @@ invoke_script(const char *ifname, enum e | | | @@ -399,34 +397,33 @@ invoke_script(const char *ifname, enum e |
399 | return; /* this address can not be handled */ | | 397 | return; /* this address can not be handled */ |
400 | } | | 398 | } |
401 | } | | 399 | } |
402 | | | 400 | |
403 | if (verbose) | | 401 | if (verbose) |
404 | (void) printf("calling: %s %s %s %s %s %s\n", | | 402 | (void) printf("calling: %s %s %s %s %s %s\n", |
405 | script, ifname, DummyTTY, DummySpeed, addr, daddr); | | 403 | script, ifname, DummyTTY, DummySpeed, addr, daddr); |
406 | if (!quiet) | | 404 | if (!quiet) |
407 | syslog(LOG_INFO, "calling: %s %s %s %s %s %s\n", | | 405 | syslog(LOG_INFO, "calling: %s %s %s %s %s %s\n", |
408 | script, ifname, DummyTTY, DummySpeed, addr, daddr); | | 406 | script, ifname, DummyTTY, DummySpeed, addr, daddr); |
409 | | | 407 | |
410 | switch (vfork()) { | | 408 | switch (vfork()) { |
411 | case -1: | | 409 | case -1: |
412 | fprintf(stderr, "cannot fork\n"); | | 410 | syslog(LOG_ERR, "cannot fork: %m"); |
413 | break; | | 411 | break; |
414 | case 0: | | 412 | case 0: |
415 | if (execl(script, script, ifname, DummyTTY, DummySpeed, | | 413 | if (execl(script, script, ifname, DummyTTY, DummySpeed, |
416 | addr, daddr, NULL) == -1) { | | 414 | addr, daddr, NULL) == -1) { |
417 | syslog(LOG_ERR, "could not execute \"%s\": %m", | | 415 | syslog(LOG_ERR, "could not execute \"%s\": %m", |
418 | script); | | 416 | script); |
419 | perror(script); | | | |
420 | } | | 417 | } |
421 | _exit(EXIT_FAILURE); | | 418 | _exit(EXIT_FAILURE); |
422 | default: | | 419 | default: |
423 | (void) wait(&status); | | 420 | (void) wait(&status); |
424 | } | | 421 | } |
425 | } | | 422 | } |
426 | | | 423 | |
427 | static void | | 424 | static void |
428 | list_interfaces(const char *ifnames) | | 425 | list_interfaces(const char *ifnames) |
429 | { | | 426 | { |
430 | char * names = strdup(ifnames); | | 427 | char * names = strdup(ifnames); |
431 | char * name, *lasts; | | 428 | char * name, *lasts; |
432 | static const char sep[] = " \t"; | | 429 | static const char sep[] = " \t"; |