Home | History | Annotate | Download | only in dhcpcd
      1 /*
      2  * dhcpcd - DHCP client daemon
      3  * Copyright (c) 2006-2012 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 copyright[] = "Copyright (c) 2006-2012 Roy Marples";
     29 
     30 #include <sys/file.h>
     31 #include <sys/socket.h>
     32 #include <sys/stat.h>
     33 #include <sys/time.h>
     34 #include <sys/types.h>
     35 #include <sys/uio.h>
     36 
     37 #include <arpa/inet.h>
     38 #include <net/route.h>
     39 
     40 #ifdef __linux__
     41 #  include <asm/types.h> /* for systems with broken headers */
     42 #  include <linux/rtnetlink.h>
     43 #endif
     44 
     45 #include <ctype.h>
     46 #include <errno.h>
     47 #include <getopt.h>
     48 #include <limits.h>
     49 #include <paths.h>
     50 #include <signal.h>
     51 #include <stdio.h>
     52 #include <stdlib.h>
     53 #include <string.h>
     54 #include <syslog.h>
     55 #include <unistd.h>
     56 #include <time.h>
     57 
     58 #include "arp.h"
     59 #include "bind.h"
     60 #include "config.h"
     61 #include "common.h"
     62 #include "configure.h"
     63 #include "control.h"
     64 #include "dhcpcd.h"
     65 #include "duid.h"
     66 #include "eloop.h"
     67 #include "if-options.h"
     68 #include "if-pref.h"
     69 #include "ipv4ll.h"
     70 #include "ipv6rs.h"
     71 #include "net.h"
     72 #include "platform.h"
     73 #include "signals.h"
     74 
     75 #ifdef ANDROID
     76 #include <sys/capability.h>
     77 #include <sys/prctl.h>
     78 #include <cutils/properties.h>
     79 #include <private/android_filesystem_config.h>
     80 #endif
     81 
     82 /* We should define a maximum for the NAK exponential backoff */
     83 #define NAKOFF_MAX              60
     84 
     85 /* Wait N nanoseconds between sending a RELEASE and dropping the address.
     86  * This gives the kernel enough time to actually send it. */
     87 #define RELEASE_DELAY_S		0
     88 #define RELEASE_DELAY_NS	10000000
     89 
     90 unsigned long long options = 0;
     91 int pidfd = -1;
     92 struct interface *ifaces = NULL;
     93 int ifac = 0;
     94 char **ifav = NULL;
     95 int ifdc = 0;
     96 char **ifdv = NULL;
     97 /* If set, avoid routes after a DHCP success */
     98 int avoid_routes = 0;
     99 
    100 static char **margv;
    101 static int margc;
    102 static struct if_options *if_options;
    103 static char **ifv;
    104 static int ifc;
    105 static char *cffile;
    106 static char *pidfile;
    107 static int linkfd = -1, ipv6rsfd = -1;
    108 
    109 struct dhcp_op {
    110 	uint8_t value;
    111 	const char *name;
    112 };
    113 
    114 static const struct dhcp_op dhcp_ops[] = {
    115 	{ DHCP_DISCOVER, "DISCOVER" },
    116 	{ DHCP_OFFER,    "OFFER" },
    117 	{ DHCP_REQUEST,  "REQUEST" },
    118 	{ DHCP_DECLINE,  "DECLINE" },
    119 	{ DHCP_ACK,      "ACK" },
    120 	{ DHCP_NAK,      "NAK" },
    121 	{ DHCP_RELEASE,  "RELEASE" },
    122 	{ DHCP_INFORM,   "INFORM" },
    123 	{ 0, NULL }
    124 };
    125 
    126 static void send_release(struct interface *);
    127 
    128 static const char *
    129 get_dhcp_op(uint8_t type)
    130 {
    131 	const struct dhcp_op *d;
    132 
    133 	for (d = dhcp_ops; d->name; d++)
    134 		if (d->value == type)
    135 			return d->name;
    136 	return NULL;
    137 }
    138 
    139 static pid_t
    140 read_pid(void)
    141 {
    142 	FILE *fp;
    143 	pid_t pid;
    144 
    145 	if ((fp = fopen(pidfile, "r")) == NULL) {
    146 		errno = ENOENT;
    147 		return 0;
    148 	}
    149 	if (fscanf(fp, "%d", &pid) != 1)
    150 		pid = 0;
    151 	fclose(fp);
    152 	return pid;
    153 }
    154 
    155 static void
    156 usage(void)
    157 {
    158 
    159 printf("usage: "PACKAGE"\t[-aABbDdEGgHJKkLnpqTVw]\n"
    160 	"\t\t[-C, --nohook hook] [-c, --script script]\n"
    161 	"\t\t[-e, --env value] [-F, --fqdn FQDN] [-f, --config file]\n"
    162 	"\t\t[-h, --hostname hostname] [-I, --clientid clientid]\n"
    163 	"\t\t[-i, --vendorclassid vendorclassid] [-l, --leasetime seconds]\n"
    164 	"\t\t[-m, --metric metric] [-O, --nooption option]\n"
    165 	"\t\t[-o, --option option] [-Q, --require option]\n"
    166 	"\t\t[-r, --request address] [-S, --static value]\n"
    167 	"\t\t[-s, --inform address[/cidr]] [-t, --timeout seconds]\n"
    168 	"\t\t[-u, --userclass class] [-v, --vendor code, value]\n"
    169 	"\t\t[-W, --whitelist address[/cidr]] [-y, --reboot seconds]\n"
    170 	"\t\t[-X, --blacklist address[/cidr]] [-Z, --denyinterfaces pattern]\n"
    171 	"\t\t[-z, --allowinterfaces pattern] [interface] [...]\n"
    172 	"       "PACKAGE"\t-k, --release [interface]\n"
    173 	"       "PACKAGE"\t-U, --dumplease interface\n"
    174 	"       "PACKAGE"\t-v, --version\n"
    175 	"       "PACKAGE"\t-x, --exit [interface]\n");
    176 }
    177 
    178 static void
    179 cleanup(void)
    180 {
    181 #ifdef DEBUG_MEMORY
    182 	struct interface *iface;
    183 	int i;
    184 
    185 	free_options(if_options);
    186 
    187 	while (ifaces) {
    188 		iface = ifaces;
    189 		ifaces = iface->next;
    190 		free_interface(iface);
    191 	}
    192 
    193 	for (i = 0; i < ifac; i++)
    194 		free(ifav[i]);
    195 	free(ifav);
    196 	for (i = 0; i < ifdc; i++)
    197 		free(ifdv[i]);
    198 	free(ifdv);
    199 #endif
    200 
    201 	if (linkfd != -1)
    202 		close(linkfd);
    203 	if (pidfd > -1) {
    204 		if (options & DHCPCD_MASTER) {
    205 			if (stop_control() == -1)
    206 				syslog(LOG_ERR, "stop_control: %m");
    207 		}
    208 		close(pidfd);
    209 		unlink(pidfile);
    210 	}
    211 #ifdef DEBUG_MEMORY
    212 	free(pidfile);
    213 #endif
    214 }
    215 
    216 /* ARGSUSED */
    217 void
    218 handle_exit_timeout(_unused void *arg)
    219 {
    220 	int timeout;
    221 
    222 	syslog(LOG_ERR, "timed out");
    223 	if (!(options & DHCPCD_TIMEOUT_IPV4LL)) {
    224 		if (options & DHCPCD_MASTER) {
    225 			daemonise();
    226 			return;
    227 		} else
    228 			exit(EXIT_FAILURE);
    229 	}
    230 	options &= ~DHCPCD_TIMEOUT_IPV4LL;
    231 	timeout = (PROBE_NUM * PROBE_MAX) + (PROBE_WAIT * 2);
    232 	syslog(LOG_WARNING, "allowing %d seconds for IPv4LL timeout", timeout);
    233 	add_timeout_sec(timeout, handle_exit_timeout, NULL);
    234 }
    235 
    236 void
    237 drop_dhcp(struct interface *iface, const char *reason)
    238 {
    239 	free(iface->state->old);
    240 	iface->state->old = iface->state->new;
    241 	iface->state->new = NULL;
    242 	iface->state->reason = reason;
    243 	configure(iface);
    244 	free(iface->state->old);
    245 	iface->state->old = NULL;
    246 	iface->state->lease.addr.s_addr = 0;
    247 }
    248 
    249 struct interface *
    250 find_interface(const char *ifname)
    251 {
    252 	struct interface *ifp;
    253 
    254 	for (ifp = ifaces; ifp; ifp = ifp->next)
    255 		if (strcmp(ifp->name, ifname) == 0)
    256 			return ifp;
    257 	return NULL;
    258 }
    259 
    260 static void
    261 stop_interface(struct interface *iface)
    262 {
    263 	struct interface *ifp, *ifl = NULL;
    264 
    265 	syslog(LOG_INFO, "%s: removing interface", iface->name);
    266 	if (iface->ras) {
    267 		ipv6rs_free(iface);
    268 		iface->ras = NULL;
    269 		run_script_reason(iface, "ROUTERADVERT");
    270 	}
    271 	if (strcmp(iface->state->reason, "RELEASE") != 0)
    272 		drop_dhcp(iface, "STOP");
    273 	close_sockets(iface);
    274 	delete_timeout(NULL, iface);
    275 	for (ifp = ifaces; ifp; ifp = ifp->next) {
    276 		if (ifp == iface)
    277 			break;
    278 		ifl = ifp;
    279 	}
    280 	if (ifl)
    281 		ifl->next = ifp->next;
    282 	else
    283 		ifaces = ifp->next;
    284 	free_interface(ifp);
    285 	if (!(options & (DHCPCD_MASTER | DHCPCD_TEST)))
    286 		exit(EXIT_FAILURE);
    287 }
    288 
    289 static uint32_t
    290 dhcp_xid(struct interface *iface)
    291 {
    292 	uint32_t xid;
    293 
    294 	if (iface->state->options->options & DHCPCD_XID_HWADDR &&
    295 	    iface->hwlen >= sizeof(xid))
    296 		/* The lower bits are probably more unique on the network */
    297 		memcpy(&xid, (iface->hwaddr + iface->hwlen) - sizeof(xid),
    298 		    sizeof(xid));
    299 	else
    300 		xid = arc4random();
    301 
    302 	return xid;
    303 }
    304 
    305 static void
    306 send_message(struct interface *iface, int type,
    307     void (*callback)(void *))
    308 {
    309 	struct if_state *state = iface->state;
    310 	struct if_options *ifo = state->options;
    311 	struct dhcp_message *dhcp;
    312 	uint8_t *udp;
    313 	ssize_t len, r;
    314 	struct in_addr from, to;
    315 	in_addr_t a = 0;
    316 	struct timeval tv;
    317 
    318 	if (!callback)
    319 		syslog(LOG_DEBUG, "%s: sending %s with xid 0x%x",
    320 		    iface->name, get_dhcp_op(type), state->xid);
    321 	else {
    322 		if (state->interval == 0)
    323 			state->interval = 4;
    324 		else {
    325 			state->interval *= 2;
    326 			if (state->interval > 64)
    327 				state->interval = 64;
    328 		}
    329 		tv.tv_sec = state->interval + DHCP_RAND_MIN;
    330 		tv.tv_usec = arc4random() % (DHCP_RAND_MAX_U - DHCP_RAND_MIN_U);
    331 		syslog(LOG_DEBUG,
    332 		    "%s: sending %s (xid 0x%x), next in %0.2f seconds",
    333 		    iface->name, get_dhcp_op(type), state->xid,
    334 		    timeval_to_double(&tv));
    335 	}
    336 
    337 	/* Ensure sockets are open. */
    338 	open_sockets(iface);
    339 
    340 	/* If we couldn't open a UDP port for our IP address
    341 	 * then we cannot renew.
    342 	 * This could happen if our IP was pulled out from underneath us.
    343 	 * Also, we should not unicast from a BOOTP lease. */
    344 	if (iface->udp_fd == -1 ||
    345 	    (!(ifo->options & DHCPCD_INFORM) && is_bootp(iface->state->new)))
    346 	{
    347 		a = iface->addr.s_addr;
    348 		iface->addr.s_addr = 0;
    349 	}
    350 	len = make_message(&dhcp, iface, type);
    351 	if (a)
    352 		iface->addr.s_addr = a;
    353 	from.s_addr = dhcp->ciaddr;
    354 	if (from.s_addr)
    355 		to.s_addr = state->lease.server.s_addr;
    356 	else
    357 		to.s_addr = 0;
    358 	if (to.s_addr && to.s_addr != INADDR_BROADCAST) {
    359 		r = send_packet(iface, to, (uint8_t *)dhcp, len);
    360 		if (r == -1) {
    361 			syslog(LOG_ERR, "%s: send_packet: %m", iface->name);
    362 			close_sockets(iface);
    363 		}
    364 	} else {
    365 		len = make_udp_packet(&udp, (uint8_t *)dhcp, len, from, to);
    366 		r = send_raw_packet(iface, ETHERTYPE_IP, udp, len);
    367 		free(udp);
    368 		/* If we failed to send a raw packet this normally means
    369 		 * we don't have the ability to work beneath the IP layer
    370 		 * for this interface.
    371 		 * As such we remove it from consideration without actually
    372 		 * stopping the interface. */
    373 		if (r == -1) {
    374 			syslog(LOG_ERR, "%s: send_raw_packet: %m", iface->name);
    375 			if (!(options & DHCPCD_TEST))
    376 				drop_dhcp(iface, "FAIL");
    377 			close_sockets(iface);
    378 			delete_timeout(NULL, iface);
    379 			callback = NULL;
    380 		}
    381 	}
    382 	free(dhcp);
    383 
    384 	/* Even if we fail to send a packet we should continue as we are
    385 	 * as our failure timeouts will change out codepath when needed. */
    386 	if (callback)
    387 		add_timeout_tv(&tv, callback, iface);
    388 }
    389 
    390 static void
    391 send_inform(void *arg)
    392 {
    393 	send_message((struct interface *)arg, DHCP_INFORM, send_inform);
    394 }
    395 
    396 static void
    397 send_discover(void *arg)
    398 {
    399 	send_message((struct interface *)arg, DHCP_DISCOVER, send_discover);
    400 }
    401 
    402 static void
    403 send_request(void *arg)
    404 {
    405 	send_message((struct interface *)arg, DHCP_REQUEST, send_request);
    406 }
    407 
    408 static void
    409 send_renew(void *arg)
    410 {
    411 	send_message((struct interface *)arg, DHCP_REQUEST, send_renew);
    412 }
    413 
    414 static void
    415 send_rebind(void *arg)
    416 {
    417 	send_message((struct interface *)arg, DHCP_REQUEST, send_rebind);
    418 }
    419 
    420 void
    421 start_expire(void *arg)
    422 {
    423 	struct interface *iface = arg;
    424 
    425 	iface->state->interval = 0;
    426 	if (iface->addr.s_addr == 0) {
    427 		/* We failed to reboot, so enter discovery. */
    428 		iface->state->lease.addr.s_addr = 0;
    429 		start_discover(iface);
    430 		return;
    431 	}
    432 
    433 	syslog(LOG_ERR, "%s: lease expired", iface->name);
    434 	delete_timeout(NULL, iface);
    435 	drop_dhcp(iface, "EXPIRE");
    436 	unlink(iface->leasefile);
    437 	if (iface->carrier != LINK_DOWN)
    438 		start_interface(iface);
    439 }
    440 
    441 static void
    442 log_dhcp(int lvl, const char *msg,
    443     const struct interface *iface, const struct dhcp_message *dhcp,
    444     const struct in_addr *from)
    445 {
    446 	const char *tfrom;
    447 	char *a;
    448 	struct in_addr addr;
    449 	int r;
    450 
    451 	if (strcmp(msg, "NAK:") == 0)
    452 		a = get_option_string(dhcp, DHO_MESSAGE);
    453 	else if (dhcp->yiaddr != 0) {
    454 		addr.s_addr = dhcp->yiaddr;
    455 		a = xstrdup(inet_ntoa(addr));
    456 	} else
    457 		a = NULL;
    458 
    459 	tfrom = "from";
    460 	r = get_option_addr(&addr, dhcp, DHO_SERVERID);
    461 	if (dhcp->servername[0] && r == 0)
    462 		syslog(lvl, "%s: %s %s %s %s `%s'", iface->name, msg, a,
    463 		    tfrom, inet_ntoa(addr), dhcp->servername);
    464 	else {
    465 		if (r != 0) {
    466 			tfrom = "via";
    467 			addr = *from;
    468 		}
    469 		if (a == NULL)
    470 			syslog(lvl, "%s: %s %s %s",
    471 			    iface->name, msg, tfrom, inet_ntoa(addr));
    472 		else
    473 			syslog(lvl, "%s: %s %s %s %s",
    474 			    iface->name, msg, a, tfrom, inet_ntoa(addr));
    475 	}
    476 	free(a);
    477 }
    478 
    479 static int
    480 blacklisted_ip(const struct if_options *ifo, in_addr_t addr)
    481 {
    482 	size_t i;
    483 
    484 	for (i = 0; i < ifo->blacklist_len; i += 2)
    485 		if (ifo->blacklist[i] == (addr & ifo->blacklist[i + 1]))
    486 			return 1;
    487 	return 0;
    488 }
    489 
    490 static int
    491 whitelisted_ip(const struct if_options *ifo, in_addr_t addr)
    492 {
    493 	size_t i;
    494 
    495 	if (ifo->whitelist_len == 0)
    496 		return -1;
    497 	for (i = 0; i < ifo->whitelist_len; i += 2)
    498 		if (ifo->whitelist[i] == (addr & ifo->whitelist[i + 1]))
    499 			return 1;
    500 	return 0;
    501 }
    502 
    503 static void
    504 handle_dhcp(struct interface *iface, struct dhcp_message **dhcpp, const struct in_addr *from)
    505 {
    506 	struct if_state *state = iface->state;
    507 	struct if_options *ifo = state->options;
    508 	struct dhcp_message *dhcp = *dhcpp;
    509 	struct dhcp_lease *lease = &state->lease;
    510 	uint8_t type, tmp;
    511 	struct in_addr addr;
    512 	size_t i;
    513 
    514 	/* reset the message counter */
    515 	state->interval = 0;
    516 
    517 	/* We may have found a BOOTP server */
    518 	if (get_option_uint8(&type, dhcp, DHO_MESSAGETYPE) == -1)
    519 		type = 0;
    520 
    521 	if (type == DHCP_NAK) {
    522 		/* For NAK, only check if we require the ServerID */
    523 		if (has_option_mask(ifo->requiremask, DHO_SERVERID) &&
    524 		    get_option_addr(&addr, dhcp, DHO_SERVERID) == -1)
    525 		{
    526 			log_dhcp(LOG_WARNING, "reject NAK", iface, dhcp, from);
    527 			return;
    528 		}
    529 		/* We should restart on a NAK */
    530 		log_dhcp(LOG_WARNING, "NAK:", iface, dhcp, from);
    531 		if (!(options & DHCPCD_TEST)) {
    532 			drop_dhcp(iface, "NAK");
    533 			unlink(iface->leasefile);
    534 		}
    535 		close_sockets(iface);
    536 		/* If we constantly get NAKS then we should slowly back off */
    537 		add_timeout_sec(state->nakoff, start_interface, iface);
    538 		state->nakoff *= 2;
    539 		if (state->nakoff > NAKOFF_MAX)
    540 			state->nakoff = NAKOFF_MAX;
    541 		return;
    542 	}
    543 
    544 	/* Ensure that all required options are present */
    545 	for (i = 1; i < 255; i++) {
    546 		if (has_option_mask(ifo->requiremask, i) &&
    547 		    get_option_uint8(&tmp, dhcp, i) != 0)
    548 		{
    549 			/* If we are bootp, then ignore the need for serverid.
    550 			 * To ignore bootp, require dhcp_message_type instead. */
    551 			if (type == 0 && i == DHO_SERVERID)
    552 				continue;
    553 			log_dhcp(LOG_WARNING, "reject DHCP", iface, dhcp, from);
    554 			return;
    555 		}
    556 	}
    557 
    558 	/* Ensure that the address offered is valid */
    559 	if ((type == 0 || type == DHCP_OFFER || type == DHCP_ACK) &&
    560 	    (dhcp->ciaddr == INADDR_ANY || dhcp->ciaddr == INADDR_BROADCAST) &&
    561 	    (dhcp->yiaddr == INADDR_ANY || dhcp->yiaddr == INADDR_BROADCAST))
    562 	{
    563 		log_dhcp(LOG_WARNING, "reject invalid address",
    564 		    iface, dhcp, from);
    565 		return;
    566 	}
    567 
    568 	/* No NAK, so reset the backoff */
    569 	state->nakoff = 1;
    570 
    571 	if ((type == 0 || type == DHCP_OFFER) &&
    572 	    state->state == DHS_DISCOVER)
    573 	{
    574 		lease->frominfo = 0;
    575 		lease->addr.s_addr = dhcp->yiaddr;
    576 		lease->cookie = dhcp->cookie;
    577 		if (type == 0 ||
    578 		    get_option_addr(&lease->server, dhcp, DHO_SERVERID) != 0)
    579 			lease->server.s_addr = INADDR_ANY;
    580 		log_dhcp(LOG_INFO, "offered", iface, dhcp, from);
    581 		free(state->offer);
    582 		state->offer = dhcp;
    583 		*dhcpp = NULL;
    584 		if (options & DHCPCD_TEST) {
    585 			free(state->old);
    586 			state->old = state->new;
    587 			state->new = state->offer;
    588 			state->offer = NULL;
    589 			state->reason = "TEST";
    590 			run_script(iface);
    591 			exit(EXIT_SUCCESS);
    592 		}
    593 		delete_timeout(send_discover, iface);
    594 		/* We don't request BOOTP addresses */
    595 		if (type) {
    596 			/* We used to ARP check here, but that seems to be in
    597 			 * violation of RFC2131 where it only describes
    598 			 * DECLINE after REQUEST.
    599 			 * It also seems that some MS DHCP servers actually
    600 			 * ignore DECLINE if no REQUEST, ie we decline a
    601 			 * DISCOVER. */
    602 			start_request(iface);
    603 			return;
    604 		}
    605 	}
    606 
    607 	if (type) {
    608 		if (type == DHCP_OFFER) {
    609 			log_dhcp(LOG_INFO, "ignoring offer of",
    610 			    iface, dhcp, from);
    611 			return;
    612 		}
    613 
    614 		/* We should only be dealing with acks */
    615 		if (type != DHCP_ACK) {
    616 			log_dhcp(LOG_ERR, "not ACK or OFFER",
    617 			    iface, dhcp, from);
    618 			return;
    619 		}
    620 
    621 		if (!(ifo->options & DHCPCD_INFORM))
    622 			log_dhcp(LOG_INFO, "acknowledged", iface, dhcp, from);
    623 	}
    624 
    625 	/* BOOTP could have already assigned this above, so check we still
    626 	 * have a pointer. */
    627 	if (*dhcpp) {
    628 		free(state->offer);
    629 		state->offer = dhcp;
    630 		*dhcpp = NULL;
    631 	}
    632 
    633 	lease->frominfo = 0;
    634 	delete_timeout(NULL, iface);
    635 
    636 	/* We now have an offer, so close the DHCP sockets.
    637 	 * This allows us to safely ARP when broken DHCP servers send an ACK
    638 	 * follows by an invalid NAK. */
    639 	close_sockets(iface);
    640 
    641 	if (ifo->options & DHCPCD_ARP &&
    642 	    iface->addr.s_addr != state->offer->yiaddr)
    643 	{
    644 		/* If the interface already has the address configured
    645 		 * then we can't ARP for duplicate detection. */
    646 		addr.s_addr = state->offer->yiaddr;
    647 		if (has_address(iface->name, &addr, NULL) != 1) {
    648 			state->claims = 0;
    649 			state->probes = 0;
    650 			state->conflicts = 0;
    651 			state->state = DHS_PROBE;
    652 			send_arp_probe(iface);
    653 			return;
    654 		}
    655 	}
    656 
    657 	bind_interface(iface);
    658 }
    659 
    660 static void
    661 handle_dhcp_packet(void *arg)
    662 {
    663 	struct interface *iface = arg;
    664 	uint8_t *packet;
    665 	struct dhcp_message *dhcp = NULL;
    666 	const uint8_t *pp;
    667 	ssize_t bytes;
    668 	struct in_addr from;
    669 	int i, partialcsum = 0;
    670 
    671 	/* We loop through until our buffer is empty.
    672 	 * The benefit is that if we get >1 DHCP packet in our buffer and
    673 	 * the first one fails for any reason, we can use the next. */
    674 	packet = xmalloc(udp_dhcp_len);
    675 	for(;;) {
    676 		bytes = get_raw_packet(iface, ETHERTYPE_IP,
    677 		    packet, udp_dhcp_len, &partialcsum);
    678 		if (bytes == 0 || bytes == -1)
    679 			break;
    680 		if (valid_udp_packet(packet, bytes, &from, partialcsum) == -1) {
    681 			syslog(LOG_ERR, "%s: invalid UDP packet from %s",
    682 			    iface->name, inet_ntoa(from));
    683 			continue;
    684 		}
    685 		i = whitelisted_ip(iface->state->options, from.s_addr);
    686 		if (i == 0) {
    687 			syslog(LOG_WARNING,
    688 			    "%s: non whitelisted DHCP packet from %s",
    689 			    iface->name, inet_ntoa(from));
    690 			continue;
    691 		} else if (i != 1 &&
    692 		    blacklisted_ip(iface->state->options, from.s_addr) == 1)
    693 		{
    694 			syslog(LOG_WARNING,
    695 			    "%s: blacklisted DHCP packet from %s",
    696 			    iface->name, inet_ntoa(from));
    697 			continue;
    698 		}
    699 		if (iface->flags & IFF_POINTOPOINT &&
    700 		    iface->dst.s_addr != from.s_addr)
    701 		{
    702 			syslog(LOG_WARNING,
    703 			    "%s: server %s is not destination",
    704 			    iface->name, inet_ntoa(from));
    705 		}
    706 		bytes = get_udp_data(&pp, packet);
    707 		if ((size_t)bytes > sizeof(*dhcp)) {
    708 			syslog(LOG_ERR,
    709 			    "%s: packet greater than DHCP size from %s",
    710 			    iface->name, inet_ntoa(from));
    711 			continue;
    712 		}
    713 		if (!dhcp)
    714 			dhcp = xzalloc(sizeof(*dhcp));
    715 		memcpy(dhcp, pp, bytes);
    716 		if (dhcp->cookie != htonl(MAGIC_COOKIE)) {
    717 			syslog(LOG_DEBUG, "%s: bogus cookie from %s",
    718 			    iface->name, inet_ntoa(from));
    719 			continue;
    720 		}
    721 		/* Ensure it's the right transaction */
    722 		if (iface->state->xid != dhcp->xid) {
    723 			syslog(LOG_DEBUG,
    724 			    "%s: wrong xid 0x%x (expecting 0x%x) from %s",
    725 			    iface->name, dhcp->xid, iface->state->xid,
    726 			    inet_ntoa(from));
    727 			continue;
    728 		}
    729 		/* Ensure packet is for us */
    730 		if (iface->hwlen <= sizeof(dhcp->chaddr) &&
    731 		    memcmp(dhcp->chaddr, iface->hwaddr, iface->hwlen))
    732 		{
    733 			syslog(LOG_DEBUG, "%s: xid 0x%x is not for hwaddr %s",
    734 			    iface->name, dhcp->xid,
    735 			    hwaddr_ntoa(dhcp->chaddr, sizeof(dhcp->chaddr)));
    736 			continue;
    737 		}
    738 		handle_dhcp(iface, &dhcp, &from);
    739 		if (iface->raw_fd == -1)
    740 			break;
    741 	}
    742 	free(packet);
    743 	free(dhcp);
    744 }
    745 
    746 static void
    747 send_release(struct interface *iface)
    748 {
    749 	struct timespec ts;
    750 
    751 	if (iface->state->new != NULL &&
    752 	    iface->state->new->cookie == htonl(MAGIC_COOKIE))
    753 	{
    754 		syslog(LOG_INFO, "%s: releasing lease of %s",
    755 		    iface->name, inet_ntoa(iface->state->lease.addr));
    756 		iface->state->xid = dhcp_xid(iface);
    757 		send_message(iface, DHCP_RELEASE, NULL);
    758 		/* Give the packet a chance to go before dropping the ip */
    759 		ts.tv_sec = RELEASE_DELAY_S;
    760 		ts.tv_nsec = RELEASE_DELAY_NS;
    761 		nanosleep(&ts, NULL);
    762 		drop_dhcp(iface, "RELEASE");
    763 	}
    764 	unlink(iface->leasefile);
    765 }
    766 
    767 void
    768 send_decline(struct interface *iface)
    769 {
    770 	send_message(iface, DHCP_DECLINE, NULL);
    771 }
    772 
    773 static void
    774 configure_interface1(struct interface *iface)
    775 {
    776 	struct if_state *ifs = iface->state;
    777 	struct if_options *ifo = ifs->options;
    778 	uint8_t *duid;
    779 	size_t len = 0, ifl;
    780 
    781 	/* Do any platform specific configuration */
    782 	if_conf(iface);
    783 
    784 	if (iface->flags & IFF_POINTOPOINT && !(ifo->options & DHCPCD_INFORM))
    785 		ifo->options |= DHCPCD_STATIC;
    786 	if (iface->flags & IFF_NOARP ||
    787 	    ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC))
    788 		ifo->options &= ~(DHCPCD_ARP | DHCPCD_IPV4LL);
    789 	if (!(iface->flags & (IFF_POINTOPOINT | IFF_LOOPBACK | IFF_MULTICAST)))
    790 		ifo->options &= ~DHCPCD_IPV6RS;
    791 	if (ifo->options & DHCPCD_LINK && carrier_status(iface) == -1)
    792 		ifo->options &= ~DHCPCD_LINK;
    793 
    794 	if (ifo->metric != -1)
    795 		iface->metric = ifo->metric;
    796 
    797 	/* If we haven't specified a ClientID and our hardware address
    798 	 * length is greater than DHCP_CHADDR_LEN then we enforce a ClientID
    799 	 * of the hardware address family and the hardware address. */
    800 	if (iface->hwlen > DHCP_CHADDR_LEN)
    801 		ifo->options |= DHCPCD_CLIENTID;
    802 
    803 	/* Firewire and InfiniBand interfaces require ClientID and
    804 	 * the broadcast option being set. */
    805 	switch (iface->family) {
    806 	case ARPHRD_IEEE1394:	/* FALLTHROUGH */
    807 	case ARPHRD_INFINIBAND:
    808 		ifo->options |= DHCPCD_CLIENTID | DHCPCD_BROADCAST;
    809 		break;
    810 	}
    811 
    812 	free(iface->clientid);
    813 	iface->clientid = NULL;
    814 	if (*ifo->clientid) {
    815 		iface->clientid = xmalloc(ifo->clientid[0] + 1);
    816 		memcpy(iface->clientid, ifo->clientid, ifo->clientid[0] + 1);
    817 	} else if (ifo->options & DHCPCD_CLIENTID) {
    818 		if (ifo->options & DHCPCD_DUID) {
    819 			duid = xmalloc(DUID_LEN);
    820 			if ((len = get_duid(duid, iface)) == 0)
    821 				syslog(LOG_ERR, "get_duid: %m");
    822 		}
    823 		if (len > 0) {
    824 			iface->clientid = xmalloc(len + 6);
    825 			iface->clientid[0] = len + 5;
    826 			iface->clientid[1] = 255; /* RFC 4361 */
    827 			ifl = strlen(iface->name);
    828 			if (ifl < 5) {
    829 				memcpy(iface->clientid + 2, iface->name, ifl);
    830 				if (ifl < 4)
    831 					memset(iface->clientid + 2 + ifl,
    832 					    0, 4 - ifl);
    833 			} else {
    834 				ifl = htonl(if_nametoindex(iface->name));
    835 				memcpy(iface->clientid + 2, &ifl, 4);
    836 			}
    837 		} else if (len == 0) {
    838 			len = iface->hwlen + 1;
    839 			iface->clientid = xmalloc(len + 1);
    840 			iface->clientid[0] = len;
    841 			iface->clientid[1] = iface->family;
    842 			memcpy(iface->clientid + 2, iface->hwaddr,
    843 			    iface->hwlen);
    844 		}
    845 	}
    846 	if (ifo->options & DHCPCD_CLIENTID)
    847 		syslog(LOG_DEBUG, "%s: using ClientID %s", iface->name,
    848 		    hwaddr_ntoa(iface->clientid + 1, *iface->clientid));
    849 	else if (iface->hwlen)
    850 		syslog(LOG_DEBUG, "%s: using hwaddr %s", iface->name,
    851 		    hwaddr_ntoa(iface->hwaddr, iface->hwlen));
    852 }
    853 
    854 int
    855 select_profile(struct interface *iface, const char *profile)
    856 {
    857 	struct if_options *ifo;
    858 	int ret;
    859 
    860 	ret = 0;
    861 	ifo = read_config(cffile, iface->name, iface->ssid, profile);
    862 	if (ifo == NULL) {
    863 		syslog(LOG_DEBUG, "%s: no profile %s", iface->name, profile);
    864 		ret = -1;
    865 		goto exit;
    866 	}
    867 	if (profile != NULL) {
    868 		strlcpy(iface->state->profile, profile,
    869 		    sizeof(iface->state->profile));
    870 		syslog(LOG_INFO, "%s: selected profile %s",
    871 		    iface->name, profile);
    872 	} else
    873 		*iface->state->profile = '\0';
    874 	free_options(iface->state->options);
    875 	iface->state->options = ifo;
    876 
    877 exit:
    878 	if (profile)
    879 		configure_interface1(iface);
    880 	return ret;
    881 }
    882 
    883 static void
    884 start_fallback(void *arg)
    885 {
    886 	struct interface *iface;
    887 
    888 	iface = (struct interface *)arg;
    889 	select_profile(iface, iface->state->options->fallback);
    890 	start_interface(iface);
    891 }
    892 
    893 static void
    894 configure_interface(struct interface *iface, int argc, char **argv)
    895 {
    896 	select_profile(iface, NULL);
    897 	add_options(iface->state->options, argc, argv);
    898 	configure_interface1(iface);
    899 }
    900 
    901 void
    902 handle_carrier(int action, int flags, const char *ifname)
    903 {
    904 	struct interface *iface;
    905 	int carrier;
    906 
    907 	if (!(options & DHCPCD_LINK))
    908 		return;
    909 	for (iface = ifaces; iface; iface = iface->next)
    910 		if (strcmp(iface->name, ifname) == 0)
    911 			break;
    912 	if (!iface) {
    913 		if (options & DHCPCD_LINK)
    914 			handle_interface(1, ifname);
    915 		return;
    916 	}
    917 	if (!(iface->state->options->options & DHCPCD_LINK))
    918 		return;
    919 
    920 	if (action) {
    921 		carrier = action == 1 ? 1 : 0;
    922 		iface->flags = flags;
    923 	} else
    924 		carrier = carrier_status(iface);
    925 
    926 	if (carrier == -1)
    927 		syslog(LOG_ERR, "%s: carrier_status: %m", ifname);
    928 	else if (carrier == 0 || ~iface->flags & IFF_UP) {
    929 		if (iface->carrier != LINK_DOWN) {
    930 			iface->carrier = LINK_DOWN;
    931 			syslog(LOG_INFO, "%s: carrier lost", iface->name);
    932 			close_sockets(iface);
    933 			delete_timeouts(iface, start_expire, NULL);
    934 			if (iface->ras) {
    935 				ipv6rs_free(iface);
    936 				iface->ras = NULL;
    937 				run_script_reason(iface, "ROUTERADVERT");
    938 			}
    939 			drop_dhcp(iface, "NOCARRIER");
    940 		}
    941 	} else if (carrier == 1 && !(~iface->flags & IFF_UP)) {
    942 		if (iface->carrier != LINK_UP) {
    943 			iface->carrier = LINK_UP;
    944 			syslog(LOG_INFO, "%s: carrier acquired", iface->name);
    945 			if (iface->wireless)
    946 				getifssid(iface->name, iface->ssid);
    947 			configure_interface(iface, margc, margv);
    948 			iface->state->interval = 0;
    949 			iface->state->reason = "CARRIER";
    950 			run_script(iface);
    951 			start_interface(iface);
    952 		}
    953 	}
    954 }
    955 
    956 void
    957 start_discover(void *arg)
    958 {
    959 	struct interface *iface = arg;
    960 	struct if_options *ifo = iface->state->options;
    961 	int timeout = ifo->timeout;
    962 
    963 	/* If we're rebooting and we're not daemonised then we need
    964 	 * to shorten the normal timeout to ensure we try correctly
    965 	 * for a fallback or IPv4LL address. */
    966 	if (iface->state->state == DHS_REBOOT &&
    967 	    !(options & DHCPCD_DAEMONISED))
    968 	{
    969 		timeout -= ifo->reboot;
    970 		if (timeout <= 0)
    971 			timeout = 2;
    972 	}
    973 
    974 	iface->state->state = DHS_DISCOVER;
    975 	iface->state->xid = dhcp_xid(iface);
    976 	delete_timeout(NULL, iface);
    977 	if (ifo->fallback)
    978 		add_timeout_sec(timeout, start_fallback, iface);
    979 	else if (ifo->options & DHCPCD_IPV4LL &&
    980 	    !IN_LINKLOCAL(htonl(iface->addr.s_addr)))
    981 	{
    982 		if (IN_LINKLOCAL(htonl(iface->state->fail.s_addr)))
    983 			add_timeout_sec(RATE_LIMIT_INTERVAL, start_ipv4ll, iface);
    984 		else
    985 			add_timeout_sec(timeout, start_ipv4ll, iface);
    986 	}
    987 	if (ifo->options & DHCPCD_REQUEST)
    988 		syslog(LOG_INFO, "%s: broadcasting for a lease (requesting %s)",
    989 		    iface->name, inet_ntoa(ifo->req_addr));
    990 	else
    991 		syslog(LOG_INFO, "%s: broadcasting for a lease", iface->name);
    992 	send_discover(iface);
    993 }
    994 
    995 void
    996 start_request(void *arg)
    997 {
    998 	struct interface *iface = arg;
    999 
   1000 	iface->state->state = DHS_REQUEST;
   1001 	send_request(iface);
   1002 }
   1003 
   1004 void
   1005 start_renew(void *arg)
   1006 {
   1007 	struct interface *iface = arg;
   1008 
   1009 	syslog(LOG_INFO, "%s: renewing lease of %s",
   1010 	    iface->name, inet_ntoa(iface->state->lease.addr));
   1011 	iface->state->state = DHS_RENEW;
   1012 	iface->state->xid = dhcp_xid(iface);
   1013 	send_renew(iface);
   1014 }
   1015 
   1016 void
   1017 start_rebind(void *arg)
   1018 {
   1019 	struct interface *iface = arg;
   1020 
   1021 	syslog(LOG_ERR, "%s: failed to renew, attempting to rebind",
   1022 	    iface->name);
   1023 	iface->state->state = DHS_REBIND;
   1024 	delete_timeout(send_renew, iface);
   1025 	iface->state->lease.server.s_addr = 0;
   1026 	send_rebind(iface);
   1027 }
   1028 
   1029 static void
   1030 start_timeout(void *arg)
   1031 {
   1032 	struct interface *iface = arg;
   1033 
   1034 	bind_interface(iface);
   1035 	iface->state->interval = 0;
   1036 	start_discover(iface);
   1037 }
   1038 
   1039 static struct dhcp_message *
   1040 dhcp_message_new(struct in_addr *addr, struct in_addr *mask)
   1041 {
   1042 	struct dhcp_message *dhcp;
   1043 	uint8_t *p;
   1044 
   1045 	dhcp = xzalloc(sizeof(*dhcp));
   1046 	dhcp->yiaddr = addr->s_addr;
   1047 	p = dhcp->options;
   1048 	if (mask && mask->s_addr != INADDR_ANY) {
   1049 		*p++ = DHO_SUBNETMASK;
   1050 		*p++ = sizeof(mask->s_addr);
   1051 		memcpy(p, &mask->s_addr, sizeof(mask->s_addr));
   1052 		p+= sizeof(mask->s_addr);
   1053 	}
   1054 	*p++ = DHO_END;
   1055 	return dhcp;
   1056 }
   1057 
   1058 static int
   1059 handle_3rdparty(struct interface *iface)
   1060 {
   1061 	struct if_options *ifo;
   1062 	struct in_addr addr, net, dst;
   1063 
   1064 	ifo = iface->state->options;
   1065 	if (ifo->req_addr.s_addr != INADDR_ANY)
   1066 		return 0;
   1067 
   1068 	if (get_address(iface->name, &addr, &net, &dst) == 1)
   1069 		handle_ifa(RTM_NEWADDR, iface->name, &addr, &net, &dst);
   1070 	else {
   1071 		syslog(LOG_INFO,
   1072 		    "%s: waiting for 3rd party to configure IP address",
   1073 		    iface->name);
   1074 		iface->state->reason = "3RDPARTY";
   1075 		run_script(iface);
   1076 	}
   1077 	return 1;
   1078 }
   1079 
   1080 static void
   1081 start_static(struct interface *iface)
   1082 {
   1083 	struct if_options *ifo;
   1084 
   1085 	if (handle_3rdparty(iface))
   1086 		return;
   1087 	ifo = iface->state->options;
   1088 	iface->state->offer =
   1089 	    dhcp_message_new(&ifo->req_addr, &ifo->req_mask);
   1090 	delete_timeout(NULL, iface);
   1091 	bind_interface(iface);
   1092 }
   1093 
   1094 static void
   1095 start_inform(struct interface *iface)
   1096 {
   1097 	if (handle_3rdparty(iface))
   1098 		return;
   1099 
   1100 	if (options & DHCPCD_TEST) {
   1101 		iface->addr.s_addr = iface->state->options->req_addr.s_addr;
   1102 		iface->net.s_addr = iface->state->options->req_mask.s_addr;
   1103 	} else {
   1104 		iface->state->options->options |= DHCPCD_STATIC;
   1105 		start_static(iface);
   1106 	}
   1107 
   1108 	iface->state->state = DHS_INFORM;
   1109 	iface->state->xid = dhcp_xid(iface);
   1110 	send_inform(iface);
   1111 }
   1112 
   1113 void
   1114 start_reboot(struct interface *iface)
   1115 {
   1116 	struct if_options *ifo = iface->state->options;
   1117 
   1118 	if (ifo->options & DHCPCD_LINK && iface->carrier == LINK_DOWN) {
   1119 		syslog(LOG_INFO, "%s: waiting for carrier", iface->name);
   1120 		return;
   1121 	}
   1122 	if (ifo->options & DHCPCD_STATIC) {
   1123 		start_static(iface);
   1124 		return;
   1125 	}
   1126 	if (ifo->reboot == 0 || iface->state->offer == NULL) {
   1127 		start_discover(iface);
   1128 		return;
   1129 	}
   1130 	if (ifo->options & DHCPCD_INFORM) {
   1131 		syslog(LOG_INFO, "%s: informing address of %s",
   1132 		    iface->name, inet_ntoa(iface->state->lease.addr));
   1133 	} else if (iface->state->offer->cookie == 0) {
   1134 		if (ifo->options & DHCPCD_IPV4LL) {
   1135 			iface->state->claims = 0;
   1136 			send_arp_announce(iface);
   1137 		} else
   1138 			start_discover(iface);
   1139 		return;
   1140 	} else {
   1141 		syslog(LOG_INFO, "%s: rebinding lease of %s",
   1142 		    iface->name, inet_ntoa(iface->state->lease.addr));
   1143 	}
   1144 	iface->state->state = DHS_REBOOT;
   1145 	iface->state->xid = dhcp_xid(iface);
   1146 	iface->state->lease.server.s_addr = 0;
   1147 	delete_timeout(NULL, iface);
   1148 	if (ifo->fallback)
   1149 		add_timeout_sec(ifo->reboot, start_fallback, iface);
   1150 	else if (ifo->options & DHCPCD_LASTLEASE &&
   1151 	    iface->state->lease.frominfo)
   1152 		add_timeout_sec(ifo->reboot, start_timeout, iface);
   1153 	else if (!(ifo->options & DHCPCD_INFORM &&
   1154 		options & (DHCPCD_MASTER | DHCPCD_DAEMONISED)))
   1155 		add_timeout_sec(ifo->reboot, start_expire, iface);
   1156 	/* Don't bother ARP checking as the server could NAK us first. */
   1157 	if (ifo->options & DHCPCD_INFORM)
   1158 		send_inform(iface);
   1159 	else
   1160 		send_request(iface);
   1161 }
   1162 
   1163 void
   1164 start_interface(void *arg)
   1165 {
   1166 	struct interface *iface = arg;
   1167 	struct if_options *ifo = iface->state->options;
   1168 	struct stat st;
   1169 	struct timeval now;
   1170 	uint32_t l;
   1171 	int nolease;
   1172 
   1173 	handle_carrier(0, 0, iface->name);
   1174 	if (iface->carrier == LINK_DOWN) {
   1175 		syslog(LOG_INFO, "%s: waiting for carrier", iface->name);
   1176 		return;
   1177 	}
   1178 
   1179 	iface->start_uptime = uptime();
   1180 	free(iface->state->offer);
   1181 	iface->state->offer = NULL;
   1182 
   1183 	if (options & DHCPCD_IPV6RS && ifo->options & DHCPCD_IPV6RS) {
   1184 		if (check_ipv6(iface->name) == 1)
   1185 			ipv6rs_start(iface);
   1186 		else
   1187 			ifo->options &= ~DHCPCD_IPV6RS;
   1188 	}
   1189 
   1190 	if (iface->state->arping_index < ifo->arping_len) {
   1191 		start_arping(iface);
   1192 		return;
   1193 	}
   1194 	if (ifo->options & DHCPCD_STATIC) {
   1195 		start_static(iface);
   1196 		return;
   1197 	}
   1198 	if (ifo->options & DHCPCD_INFORM) {
   1199 		start_inform(iface);
   1200 		return;
   1201 	}
   1202 	if (iface->hwlen == 0 && ifo->clientid[0] == '\0') {
   1203 		syslog(LOG_WARNING, "%s: needs a clientid to configure",
   1204 		    iface->name);
   1205 		drop_dhcp(iface, "FAIL");
   1206 		close_sockets(iface);
   1207 		delete_timeout(NULL, iface);
   1208 		return;
   1209 	}
   1210 	/* We don't want to read the old lease if we NAK an old test */
   1211 	nolease = iface->state->offer && options & DHCPCD_TEST;
   1212 	if (!nolease)
   1213 		iface->state->offer = read_lease(iface);
   1214 	if (iface->state->offer) {
   1215 		get_lease(&iface->state->lease, iface->state->offer);
   1216 		iface->state->lease.frominfo = 1;
   1217 		if (iface->state->offer->cookie == 0) {
   1218 			if (iface->state->offer->yiaddr ==
   1219 			    iface->addr.s_addr)
   1220 			{
   1221 				free(iface->state->offer);
   1222 				iface->state->offer = NULL;
   1223 			}
   1224 		} else if (iface->state->lease.leasetime != ~0U &&
   1225 		    stat(iface->leasefile, &st) == 0)
   1226 		{
   1227 			/* Offset lease times and check expiry */
   1228 			gettimeofday(&now, NULL);
   1229 			if ((time_t)iface->state->lease.leasetime <
   1230 			    (time_t)(now.tv_sec - st.st_mtime))
   1231 			{
   1232 				syslog(LOG_DEBUG,
   1233 				    "%s: discarding expired lease",
   1234 				    iface->name);
   1235 				free(iface->state->offer);
   1236 				iface->state->offer = NULL;
   1237 				iface->state->lease.addr.s_addr = 0;
   1238 			} else {
   1239 				l = now.tv_sec - st.st_mtime;
   1240 				iface->state->lease.leasetime -= l;
   1241 				iface->state->lease.renewaltime -= l;
   1242 				iface->state->lease.rebindtime -= l;
   1243 			}
   1244 		}
   1245 	}
   1246 	if (iface->state->offer == NULL)
   1247 		start_discover(iface);
   1248 	else if (iface->state->offer->cookie == 0 &&
   1249 	    iface->state->options->options & DHCPCD_IPV4LL)
   1250 		start_ipv4ll(iface);
   1251 	else
   1252 		start_reboot(iface);
   1253 }
   1254 
   1255 static void
   1256 init_state(struct interface *iface, int argc, char **argv)
   1257 {
   1258 	struct if_state *ifs;
   1259 
   1260 	if (iface->state)
   1261 		ifs = iface->state;
   1262 	else
   1263 		ifs = iface->state = xzalloc(sizeof(*ifs));
   1264 
   1265 	ifs->state = DHS_INIT;
   1266 	ifs->reason = "PREINIT";
   1267 	ifs->nakoff = 1;
   1268 	configure_interface(iface, argc, argv);
   1269 	if (!(options & DHCPCD_TEST))
   1270 		run_script(iface);
   1271 	/* We need to drop the leasefile so that start_interface
   1272 	 * doesn't load it. */
   1273 	if (ifs->options->options & DHCPCD_REQUEST)
   1274 		unlink(iface->leasefile);
   1275 
   1276 	if (ifs->options->options & DHCPCD_LINK) {
   1277 		switch (carrier_status(iface)) {
   1278 		case 0:
   1279 			iface->carrier = LINK_DOWN;
   1280 			ifs->reason = "NOCARRIER";
   1281 			break;
   1282 		case 1:
   1283 			iface->carrier = LINK_UP;
   1284 			ifs->reason = "CARRIER";
   1285 			break;
   1286 		default:
   1287 			iface->carrier = LINK_UNKNOWN;
   1288 			return;
   1289 		}
   1290 		if (!(options & DHCPCD_TEST))
   1291 			run_script(iface);
   1292 	} else
   1293 		iface->carrier = LINK_UNKNOWN;
   1294 }
   1295 
   1296 void
   1297 handle_interface(int action, const char *ifname)
   1298 {
   1299 	struct interface *ifs, *ifp, *ifn, *ifl = NULL;
   1300 	const char * const argv[] = { ifname };
   1301 	int i;
   1302 
   1303 	if (action == -1) {
   1304 		ifp = find_interface(ifname);
   1305 		if (ifp != NULL)
   1306 			stop_interface(ifp);
   1307 		return;
   1308 	}
   1309 
   1310 	/* If running off an interface list, check it's in it. */
   1311 	if (ifc) {
   1312 		for (i = 0; i < ifc; i++)
   1313 			if (strcmp(ifv[i], ifname) == 0)
   1314 				break;
   1315 		if (i >= ifc)
   1316 			return;
   1317 	}
   1318 
   1319 	ifs = discover_interfaces(-1, UNCONST(argv));
   1320 	for (ifp = ifs; ifp; ifp = ifp->next) {
   1321 		if (strcmp(ifp->name, ifname) != 0)
   1322 			continue;
   1323 		/* Check if we already have the interface */
   1324 		for (ifn = ifaces; ifn; ifn = ifn->next) {
   1325 			if (strcmp(ifn->name, ifp->name) == 0)
   1326 				break;
   1327 			ifl = ifn;
   1328 		}
   1329 		if (ifn) {
   1330 			/* The flags and hwaddr could have changed */
   1331 			ifn->flags = ifp->flags;
   1332 			ifn->hwlen = ifp->hwlen;
   1333 			if (ifp->hwlen != 0)
   1334 				memcpy(ifn->hwaddr, ifp->hwaddr, ifn->hwlen);
   1335 		} else {
   1336 			if (ifl)
   1337 				ifl->next = ifp;
   1338 			else
   1339 				ifaces = ifp;
   1340 		}
   1341 		init_state(ifp, 0, NULL);
   1342 		start_interface(ifp);
   1343 	}
   1344 }
   1345 
   1346 #ifdef RTM_CHGADDR
   1347 void
   1348 handle_hwaddr(const char *ifname, unsigned char *hwaddr, size_t hwlen)
   1349 {
   1350 	struct interface *ifp;
   1351 	struct if_options *ifo;
   1352 
   1353 	for (ifp = ifaces; ifp; ifp = ifp->next)
   1354 		if (strcmp(ifp->name, ifname) == 0 && ifp->hwlen <= hwlen) {
   1355 			ifo = ifp->state->options;
   1356 			if (!(ifo->options &
   1357 			    (DHCPCD_INFORM | DHCPCD_STATIC | DHCPCD_CLIENTID))
   1358 	    		    && ifp->state->new != NULL &&
   1359 			    ifp->state->new->cookie == htonl(MAGIC_COOKIE))
   1360 			{
   1361 				syslog(LOG_INFO,
   1362 				    "%s: expiring for new hardware address",
   1363 				    ifp->name);
   1364 				drop_dhcp(ifp, "EXPIRE");
   1365 			}
   1366 			memcpy(ifp->hwaddr, hwaddr, hwlen);
   1367 			ifp->hwlen = hwlen;
   1368 			if (!(ifo->options &
   1369 			    (DHCPCD_INFORM | DHCPCD_STATIC | DHCPCD_CLIENTID)))
   1370 			{
   1371 				syslog(LOG_DEBUG, "%s: using hwaddr %s",
   1372 				    ifp->name,
   1373 		    		    hwaddr_ntoa(ifp->hwaddr, ifp->hwlen));
   1374 				ifp->state->interval = 0;
   1375 				ifp->state->nakoff = 1;
   1376 				start_interface(ifp);
   1377 			}
   1378 		}
   1379 	free(hwaddr);
   1380 }
   1381 #endif
   1382 
   1383 void
   1384 handle_ifa(int type, const char *ifname,
   1385     struct in_addr *addr, struct in_addr *net, struct in_addr *dst)
   1386 {
   1387 	struct interface *ifp;
   1388 	struct if_options *ifo;
   1389 	int i;
   1390 
   1391 	if (addr->s_addr == INADDR_ANY)
   1392 		return;
   1393 	for (ifp = ifaces; ifp; ifp = ifp->next)
   1394 		if (strcmp(ifp->name, ifname) == 0)
   1395 			break;
   1396 	if (ifp == NULL)
   1397 		return;
   1398 
   1399 	if (type == RTM_DELADDR) {
   1400 		if (ifp->state->new &&
   1401 		    ifp->state->new->yiaddr == addr->s_addr)
   1402 			syslog(LOG_INFO, "%s: removing IP address %s/%d",
   1403 			    ifp->name, inet_ntoa(ifp->state->lease.addr),
   1404 			    inet_ntocidr(ifp->state->lease.net));
   1405 		return;
   1406 	}
   1407 
   1408 	if (type != RTM_NEWADDR)
   1409 		return;
   1410 
   1411 	ifo = ifp->state->options;
   1412 	if ((ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC)) == 0 ||
   1413 	    ifo->req_addr.s_addr != INADDR_ANY)
   1414 		return;
   1415 
   1416 	free(ifp->state->old);
   1417 	ifp->state->old = ifp->state->new;
   1418 	ifp->state->new = dhcp_message_new(addr, net);
   1419 	ifp->dst.s_addr = dst ? dst->s_addr : INADDR_ANY;
   1420 	if (dst) {
   1421 		for (i = 1; i < 255; i++)
   1422 			if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
   1423 				dhcp_message_add_addr(ifp->state->new, i, *dst);
   1424 	}
   1425 	ifp->state->reason = "STATIC";
   1426 	build_routes();
   1427 	run_script(ifp);
   1428 	if (ifo->options & DHCPCD_INFORM) {
   1429 		ifp->state->state = DHS_INFORM;
   1430 		ifp->state->xid = dhcp_xid(ifp);
   1431 		ifp->state->lease.server.s_addr =
   1432 		    dst ? dst->s_addr : INADDR_ANY;
   1433 		ifp->addr = *addr;
   1434 		ifp->net = *net;
   1435 		send_inform(ifp);
   1436 	}
   1437 }
   1438 
   1439 /* ARGSUSED */
   1440 static void
   1441 handle_link(_unused void *arg)
   1442 {
   1443 	if (manage_link(linkfd) == -1)
   1444 		syslog(LOG_ERR, "manage_link: %m");
   1445 }
   1446 
   1447 static void
   1448 if_reboot(struct interface *iface, int argc, char **argv)
   1449 {
   1450 	const struct if_options *ifo;
   1451 	int opt;
   1452 
   1453 	ifo = iface->state->options;
   1454 	opt = ifo->options;
   1455 	configure_interface(iface, argc, argv);
   1456 	ifo = iface->state->options;
   1457 	iface->state->interval = 0;
   1458 	if ((ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC) &&
   1459 		iface->addr.s_addr != ifo->req_addr.s_addr) ||
   1460 	    (opt & (DHCPCD_INFORM | DHCPCD_STATIC) &&
   1461 		!(ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC))))
   1462 	{
   1463 		drop_dhcp(iface, "EXPIRE");
   1464 	} else {
   1465 		free(iface->state->offer);
   1466 		iface->state->offer = NULL;
   1467 	}
   1468 	start_interface(iface);
   1469 }
   1470 
   1471 static void
   1472 reconf_reboot(int action, int argc, char **argv, int oi)
   1473 {
   1474 	struct interface *ifl, *ifn, *ifp, *ifs, *ift;
   1475 
   1476 	ifs = discover_interfaces(argc - oi, argv + oi);
   1477 	if (ifs == NULL)
   1478 		return;
   1479 
   1480 	for (ifp = ifs; ifp && (ift = ifp->next, 1); ifp = ift) {
   1481 		ifl = NULL;
   1482 		for (ifn = ifaces; ifn; ifn = ifn->next) {
   1483 			if (strcmp(ifn->name, ifp->name) == 0)
   1484 				break;
   1485 			ifl = ifn;
   1486 		}
   1487 		if (ifn) {
   1488 			if (action)
   1489 				if_reboot(ifn, argc, argv);
   1490 			else if (ifn->state->new)
   1491 				configure(ifn);
   1492 			free_interface(ifp);
   1493 		} else {
   1494 			ifp->next = NULL;
   1495 			init_state(ifp, argc, argv);
   1496 			start_interface(ifp);
   1497 			if (ifl)
   1498 				ifl->next = ifp;
   1499 			else
   1500 				ifaces = ifp;
   1501 		}
   1502 	}
   1503 
   1504 	sort_interfaces();
   1505 }
   1506 
   1507 /* ARGSUSED */
   1508 static void
   1509 handle_signal(_unused void *arg)
   1510 {
   1511 	struct interface *ifp, *ifl;
   1512 	struct if_options *ifo;
   1513 	int sig = signal_read();
   1514 	int do_release, do_rebind, i;
   1515 
   1516 	do_rebind = do_release = 0;
   1517 	switch (sig) {
   1518 	case SIGINT:
   1519 		syslog(LOG_INFO, "received SIGINT, stopping");
   1520 		break;
   1521 	case SIGTERM:
   1522 		syslog(LOG_INFO, "received SIGTERM, stopping");
   1523 		break;
   1524 	case SIGALRM:
   1525 #ifdef ANDROID
   1526 		syslog(LOG_INFO, "received SIGALRM, renewing");
   1527 		for (ifp = ifaces; ifp; ifp = ifp->next) {
   1528 			start_renew(ifp);
   1529 		}
   1530 #else
   1531 		syslog(LOG_INFO, "received SIGALRM, rebinding");
   1532 		for (i = 0; i < ifac; i++)
   1533 			free(ifav[i]);
   1534 		free(ifav);
   1535 		ifav = NULL;
   1536 		ifac = 0;
   1537 		for (i = 0; i < ifdc; i++)
   1538 			free(ifdv[i]);
   1539 		free(ifdv);
   1540 		ifdc = 0;
   1541 		ifdv = NULL;
   1542 		ifo = read_config(cffile, NULL, NULL, NULL);
   1543 		add_options(ifo, margc, margv);
   1544 		/* We need to preserve these two options. */
   1545 		if (options & DHCPCD_MASTER)
   1546 			ifo->options |= DHCPCD_MASTER;
   1547 		if (options & DHCPCD_DAEMONISED)
   1548 			ifo->options |= DHCPCD_DAEMONISED;
   1549 		options = ifo->options;
   1550 		free_options(ifo);
   1551 		reconf_reboot(1, ifc, ifv, 0);
   1552 #endif
   1553 		return;
   1554 	case SIGHUP:
   1555 		syslog(LOG_INFO, "received SIGHUP, releasing");
   1556 		do_release = 1;
   1557 		break;
   1558 	case SIGUSR1:
   1559 		syslog(LOG_INFO, "received SIGUSR, reconfiguring");
   1560 		for (ifp = ifaces; ifp; ifp = ifp->next)
   1561 			if (ifp->state->new)
   1562 				configure(ifp);
   1563 		return;
   1564 	case SIGPIPE:
   1565 		syslog(LOG_WARNING, "received SIGPIPE");
   1566 		return;
   1567 	default:
   1568 		syslog(LOG_ERR,
   1569 		    "received signal %d, but don't know what to do with it",
   1570 		    sig);
   1571 		return;
   1572 	}
   1573 
   1574 	if (options & DHCPCD_TEST)
   1575 		exit(EXIT_FAILURE);
   1576 
   1577 	/* As drop_dhcp could re-arrange the order, we do it like this. */
   1578 	for (;;) {
   1579 		/* Be sane and drop the last config first */
   1580 		ifl = NULL;
   1581 		for (ifp = ifaces; ifp; ifp = ifp->next) {
   1582 			if (ifp->next == NULL)
   1583 				break;
   1584 			ifl = ifp;
   1585 		}
   1586 		if (ifp == NULL)
   1587 			break;
   1588 		if (ifp->carrier != LINK_DOWN &&
   1589 		    (do_release ||
   1590 			ifp->state->options->options & DHCPCD_RELEASE))
   1591 			send_release(ifp);
   1592 		stop_interface(ifp);
   1593 	}
   1594 	exit(EXIT_FAILURE);
   1595 }
   1596 
   1597 int
   1598 handle_args(struct fd_list *fd, int argc, char **argv)
   1599 {
   1600 	struct interface *ifp;
   1601 	int do_exit = 0, do_release = 0, do_reboot = 0, do_reconf = 0;
   1602 	int opt, oi = 0;
   1603 	ssize_t len;
   1604 	size_t l;
   1605 	struct iovec iov[2];
   1606 	char *tmp, *p;
   1607 
   1608 	if (fd != NULL) {
   1609 		/* Special commands for our control socket */
   1610 		if (strcmp(*argv, "--version") == 0) {
   1611 			len = strlen(VERSION) + 1;
   1612 			iov[0].iov_base = &len;
   1613 			iov[0].iov_len = sizeof(ssize_t);
   1614 			iov[1].iov_base = UNCONST(VERSION);
   1615 			iov[1].iov_len = len;
   1616 			if (writev(fd->fd, iov, 2) == -1) {
   1617 				syslog(LOG_ERR, "writev: %m");
   1618 				return -1;
   1619 			}
   1620 			return 0;
   1621 		} else if (strcmp(*argv, "--getconfigfile") == 0) {
   1622 			len = strlen(cffile ? cffile : CONFIG) + 1;
   1623 			iov[0].iov_base = &len;
   1624 			iov[0].iov_len = sizeof(ssize_t);
   1625 			iov[1].iov_base = cffile ? cffile : UNCONST(CONFIG);
   1626 			iov[1].iov_len = len;
   1627 			if (writev(fd->fd, iov, 2) == -1) {
   1628 				syslog(LOG_ERR, "writev: %m");
   1629 				return -1;
   1630 			}
   1631 			return 0;
   1632 		} else if (strcmp(*argv, "--getinterfaces") == 0) {
   1633 			len = 0;
   1634 			if (argc == 1) {
   1635 				for (ifp = ifaces; ifp; ifp = ifp->next) {
   1636 					len++;
   1637 					if (ifp->ras)
   1638 						len++;
   1639 				}
   1640 				len = write(fd->fd, &len, sizeof(len));
   1641 				if (len != sizeof(len))
   1642 					return -1;
   1643 				for (ifp = ifaces; ifp; ifp = ifp->next)
   1644 					send_interface(fd->fd, ifp);
   1645 				return 0;
   1646 			}
   1647 			opt = 0;
   1648 			while (argv[++opt] != NULL) {
   1649 				for (ifp = ifaces; ifp; ifp = ifp->next)
   1650 					if (strcmp(argv[opt], ifp->name) == 0) {
   1651 						len++;
   1652 						if (ifp->ras)
   1653 							len++;
   1654 					}
   1655 			}
   1656 			len = write(fd->fd, &len, sizeof(len));
   1657 			if (len != sizeof(len))
   1658 				return -1;
   1659 			opt = 0;
   1660 			while (argv[++opt] != NULL) {
   1661 				for (ifp = ifaces; ifp; ifp = ifp->next)
   1662 					if (strcmp(argv[opt], ifp->name) == 0)
   1663 						send_interface(fd->fd, ifp);
   1664 			}
   1665 			return 0;
   1666 		} else if (strcmp(*argv, "--listen") == 0) {
   1667 			fd->listener = 1;
   1668 			return 0;
   1669 		}
   1670 	}
   1671 
   1672 	/* Log the command */
   1673 	len = 0;
   1674 	for (opt = 0; opt < argc; opt++)
   1675 		len += strlen(argv[opt]) + 1;
   1676 	tmp = p = xmalloc(len + 1);
   1677 	for (opt = 0; opt < argc; opt++) {
   1678 		l = strlen(argv[opt]);
   1679 		strlcpy(p, argv[opt], l + 1);
   1680 		p += l;
   1681 		*p++ = ' ';
   1682 	}
   1683 	*--p = '\0';
   1684 	syslog(LOG_INFO, "control command: %s", tmp);
   1685 	free(tmp);
   1686 
   1687 	optind = 0;
   1688 	while ((opt = getopt_long(argc, argv, IF_OPTS, cf_options, &oi)) != -1)
   1689 	{
   1690 		switch (opt) {
   1691 		case 'g':
   1692 			do_reconf = 1;
   1693 			break;
   1694 		case 'k':
   1695 			do_release = 1;
   1696 			break;
   1697 		case 'n':
   1698 			do_reboot = 1;
   1699 			break;
   1700 		case 'x':
   1701 			do_exit = 1;
   1702 			break;
   1703 		}
   1704 	}
   1705 
   1706 	/* We need at least one interface */
   1707 	if (optind == argc) {
   1708 		syslog(LOG_ERR, "handle_args: no interface");
   1709 		return -1;
   1710 	}
   1711 
   1712 	if (do_release || do_exit) {
   1713 		for (oi = optind; oi < argc; oi++) {
   1714 			for (ifp = ifaces; ifp; ifp = ifp->next)
   1715 				if (strcmp(ifp->name, argv[oi]) == 0)
   1716 					break;
   1717 			if (!ifp)
   1718 				continue;
   1719 			if (do_release)
   1720 				ifp->state->options->options |= DHCPCD_RELEASE;
   1721 			if (ifp->state->options->options & DHCPCD_RELEASE &&
   1722 			    ifp->carrier != LINK_DOWN)
   1723 				send_release(ifp);
   1724 			stop_interface(ifp);
   1725 		}
   1726 		return 0;
   1727 	}
   1728 
   1729 	reconf_reboot(do_reboot, argc, argv, optind);
   1730 	return 0;
   1731 }
   1732 
   1733 void
   1734 open_sockets(struct interface *iface)
   1735 {
   1736 	if (iface->raw_fd == -1) {
   1737 		if (open_socket(iface, ETHERTYPE_IP) == -1)
   1738 			syslog(LOG_ERR, "%s: open_socket: %m", iface->name);
   1739 		else
   1740 			add_event(iface->raw_fd, handle_dhcp_packet, iface);
   1741 	}
   1742 	if (iface->udp_fd == -1 &&
   1743 	    iface->addr.s_addr != 0 &&
   1744 	    iface->state->new != NULL &&
   1745 	    (iface->state->new->cookie == htonl(MAGIC_COOKIE) ||
   1746 	    iface->state->options->options & DHCPCD_INFORM))
   1747 	{
   1748 		if (open_udp_socket(iface) == -1 && errno != EADDRINUSE)
   1749 			syslog(LOG_ERR, "%s: open_udp_socket: %m", iface->name);
   1750 	}
   1751 }
   1752 
   1753 void
   1754 close_sockets(struct interface *iface)
   1755 {
   1756 	if (iface->arp_fd != -1) {
   1757 		delete_event(iface->arp_fd);
   1758 		close(iface->arp_fd);
   1759 		iface->arp_fd = -1;
   1760 	}
   1761 	if (iface->raw_fd != -1) {
   1762 		delete_event(iface->raw_fd);
   1763 		close(iface->raw_fd);
   1764 		iface->raw_fd = -1;
   1765 	}
   1766 	if (iface->udp_fd != -1) {
   1767 		/* we don't listen to events on the udp */
   1768 		close(iface->udp_fd);
   1769 		iface->udp_fd = -1;
   1770 	}
   1771 }
   1772 
   1773 #ifdef ANDROID
   1774 void switchUser(void)
   1775 {
   1776 	gid_t groups[] = { AID_INET, AID_SHELL };
   1777 	struct __user_cap_header_struct header;
   1778 	struct __user_cap_data_struct cap;
   1779 
   1780 	setgroups(sizeof(groups)/sizeof(groups[0]), groups);
   1781 
   1782 	prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
   1783 
   1784 	setgid(AID_DHCP);
   1785 	setuid(AID_DHCP);
   1786 	header.version = _LINUX_CAPABILITY_VERSION;
   1787 	header.pid = 0;
   1788 	cap.effective = cap.permitted =
   1789 		(1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW) |
   1790 		(1 << CAP_NET_BROADCAST) | (1 << CAP_NET_BIND_SERVICE);
   1791 	cap.inheritable = 0;
   1792 	capset(&header, &cap);
   1793 }
   1794 #endif /* ANDROID */
   1795 
   1796 int
   1797 main(int argc, char **argv)
   1798 {
   1799 	struct interface *iface;
   1800 	int opt, oi = 0, signal_fd, sig = 0, i, control_fd;
   1801 	size_t len;
   1802 	pid_t pid;
   1803 	struct timespec ts;
   1804 
   1805 #ifdef ANDROID
   1806 	/* Reuse system properties for a p2p interface */
   1807 	char p2p_interface[PROPERTY_KEY_MAX];
   1808 	switchUser();
   1809 #endif
   1810 	closefrom(3);
   1811 	openlog(PACKAGE, LOG_PERROR | LOG_PID, LOG_DAEMON);
   1812 	setlogmask(LOG_UPTO(LOG_INFO));
   1813 
   1814 	/* Test for --help and --version */
   1815 	if (argc > 1) {
   1816 		if (strcmp(argv[1], "--help") == 0) {
   1817 			usage();
   1818 			exit(EXIT_SUCCESS);
   1819 		} else if (strcmp(argv[1], "--version") == 0) {
   1820 			printf(""PACKAGE" "VERSION"\n%s\n", copyright);
   1821 			exit(EXIT_SUCCESS);
   1822 		}
   1823 	}
   1824 
   1825 	i = 0;
   1826 	while ((opt = getopt_long(argc, argv, IF_OPTS, cf_options, &oi)) != -1)
   1827 	{
   1828 		switch (opt) {
   1829 		case 'f':
   1830 			cffile = optarg;
   1831 			break;
   1832 		case 'g':
   1833 			sig = SIGUSR1;
   1834 			break;
   1835 		case 'k':
   1836 			sig = SIGHUP;
   1837 			break;
   1838 		case 'n':
   1839 			sig = SIGALRM;
   1840 			break;
   1841 		case 'x':
   1842 			sig = SIGTERM;
   1843 			break;
   1844 		case 'T':
   1845 			i = 1;
   1846 			break;
   1847 		case 'U':
   1848 			i = 2;
   1849 			break;
   1850 		case 'a':
   1851 			avoid_routes = 1;
   1852 			break;
   1853 		case 'V':
   1854 			print_options();
   1855 			exit(EXIT_SUCCESS);
   1856 		case '?':
   1857 			usage();
   1858 			exit(EXIT_FAILURE);
   1859 		}
   1860 	}
   1861 
   1862 	margv = argv;
   1863 	margc = argc;
   1864 	if_options = read_config(cffile, NULL, NULL, NULL);
   1865 	opt = add_options(if_options, argc, argv);
   1866 	if (opt != 1) {
   1867 		if (opt == 0)
   1868 			usage();
   1869 		exit(EXIT_FAILURE);
   1870 	}
   1871 	options = if_options->options;
   1872 	if (i != 0) {
   1873 		if (i == 1)
   1874 			options |= DHCPCD_TEST;
   1875 		else
   1876 			options |= DHCPCD_DUMPLEASE;
   1877 		options |= DHCPCD_PERSISTENT;
   1878 		options &= ~DHCPCD_DAEMONISE;
   1879 	}
   1880 
   1881 #ifdef THERE_IS_NO_FORK
   1882 	options &= ~DHCPCD_DAEMONISE;
   1883 #endif
   1884 
   1885 	if (options & DHCPCD_DEBUG)
   1886 		setlogmask(LOG_UPTO(LOG_DEBUG));
   1887 	if (options & DHCPCD_QUIET)
   1888 		close(STDERR_FILENO);
   1889 
   1890 	if (!(options & (DHCPCD_TEST | DHCPCD_DUMPLEASE))) {
   1891 		/* If we have any other args, we should run as a single dhcpcd
   1892 		 *  instance for that interface. */
   1893 		len = strlen(PIDFILE) + IF_NAMESIZE + 2;
   1894 		pidfile = xmalloc(len);
   1895 		if (optind == argc - 1)
   1896 			snprintf(pidfile, len, PIDFILE, "-", argv[optind]);
   1897 		else {
   1898 			snprintf(pidfile, len, PIDFILE, "", "");
   1899 			options |= DHCPCD_MASTER;
   1900 		}
   1901 	}
   1902 
   1903 	if (chdir("/") == -1)
   1904 		syslog(LOG_ERR, "chdir `/': %m");
   1905 	atexit(cleanup);
   1906 
   1907 	if (options & DHCPCD_DUMPLEASE) {
   1908 		if (optind != argc - 1) {
   1909 			syslog(LOG_ERR, "dumplease requires an interface");
   1910 			exit(EXIT_FAILURE);
   1911 		}
   1912 		ifaces = iface = xzalloc(sizeof(*iface));
   1913 		strlcpy(iface->name, argv[optind], sizeof(iface->name));
   1914 		snprintf(iface->leasefile, sizeof(iface->leasefile),
   1915 		    LEASEFILE, iface->name);
   1916 		iface->state = xzalloc(sizeof(*iface->state));
   1917 		iface->state->options = xzalloc(sizeof(*iface->state->options));
   1918 		strlcpy(iface->state->options->script, if_options->script,
   1919 		    sizeof(iface->state->options->script));
   1920 		iface->state->new = read_lease(iface);
   1921 		if (iface->state->new == NULL && errno == ENOENT) {
   1922 			strlcpy(iface->leasefile, argv[optind],
   1923 			    sizeof(iface->leasefile));
   1924 			iface->state->new = read_lease(iface);
   1925 		}
   1926 		if (iface->state->new == NULL) {
   1927 			if (errno == ENOENT)
   1928 				syslog(LOG_ERR, "%s: no lease to dump",
   1929 				    iface->name);
   1930 			exit(EXIT_FAILURE);
   1931 		}
   1932 		iface->state->reason = "DUMP";
   1933 		run_script(iface);
   1934 		exit(EXIT_SUCCESS);
   1935 	}
   1936 
   1937 	if (!(options & (DHCPCD_MASTER | DHCPCD_TEST))) {
   1938 		control_fd = open_control();
   1939 		if (control_fd != -1) {
   1940 			syslog(LOG_INFO,
   1941 			    "sending commands to master dhcpcd process");
   1942 			i = send_control(argc, argv);
   1943 			if (i > 0) {
   1944 				syslog(LOG_DEBUG, "send OK");
   1945 				exit(EXIT_SUCCESS);
   1946 			} else {
   1947 				syslog(LOG_ERR, "failed to send commands");
   1948 				exit(EXIT_FAILURE);
   1949 			}
   1950 		} else {
   1951 			if (errno != ENOENT)
   1952 				syslog(LOG_ERR, "open_control: %m");
   1953 		}
   1954 	}
   1955 
   1956 #ifndef ANDROID
   1957 	/* android runs us as user "dhcp" */
   1958 	if (geteuid())
   1959 		syslog(LOG_WARNING,
   1960 		    PACKAGE " will not work correctly unless run as root");
   1961 #endif
   1962 	if (sig != 0) {
   1963 #ifdef ANDROID
   1964 		char pidpropname[PROPERTY_KEY_MAX];
   1965 		char pidpropval[PROPERTY_VALUE_MAX];
   1966 
   1967 		if (optind != argc - 1) {
   1968 			syslog(LOG_ERR, "Android requires an interface");
   1969 			exit(EXIT_FAILURE);
   1970 		}
   1971 
   1972 		if (strncmp(argv[optind], "p2p", 3) == 0) {
   1973 			strncpy(p2p_interface, "p2p", sizeof(p2p_interface));
   1974 		} else {
   1975 			strncpy(p2p_interface, argv[optind], sizeof(p2p_interface));
   1976 		}
   1977 
   1978 		if (snprintf(pidpropname,
   1979 			     sizeof(pidpropname),
   1980 			     "dhcp.%s.pid", p2p_interface) >= PROPERTY_KEY_MAX)
   1981 			exit(EXIT_FAILURE);
   1982 		property_get(pidpropname, pidpropval, NULL);
   1983 		if (strlen(pidpropval) == 0)
   1984 			exit(EXIT_FAILURE);
   1985 		pid = atoi(pidpropval);
   1986 #else
   1987 		pid = read_pid();
   1988 #endif
   1989 		if (pid != 0)
   1990 			syslog(LOG_INFO, "sending signal %d to pid %d",
   1991 			    sig, pid);
   1992 		if (pid == 0 || kill(pid, sig) != 0) {
   1993 			if (sig != SIGALRM)
   1994 				syslog(LOG_ERR, ""PACKAGE" not running");
   1995 			if (pid != 0 && errno != ESRCH) {
   1996 				syslog(LOG_ERR, "kill: %m");
   1997 				exit(EXIT_FAILURE);
   1998 			}
   1999 			unlink(pidfile);
   2000 			if (sig != SIGALRM)
   2001 				exit(EXIT_FAILURE);
   2002 		} else {
   2003 			if (sig == SIGALRM || sig == SIGUSR1)
   2004 				exit(EXIT_SUCCESS);
   2005 			/* Spin until it exits */
   2006 			syslog(LOG_INFO, "waiting for pid %d to exit", pid);
   2007 			ts.tv_sec = 0;
   2008 			ts.tv_nsec = 100000000; /* 10th of a second */
   2009 			for(i = 0; i < 100; i++) {
   2010 				nanosleep(&ts, NULL);
   2011 				if (read_pid() == 0)
   2012 					exit(EXIT_SUCCESS);
   2013 			}
   2014 			syslog(LOG_ERR, "pid %d failed to exit", pid);
   2015 			exit(EXIT_FAILURE);
   2016 		}
   2017 	}
   2018 
   2019 	if (!(options & DHCPCD_TEST)) {
   2020 #ifdef ANDROID
   2021 		char pidpropname[PROPERTY_KEY_MAX];
   2022 		char pidpropval[PROPERTY_VALUE_MAX];
   2023 #endif
   2024 #ifndef ANDROID
   2025 		if ((pid = read_pid()) > 0 &&
   2026 		    kill(pid, 0) == 0)
   2027 		{
   2028 			syslog(LOG_ERR, ""PACKAGE
   2029 			    " already running on pid %d (%s)",
   2030 			    pid, pidfile);
   2031 			exit(EXIT_FAILURE);
   2032 		}
   2033 
   2034 		/* Ensure we have the needed directories */
   2035 		if (mkdir(RUNDIR, 0755) == -1 && errno != EEXIST)
   2036 			syslog(LOG_ERR, "mkdir `%s': %m", RUNDIR);
   2037 		if (mkdir(DBDIR, 0755) == -1 && errno != EEXIST)
   2038 			syslog(LOG_ERR, "mkdir `%s': %m", DBDIR);
   2039 #endif
   2040 
   2041 		pidfd = open(pidfile, O_WRONLY | O_CREAT | O_NONBLOCK, 0664);
   2042 		if (pidfd == -1)
   2043 			syslog(LOG_ERR, "open `%s': %m", pidfile);
   2044 		else {
   2045 			/* Lock the file so that only one instance of dhcpcd
   2046 			 * runs on an interface */
   2047 			if (flock(pidfd, LOCK_EX | LOCK_NB) == -1) {
   2048 				syslog(LOG_ERR, "flock `%s': %m", pidfile);
   2049 				exit(EXIT_FAILURE);
   2050 			}
   2051 			if (set_cloexec(pidfd) == -1)
   2052 				exit(EXIT_FAILURE);
   2053 #ifdef ANDROID
   2054 			if (optind != argc - 1) {
   2055 				syslog(LOG_ERR, "Android requires an interface");
   2056 				exit(EXIT_FAILURE);
   2057 			}
   2058 
   2059 			if (strncmp(argv[optind], "p2p", 3) == 0) {
   2060 				strncpy(p2p_interface, "p2p", sizeof(p2p_interface));
   2061 			} else {
   2062 				strncpy(p2p_interface, argv[optind], sizeof(p2p_interface));
   2063 			}
   2064 
   2065 			if (snprintf(pidpropname,
   2066 				     sizeof(pidpropname),
   2067 				     "dhcp.%s.pid", p2p_interface) >= PROPERTY_KEY_MAX)
   2068 				exit(EXIT_FAILURE);
   2069 			if (snprintf(pidpropval, sizeof(pidpropval), "%d", getpid()) >= PROPERTY_VALUE_MAX)
   2070 				exit(EXIT_FAILURE);
   2071 			property_set(pidpropname, pidpropval);
   2072 #else
   2073 			writepid(pidfd, getpid());
   2074 #endif
   2075 		}
   2076 	}
   2077 
   2078 	syslog(LOG_INFO, "version " VERSION " starting");
   2079 
   2080 	if ((signal_fd = signal_init()) == -1)
   2081 		exit(EXIT_FAILURE);
   2082 	if (signal_setup() == -1)
   2083 		exit(EXIT_FAILURE);
   2084 	add_event(signal_fd, handle_signal, NULL);
   2085 
   2086 	if (options & DHCPCD_MASTER) {
   2087 		if (start_control() == -1)
   2088 			syslog(LOG_ERR, "start_control: %m");
   2089 	}
   2090 
   2091 	if (init_sockets() == -1) {
   2092 		syslog(LOG_ERR, "init_socket: %m");
   2093 		exit(EXIT_FAILURE);
   2094 	}
   2095 	if (if_options->options & DHCPCD_LINK) {
   2096 		linkfd = open_link_socket();
   2097 		if (linkfd == -1)
   2098 			syslog(LOG_ERR, "open_link_socket: %m");
   2099 		else
   2100 			add_event(linkfd, handle_link, NULL);
   2101 	}
   2102 
   2103 #if 0
   2104 	if (options & DHCPCD_IPV6RS && disable_rtadv() == -1) {
   2105 		syslog(LOG_ERR, "ipv6rs: %m");
   2106 		options &= ~DHCPCD_IPV6RS;
   2107 	}
   2108 #endif
   2109 
   2110 	if (options & DHCPCD_IPV6RS && !check_ipv6(NULL))
   2111 		options &= ~DHCPCD_IPV6RS;
   2112 	if (options & DHCPCD_IPV6RS) {
   2113 		ipv6rsfd = ipv6rs_open();
   2114 		if (ipv6rsfd == -1) {
   2115 			syslog(LOG_ERR, "ipv6rs: %m");
   2116 			options &= ~DHCPCD_IPV6RS;
   2117 		} else {
   2118 			add_event(ipv6rsfd, ipv6rs_handledata, NULL);
   2119 //			atexit(restore_rtadv);
   2120 		}
   2121 	}
   2122 
   2123 	ifc = argc - optind;
   2124 	ifv = argv + optind;
   2125 
   2126 	/* When running dhcpcd against a single interface, we need to retain
   2127 	 * the old behaviour of waiting for an IP address */
   2128 	if (ifc == 1)
   2129 		options |= DHCPCD_WAITIP;
   2130 
   2131 	ifaces = discover_interfaces(ifc, ifv);
   2132 	for (i = 0; i < ifc; i++) {
   2133 		for (iface = ifaces; iface; iface = iface->next)
   2134 			if (strcmp(iface->name, ifv[i]) == 0)
   2135 				break;
   2136 		if (!iface)
   2137 			syslog(LOG_ERR, "%s: interface not found or invalid",
   2138 			    ifv[i]);
   2139 	}
   2140 	if (!ifaces) {
   2141 		if (ifc == 0)
   2142 			syslog(LOG_ERR, "no valid interfaces found");
   2143 		else
   2144 			exit(EXIT_FAILURE);
   2145 		if (!(options & DHCPCD_LINK)) {
   2146 			syslog(LOG_ERR,
   2147 			    "aborting as link detection is disabled");
   2148 			exit(EXIT_FAILURE);
   2149 		}
   2150 	}
   2151 
   2152 	if (options & DHCPCD_BACKGROUND)
   2153 		daemonise();
   2154 
   2155 	opt = 0;
   2156 	for (iface = ifaces; iface; iface = iface->next) {
   2157 		init_state(iface, argc, argv);
   2158 		if (iface->carrier != LINK_DOWN)
   2159 			opt = 1;
   2160 	}
   2161 
   2162 	if (!(options & DHCPCD_BACKGROUND)) {
   2163 		/* If we don't have a carrier, we may have to wait for a second
   2164 		 * before one becomes available if we brought an interface up */
   2165 		if (opt == 0 &&
   2166 		    options & DHCPCD_LINK &&
   2167 		    options & DHCPCD_WAITUP &&
   2168 		    !(options & DHCPCD_WAITIP))
   2169 		{
   2170 			ts.tv_sec = 1;
   2171 			ts.tv_nsec = 0;
   2172 			nanosleep(&ts, NULL);
   2173 			for (iface = ifaces; iface; iface = iface->next) {
   2174 				handle_carrier(0, 0, iface->name);
   2175 				if (iface->carrier != LINK_DOWN) {
   2176 					opt = 1;
   2177 					break;
   2178 				}
   2179 			}
   2180 		}
   2181 		if (options & DHCPCD_MASTER)
   2182 			i = if_options->timeout;
   2183 		else
   2184 			i = ifaces->state->options->timeout;
   2185 		if (opt == 0 &&
   2186 		    options & DHCPCD_LINK &&
   2187 		    !(options & DHCPCD_WAITIP))
   2188 		{
   2189 			syslog(LOG_WARNING, "no interfaces have a carrier");
   2190 			daemonise();
   2191 		} else if (i > 0) {
   2192 			if (options & DHCPCD_IPV4LL)
   2193 				options |= DHCPCD_TIMEOUT_IPV4LL;
   2194 			add_timeout_sec(i, handle_exit_timeout, NULL);
   2195 		}
   2196 	}
   2197 	free_options(if_options);
   2198 	if_options = NULL;
   2199 
   2200 	sort_interfaces();
   2201 	for (iface = ifaces; iface; iface = iface->next)
   2202 		add_timeout_sec(0, start_interface, iface);
   2203 
   2204 	start_eloop();
   2205 	exit(EXIT_SUCCESS);
   2206 }
   2207