OLD | NEW |
1 /* | 1 /* |
2 * dhcpcd - DHCP client daemon | 2 * dhcpcd - DHCP client daemon |
3 * Copyright (c) 2006-2009 Roy Marples <roy@marples.name> | 3 * Copyright (c) 2006-2009 Roy Marples <roy@marples.name> |
4 * All rights reserved | 4 * All rights reserved |
5 | 5 |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 #include <unistd.h> | 54 #include <unistd.h> |
55 #include <time.h> | 55 #include <time.h> |
56 | 56 |
57 #include "arp.h" | 57 #include "arp.h" |
58 #include "bind.h" | 58 #include "bind.h" |
59 #include "config.h" | 59 #include "config.h" |
60 #include "common.h" | 60 #include "common.h" |
61 #include "configure.h" | 61 #include "configure.h" |
62 #include "control.h" | 62 #include "control.h" |
63 #include "dhcpcd.h" | 63 #include "dhcpcd.h" |
| 64 #include "dhcpcd-dbus.h" |
64 #include "duid.h" | 65 #include "duid.h" |
65 #include "eloop.h" | 66 #include "eloop.h" |
66 #include "if-options.h" | 67 #include "if-options.h" |
67 #include "if-pref.h" | 68 #include "if-pref.h" |
68 #include "ipv4ll.h" | 69 #include "ipv4ll.h" |
69 #include "net.h" | 70 #include "net.h" |
70 #include "signals.h" | 71 #include "signals.h" |
71 | 72 |
72 /* We should define a maximum for the NAK exponential backoff */ | 73 /* We should define a maximum for the NAK exponential backoff */ |
73 #define NAKOFF_MAX 60 | 74 #define NAKOFF_MAX 60 |
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 ifp->dst.s_addr = dst ? dst->s_addr : INADDR_ANY; | 1292 ifp->dst.s_addr = dst ? dst->s_addr : INADDR_ANY; |
1292 if (dst) { | 1293 if (dst) { |
1293 for (i = 1; i < 255; i++) | 1294 for (i = 1; i < 255; i++) |
1294 if (i != DHO_ROUTER && | 1295 if (i != DHO_ROUTER && |
1295 has_option_mask(ifo->dstmask, i)) | 1296 has_option_mask(ifo->dstmask, i)) |
1296 dhcp_message_add_addr( | 1297 dhcp_message_add_addr( |
1297 ifp->state->new, | 1298 ifp->state->new, |
1298 i, *dst); | 1299 i, *dst); |
1299 } | 1300 } |
1300 ifp->state->reason = "STATIC"; | 1301 ifp->state->reason = "STATIC"; |
1301 build_routes(); | |
1302 run_script(ifp); | 1302 run_script(ifp); |
1303 if (ifo->options & DHCPCD_INFORM) { | 1303 if (ifo->options & DHCPCD_INFORM) { |
1304 ifp->state->state = DHS_INFORM; | 1304 ifp->state->state = DHS_INFORM; |
1305 ifp->state->xid = arc4random(); | 1305 ifp->state->xid = arc4random(); |
1306 ifp->state->lease.server.s_addr = | 1306 ifp->state->lease.server.s_addr = |
1307 dst ? dst->s_addr : INADDR_ANY; | 1307 dst ? dst->s_addr : INADDR_ANY; |
1308 ifp->addr = *addr; | 1308 ifp->addr = *addr; |
1309 ifp->net = *net; | 1309 ifp->net = *net; |
1310 open_sockets(ifp); | 1310 open_sockets(ifp); |
1311 send_inform(ifp); | 1311 send_inform(ifp); |
1312 } | 1312 } |
1313 break; | 1313 break; |
1314 } | 1314 } |
1315 } | 1315 } |
1316 | 1316 |
1317 /* ARGSUSED */ | 1317 /* ARGSUSED */ |
1318 static void | 1318 static void |
1319 handle_link(_unused void *arg) | 1319 handle_link(_unused void *arg) |
1320 { | 1320 { |
1321 if (manage_link(linkfd) == -1) | 1321 if (manage_link(linkfd) == -1) |
1322 syslog(LOG_ERR, "manage_link: %m"); | 1322 syslog(LOG_ERR, "manage_link: %m"); |
1323 } | 1323 } |
1324 | 1324 |
1325 /* ARGSUSED */ | 1325 /* ARGSUSED */ |
1326 static void | 1326 void |
1327 handle_signal(_unused void *arg) | 1327 handle_signal(_unused void *arg) |
1328 { | 1328 { |
1329 struct interface *iface, *ifl; | 1329 struct interface *iface, *ifl; |
1330 int sig = signal_read(); | 1330 int sig = signal_read(); |
1331 int do_release = 0; | 1331 int do_release = 0; |
1332 | 1332 |
1333 switch (sig) { | 1333 switch (sig) { |
1334 case SIGINT: | 1334 case SIGINT: |
1335 syslog(LOG_INFO, "received SIGINT, stopping"); | 1335 syslog(LOG_INFO, "received SIGINT, stopping"); |
1336 break; | 1336 break; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1413 handle_args(struct fd_list *fd, int argc, char **argv) | 1413 handle_args(struct fd_list *fd, int argc, char **argv) |
1414 { | 1414 { |
1415 struct interface *ifs, *ifp, *ifl, *ifn, *ift; | 1415 struct interface *ifs, *ifp, *ifl, *ifn, *ift; |
1416 int do_exit = 0, do_release = 0, do_reboot = 0, do_reconf = 0; | 1416 int do_exit = 0, do_release = 0, do_reboot = 0, do_reconf = 0; |
1417 int opt, oi = 0; | 1417 int opt, oi = 0; |
1418 ssize_t len; | 1418 ssize_t len; |
1419 size_t l; | 1419 size_t l; |
1420 struct iovec iov[2]; | 1420 struct iovec iov[2]; |
1421 char *tmp, *p; | 1421 char *tmp, *p; |
1422 | 1422 |
1423 if (fd != NULL) { | |
1424 /* Special commands for our control socket */ | |
1425 if (strcmp(*argv, "--version") == 0) { | |
1426 len = strlen(VERSION) + 1; | |
1427 iov[0].iov_base = &len; | |
1428 iov[0].iov_len = sizeof(ssize_t); | |
1429 iov[1].iov_base = UNCONST(VERSION); | |
1430 iov[1].iov_len = len; | |
1431 if (writev(fd->fd, iov, 2) == -1) { | |
1432 syslog(LOG_ERR, "writev: %m"); | |
1433 return -1; | |
1434 } | |
1435 return 0; | |
1436 } else if (strcmp(*argv, "--getconfigfile") == 0) { | |
1437 len = strlen(cffile ? cffile : CONFIG) + 1; | |
1438 iov[0].iov_base = &len; | |
1439 iov[0].iov_len = sizeof(ssize_t); | |
1440 iov[1].iov_base = cffile ? cffile : UNCONST(CONFIG); | |
1441 iov[1].iov_len = len; | |
1442 if (writev(fd->fd, iov, 2) == -1) { | |
1443 syslog(LOG_ERR, "writev: %m"); | |
1444 return -1; | |
1445 } | |
1446 return 0; | |
1447 } else if (strcmp(*argv, "--getinterfaces") == 0) { | |
1448 len = 0; | |
1449 if (argc == 1) { | |
1450 for (ifp = ifaces; ifp; ifp = ifp->next) | |
1451 len++; | |
1452 len = write(fd->fd, &len, sizeof(len)); | |
1453 if (len != sizeof(len)) | |
1454 return -1; | |
1455 for (ifp = ifaces; ifp; ifp = ifp->next) | |
1456 send_interface(fd->fd, ifp); | |
1457 return 0; | |
1458 } | |
1459 opt = 0; | |
1460 while (argv[++opt] != NULL) { | |
1461 for (ifp = ifaces; ifp; ifp = ifp->next) | |
1462 if (strcmp(argv[opt], ifp->name) == 0) | |
1463 len++; | |
1464 } | |
1465 len = write(fd->fd, &len, sizeof(len)); | |
1466 if (len != sizeof(len)) | |
1467 return -1; | |
1468 opt = 0; | |
1469 while (argv[++opt] != NULL) { | |
1470 for (ifp = ifaces; ifp; ifp = ifp->next) | |
1471 if (strcmp(argv[opt], ifp->name) == 0) | |
1472 send_interface(fd->fd, ifp); | |
1473 } | |
1474 return 0; | |
1475 } else if (strcmp(*argv, "--listen") == 0) { | |
1476 fd->listener = 1; | |
1477 return 0; | |
1478 } | |
1479 } | |
1480 | |
1481 /* Log the command */ | 1423 /* Log the command */ |
1482 len = 0; | 1424 len = 0; |
1483 for (opt = 0; opt < argc; opt++) | 1425 for (opt = 0; opt < argc; opt++) |
1484 len += strlen(argv[opt]) + 1; | 1426 len += strlen(argv[opt]) + 1; |
1485 tmp = p = xmalloc(len + 1); | 1427 tmp = p = xmalloc(len + 1); |
1486 for (opt = 0; opt < argc; opt++) { | 1428 for (opt = 0; opt < argc; opt++) { |
1487 l = strlen(argv[opt]); | 1429 l = strlen(argv[opt]); |
1488 strlcpy(p, argv[opt], l + 1); | 1430 strlcpy(p, argv[opt], l + 1); |
1489 p += l; | 1431 p += l; |
1490 *p++ = ' '; | 1432 *p++ = ' '; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1568 main(int argc, char **argv) | 1510 main(int argc, char **argv) |
1569 { | 1511 { |
1570 struct if_options *ifo; | 1512 struct if_options *ifo; |
1571 struct interface *iface; | 1513 struct interface *iface; |
1572 int opt, oi = 0, signal_fd, sig = 0, i, control_fd; | 1514 int opt, oi = 0, signal_fd, sig = 0, i, control_fd; |
1573 size_t len; | 1515 size_t len; |
1574 pid_t pid; | 1516 pid_t pid; |
1575 struct timespec ts; | 1517 struct timespec ts; |
1576 | 1518 |
1577 closefrom(3); | 1519 closefrom(3); |
1578 » openlog(PACKAGE, LOG_PERROR, LOG_DAEMON); | 1520 » openlog(PACKAGE, LOG_PID | LOG_PERROR, LOG_DAEMON); |
1579 setlogmask(LOG_UPTO(LOG_INFO)); | 1521 setlogmask(LOG_UPTO(LOG_INFO)); |
1580 | 1522 |
1581 /* Test for --help and --version */ | 1523 /* Test for --help and --version */ |
1582 if (argc > 1) { | 1524 if (argc > 1) { |
1583 if (strcmp(argv[1], "--help") == 0) { | 1525 if (strcmp(argv[1], "--help") == 0) { |
1584 usage(); | 1526 usage(); |
1585 exit(EXIT_SUCCESS); | 1527 exit(EXIT_SUCCESS); |
1586 } else if (strcmp(argv[1], "--version") == 0) { | 1528 } else if (strcmp(argv[1], "--version") == 0) { |
1587 printf(""PACKAGE" "VERSION"\n%s\n", copyright); | 1529 printf(""PACKAGE" "VERSION"\n%s\n", copyright); |
1588 exit(EXIT_SUCCESS); | 1530 exit(EXIT_SUCCESS); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1627 if (opt != 1) { | 1569 if (opt != 1) { |
1628 if (opt == 0) | 1570 if (opt == 0) |
1629 usage(); | 1571 usage(); |
1630 exit(EXIT_FAILURE); | 1572 exit(EXIT_FAILURE); |
1631 } | 1573 } |
1632 options = ifo->options; | 1574 options = ifo->options; |
1633 if (i != 0) { | 1575 if (i != 0) { |
1634 options |= DHCPCD_TEST | DHCPCD_PERSISTENT; | 1576 options |= DHCPCD_TEST | DHCPCD_PERSISTENT; |
1635 options &= ~DHCPCD_DAEMONISE; | 1577 options &= ~DHCPCD_DAEMONISE; |
1636 } | 1578 } |
1637 » | 1579 |
1638 #ifdef THERE_IS_NO_FORK | 1580 #ifdef THERE_IS_NO_FORK |
1639 options &= ~DHCPCD_DAEMONISE; | 1581 options &= ~DHCPCD_DAEMONISE; |
1640 #endif | 1582 #endif |
1641 | 1583 |
1642 if (options & DHCPCD_DEBUG) | 1584 if (options & DHCPCD_DEBUG) |
1643 setlogmask(LOG_UPTO(LOG_DEBUG)); | 1585 setlogmask(LOG_UPTO(LOG_DEBUG)); |
1644 else if (options & DHCPCD_QUIET) | 1586 else if (options & DHCPCD_QUIET) |
1645 close(STDERR_FILENO); | 1587 close(STDERR_FILENO); |
1646 | 1588 |
1647 if (!(options & DHCPCD_TEST)) { | 1589 if (!(options & DHCPCD_TEST)) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 nanosleep(&ts, NULL); | 1652 nanosleep(&ts, NULL); |
1711 if (read_pid() == 0) | 1653 if (read_pid() == 0) |
1712 exit(EXIT_SUCCESS); | 1654 exit(EXIT_SUCCESS); |
1713 } | 1655 } |
1714 syslog(LOG_ERR, "pid %d failed to exit", pid); | 1656 syslog(LOG_ERR, "pid %d failed to exit", pid); |
1715 exit(EXIT_FAILURE); | 1657 exit(EXIT_FAILURE); |
1716 } | 1658 } |
1717 } | 1659 } |
1718 | 1660 |
1719 if (!(options & DHCPCD_TEST)) { | 1661 if (!(options & DHCPCD_TEST)) { |
1720 » » if ((pid = read_pid()) > 0 && | 1662 » » if ((pid = read_pid()) > 0 && kill(pid, 0) == 0) { |
1721 » » kill(pid, 0) == 0) | |
1722 » » { | |
1723 syslog(LOG_ERR, ""PACKAGE | 1663 syslog(LOG_ERR, ""PACKAGE |
1724 " already running on pid %d (%s)", | 1664 " already running on pid %d (%s)", |
1725 pid, pidfile); | 1665 pid, pidfile); |
1726 exit(EXIT_FAILURE); | 1666 exit(EXIT_FAILURE); |
1727 } | 1667 } |
1728 | 1668 |
1729 /* Ensure we have the needed directories */ | 1669 /* Ensure we have the needed directories */ |
1730 if (mkdir(RUNDIR, 0755) == -1 && errno != EEXIST) { | 1670 if (mkdir(RUNDIR, 0755) == -1 && errno != EEXIST) { |
1731 syslog(LOG_ERR, "mkdir `%s': %m", RUNDIR); | 1671 syslog(LOG_ERR, "mkdir `%s': %m", RUNDIR); |
1732 exit(EXIT_FAILURE); | 1672 exit(EXIT_FAILURE); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 if (start_control() == -1) { | 1704 if (start_control() == -1) { |
1765 syslog(LOG_ERR, "start_control: %m"); | 1705 syslog(LOG_ERR, "start_control: %m"); |
1766 exit(EXIT_FAILURE); | 1706 exit(EXIT_FAILURE); |
1767 } | 1707 } |
1768 } | 1708 } |
1769 | 1709 |
1770 if (init_sockets() == -1) { | 1710 if (init_sockets() == -1) { |
1771 syslog(LOG_ERR, "init_socket: %m"); | 1711 syslog(LOG_ERR, "init_socket: %m"); |
1772 exit(EXIT_FAILURE); | 1712 exit(EXIT_FAILURE); |
1773 } | 1713 } |
| 1714 if (dhcpcd_dbus_init() == -1) { |
| 1715 /* NB: dhcpcd_dbus_init generates a syslog msg */ |
| 1716 exit(EXIT_FAILURE); |
| 1717 } |
1774 if (ifo->options & DHCPCD_LINK) { | 1718 if (ifo->options & DHCPCD_LINK) { |
1775 linkfd = open_link_socket(); | 1719 linkfd = open_link_socket(); |
1776 if (linkfd == -1) | 1720 if (linkfd == -1) |
1777 syslog(LOG_ERR, "open_link_socket: %m"); | 1721 syslog(LOG_ERR, "open_link_socket: %m"); |
1778 else | 1722 else |
1779 add_event(linkfd, handle_link, NULL); | 1723 add_event(linkfd, handle_link, NULL); |
1780 } | 1724 } |
1781 | 1725 |
1782 ifc = argc - optind; | 1726 ifc = argc - optind; |
1783 ifv = argv + optind; | 1727 ifv = argv + optind; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1852 } | 1796 } |
1853 free_options(ifo); | 1797 free_options(ifo); |
1854 | 1798 |
1855 sort_interfaces(); | 1799 sort_interfaces(); |
1856 for (iface = ifaces; iface; iface = iface->next) | 1800 for (iface = ifaces; iface; iface = iface->next) |
1857 add_timeout_sec(0, start_interface, iface); | 1801 add_timeout_sec(0, start_interface, iface); |
1858 | 1802 |
1859 start_eloop(); | 1803 start_eloop(); |
1860 exit(EXIT_SUCCESS); | 1804 exit(EXIT_SUCCESS); |
1861 } | 1805 } |
OLD | NEW |