Home | History | Annotate | Download | only in dhcpcd-6.8.2
      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