1 /* 2 * dhcpcd - DHCP client daemon 3 * Copyright (c) 2006-2015 Roy Marples <roy (at) marples.name> 4 * All rights reserved 5 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 const char dhcpcd_copyright[] = "Copyright (c) 2006-2015 Roy Marples"; 29 30 #define _WITH_DPRINTF /* Stop FreeBSD bitching */ 31 32 #include <sys/file.h> 33 #include <sys/socket.h> 34 #include <sys/stat.h> 35 #include <sys/time.h> 36 #include <sys/types.h> 37 #include <sys/uio.h> 38 39 #include <ctype.h> 40 #include <errno.h> 41 #include <fcntl.h> 42 #include <getopt.h> 43 #include <limits.h> 44 #include <paths.h> 45 #include <signal.h> 46 #include <stdio.h> 47 #include <stdlib.h> 48 #include <string.h> 49 #include <unistd.h> 50 #include <time.h> 51 52 #if defined(__ANDROID__) 53 #include <sys/capability.h> 54 #include <sys/prctl.h> 55 #include <private/android_filesystem_config.h> 56 #endif /* __ANDROID__ */ 57 58 #include "config.h" 59 #include "arp.h" 60 #include "common.h" 61 #include "control.h" 62 #include "dev.h" 63 #include "dhcpcd.h" 64 #include "dhcp6.h" 65 #include "duid.h" 66 #include "eloop.h" 67 #include "if.h" 68 #include "if-options.h" 69 #include "ipv4.h" 70 #include "ipv6.h" 71 #include "ipv6nd.h" 72 #include "rpc-interface.h" 73 #include "script.h" 74 75 #ifdef USE_SIGNALS 76 const int dhcpcd_handlesigs[] = { 77 SIGTERM, 78 SIGINT, 79 SIGALRM, 80 SIGHUP, 81 SIGUSR1, 82 SIGUSR2, 83 SIGPIPE, 84 0 85 }; 86 87 /* Handling signals needs *some* context */ 88 static struct dhcpcd_ctx *dhcpcd_ctx; 89 #endif 90 91 #if defined(USE_SIGNALS) || !defined(THERE_IS_NO_FORK) 92 static pid_t 93 read_pid(const char *pidfile) 94 { 95 FILE *fp; 96 pid_t pid; 97 98 if ((fp = fopen(pidfile, "r")) == NULL) { 99 errno = ENOENT; 100 return 0; 101 } 102 if (fscanf(fp, "%d", &pid) != 1) 103 pid = 0; 104 fclose(fp); 105 return pid; 106 } 107 108 static int 109 write_pid(int fd, pid_t pid) 110 { 111 112 if (ftruncate(fd, (off_t)0) == -1) 113 return -1; 114 lseek(fd, (off_t)0, SEEK_SET); 115 return dprintf(fd, "%d\n", (int)pid); 116 } 117 #endif 118 119 static void 120 usage(void) 121 { 122 123 printf("usage: "PACKAGE"\t[-46ABbDdEGgHJKkLnpqTVw]\n" 124 "\t\t[-C, --nohook hook] [-c, --script script]\n" 125 "\t\t[-e, --env value] [-F, --fqdn FQDN] [-f, --config file]\n" 126 "\t\t[-h, --hostname hostname] [-I, --clientid clientid]\n" 127 "\t\t[-i, --vendorclassid vendorclassid] [-l, --leasetime seconds]\n" 128 "\t\t[-m, --metric metric] [-O, --nooption option]\n" 129 "\t\t[-o, --option option] [-Q, --require option]\n" 130 "\t\t[-r, --request address] [-S, --static value]\n" 131 "\t\t[-s, --inform address[/cidr]] [-t, --timeout seconds]\n" 132 "\t\t[-u, --userclass class] [-v, --vendor code, value]\n" 133 "\t\t[-W, --whitelist address[/cidr]] [-y, --reboot seconds]\n" 134 "\t\t[-X, --blacklist address[/cidr]] [-Z, --denyinterfaces pattern]\n" 135 "\t\t[-z, --allowinterfaces pattern] [interface] [...]\n" 136 " "PACKAGE"\t-k, --release [interface]\n" 137 " "PACKAGE"\t-U, --dumplease interface\n" 138 " "PACKAGE"\t--version\n" 139 " "PACKAGE"\t-x, --exit [interface]\n"); 140 } 141 142 static void 143 free_globals(struct dhcpcd_ctx *ctx) 144 { 145 struct dhcp_opt *opt; 146 147 if (ctx->ifac) { 148 for (; ctx->ifac > 0; ctx->ifac--) 149 free(ctx->ifav[ctx->ifac - 1]); 150 free(ctx->ifav); 151 ctx->ifav = NULL; 152 } 153 if (ctx->ifdc) { 154 for (; ctx->ifdc > 0; ctx->ifdc--) 155 free(ctx->ifdv[ctx->ifdc - 1]); 156 free(ctx->ifdv); 157 ctx->ifdv = NULL; 158 } 159 if (ctx->ifcc) { 160 for (; ctx->ifcc > 0; ctx->ifcc--) 161 free(ctx->ifcv[ctx->ifcc - 1]); 162 free(ctx->ifcv); 163 ctx->ifcv = NULL; 164 } 165 166 #ifdef INET 167 if (ctx->dhcp_opts) { 168 for (opt = ctx->dhcp_opts; 169 ctx->dhcp_opts_len > 0; 170 opt++, ctx->dhcp_opts_len--) 171 free_dhcp_opt_embenc(opt); 172 free(ctx->dhcp_opts); 173 ctx->dhcp_opts = NULL; 174 } 175 #endif 176 #ifdef INET6 177 if (ctx->dhcp6_opts) { 178 for (opt = ctx->dhcp6_opts; 179 ctx->dhcp6_opts_len > 0; 180 opt++, ctx->dhcp6_opts_len--) 181 free_dhcp_opt_embenc(opt); 182 free(ctx->dhcp6_opts); 183 ctx->dhcp6_opts = NULL; 184 } 185 #endif 186 if (ctx->vivso) { 187 for (opt = ctx->vivso; 188 ctx->vivso_len > 0; 189 opt++, ctx->vivso_len--) 190 free_dhcp_opt_embenc(opt); 191 free(ctx->vivso); 192 ctx->vivso = NULL; 193 } 194 } 195 196 static void 197 handle_exit_timeout(void *arg) 198 { 199 struct dhcpcd_ctx *ctx; 200 201 ctx = arg; 202 logger(ctx, LOG_ERR, "timed out"); 203 if (!(ctx->options & DHCPCD_MASTER)) { 204 eloop_exit(ctx->eloop, EXIT_FAILURE); 205 return; 206 } 207 ctx->options |= DHCPCD_NOWAITIP; 208 dhcpcd_daemonise(ctx); 209 } 210 211 int 212 dhcpcd_oneup(struct dhcpcd_ctx *ctx) 213 { 214 const struct interface *ifp; 215 216 TAILQ_FOREACH(ifp, ctx->ifaces, next) { 217 if (D_STATE_RUNNING(ifp) || 218 RS_STATE_RUNNING(ifp) || 219 D6_STATE_RUNNING(ifp)) 220 return 1; 221 } 222 return 0; 223 } 224 225 int 226 dhcpcd_ipwaited(struct dhcpcd_ctx *ctx) 227 { 228 229 if (ctx->options & DHCPCD_WAITIP4 && 230 !ipv4_addrexists(ctx, NULL)) 231 return 0; 232 if (ctx->options & DHCPCD_WAITIP6 && 233 !ipv6nd_findaddr(ctx, NULL, 0) && 234 !dhcp6_findaddr(ctx, NULL, 0)) 235 return 0; 236 if (ctx->options & DHCPCD_WAITIP && 237 !(ctx->options & (DHCPCD_WAITIP4 | DHCPCD_WAITIP6)) && 238 !ipv4_addrexists(ctx, NULL) && 239 !ipv6nd_findaddr(ctx, NULL, 0) && 240 !dhcp6_findaddr(ctx, NULL, 0)) 241 return 0; 242 return 1; 243 } 244 245 /* Returns the pid of the child, otherwise 0. */ 246 pid_t 247 dhcpcd_daemonise(struct dhcpcd_ctx *ctx) 248 { 249 #ifdef THERE_IS_NO_FORK 250 eloop_timeout_delete(ctx->eloop, handle_exit_timeout, ctx); 251 errno = ENOSYS; 252 return 0; 253 #else 254 pid_t pid; 255 char buf = '\0'; 256 int sidpipe[2], fd; 257 258 if (ctx->options & DHCPCD_DAEMONISE && 259 !(ctx->options & (DHCPCD_DAEMONISED | DHCPCD_NOWAITIP))) 260 { 261 if (!dhcpcd_ipwaited(ctx)) 262 return 0; 263 } 264 265 eloop_timeout_delete(ctx->eloop, handle_exit_timeout, ctx); 266 if (ctx->options & DHCPCD_DAEMONISED || 267 !(ctx->options & DHCPCD_DAEMONISE)) 268 return 0; 269 /* Setup a signal pipe so parent knows when to exit. */ 270 if (pipe(sidpipe) == -1) { 271 logger(ctx, LOG_ERR, "pipe: %m"); 272 return 0; 273 } 274 logger(ctx, LOG_DEBUG, "forking to background"); 275 switch (pid = fork()) { 276 case -1: 277 logger(ctx, LOG_ERR, "fork: %m"); 278 return 0; 279 case 0: 280 setsid(); 281 /* Some polling methods don't survive after forking, 282 * so ensure we can requeue all our events. */ 283 if (eloop_requeue(ctx->eloop) == -1) { 284 logger(ctx, LOG_ERR, "eloop_requeue: %m"); 285 eloop_exit(ctx->eloop, EXIT_FAILURE); 286 } 287 /* Notify parent it's safe to exit as we've detached. */ 288 close(sidpipe[0]); 289 if (write(sidpipe[1], &buf, 1) == -1) 290 logger(ctx, LOG_ERR, "failed to notify parent: %m"); 291 close(sidpipe[1]); 292 if ((fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { 293 dup2(fd, STDIN_FILENO); 294 dup2(fd, STDOUT_FILENO); 295 dup2(fd, STDERR_FILENO); 296 close(fd); 297 } 298 break; 299 default: 300 /* Wait for child to detach */ 301 close(sidpipe[1]); 302 if (read(sidpipe[0], &buf, 1) == -1) 303 logger(ctx, LOG_ERR, "failed to read child: %m"); 304 close(sidpipe[0]); 305 break; 306 } 307 /* Done with the fd now */ 308 if (pid != 0) { 309 logger(ctx, LOG_INFO, "forked to background, child pid %d", pid); 310 write_pid(ctx->pid_fd, pid); 311 close(ctx->pid_fd); 312 ctx->pid_fd = -1; 313 ctx->options |= DHCPCD_FORKED; 314 eloop_exit(ctx->eloop, EXIT_SUCCESS); 315 return pid; 316 } 317 ctx->options |= DHCPCD_DAEMONISED; 318 return pid; 319 #endif 320 } 321 322 static void 323 dhcpcd_drop(struct interface *ifp, int stop) 324 { 325 326 dhcp6_drop(ifp, stop ? NULL : "EXPIRE6"); 327 ipv6nd_drop(ifp); 328 ipv6_drop(ifp); 329 dhcp_drop(ifp, stop ? "STOP" : "EXPIRE"); 330 arp_close(ifp); 331 } 332 333 static void 334 stop_interface(struct interface *ifp) 335 { 336 struct dhcpcd_ctx *ctx; 337 338 ctx = ifp->ctx; 339 logger(ctx, LOG_INFO, "%s: removing interface", ifp->name); 340 ifp->options->options |= DHCPCD_STOPPING; 341 342 dhcpcd_drop(ifp, 1); 343 if (ifp->options->options & DHCPCD_DEPARTED) 344 script_runreason(ifp, "DEPARTED"); 345 else 346 script_runreason(ifp, "STOPPED"); 347 348 /* Delete all timeouts for the interfaces */ 349 eloop_q_timeout_delete(ctx->eloop, 0, NULL, ifp); 350 351 /* Remove the interface from our list */ 352 TAILQ_REMOVE(ifp->ctx->ifaces, ifp, next); 353 if_free(ifp); 354 355 if (!(ctx->options & (DHCPCD_MASTER | DHCPCD_TEST))) 356 eloop_exit(ctx->eloop, EXIT_FAILURE); 357 } 358 359 static void 360 configure_interface1(struct interface *ifp) 361 { 362 struct if_options *ifo = ifp->options; 363 int ra_global, ra_iface; 364 #ifdef INET6 365 size_t i; 366 #endif 367 368 /* Do any platform specific configuration */ 369 if_conf(ifp); 370 371 /* If we want to release a lease, we can't really persist the 372 * address either. */ 373 if (ifo->options & DHCPCD_RELEASE) 374 ifo->options &= ~DHCPCD_PERSISTENT; 375 376 if (ifp->flags & IFF_POINTOPOINT && !(ifo->options & DHCPCD_INFORM)) 377 ifo->options |= DHCPCD_STATIC; 378 if (ifp->flags & IFF_NOARP || 379 ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC)) 380 ifo->options &= ~(DHCPCD_ARP | DHCPCD_IPV4LL); 381 if (ifp->flags & (IFF_POINTOPOINT | IFF_LOOPBACK) || 382 !(ifp->flags & IFF_MULTICAST)) 383 ifo->options &= ~DHCPCD_IPV6RS; 384 385 if (ifo->metric != -1) 386 ifp->metric = (unsigned int)ifo->metric; 387 388 if (!(ifo->options & DHCPCD_IPV4)) 389 ifo->options &= ~(DHCPCD_DHCP | DHCPCD_IPV4LL); 390 391 if (!(ifo->options & DHCPCD_IPV6)) 392 ifo->options &= ~(DHCPCD_IPV6RS | DHCPCD_DHCP6); 393 394 if (ifo->options & DHCPCD_SLAACPRIVATE && 395 !(ifp->ctx->options & (DHCPCD_DUMPLEASE | DHCPCD_TEST))) 396 ifo->options |= DHCPCD_IPV6RA_OWN; 397 398 /* If we're a psuedo interface, ensure we disable as much as we can */ 399 if (ifp->options->options & DHCPCD_PFXDLGONLY) 400 ifp->options->options &= ~(DHCPCD_IPV4 | DHCPCD_IPV6RS); 401 402 /* We want to disable kernel interface RA as early as possible. */ 403 if (ifo->options & DHCPCD_IPV6RS && 404 !(ifp->ctx->options & DHCPCD_DUMPLEASE)) 405 { 406 /* If not doing any DHCP, disable the RDNSS requirement. */ 407 if (!(ifo->options & (DHCPCD_DHCP | DHCPCD_DHCP6))) 408 ifo->options &= ~DHCPCD_IPV6RA_REQRDNSS; 409 ra_global = if_checkipv6(ifp->ctx, NULL, 410 ifp->ctx->options & DHCPCD_IPV6RA_OWN ? 1 : 0); 411 ra_iface = if_checkipv6(ifp->ctx, ifp, 412 ifp->options->options & DHCPCD_IPV6RA_OWN ? 1 : 0); 413 if (ra_global == -1 || ra_iface == -1) 414 ifo->options &= ~DHCPCD_IPV6RS; 415 else if (ra_iface == 0 && 416 !(ifp->ctx->options & DHCPCD_TEST)) 417 ifo->options |= DHCPCD_IPV6RA_OWN; 418 } 419 420 /* If we haven't specified a ClientID and our hardware address 421 * length is greater than DHCP_CHADDR_LEN then we enforce a ClientID 422 * of the hardware address family and the hardware address. 423 * If there is no hardware address and no ClientID set, 424 * force a DUID based ClientID. */ 425 if (ifp->hwlen > DHCP_CHADDR_LEN) 426 ifo->options |= DHCPCD_CLIENTID; 427 else if (ifp->hwlen == 0 && !(ifo->options & DHCPCD_CLIENTID)) 428 ifo->options |= DHCPCD_CLIENTID | DHCPCD_DUID; 429 430 /* Firewire and InfiniBand interfaces require ClientID and 431 * the broadcast option being set. */ 432 switch (ifp->family) { 433 case ARPHRD_IEEE1394: /* FALLTHROUGH */ 434 case ARPHRD_INFINIBAND: 435 ifo->options |= DHCPCD_CLIENTID | DHCPCD_BROADCAST; 436 break; 437 } 438 439 if (!(ifo->options & DHCPCD_IAID)) { 440 /* 441 * An IAID is for identifying a unqiue interface within 442 * the client. It is 4 bytes long. Working out a default 443 * value is problematic. 444 * 445 * Interface name and number are not stable 446 * between different OS's. Some OS's also cannot make 447 * up their mind what the interface should be called 448 * (yes, udev, I'm looking at you). 449 * Also, the name could be longer than 4 bytes. 450 * Also, with pluggable interfaces the name and index 451 * could easily get swapped per actual interface. 452 * 453 * The MAC address is 6 bytes long, the final 3 454 * being unique to the manufacturer and the initial 3 455 * being unique to the organisation which makes it. 456 * We could use the last 4 bytes of the MAC address 457 * as the IAID as it's the most stable part given the 458 * above, but equally it's not guaranteed to be 459 * unique. 460 * 461 * Given the above, and our need to reliably work 462 * between reboots without persitent storage, 463 * generating the IAID from the MAC address is the only 464 * logical default. 465 * 466 * dhclient uses the last 4 bytes of the MAC address. 467 * dibbler uses an increamenting counter. 468 * wide-dhcpv6 uses 0 or a configured value. 469 * odhcp6c uses 1. 470 * Windows 7 uses the first 3 bytes of the MAC address 471 * and an unknown byte. 472 * dhcpcd-6.1.0 and earlier used the interface name, 473 * falling back to interface index if name > 4. 474 */ 475 if (ifp->hwlen >= sizeof(ifo->iaid)) 476 memcpy(ifo->iaid, 477 ifp->hwaddr + ifp->hwlen - sizeof(ifo->iaid), 478 sizeof(ifo->iaid)); 479 else { 480 uint32_t len; 481 482 len = (uint32_t)strlen(ifp->name); 483 if (len <= sizeof(ifo->iaid)) { 484 memcpy(ifo->iaid, ifp->name, len); 485 if (len < sizeof(ifo->iaid)) 486 memset(ifo->iaid + len, 0, 487 sizeof(ifo->iaid) - len); 488 } else { 489 /* IAID is the same size as a uint32_t */ 490 len = htonl(ifp->index); 491 memcpy(ifo->iaid, &len, sizeof(len)); 492 } 493 } 494 ifo->options |= DHCPCD_IAID; 495 } 496 497 #ifdef INET6 498 if (ifo->ia_len == 0 && ifo->options & DHCPCD_IPV6 && 499 ifp->name[0] != '\0') 500 { 501 ifo->ia = malloc(sizeof(*ifo->ia)); 502 if (ifo->ia == NULL) 503 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 504 else { 505 ifo->ia_len = 1; 506 ifo->ia->ia_type = D6_OPTION_IA_NA; 507 memcpy(ifo->ia->iaid, ifo->iaid, sizeof(ifo->iaid)); 508 memset(&ifo->ia->addr, 0, sizeof(ifo->ia->addr)); 509 ifo->ia->sla = NULL; 510 ifo->ia->sla_len = 0; 511 } 512 } else { 513 for (i = 0; i < ifo->ia_len; i++) { 514 if (!ifo->ia[i].iaid_set) { 515 memcpy(&ifo->ia[i].iaid, ifo->iaid, 516 sizeof(ifo->ia[i].iaid)); 517 ifo->ia[i].iaid_set = 1; 518 } 519 } 520 } 521 #endif 522 523 /* If we are not sending an authentication option, don't require it */ 524 if (!(ifo->auth.options & DHCPCD_AUTH_SEND)) 525 ifo->auth.options &= ~DHCPCD_AUTH_REQUIRE; 526 } 527 528 int 529 dhcpcd_selectprofile(struct interface *ifp, const char *profile) 530 { 531 struct if_options *ifo; 532 char pssid[PROFILE_LEN]; 533 534 if (ifp->ssid_len) { 535 ssize_t r; 536 537 r = print_string(pssid, sizeof(pssid), ESCSTRING, 538 ifp->ssid, ifp->ssid_len); 539 if (r == -1) { 540 logger(ifp->ctx, LOG_ERR, 541 "%s: %s: %m", ifp->name, __func__); 542 pssid[0] = '\0'; 543 } 544 } else 545 pssid[0] = '\0'; 546 ifo = read_config(ifp->ctx, ifp->name, pssid, profile); 547 if (ifo == NULL) { 548 logger(ifp->ctx, LOG_DEBUG, "%s: no profile %s", 549 ifp->name, profile); 550 return -1; 551 } 552 if (profile != NULL) { 553 strlcpy(ifp->profile, profile, sizeof(ifp->profile)); 554 logger(ifp->ctx, LOG_INFO, "%s: selected profile %s", 555 ifp->name, profile); 556 } else 557 *ifp->profile = '\0'; 558 559 free_options(ifp->options); 560 ifp->options = ifo; 561 if (profile) 562 configure_interface1(ifp); 563 return 1; 564 } 565 566 static void 567 configure_interface(struct interface *ifp, int argc, char **argv, 568 unsigned long long options) 569 { 570 time_t old; 571 572 old = ifp->options ? ifp->options->mtime : 0; 573 dhcpcd_selectprofile(ifp, NULL); 574 add_options(ifp->ctx, ifp->name, ifp->options, argc, argv); 575 ifp->options->options |= options; 576 configure_interface1(ifp); 577 578 /* If the mtime has changed drop any old lease */ 579 if (ifp->options && old != 0 && ifp->options->mtime != old) { 580 logger(ifp->ctx, LOG_WARNING, 581 "%s: confile file changed, expiring leases", ifp->name); 582 dhcpcd_drop(ifp, 0); 583 } 584 } 585 586 static void 587 dhcpcd_pollup(void *arg) 588 { 589 struct interface *ifp = arg; 590 int carrier; 591 592 carrier = if_carrier(ifp); /* will set ifp->flags */ 593 if (carrier == LINK_UP && !(ifp->flags & IFF_UP)) { 594 struct timespec tv; 595 596 tv.tv_sec = 0; 597 tv.tv_nsec = IF_POLL_UP * MSEC_PER_NSEC; 598 eloop_timeout_add_tv(ifp->ctx->eloop, &tv, dhcpcd_pollup, ifp); 599 return; 600 } 601 602 dhcpcd_handlecarrier(ifp->ctx, carrier, ifp->flags, ifp->name); 603 } 604 605 void 606 dhcpcd_handlecarrier(struct dhcpcd_ctx *ctx, int carrier, unsigned int flags, 607 const char *ifname) 608 { 609 struct interface *ifp; 610 611 ifp = if_find(ctx->ifaces, ifname); 612 if (ifp == NULL || !(ifp->options->options & DHCPCD_LINK)) 613 return; 614 615 switch(carrier) { 616 case LINK_UNKNOWN: 617 carrier = if_carrier(ifp); /* will set ifp->flags */ 618 break; 619 case LINK_UP: 620 /* we have a carrier! Still need to check for IFF_UP */ 621 if (flags & IFF_UP) 622 ifp->flags = flags; 623 else { 624 /* So we need to poll for IFF_UP as there is no 625 * kernel notification when it's set. */ 626 dhcpcd_pollup(ifp); 627 return; 628 } 629 break; 630 default: 631 ifp->flags = flags; 632 } 633 634 /* If we here, we don't need to poll for IFF_UP any longer 635 * if generated by a kernel event. */ 636 eloop_timeout_delete(ifp->ctx->eloop, dhcpcd_pollup, ifp); 637 638 if (carrier == LINK_UNKNOWN) { 639 if (errno != ENOTTY) /* For example a PPP link on BSD */ 640 logger(ctx, LOG_ERR, "%s: carrier_status: %m", ifname); 641 } else if (carrier == LINK_DOWN || (ifp->flags & IFF_UP) == 0) { 642 if (ifp->carrier != LINK_DOWN) { 643 if (ifp->carrier == LINK_UP) 644 logger(ctx, LOG_INFO, "%s: carrier lost", 645 ifp->name); 646 ifp->carrier = LINK_DOWN; 647 script_runreason(ifp, "NOCARRIER"); 648 #ifdef NOCARRIER_PRESERVE_IP 649 arp_close(ifp); 650 ipv4_buildroutes(ifp->ctx); 651 ipv6nd_expire(ifp, 0); 652 #else 653 dhcpcd_drop(ifp, 0); 654 #endif 655 } 656 } else if (carrier == LINK_UP && ifp->flags & IFF_UP) { 657 if (ifp->carrier != LINK_UP) { 658 logger(ctx, LOG_INFO, "%s: carrier acquired", 659 ifp->name); 660 ifp->carrier = LINK_UP; 661 #if !defined(__linux__) && !defined(__NetBSD__) 662 /* BSD does not emit RTM_NEWADDR or RTM_CHGADDR when the 663 * hardware address changes so we have to go 664 * through the disovery process to work it out. */ 665 dhcpcd_handleinterface(ctx, 0, ifp->name); 666 #endif 667 if (ifp->wireless) { 668 uint8_t ossid[IF_SSIDSIZE]; 669 #ifdef NOCARRIER_PRESERVE_IP 670 size_t olen; 671 672 olen = ifp->ssid_len; 673 #endif 674 memcpy(ossid, ifp->ssid, ifp->ssid_len); 675 if_getssid(ifp); 676 #ifdef NOCARRIER_PRESERVE_IP 677 /* If we changed SSID network, drop leases */ 678 if (ifp->ssid_len != olen || 679 memcmp(ifp->ssid, ossid, ifp->ssid_len)) 680 dhcpcd_drop(ifp, 0); 681 #endif 682 } 683 dhcpcd_initstate(ifp, 0); 684 script_runreason(ifp, "CARRIER"); 685 #ifdef NOCARRIER_PRESERVE_IP 686 /* Set any IPv6 Routers we remembered to expire 687 * faster than they would normally as we 688 * maybe on a new network. */ 689 ipv6nd_expire(ifp, RTR_CARRIER_EXPIRE); 690 #endif 691 /* RFC4941 Section 3.5 */ 692 if (ifp->options->options & DHCPCD_IPV6RA_OWN) 693 ipv6_gentempifid(ifp); 694 dhcpcd_startinterface(ifp); 695 } 696 } 697 } 698 699 static void 700 warn_iaid_conflict(struct interface *ifp, uint8_t *iaid) 701 { 702 struct interface *ifn; 703 size_t i; 704 705 TAILQ_FOREACH(ifn, ifp->ctx->ifaces, next) { 706 if (ifn == ifp) 707 continue; 708 if (ifn->options->options & DHCPCD_PFXDLGONLY) 709 continue; 710 if (memcmp(ifn->options->iaid, iaid, 711 sizeof(ifn->options->iaid)) == 0) 712 break; 713 for (i = 0; i < ifn->options->ia_len; i++) { 714 if (memcmp(&ifn->options->ia[i].iaid, iaid, 715 sizeof(ifn->options->ia[i].iaid)) == 0) 716 break; 717 } 718 } 719 720 /* This is only a problem if the interfaces are on the same network. */ 721 if (ifn && strcmp(ifp->name, ifn->name)) 722 logger(ifp->ctx, LOG_ERR, 723 "%s: IAID conflicts with one assigned to %s", 724 ifp->name, ifn->name); 725 } 726 727 static void 728 pre_start(struct interface *ifp) 729 { 730 731 /* Add our link-local address before upping the interface 732 * so our RFC7217 address beats the hwaddr based one. 733 * This is also a safety check incase it was ripped out 734 * from under us. */ 735 if (ifp->options->options & DHCPCD_IPV6 && ipv6_start(ifp) == -1) { 736 logger(ifp->ctx, LOG_ERR, "%s: ipv6_start: %m", ifp->name); 737 ifp->options->options &= ~DHCPCD_IPV6; 738 } 739 } 740 741 void 742 dhcpcd_startinterface(void *arg) 743 { 744 struct interface *ifp = arg; 745 struct if_options *ifo = ifp->options; 746 size_t i; 747 char buf[DUID_LEN * 3]; 748 int carrier; 749 struct timespec tv; 750 751 if (ifo->options & DHCPCD_LINK) { 752 switch (ifp->carrier) { 753 case LINK_UP: 754 break; 755 case LINK_DOWN: 756 logger(ifp->ctx, LOG_INFO, "%s: waiting for carrier", 757 ifp->name); 758 return; 759 case LINK_UNKNOWN: 760 /* No media state available. 761 * Loop until both IFF_UP and IFF_RUNNING are set */ 762 if ((carrier = if_carrier(ifp)) == LINK_UNKNOWN) { 763 tv.tv_sec = 0; 764 tv.tv_nsec = IF_POLL_UP * MSEC_PER_NSEC; 765 eloop_timeout_add_tv(ifp->ctx->eloop, 766 &tv, dhcpcd_startinterface, ifp); 767 } else 768 dhcpcd_handlecarrier(ifp->ctx, carrier, 769 ifp->flags, ifp->name); 770 return; 771 } 772 } 773 774 if (ifo->options & (DHCPCD_DUID | DHCPCD_IPV6)) { 775 /* Report client DUID */ 776 if (ifp->ctx->duid == NULL) { 777 if (duid_init(ifp) == 0) 778 return; 779 if (!(ifo->options & DHCPCD_PFXDLGONLY)) 780 logger(ifp->ctx, LOG_INFO, "DUID %s", 781 hwaddr_ntoa(ifp->ctx->duid, 782 ifp->ctx->duid_len, 783 buf, sizeof(buf))); 784 } 785 } 786 787 if (ifo->options & (DHCPCD_DUID | DHCPCD_IPV6) && 788 !(ifo->options & DHCPCD_PFXDLGONLY)) 789 { 790 /* Report IAIDs */ 791 logger(ifp->ctx, LOG_INFO, "%s: IAID %s", ifp->name, 792 hwaddr_ntoa(ifo->iaid, sizeof(ifo->iaid), 793 buf, sizeof(buf))); 794 warn_iaid_conflict(ifp, ifo->iaid); 795 for (i = 0; i < ifo->ia_len; i++) { 796 if (memcmp(ifo->iaid, ifo->ia[i].iaid, 797 sizeof(ifo->iaid))) 798 { 799 logger(ifp->ctx, LOG_INFO, "%s: IAID %s", 800 ifp->name, hwaddr_ntoa(ifo->ia[i].iaid, 801 sizeof(ifo->ia[i].iaid), 802 buf, sizeof(buf))); 803 warn_iaid_conflict(ifp, ifo->ia[i].iaid); 804 } 805 } 806 } 807 808 if (ifo->options & DHCPCD_IPV6) { 809 if (ifo->options & DHCPCD_IPV6RS && 810 !(ifo->options & DHCPCD_INFORM)) 811 ipv6nd_startrs(ifp); 812 813 if (ifo->options & DHCPCD_DHCP6) 814 dhcp6_find_delegates(ifp); 815 816 if (!(ifo->options & DHCPCD_IPV6RS) || 817 ifo->options & DHCPCD_IA_FORCED) 818 { 819 ssize_t nolease; 820 821 if (ifo->options & DHCPCD_IA_FORCED) 822 nolease = dhcp6_start(ifp, DH6S_INIT); 823 else { 824 nolease = 0; 825 /* Enabling the below doesn't really make 826 * sense as there is currently no standard 827 * to push routes via DHCPv6. 828 * (There is an expired working draft, 829 * maybe abandoned?) 830 * You can also get it to work by forcing 831 * an IA as shown above. */ 832 #if 0 833 /* With no RS or delegates we might 834 * as well try and solicit a DHCPv6 address */ 835 if (nolease == 0) 836 nolease = dhcp6_start(ifp, DH6S_INIT); 837 #endif 838 } 839 if (nolease == -1) 840 logger(ifp->ctx, LOG_ERR, 841 "%s: dhcp6_start: %m", ifp->name); 842 } 843 } 844 845 if (ifo->options & DHCPCD_IPV4) 846 dhcp_start(ifp); 847 } 848 849 static void 850 dhcpcd_prestartinterface(void *arg) 851 { 852 struct interface *ifp = arg; 853 854 pre_start(ifp); 855 if (if_up(ifp) == -1) 856 logger(ifp->ctx, LOG_ERR, "%s: if_up: %m", ifp->name); 857 858 if (ifp->options->options & DHCPCD_LINK && 859 ifp->carrier == LINK_UNKNOWN) 860 { 861 int carrier; 862 863 if ((carrier = if_carrier(ifp)) != LINK_UNKNOWN) { 864 dhcpcd_handlecarrier(ifp->ctx, carrier, 865 ifp->flags, ifp->name); 866 return; 867 } 868 logger(ifp->ctx, LOG_INFO, 869 "%s: unknown carrier, waiting for interface flags", 870 ifp->name); 871 } 872 873 dhcpcd_startinterface(ifp); 874 } 875 876 static void 877 handle_link(void *arg) 878 { 879 struct dhcpcd_ctx *ctx; 880 881 ctx = arg; 882 if (if_managelink(ctx) == -1) { 883 logger(ctx, LOG_ERR, "if_managelink: %m"); 884 eloop_event_delete(ctx->eloop, ctx->link_fd, 0); 885 close(ctx->link_fd); 886 ctx->link_fd = -1; 887 } 888 } 889 890 static void 891 dhcpcd_initstate1(struct interface *ifp, int argc, char **argv, 892 unsigned long long options) 893 { 894 struct if_options *ifo; 895 896 configure_interface(ifp, argc, argv, options); 897 ifo = ifp->options; 898 899 if (ifo->options & DHCPCD_IPV4 && ipv4_init(ifp->ctx) == -1) { 900 logger(ifp->ctx, LOG_ERR, "ipv4_init: %m"); 901 ifo->options &= ~DHCPCD_IPV4; 902 } 903 if (ifo->options & DHCPCD_IPV6 && ipv6_init(ifp->ctx) == NULL) { 904 logger(ifp->ctx, LOG_ERR, "ipv6_init: %m"); 905 ifo->options &= ~DHCPCD_IPV6RS; 906 } 907 908 /* Add our link-local address before upping the interface 909 * so our RFC7217 address beats the hwaddr based one. 910 * This needs to happen before PREINIT incase a hook script 911 * inadvertently ups the interface. */ 912 if (ifo->options & DHCPCD_IPV6 && ipv6_start(ifp) == -1) { 913 logger(ifp->ctx, LOG_ERR, "%s: ipv6_start: %m", ifp->name); 914 ifo->options &= ~DHCPCD_IPV6; 915 } 916 } 917 918 void 919 dhcpcd_initstate(struct interface *ifp, unsigned long long options) 920 { 921 922 dhcpcd_initstate1(ifp, ifp->ctx->argc, ifp->ctx->argv, options); 923 } 924 925 static void 926 run_preinit(struct interface *ifp) 927 { 928 929 pre_start(ifp); 930 if (ifp->ctx->options & DHCPCD_TEST) 931 return; 932 933 script_runreason(ifp, "PREINIT"); 934 935 if (ifp->options->options & DHCPCD_LINK && ifp->carrier != LINK_UNKNOWN) 936 script_runreason(ifp, 937 ifp->carrier == LINK_UP ? "CARRIER" : "NOCARRIER"); 938 } 939 940 int 941 dhcpcd_handleinterface(void *arg, int action, const char *ifname) 942 { 943 struct dhcpcd_ctx *ctx; 944 struct if_head *ifs; 945 struct interface *ifp, *iff, *ifn; 946 const char * const argv[] = { ifname }; 947 int i; 948 949 ctx = arg; 950 if (action == -1) { 951 ifp = if_find(ctx->ifaces, ifname); 952 if (ifp == NULL) { 953 errno = ESRCH; 954 return -1; 955 } 956 logger(ctx, LOG_DEBUG, "%s: interface departed", ifp->name); 957 ifp->options->options |= DHCPCD_DEPARTED; 958 stop_interface(ifp); 959 return 0; 960 } 961 962 /* If running off an interface list, check it's in it. */ 963 if (ctx->ifc && action != 2) { 964 for (i = 0; i < ctx->ifc; i++) 965 if (strcmp(ctx->ifv[i], ifname) == 0) 966 break; 967 if (i >= ctx->ifc) 968 return 0; 969 } 970 971 i = -1; 972 ifs = if_discover(ctx, -1, UNCONST(argv)); 973 if (ifs == NULL) { 974 logger(ctx, LOG_ERR, "%s: if_discover: %m", __func__); 975 return -1; 976 } 977 TAILQ_FOREACH_SAFE(ifp, ifs, next, ifn) { 978 if (strcmp(ifp->name, ifname) != 0) 979 continue; 980 i = 0; 981 /* Check if we already have the interface */ 982 iff = if_find(ctx->ifaces, ifp->name); 983 if (iff) { 984 logger(ctx, LOG_DEBUG, "%s: interface updated", iff->name); 985 /* The flags and hwaddr could have changed */ 986 iff->flags = ifp->flags; 987 iff->hwlen = ifp->hwlen; 988 if (ifp->hwlen != 0) 989 memcpy(iff->hwaddr, ifp->hwaddr, iff->hwlen); 990 } else { 991 logger(ctx, LOG_DEBUG, "%s: interface added", ifp->name); 992 TAILQ_REMOVE(ifs, ifp, next); 993 TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next); 994 dhcpcd_initstate(ifp, 0); 995 run_preinit(ifp); 996 iff = ifp; 997 } 998 if (action > 0) 999 dhcpcd_prestartinterface(iff); 1000 } 1001 1002 /* Free our discovered list */ 1003 while ((ifp = TAILQ_FIRST(ifs))) { 1004 TAILQ_REMOVE(ifs, ifp, next); 1005 if_free(ifp); 1006 } 1007 free(ifs); 1008 1009 if (i == -1) 1010 errno = ENOENT; 1011 return i; 1012 } 1013 1014 void 1015 dhcpcd_handlehwaddr(struct dhcpcd_ctx *ctx, const char *ifname, 1016 const uint8_t *hwaddr, uint8_t hwlen) 1017 { 1018 struct interface *ifp; 1019 char buf[sizeof(ifp->hwaddr) * 3]; 1020 1021 ifp = if_find(ctx->ifaces, ifname); 1022 if (ifp == NULL) 1023 return; 1024 1025 if (hwlen > sizeof(ifp->hwaddr)) { 1026 errno = ENOBUFS; 1027 logger(ctx, LOG_ERR, "%s: %s: %m", ifp->name, __func__); 1028 return; 1029 } 1030 1031 if (ifp->hwlen == hwlen && memcmp(ifp->hwaddr, hwaddr, hwlen) == 0) 1032 return; 1033 1034 logger(ctx, LOG_INFO, "%s: new hardware address: %s", ifp->name, 1035 hwaddr_ntoa(hwaddr, hwlen, buf, sizeof(buf))); 1036 ifp->hwlen = hwlen; 1037 memcpy(ifp->hwaddr, hwaddr, hwlen); 1038 } 1039 1040 void 1041 dhcpcd_start_interface(struct dhcpcd_ctx *ctx, const char *ifname) 1042 { 1043 struct interface *ifp; 1044 ifp = if_find(ctx->ifaces, ifname); 1045 if (ifp == NULL) 1046 { 1047 logger(ctx, LOG_ERR, "start_interface: %s not found", 1048 ifname); 1049 return; 1050 } 1051 dhcpcd_startinterface(ifp); 1052 } 1053 1054 void 1055 dhcpcd_stop_interface(struct dhcpcd_ctx *ctx, const char *ifname) 1056 { 1057 struct interface *ifp; 1058 ifp = if_find(ctx->ifaces, ifname); 1059 if (ifp == NULL) 1060 { 1061 logger(ctx, LOG_ERR, "stop_interface: %s not found", 1062 ifname); 1063 return; 1064 } 1065 stop_interface(ifp); 1066 } 1067 1068 void 1069 dhcpcd_stop_interfaces(struct dhcpcd_ctx *ctx) 1070 { 1071 struct interface *ifp; 1072 TAILQ_FOREACH(ifp, ctx->ifaces, next) { 1073 stop_interface(ifp); 1074 } 1075 } 1076 1077 void 1078 dhcpcd_release_ipv4(struct dhcpcd_ctx *ctx, const char *ifname) 1079 { 1080 struct interface *ifp; 1081 1082 ifp = if_find(ctx->ifaces, ifname); 1083 if (ifp == NULL) 1084 { 1085 logger(ctx, LOG_ERR, "IPv4 release: %s not found", 1086 ifname); 1087 return; 1088 } 1089 dhcp_drop(ifp, "RELEASE"); 1090 } 1091 1092 static void 1093 if_reboot(struct interface *ifp, int argc, char **argv) 1094 { 1095 unsigned long long oldopts; 1096 1097 oldopts = ifp->options->options; 1098 script_runreason(ifp, "RECONFIGURE"); 1099 dhcpcd_initstate1(ifp, argc, argv, 0); 1100 dhcp_reboot_newopts(ifp, oldopts); 1101 dhcp6_reboot(ifp); 1102 dhcpcd_prestartinterface(ifp); 1103 } 1104 1105 static void 1106 reload_config(struct dhcpcd_ctx *ctx) 1107 { 1108 struct if_options *ifo; 1109 1110 free_globals(ctx); 1111 ifo = read_config(ctx, NULL, NULL, NULL); 1112 add_options(ctx, NULL, ifo, ctx->argc, ctx->argv); 1113 /* We need to preserve these two options. */ 1114 if (ctx->options & DHCPCD_MASTER) 1115 ifo->options |= DHCPCD_MASTER; 1116 if (ctx->options & DHCPCD_DAEMONISED) 1117 ifo->options |= DHCPCD_DAEMONISED; 1118 ctx->options = ifo->options; 1119 free_options(ifo); 1120 } 1121 1122 static void 1123 reconf_reboot(struct dhcpcd_ctx *ctx, int action, int argc, char **argv, int oi) 1124 { 1125 struct if_head *ifs; 1126 struct interface *ifn, *ifp; 1127 1128 ifs = if_discover(ctx, argc - oi, argv + oi); 1129 if (ifs == NULL) { 1130 logger(ctx, LOG_ERR, "%s: if_discover: %m", __func__); 1131 return; 1132 } 1133 1134 while ((ifp = TAILQ_FIRST(ifs))) { 1135 TAILQ_REMOVE(ifs, ifp, next); 1136 ifn = if_find(ctx->ifaces, ifp->name); 1137 if (ifn) { 1138 if (action) 1139 if_reboot(ifn, argc, argv); 1140 else 1141 ipv4_applyaddr(ifn); 1142 if_free(ifp); 1143 } else { 1144 TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next); 1145 dhcpcd_initstate1(ifp, argc, argv, 0); 1146 run_preinit(ifp); 1147 dhcpcd_prestartinterface(ifp); 1148 } 1149 } 1150 free(ifs); 1151 } 1152 1153 static void 1154 stop_all_interfaces(struct dhcpcd_ctx *ctx, int do_release) 1155 { 1156 struct interface *ifp; 1157 1158 /* drop_dhcp could change the order, so we do it like this. */ 1159 for (;;) { 1160 /* Be sane and drop the last config first, 1161 * skipping any pseudo interfaces */ 1162 TAILQ_FOREACH_REVERSE(ifp, ctx->ifaces, if_head, next) { 1163 if (!(ifp->options->options & DHCPCD_PFXDLGONLY)) 1164 break; 1165 } 1166 if (ifp == NULL) 1167 break; 1168 if (do_release) { 1169 ifp->options->options |= DHCPCD_RELEASE; 1170 ifp->options->options &= ~DHCPCD_PERSISTENT; 1171 } 1172 ifp->options->options |= DHCPCD_EXITING; 1173 stop_interface(ifp); 1174 } 1175 } 1176 1177 #ifdef USE_SIGNALS 1178 struct dhcpcd_siginfo dhcpcd_siginfo; 1179 #define sigmsg "received %s, %s" 1180 void 1181 dhcpcd_handle_signal(void *arg) 1182 { 1183 struct dhcpcd_ctx *ctx; 1184 struct dhcpcd_siginfo *si; 1185 struct interface *ifp; 1186 int do_release, exit_code;; 1187 1188 ctx = dhcpcd_ctx; 1189 si = arg; 1190 do_release = 0; 1191 exit_code = EXIT_FAILURE; 1192 switch (si->signo) { 1193 case SIGINT: 1194 logger(ctx, LOG_INFO, sigmsg, "SIGINT", "stopping"); 1195 break; 1196 case SIGTERM: 1197 logger(ctx, LOG_INFO, sigmsg, "SIGTERM", "stopping"); 1198 exit_code = EXIT_SUCCESS; 1199 break; 1200 case SIGALRM: 1201 logger(ctx, LOG_INFO, sigmsg, "SIGALRM", "releasing"); 1202 do_release = 1; 1203 exit_code = EXIT_SUCCESS; 1204 break; 1205 case SIGHUP: 1206 logger(ctx, LOG_INFO, sigmsg, "SIGHUP", "rebinding"); 1207 reload_config(ctx); 1208 /* Preserve any options passed on the commandline 1209 * when we were started. */ 1210 reconf_reboot(ctx, 1, ctx->argc, ctx->argv, 1211 ctx->argc - ctx->ifc); 1212 return; 1213 case SIGUSR1: 1214 logger(ctx, LOG_INFO, sigmsg, "SIGUSR1", "reconfiguring"); 1215 TAILQ_FOREACH(ifp, ctx->ifaces, next) { 1216 ipv4_applyaddr(ifp); 1217 } 1218 return; 1219 case SIGUSR2: 1220 logger_close(ctx); 1221 logger_open(ctx); 1222 logger(ctx, LOG_INFO, sigmsg, "SIGUSR2", "reopened logfile"); 1223 return; 1224 case SIGPIPE: 1225 logger(ctx, LOG_WARNING, "received SIGPIPE"); 1226 return; 1227 default: 1228 logger(ctx, LOG_ERR, 1229 "received signal %d, " 1230 "but don't know what to do with it", 1231 si->signo); 1232 return; 1233 } 1234 1235 if (!(ctx->options & DHCPCD_TEST)) 1236 stop_all_interfaces(ctx, do_release); 1237 eloop_exit(ctx->eloop, exit_code); 1238 } 1239 1240 #ifndef HAVE_KQUEUE 1241 static void 1242 handle_signal(int sig, __unused siginfo_t *siginfo, __unused void *context) 1243 { 1244 1245 /* So that we can operate safely under a signal we instruct 1246 * eloop to pass a copy of the siginfo structure to handle_signal1 1247 * as the very first thing to do. */ 1248 dhcpcd_siginfo.signo = sig; 1249 eloop_timeout_add_now(dhcpcd_ctx->eloop, 1250 dhcpcd_handle_signal, &dhcpcd_siginfo); 1251 } 1252 #endif 1253 1254 static int 1255 signal_init(sigset_t *oldset) 1256 { 1257 sigset_t newset; 1258 #ifndef HAVE_KQUEUE 1259 int i; 1260 struct sigaction sa; 1261 #endif 1262 1263 sigfillset(&newset); 1264 if (sigprocmask(SIG_SETMASK, &newset, oldset) == -1) 1265 return -1; 1266 1267 #ifndef HAVE_KQUEUE 1268 memset(&sa, 0, sizeof(sa)); 1269 sa.sa_sigaction = handle_signal; 1270 sa.sa_flags = SA_SIGINFO; 1271 sigemptyset(&sa.sa_mask); 1272 1273 for (i = 0; dhcpcd_handlesigs[i]; i++) { 1274 if (sigaction(dhcpcd_handlesigs[i], &sa, NULL) == -1) 1275 return -1; 1276 } 1277 #endif 1278 return 0; 1279 } 1280 #endif 1281 1282 static void 1283 dhcpcd_getinterfaces(void *arg) 1284 { 1285 struct fd_list *fd = arg; 1286 struct interface *ifp; 1287 size_t len; 1288 1289 len = 0; 1290 TAILQ_FOREACH(ifp, fd->ctx->ifaces, next) { 1291 len++; 1292 if (D_STATE_RUNNING(ifp)) 1293 len++; 1294 if (RS_STATE_RUNNING(ifp)) 1295 len++; 1296 if (D6_STATE_RUNNING(ifp)) 1297 len++; 1298 } 1299 if (write(fd->fd, &len, sizeof(len)) != sizeof(len)) 1300 return; 1301 eloop_event_delete(fd->ctx->eloop, fd->fd, 1); 1302 TAILQ_FOREACH(ifp, fd->ctx->ifaces, next) { 1303 if (send_interface(fd, ifp) == -1) 1304 logger(ifp->ctx, LOG_ERR, 1305 "send_interface %d: %m", fd->fd); 1306 } 1307 } 1308 1309 int 1310 dhcpcd_handleargs(struct dhcpcd_ctx *ctx, struct fd_list *fd, 1311 int argc, char **argv) 1312 { 1313 struct interface *ifp; 1314 int do_exit = 0, do_release = 0, do_reboot = 0; 1315 int opt, oi = 0; 1316 size_t len, l; 1317 char *tmp, *p; 1318 1319 /* Special commands for our control socket 1320 * as the other end should be blocking until it gets the 1321 * expected reply we should be safely able just to change the 1322 * write callback on the fd */ 1323 if (strcmp(*argv, "--version") == 0) { 1324 return control_queue(fd, UNCONST(VERSION), 1325 strlen(VERSION) + 1, 0); 1326 } else if (strcmp(*argv, "--getconfigfile") == 0) { 1327 return control_queue(fd, UNCONST(fd->ctx->cffile), 1328 strlen(fd->ctx->cffile) + 1, 0); 1329 } else if (strcmp(*argv, "--getinterfaces") == 0) { 1330 eloop_event_add(fd->ctx->eloop, fd->fd, NULL, NULL, 1331 dhcpcd_getinterfaces, fd); 1332 return 0; 1333 } else if (strcmp(*argv, "--listen") == 0) { 1334 fd->flags |= FD_LISTEN; 1335 return 0; 1336 } 1337 1338 /* Only priviledged users can control dhcpcd via the socket. */ 1339 if (fd->flags & FD_UNPRIV) { 1340 errno = EPERM; 1341 return -1; 1342 } 1343 1344 /* Log the command */ 1345 len = 1; 1346 for (opt = 0; opt < argc; opt++) 1347 len += strlen(argv[opt]) + 1; 1348 tmp = malloc(len); 1349 if (tmp == NULL) 1350 return -1; 1351 p = tmp; 1352 for (opt = 0; opt < argc; opt++) { 1353 l = strlen(argv[opt]); 1354 strlcpy(p, argv[opt], len); 1355 len -= l + 1; 1356 p += l; 1357 *p++ = ' '; 1358 } 1359 *--p = '\0'; 1360 logger(ctx, LOG_INFO, "control command: %s", tmp); 1361 free(tmp); 1362 1363 optind = 0; 1364 while ((opt = getopt_long(argc, argv, IF_OPTS, cf_options, &oi)) != -1) 1365 { 1366 switch (opt) { 1367 case 'g': 1368 /* Assumed if below not set */ 1369 break; 1370 case 'k': 1371 do_release = 1; 1372 break; 1373 case 'n': 1374 do_reboot = 1; 1375 break; 1376 case 'x': 1377 do_exit = 1; 1378 break; 1379 } 1380 } 1381 1382 if (do_release || do_exit) { 1383 if (optind == argc) { 1384 stop_all_interfaces(ctx, do_release); 1385 eloop_exit(ctx->eloop, EXIT_SUCCESS); 1386 return 0; 1387 } 1388 for (oi = optind; oi < argc; oi++) { 1389 if ((ifp = if_find(ctx->ifaces, argv[oi])) == NULL) 1390 continue; 1391 if (do_release) { 1392 ifp->options->options |= DHCPCD_RELEASE; 1393 ifp->options->options &= ~DHCPCD_PERSISTENT; 1394 } 1395 ifp->options->options |= DHCPCD_EXITING; 1396 stop_interface(ifp); 1397 } 1398 return 0; 1399 } 1400 1401 reload_config(ctx); 1402 /* XXX: Respect initial commandline options? */ 1403 reconf_reboot(ctx, do_reboot, argc, argv, optind); 1404 return 0; 1405 } 1406 1407 #if defined(__ANDROID__) 1408 static void 1409 switch_user(void) 1410 { 1411 gid_t groups[] = { AID_DBUS, AID_INET, AID_SHELL }; 1412 struct __user_cap_header_struct header; 1413 struct __user_cap_data_struct cap; 1414 1415 setgroups(sizeof(groups)/sizeof(groups[0]), groups); 1416 1417 prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); 1418 1419 setgid(AID_DHCP); 1420 setuid(AID_DHCP); 1421 header.version = _LINUX_CAPABILITY_VERSION; 1422 header.pid = 0; 1423 cap.effective = cap.permitted = 1424 (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) | 1425 (1 << CAP_NET_BROADCAST) | (1 << CAP_NET_BIND_SERVICE); 1426 cap.inheritable = 0; 1427 capset(&header, &cap); 1428 } 1429 #endif /* __ANDROID__ */ 1430 1431 int 1432 main(int argc, char **argv) 1433 { 1434 struct dhcpcd_ctx ctx; 1435 struct if_options *ifo; 1436 struct interface *ifp; 1437 uint16_t family = 0; 1438 int opt, oi = 0, i; 1439 time_t t; 1440 ssize_t len; 1441 #if defined(USE_SIGNALS) || !defined(THERE_IS_NO_FORK) 1442 pid_t pid; 1443 #endif 1444 #ifdef USE_SIGNALS 1445 int sig; 1446 const char *siga; 1447 #endif 1448 char ifn[IF_NAMESIZE]; 1449 1450 #if defined(__ANDROID__) && !defined(__BRILLO__) 1451 switch_user(); 1452 #endif /* __ANDROID__ && !__BRILLO__ */ 1453 1454 /* Test for --help and --version */ 1455 if (argc > 1) { 1456 if (strcmp(argv[1], "--help") == 0) { 1457 usage(); 1458 return EXIT_SUCCESS; 1459 } else if (strcmp(argv[1], "--version") == 0) { 1460 printf(""PACKAGE" "VERSION"\n%s\n", dhcpcd_copyright); 1461 return EXIT_SUCCESS; 1462 } 1463 } 1464 1465 memset(&ctx, 0, sizeof(ctx)); 1466 #ifdef USE_SIGNALS 1467 dhcpcd_ctx = &ctx; 1468 sig = 0; 1469 siga = NULL; 1470 #endif 1471 closefrom(3); 1472 1473 ctx.log_fd = -1; 1474 logger_open(&ctx); 1475 logger_mask(&ctx, LOG_UPTO(LOG_INFO)); 1476 1477 ifo = NULL; 1478 ctx.cffile = CONFIG; 1479 ctx.pid_fd = ctx.control_fd = ctx.control_unpriv_fd = ctx.link_fd = -1; 1480 TAILQ_INIT(&ctx.control_fds); 1481 #ifdef PLUGIN_DEV 1482 ctx.dev_fd = -1; 1483 #endif 1484 #ifdef INET 1485 ctx.udp_fd = -1; 1486 #endif 1487 i = 0; 1488 while ((opt = getopt_long(argc, argv, IF_OPTS, cf_options, &oi)) != -1) 1489 { 1490 switch (opt) { 1491 case '4': 1492 family = AF_INET; 1493 break; 1494 case '6': 1495 family = AF_INET6; 1496 break; 1497 case 'f': 1498 ctx.cffile = optarg; 1499 break; 1500 #ifdef USE_SIGNALS 1501 case 'g': 1502 sig = SIGUSR1; 1503 siga = "USR1"; 1504 break; 1505 case 'j': 1506 ctx.logfile = strdup(optarg); 1507 logger_close(&ctx); 1508 logger_open(&ctx); 1509 break; 1510 case 'k': 1511 sig = SIGALRM; 1512 siga = "ARLM"; 1513 break; 1514 case 'n': 1515 sig = SIGHUP; 1516 siga = "HUP"; 1517 break; 1518 case 'x': 1519 sig = SIGTERM; 1520 siga = "TERM";; 1521 break; 1522 #endif 1523 case 'T': 1524 i = 1; 1525 break; 1526 case 'U': 1527 if (i == 3) 1528 i = 4; 1529 else if (i != 4) 1530 i = 3; 1531 break; 1532 case 'V': 1533 i = 2; 1534 break; 1535 case '?': 1536 usage(); 1537 goto exit_failure; 1538 } 1539 } 1540 1541 ctx.argv = argv; 1542 ctx.argc = argc; 1543 ctx.ifc = argc - optind; 1544 ctx.ifv = argv + optind; 1545 1546 ifo = read_config(&ctx, NULL, NULL, NULL); 1547 if (ifo == NULL) 1548 goto exit_failure; 1549 opt = add_options(&ctx, NULL, ifo, argc, argv); 1550 if (opt != 1) { 1551 if (opt == 0) 1552 usage(); 1553 goto exit_failure; 1554 } 1555 if (i == 2) { 1556 printf("Interface options:\n"); 1557 if (optind == argc - 1) { 1558 free_options(ifo); 1559 ifo = read_config(&ctx, argv[optind], NULL, NULL); 1560 if (ifo == NULL) 1561 goto exit_failure; 1562 add_options(&ctx, NULL, ifo, argc, argv); 1563 } 1564 if_printoptions(); 1565 #ifdef INET 1566 if (family == 0 || family == AF_INET) { 1567 printf("\nDHCPv4 options:\n"); 1568 dhcp_printoptions(&ctx, 1569 ifo->dhcp_override, ifo->dhcp_override_len); 1570 } 1571 #endif 1572 #ifdef INET6 1573 if (family == 0 || family == AF_INET6) { 1574 printf("\nDHCPv6 options:\n"); 1575 dhcp6_printoptions(&ctx, 1576 ifo->dhcp6_override, ifo->dhcp6_override_len); 1577 } 1578 #endif 1579 goto exit_success; 1580 } 1581 ctx.options = ifo->options; 1582 if (i != 0) { 1583 if (i == 1) 1584 ctx.options |= DHCPCD_TEST; 1585 else 1586 ctx.options |= DHCPCD_DUMPLEASE; 1587 if (i == 4) 1588 ctx.options |= DHCPCD_PFXDLGONLY; 1589 ctx.options |= DHCPCD_PERSISTENT; 1590 ctx.options &= ~DHCPCD_DAEMONISE; 1591 } 1592 1593 #ifdef THERE_IS_NO_FORK 1594 ctx.options &= ~DHCPCD_DAEMONISE; 1595 #endif 1596 1597 if (ctx.options & DHCPCD_DEBUG) 1598 logger_mask(&ctx, LOG_UPTO(LOG_DEBUG)); 1599 if (ctx.options & DHCPCD_QUIET) { 1600 i = open(_PATH_DEVNULL, O_RDWR); 1601 if (i == -1) 1602 logger(&ctx, LOG_ERR, "%s: open: %m", __func__); 1603 else { 1604 dup2(i, STDERR_FILENO); 1605 close(i); 1606 } 1607 } 1608 1609 if (!(ctx.options & (DHCPCD_TEST | DHCPCD_DUMPLEASE))) { 1610 /* If we have any other args, we should run as a single dhcpcd 1611 * instance for that interface. */ 1612 if (optind == argc - 1 && !(ctx.options & DHCPCD_MASTER)) { 1613 const char *per; 1614 int intf_len = strlen(argv[optind]); 1615 split_interface_lease(argv[optind], &intf_len, NULL); 1616 if (intf_len > IF_NAMESIZE) { 1617 logger(&ctx, LOG_ERR, 1618 "%s: interface name too long", 1619 argv[optind]); 1620 goto exit_failure; 1621 } 1622 strlcpy(ifn, argv[optind], intf_len + 1); 1623 /* Allow a dhcpcd interface per address family */ 1624 switch(family) { 1625 case AF_INET: 1626 per = "-4"; 1627 break; 1628 case AF_INET6: 1629 per = "-6"; 1630 break; 1631 default: 1632 per = ""; 1633 } 1634 snprintf(ctx.pidfile, sizeof(ctx.pidfile), 1635 PIDFILE, "-", ifn, per); 1636 } else { 1637 snprintf(ctx.pidfile, sizeof(ctx.pidfile), 1638 PIDFILE, "", "", ""); 1639 ctx.options |= DHCPCD_MASTER; 1640 } 1641 } 1642 1643 if (chdir("/") == -1) 1644 logger(&ctx, LOG_ERR, "chdir `/': %m"); 1645 1646 /* Freeing allocated addresses from dumping leases can trigger 1647 * eloop removals as well, so init here. */ 1648 ctx.eloop = eloop_init(&ctx); 1649 if (ctx.eloop == NULL) { 1650 logger(&ctx, LOG_ERR, "%s: eloop_init: %m", __func__); 1651 goto exit_failure; 1652 } 1653 1654 if (ctx.options & DHCPCD_DUMPLEASE) { 1655 if (optind != argc - 1) { 1656 logger(&ctx, LOG_ERR, 1657 "dumplease requires an interface"); 1658 goto exit_failure; 1659 } 1660 i = 0; 1661 /* We need to try and find the interface so we can 1662 * load the hardware address to compare automated IAID */ 1663 ctx.ifaces = if_discover(&ctx, 1, argv + optind); 1664 if (ctx.ifaces == NULL) { 1665 logger(&ctx, LOG_ERR, "if_discover: %m"); 1666 goto exit_failure; 1667 } 1668 ifp = TAILQ_FIRST(ctx.ifaces); 1669 if (ifp == NULL) { 1670 ifp = calloc(1, sizeof(*ifp)); 1671 if (ifp == NULL) { 1672 logger(&ctx, LOG_ERR, "%s: %m", __func__); 1673 goto exit_failure; 1674 } 1675 strlcpy(ctx.pidfile, argv[optind], sizeof(ctx.pidfile)); 1676 ifp->ctx = &ctx; 1677 TAILQ_INSERT_HEAD(ctx.ifaces, ifp, next); 1678 if (family == 0) { 1679 if (ctx.pidfile[strlen(ctx.pidfile) - 1] == '6') 1680 family = AF_INET6; 1681 else 1682 family = AF_INET; 1683 } 1684 } 1685 configure_interface(ifp, ctx.argc, ctx.argv, 0); 1686 if (ctx.options & DHCPCD_PFXDLGONLY) 1687 ifp->options->options |= DHCPCD_PFXDLGONLY; 1688 if (family == 0 || family == AF_INET) { 1689 if (dhcp_dump(ifp) == -1) 1690 i = 1; 1691 } 1692 if (family == 0 || family == AF_INET6) { 1693 if (dhcp6_dump(ifp) == -1) 1694 i = 1; 1695 } 1696 if (i == -1) 1697 goto exit_failure; 1698 goto exit_success; 1699 } 1700 1701 #ifdef USE_SIGNALS 1702 if (!(ctx.options & DHCPCD_TEST) && 1703 (sig == 0 || ctx.ifc != 0)) 1704 { 1705 #endif 1706 if (ctx.options & DHCPCD_MASTER) 1707 i = -1; 1708 else 1709 i = control_open(&ctx, argv[optind]); 1710 if (i == -1) 1711 i = control_open(&ctx, NULL); 1712 if (i != -1) { 1713 logger(&ctx, LOG_INFO, 1714 "sending commands to master dhcpcd process"); 1715 len = control_send(&ctx, argc, argv); 1716 control_close(&ctx); 1717 if (len > 0) { 1718 logger(&ctx, LOG_DEBUG, "send OK"); 1719 goto exit_success; 1720 } else { 1721 logger(&ctx, LOG_ERR, 1722 "failed to send commands"); 1723 goto exit_failure; 1724 } 1725 } else { 1726 if (errno != ENOENT) 1727 logger(&ctx, LOG_ERR, "control_open: %m"); 1728 } 1729 #ifdef USE_SIGNALS 1730 } 1731 #endif 1732 1733 if (geteuid()) 1734 logger(&ctx, LOG_NOTICE, 1735 PACKAGE " is running with reduced privileges"); 1736 1737 #ifdef USE_SIGNALS 1738 if (sig != 0) { 1739 pid = read_pid(ctx.pidfile); 1740 if (pid != 0) 1741 logger(&ctx, LOG_INFO, "sending signal %s to pid %d", 1742 siga, pid); 1743 if (pid == 0 || kill(pid, sig) != 0) { 1744 if (sig != SIGHUP && errno != EPERM) 1745 logger(&ctx, LOG_ERR, ""PACKAGE" not running"); 1746 if (pid != 0 && errno != ESRCH) { 1747 logger(&ctx, LOG_ERR, "kill: %m"); 1748 goto exit_failure; 1749 } 1750 unlink(ctx.pidfile); 1751 if (sig != SIGHUP) 1752 goto exit_failure; 1753 } else { 1754 struct timespec ts; 1755 1756 if (sig == SIGHUP || sig == SIGUSR1) 1757 goto exit_success; 1758 /* Spin until it exits */ 1759 logger(&ctx, LOG_INFO, 1760 "waiting for pid %d to exit", pid); 1761 ts.tv_sec = 0; 1762 ts.tv_nsec = 100000000; /* 10th of a second */ 1763 for(i = 0; i < 100; i++) { 1764 nanosleep(&ts, NULL); 1765 if (read_pid(ctx.pidfile) == 0) 1766 goto exit_success; 1767 } 1768 logger(&ctx, LOG_ERR, "pid %d failed to exit", pid); 1769 goto exit_failure; 1770 } 1771 } 1772 1773 if (!(ctx.options & DHCPCD_TEST)) { 1774 if ((pid = read_pid(ctx.pidfile)) > 0 && 1775 kill(pid, 0) == 0) 1776 { 1777 logger(&ctx, LOG_ERR, ""PACKAGE 1778 " already running on pid %d (%s)", 1779 pid, ctx.pidfile); 1780 goto exit_failure; 1781 } 1782 1783 #if !defined(__ANDROID__) 1784 /* Ensure we have the needed directories 1785 * On Android, we assume that these directories have been created 1786 * by calls to mkdir in an init.rc file. */ 1787 if (mkdir(RUNDIR, 0755) == -1 && errno != EEXIST) 1788 logger(&ctx, LOG_ERR, "mkdir `%s': %m", RUNDIR); 1789 if (mkdir(DBDIR, 0755) == -1 && errno != EEXIST) 1790 logger(&ctx, LOG_ERR, "mkdir `%s': %m", DBDIR); 1791 #endif /* __ANDROID__ */ 1792 1793 opt = O_WRONLY | O_CREAT | O_NONBLOCK; 1794 #ifdef O_CLOEXEC 1795 opt |= O_CLOEXEC; 1796 #endif 1797 ctx.pid_fd = open(ctx.pidfile, opt, 0664); 1798 if (ctx.pid_fd == -1) 1799 logger(&ctx, LOG_ERR, "open `%s': %m", ctx.pidfile); 1800 else { 1801 #ifdef LOCK_EX 1802 /* Lock the file so that only one instance of dhcpcd 1803 * runs on an interface */ 1804 if (flock(ctx.pid_fd, LOCK_EX | LOCK_NB) == -1) { 1805 logger(&ctx, LOG_ERR, "flock `%s': %m", ctx.pidfile); 1806 close(ctx.pid_fd); 1807 ctx.pid_fd = -1; 1808 goto exit_failure; 1809 } 1810 #endif 1811 #ifndef O_CLOEXEC 1812 if (fcntl(ctx.pid_fd, F_GETFD, &opt) == -1 || 1813 fcntl(ctx.pid_fd, F_SETFD, opt | FD_CLOEXEC) == -1) 1814 { 1815 logger(&ctx, LOG_ERR, "fcntl: %m"); 1816 close(ctx.pid_fd); 1817 ctx.pid_fd = -1; 1818 goto exit_failure; 1819 } 1820 #endif 1821 write_pid(ctx.pid_fd, getpid()); 1822 } 1823 } 1824 1825 if (ctx.options & DHCPCD_MASTER) { 1826 if (control_start(&ctx, NULL) == -1) 1827 logger(&ctx, LOG_ERR, "control_start: %m"); 1828 } 1829 #else 1830 if (control_start(&ctx, 1831 ctx.options & DHCPCD_MASTER ? NULL : argv[optind]) == -1) 1832 { 1833 logger(&ctx, LOG_ERR, "control_start: %m"); 1834 goto exit_failure; 1835 } 1836 #endif 1837 1838 logger(&ctx, LOG_DEBUG, PACKAGE "-" VERSION " starting"); 1839 ctx.options |= DHCPCD_STARTED; 1840 #ifdef USE_SIGNALS 1841 /* Save signal mask, block and redirect signals to our handler */ 1842 if (signal_init(&ctx.sigset) == -1) { 1843 logger(&ctx, LOG_ERR, "signal_setup: %m"); 1844 goto exit_failure; 1845 } 1846 #endif 1847 1848 /* When running dhcpcd against a single interface, we need to retain 1849 * the old behaviour of waiting for an IP address */ 1850 if (ctx.ifc == 1 && !(ctx.options & DHCPCD_BACKGROUND)) 1851 ctx.options |= DHCPCD_WAITIP; 1852 1853 /* RTM_NEWADDR goes through the link socket as well which we 1854 * need for IPv6 DAD, so we check for DHCPCD_LINK in 1855 * dhcpcd_handlecarrier instead. 1856 * We also need to open this before checking for interfaces below 1857 * so that we pickup any new addresses during the discover phase. */ 1858 ctx.link_fd = if_openlinksocket(); 1859 if (ctx.link_fd == -1) 1860 logger(&ctx, LOG_ERR, "open_link_socket: %m"); 1861 else 1862 eloop_event_add(ctx.eloop, ctx.link_fd, 1863 handle_link, &ctx, NULL, NULL); 1864 1865 /* Start any dev listening plugin which may want to 1866 * change the interface name provided by the kernel */ 1867 if ((ctx.options & (DHCPCD_MASTER | DHCPCD_DEV)) == 1868 (DHCPCD_MASTER | DHCPCD_DEV)) 1869 dev_start(&ctx); 1870 1871 if (rpc_init(&ctx) == -1) { 1872 /* NB: rpc_init generates a syslog msg */ 1873 exit(EXIT_FAILURE); 1874 } 1875 rpc_signal_status("Init"); 1876 1877 ctx.ifaces = if_discover(&ctx, ctx.ifc, ctx.ifv); 1878 if (ctx.ifaces == NULL) { 1879 logger(&ctx, LOG_ERR, "if_discover: %m"); 1880 goto exit_failure; 1881 } 1882 for (i = 0; i < ctx.ifc; i++) { 1883 int intf_len = strlen(ctx.ifv[i]); 1884 split_interface_lease(ctx.ifv[i], &intf_len, NULL); 1885 if (intf_len > IF_NAMESIZE) { 1886 logger(&ctx, LOG_ERR, 1887 "%s: interface name too long", 1888 ctx.ifv[i]); 1889 continue; 1890 } 1891 strlcpy(ifn, ctx.ifv[i], intf_len + 1); 1892 if (if_find(ctx.ifaces, ifn) == NULL) 1893 logger(&ctx, LOG_ERR, 1894 "%s: interface not found or invalid", 1895 ifn); 1896 } 1897 if (TAILQ_FIRST(ctx.ifaces) == NULL) { 1898 if (ctx.ifc == 0) 1899 logger(&ctx, LOG_ERR, "no valid interfaces found"); 1900 else 1901 goto exit_failure; 1902 if (!(ctx.options & DHCPCD_LINK)) { 1903 logger(&ctx, LOG_ERR, 1904 "aborting as link detection is disabled"); 1905 goto exit_failure; 1906 } 1907 } 1908 1909 TAILQ_FOREACH(ifp, ctx.ifaces, next) { 1910 dhcpcd_initstate1(ifp, argc, argv, 0); 1911 } 1912 1913 if (ctx.options & DHCPCD_BACKGROUND && dhcpcd_daemonise(&ctx)) 1914 goto exit_success; 1915 1916 opt = 0; 1917 TAILQ_FOREACH(ifp, ctx.ifaces, next) { 1918 run_preinit(ifp); 1919 if (ifp->carrier != LINK_DOWN) 1920 opt = 1; 1921 } 1922 1923 if (!(ctx.options & DHCPCD_BACKGROUND)) { 1924 if (ctx.options & DHCPCD_MASTER) 1925 t = ifo->timeout; 1926 else if ((ifp = TAILQ_FIRST(ctx.ifaces))) 1927 t = ifp->options->timeout; 1928 else 1929 t = 0; 1930 if (opt == 0 && 1931 ctx.options & DHCPCD_LINK && 1932 !(ctx.options & DHCPCD_WAITIP)) 1933 { 1934 logger(&ctx, LOG_WARNING, 1935 "no interfaces have a carrier"); 1936 if (dhcpcd_daemonise(&ctx)) 1937 goto exit_success; 1938 } else if (t > 0 && 1939 /* Test mode removes the daemonise bit, so check for both */ 1940 ctx.options & (DHCPCD_DAEMONISE | DHCPCD_TEST)) 1941 { 1942 eloop_timeout_add_sec(ctx.eloop, t, 1943 handle_exit_timeout, &ctx); 1944 } 1945 } 1946 free_options(ifo); 1947 ifo = NULL; 1948 1949 if_sortinterfaces(&ctx); 1950 TAILQ_FOREACH(ifp, ctx.ifaces, next) { 1951 eloop_timeout_add_sec(ctx.eloop, 0, 1952 dhcpcd_prestartinterface, ifp); 1953 } 1954 1955 i = eloop_start(ctx.eloop); 1956 goto exit1; 1957 1958 exit_success: 1959 i = EXIT_SUCCESS; 1960 goto exit1; 1961 1962 exit_failure: 1963 i = EXIT_FAILURE; 1964 1965 exit1: 1966 /* Free memory and close fd's */ 1967 if (ctx.ifaces) { 1968 while ((ifp = TAILQ_FIRST(ctx.ifaces))) { 1969 TAILQ_REMOVE(ctx.ifaces, ifp, next); 1970 if_free(ifp); 1971 } 1972 free(ctx.ifaces); 1973 } 1974 free(ctx.duid); 1975 if (ctx.link_fd != -1) { 1976 eloop_event_delete(ctx.eloop, ctx.link_fd, 0); 1977 close(ctx.link_fd); 1978 } 1979 1980 free_options(ifo); 1981 free_globals(&ctx); 1982 ipv4_ctxfree(&ctx); 1983 ipv6_ctxfree(&ctx); 1984 dev_stop(&ctx); 1985 if (control_stop(&ctx) == -1) 1986 logger(&ctx, LOG_ERR, "control_stop: %m:"); 1987 if (ctx.pid_fd != -1) { 1988 close(ctx.pid_fd); 1989 unlink(ctx.pidfile); 1990 } 1991 eloop_free(ctx.eloop); 1992 1993 if (ctx.options & DHCPCD_STARTED && !(ctx.options & DHCPCD_FORKED)) 1994 logger(&ctx, LOG_INFO, PACKAGE " exited"); 1995 logger_close(&ctx); 1996 free(ctx.logfile); 1997 return i; 1998 } 1999