Module Name:    src
Committed By:   roy
Date:           Mon Oct 12 14:09:03 UTC 2020

Modified Files:
        src/external/bsd/dhcpcd/dist/src: dhcp.c dhcp6.c dhcpcd.c if-bsd.c
            ipv6.c ipv6nd.c logerr.c privsep.c script.c

Log Message:
Sync withn dhcpcd-9.3.1


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/external/bsd/dhcpcd/dist/src/dhcp.c
cvs rdiff -u -r1.23 -r1.24 src/external/bsd/dhcpcd/dist/src/dhcp6.c
cvs rdiff -u -r1.43 -r1.44 src/external/bsd/dhcpcd/dist/src/dhcpcd.c
cvs rdiff -u -r1.24 -r1.25 src/external/bsd/dhcpcd/dist/src/if-bsd.c \
    src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.14 -r1.15 src/external/bsd/dhcpcd/dist/src/ipv6.c
cvs rdiff -u -r1.9 -r1.10 src/external/bsd/dhcpcd/dist/src/logerr.c
cvs rdiff -u -r1.8 -r1.9 src/external/bsd/dhcpcd/dist/src/privsep.c
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/dhcpcd/dist/src/script.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.40 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.41
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.40	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c	Mon Oct 12 14:09:03 2020
@@ -1712,7 +1712,7 @@ send_message(struct interface *ifp, uint
 
 	if (callback == NULL) {
 		/* No carrier? Don't bother sending the packet. */
-		if (ifp->carrier <= LINK_DOWN)
+		if (!if_is_link_up(ifp))
 			return;
 		logdebugx("%s: sending %s with xid 0x%x",
 		    ifp->name,
@@ -1731,7 +1731,7 @@ send_message(struct interface *ifp, uint
 		    (arc4random_uniform(MSEC_PER_SEC * 2) - MSEC_PER_SEC);
 		/* No carrier? Don't bother sending the packet.
 		 * However, we do need to advance the timeout. */
-		if (ifp->carrier <= LINK_DOWN)
+		if (!if_is_link_up(ifp))
 			goto fail;
 		logdebugx("%s: sending %s (xid 0x%x), next in %0.1f seconds",
 		    ifp->name,
@@ -2633,7 +2633,7 @@ dhcp_reboot(struct interface *ifp)
 	state->state = DHS_REBOOT;
 	state->interval = 0;
 
-	if (ifo->options & DHCPCD_LINK && ifp->carrier <= LINK_DOWN) {
+	if (ifo->options & DHCPCD_LINK && !if_is_link_up(ifp)) {
 		loginfox("%s: waiting for carrier", ifp->name);
 		return;
 	}
@@ -2733,7 +2733,7 @@ dhcp_drop(struct interface *ifp, const c
 		state->state = DHS_RELEASE;
 
 		dhcp_unlink(ifp->ctx, state->leasefile);
-		if (ifp->carrier > LINK_DOWN &&
+		if (if_is_link_up(ifp) &&
 		    state->new != NULL &&
 		    state->lease.server.s_addr != INADDR_ANY)
 		{

Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.23 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.24
--- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.23	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.c	Mon Oct 12 14:09:03 2020
@@ -1237,7 +1237,7 @@ dhcp6_sendmessage(struct interface *ifp,
 	};
 	char uaddr[INET6_ADDRSTRLEN];
 
-	if (!callback && ifp->carrier <= LINK_DOWN)
+	if (!callback && !if_is_link_up(ifp))
 		return 0;
 
 	if (!IN6_IS_ADDR_UNSPECIFIED(&state->unicast)) {
@@ -1298,7 +1298,7 @@ dhcp6_sendmessage(struct interface *ifp,
 		    + (unsigned int)((float)state->RT
 		    * ((float)lr / DHCP6_RAND_DIV));
 
-		if (ifp->carrier > LINK_DOWN)
+		if (if_is_link_up(ifp))
 			logdebugx("%s: %s %s (xid 0x%02x%02x%02x)%s%s,"
 			    " next in %0.1f seconds",
 			    ifp->name,
@@ -1320,7 +1320,7 @@ dhcp6_sendmessage(struct interface *ifp,
 		}
 	}
 
-	if (ifp->carrier <= LINK_DOWN)
+	if (!if_is_link_up(ifp))
 		return 0;
 
 	/* Update the elapsed time */
@@ -2906,7 +2906,7 @@ dhcp6_delegate_prefix(struct interface *
 				if (ia->sla_len == 0) {
 					/* no SLA configured, so lets
 					 * automate it */
-					if (ifd->carrier != LINK_UP) {
+					if (!if_is_link_up(ifd)) {
 						logdebugx(
 						    "%s: has no carrier, cannot"
 						    " delegate addresses",
@@ -2922,7 +2922,7 @@ dhcp6_delegate_prefix(struct interface *
 					sla = &ia->sla[j];
 					if (strcmp(ifd->name, sla->ifname))
 						continue;
-					if (ifd->carrier != LINK_UP) {
+					if (!if_is_link_up(ifd)) {
 						logdebugx(
 						    "%s: has no carrier, cannot"
 						    " delegate addresses",
@@ -4029,7 +4029,7 @@ dhcp6_freedrop(struct interface *ifp, in
 		if (drop && options & DHCPCD_RELEASE &&
 		    state->state != DH6S_DELEGATED)
 		{
-			if (ifp->carrier == LINK_UP &&
+			if (if_is_link_up(ifp) &&
 			    state->state != DH6S_RELEASED &&
 			    state->state != DH6S_INFORMED)
 			{

Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.43 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.44
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.43	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c	Mon Oct 12 14:09:03 2020
@@ -97,9 +97,6 @@ const int dhcpcd_signals_ignore[] = {
 const size_t dhcpcd_signals_ignore_len = __arraycount(dhcpcd_signals_ignore);
 #endif
 
-#define IF_UPANDRUNNING(a) \
-	(((a)->flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
-
 const char *dhcpcd_default_script = SCRIPT;
 
 static void
@@ -412,7 +409,7 @@ dhcpcd_drop(struct interface *ifp, int s
 }
 
 static void
-stop_interface(struct interface *ifp)
+stop_interface(struct interface *ifp, const char *reason)
 {
 	struct dhcpcd_ctx *ctx;
 
@@ -421,10 +418,7 @@ stop_interface(struct interface *ifp)
 	ifp->options->options |= DHCPCD_STOPPING;
 
 	dhcpcd_drop(ifp, 1);
-	if (ifp->options->options & DHCPCD_DEPARTED)
-		script_runreason(ifp, "DEPARTED");
-	else
-		script_runreason(ifp, "STOPPED");
+	script_runreason(ifp, reason == NULL ? "STOPPED" : reason);
 
 	/* Delete all timeouts for the interfaces */
 	eloop_q_timeout_delete(ctx->eloop, ELOOP_QUEUE_ALL, NULL, ifp);
@@ -704,110 +698,108 @@ dhcpcd_reportssid(struct interface *ifp)
 void
 dhcpcd_handlecarrier(struct interface *ifp, int carrier, unsigned int flags)
 {
-	bool nolink = ifp->options == NULL ||
-	    !(ifp->options->options & DHCPCD_LINK);
+	bool was_link_up = if_is_link_up(ifp);
 
+	ifp->carrier = carrier;
 	ifp->flags = flags;
-	if (carrier == LINK_UNKNOWN) {
-		if (ifp->wireless)
-			carrier = LINK_DOWN;
-		else
-			carrier = IF_UPANDRUNNING(ifp) ? LINK_UP : LINK_DOWN;
-	}
 
-	if (carrier == LINK_DOWN || (ifp->flags & IFF_UP) == 0) {
-		if (ifp->carrier != LINK_DOWN) {
-#ifdef NOCARRIER_PRESERVE_IP
-			if (ifp->flags & IFF_UP &&
-			    (ifp->options == NULL ||
-			    !(ifp->options->options & DHCPCD_ANONYMOUS)))
-				ifp->carrier = LINK_DOWN_IFFUP;
-			else
-#endif
-				ifp->carrier = LINK_DOWN;
-			if (!ifp->active || nolink)
-				return;
-			loginfox("%s: carrier lost", ifp->name);
-			script_runreason(ifp, "NOCARRIER");
+	if (!if_is_link_up(ifp)) {
+		if (!was_link_up || !ifp->active)
+			return;
+		loginfox("%s: carrier lost", ifp->name);
+		script_runreason(ifp, "NOCARRIER");
 #ifdef NOCARRIER_PRESERVE_IP
-			if (ifp->flags & IFF_UP &&
-			    !(ifp->options->options & DHCPCD_ANONYMOUS))
-			{
+		if (ifp->flags & IFF_UP &&
+		    !(ifp->options->options & DHCPCD_ANONYMOUS))
+		{
 #ifdef ARP
-				arp_drop(ifp);
+			arp_drop(ifp);
 #endif
 #ifdef INET
-				dhcp_abort(ifp);
+			dhcp_abort(ifp);
 #endif
 #ifdef DHCP6
-				dhcp6_abort(ifp);
+			dhcp6_abort(ifp);
 #endif
-			} else
+		} else
 #endif
-				dhcpcd_drop(ifp, 0);
-			if (ifp->options->options & DHCPCD_ANONYMOUS) {
-				bool was_up = ifp->flags & IFF_UP;
-
-				if (was_up)
-					if_down(ifp);
-				if (if_randomisemac(ifp) == -1 && errno != ENXIO)
-					logerr(__func__);
-				if (was_up)
-					if_up(ifp);
-			}
+			dhcpcd_drop(ifp, 0);
+		if (ifp->options->options & DHCPCD_ANONYMOUS) {
+			bool is_up = ifp->flags & IFF_UP;
+
+			if (is_up)
+				if_down(ifp);
+			if (if_randomisemac(ifp) == -1 && errno != ENXIO)
+				logerr(__func__);
+			if (is_up)
+				if_up(ifp);
 		}
-	} else if (carrier == LINK_UP && ifp->flags & IFF_UP) {
-		if (ifp->carrier != LINK_UP) {
-			ifp->carrier = LINK_UP;
-			if (ifp->active)
-				loginfox("%s: carrier acquired", ifp->name);
+		return;
+	}
+
+	/*
+	 * At this point carrier is NOT DOWN and we have IFF_UP.
+	 * We should treat LINK_UNKNOWN as up as the driver may not support
+	 * link state changes.
+	 * The consideration of any other information about carrier should
+	 * be handled in the OS specific if_carrier() function.
+	 */
+	if (was_link_up)
+		return;
+
+	if (ifp->active) {
+		if (carrier == LINK_UNKNOWN)
+			loginfox("%s: carrier unknown, assuming up", ifp->name);
+		else
+			loginfox("%s: carrier acquired", ifp->name);
+	}
+
 #if !defined(__linux__) && !defined(__NetBSD__)
-			/* BSD does not emit RTM_NEWADDR or RTM_CHGADDR when the
-			 * hardware address changes so we have to go
-			 * through the disovery process to work it out. */
-			dhcpcd_handleinterface(ifp->ctx, 0, ifp->name);
-#endif
-			if (ifp->wireless) {
-				uint8_t ossid[IF_SSIDLEN];
-				size_t olen;
-
-				olen = ifp->ssid_len;
-				memcpy(ossid, ifp->ssid, ifp->ssid_len);
-				if_getssid(ifp);
-
-				/* If we changed SSID network, drop leases */
-				if ((ifp->ssid_len != olen ||
-				    memcmp(ifp->ssid, ossid, ifp->ssid_len)) &&
-				    ifp->active)
-				{
-					dhcpcd_reportssid(ifp);
+	/* BSD does not emit RTM_NEWADDR or RTM_CHGADDR when the
+	 * hardware address changes so we have to go
+	 * through the disovery process to work it out. */
+	dhcpcd_handleinterface(ifp->ctx, 0, ifp->name);
+#endif
+
+	if (ifp->wireless) {
+		uint8_t ossid[IF_SSIDLEN];
+		size_t olen;
+
+		olen = ifp->ssid_len;
+		memcpy(ossid, ifp->ssid, ifp->ssid_len);
+		if_getssid(ifp);
+
+		/* If we changed SSID network, drop leases */
+		if ((ifp->ssid_len != olen ||
+		    memcmp(ifp->ssid, ossid, ifp->ssid_len)) && ifp->active)
+		{
+			dhcpcd_reportssid(ifp);
 #ifdef NOCARRIER_PRESERVE_IP
-					dhcpcd_drop(ifp, 0);
+			dhcpcd_drop(ifp, 0);
 #endif
 #ifdef IPV4LL
-					ipv4ll_reset(ifp);
+			ipv4ll_reset(ifp);
 #endif
-				}
-			}
-			if (!ifp->active || nolink)
-				return;
-			dhcpcd_initstate(ifp, 0);
-			script_runreason(ifp, "CARRIER");
+		}
+	}
+
+	if (!ifp->active)
+		return;
+
+	dhcpcd_initstate(ifp, 0);
+	script_runreason(ifp, "CARRIER");
 #ifdef INET6
 #ifdef NOCARRIER_PRESERVE_IP
-			/* Set any IPv6 Routers we remembered to expire
-			 * faster than they would normally as we
-			 * maybe on a new network. */
-			ipv6nd_startexpire(ifp);
+	/* Set any IPv6 Routers we remembered to expire faster than they
+	 * would normally as we maybe on a new network. */
+	ipv6nd_startexpire(ifp);
 #endif
 #ifdef IPV6_MANAGETEMPADDR
-			/* RFC4941 Section 3.5 */
-			ipv6_regentempaddrs(ifp);
+	/* RFC4941 Section 3.5 */
+	ipv6_regentempaddrs(ifp);
 #endif
 #endif
-			dhcpcd_startinterface(ifp);
-		}
-	}
+	dhcpcd_startinterface(ifp);
 }
 
 static void
@@ -866,9 +858,7 @@ dhcpcd_startinterface(void *arg)
 	struct interface *ifp = arg;
 	struct if_options *ifo = ifp->options;
 
-	if (ifo->options & DHCPCD_LINK && (ifp->carrier == LINK_DOWN ||
-	    (ifp->carrier == LINK_UNKNOWN && !IF_UPANDRUNNING(ifp))))
-	{
+	if (ifo->options & DHCPCD_LINK && !if_is_link_up(ifp)) {
 		loginfox("%s: waiting for carrier", ifp->name);
 		return;
 	}
@@ -959,7 +949,7 @@ dhcpcd_prestartinterface(void *arg)
 	struct dhcpcd_ctx *ctx = ifp->ctx;
 	bool anondown;
 
-	if (ifp->carrier == LINK_DOWN &&
+	if (ifp->carrier <= LINK_DOWN &&
 	    ifp->options->options & DHCPCD_ANONYMOUS &&
 	    ifp->flags & IFF_UP)
 	{
@@ -990,7 +980,7 @@ run_preinit(struct interface *ifp)
 		return;
 
 	script_runreason(ifp, "PREINIT");
-	if (ifp->wireless && ifp->carrier == LINK_UP)
+	if (ifp->wireless && if_is_link_up(ifp))
 		dhcpcd_reportssid(ifp);
 	if (ifp->options->options & DHCPCD_LINK && ifp->carrier != LINK_UNKNOWN)
 		script_runreason(ifp,
@@ -1032,8 +1022,7 @@ dhcpcd_handleinterface(void *arg, int ac
 		}
 		if (ifp->active) {
 			logdebugx("%s: interface departed", ifp->name);
-			ifp->options->options |= DHCPCD_DEPARTED;
-			stop_interface(ifp);
+			stop_interface(ifp, "DEPARTED");
 		}
 		TAILQ_REMOVE(ctx->ifaces, ifp, next);
 		if_free(ifp);
@@ -1346,7 +1335,7 @@ stop_all_interfaces(struct dhcpcd_ctx *c
 		if (ifp->options->options & DHCPCD_RELEASE)
 			ifp->options->options &= ~DHCPCD_PERSISTENT;
 		ifp->options->options |= DHCPCD_EXITING;
-		stop_interface(ifp);
+		stop_interface(ifp, NULL);
 	}
 }
 
@@ -1357,8 +1346,7 @@ dhcpcd_ifrenew(struct interface *ifp)
 	if (!ifp->active)
 		return;
 
-	if (ifp->options->options & DHCPCD_LINK &&
-	    ifp->carrier == LINK_DOWN)
+	if (ifp->options->options & DHCPCD_LINK && !if_is_link_up(ifp))
 		return;
 
 #ifdef INET
@@ -1599,7 +1587,7 @@ dumperr:
 			ifp->options->options |= opts;
 			if (opts & DHCPCD_RELEASE)
 				ifp->options->options &= ~DHCPCD_PERSISTENT;
-			stop_interface(ifp);
+			stop_interface(ifp, NULL);
 		}
 		return 0;
 	}
@@ -1779,7 +1767,7 @@ dhcpcd_stderr_cb(void *arg)
 }
 
 int
-main(int argc, char **argv)
+main(int argc, char **argv, char **envp)
 {
 	struct dhcpcd_ctx ctx;
 	struct ifaddrs *ifaddrs = NULL;
@@ -1799,6 +1787,12 @@ main(int argc, char **argv)
 	size_t si;
 #endif
 
+#ifdef SETPROCTITLE_H
+	setproctitle_init(argc, argv, envp);
+#else
+	UNUSED(envp);
+#endif
+
 	/* Test for --help and --version */
 	if (argc > 1) {
 		if (strcmp(argv[1], "--help") == 0) {
@@ -2258,7 +2252,7 @@ printpidfile:
 		ctx.fork_fd = fork_fd[1];
 		close(fork_fd[0]);
 #ifdef PRIVSEP_RIGHTS
-		if (ps_rights_limit_fd(fork_fd[1]) == -1) {
+		if (ps_rights_limit_fd(ctx.fork_fd) == -1) {
 			logerr("ps_rights_limit_fdpair");
 			goto exit_failure;
 		}
@@ -2301,14 +2295,12 @@ printpidfile:
 		break;
 	default:
 		setproctitle("[launcher]");
-		ctx.options |= DHCPCD_FORKED;
+		ctx.options |= DHCPCD_FORKED | DHCPCD_LAUNCHER;
 		ctx.fork_fd = fork_fd[0];
 		close(fork_fd[1]);
 #ifdef PRIVSEP_RIGHTS
-		if (ps_rights_limit_fd(fork_fd[0]) == -1 ||
-		    ps_rights_limit_fd(stderr_fd[0]) == 1)
-		{
-			logerr("ps_rights_limit_fdpair");
+		if (ps_rights_limit_fd(ctx.fork_fd) == -1) {
+			logerr("ps_rights_limit_fd");
 			goto exit_failure;
 		}
 #endif
@@ -2318,14 +2310,13 @@ printpidfile:
 			ctx.stderr_fd = stderr_fd[0];
 			close(stderr_fd[1]);
 #ifdef PRIVSEP_RIGHTS
-			if (ps_rights_limit_fd(stderr_fd[0]) == 1) {
-				logerr("ps_rights_limit_fdpair");
+			if (ps_rights_limit_fd(ctx.stderr_fd) == 1) {
+				logerr("ps_rights_limit_fd");
 				goto exit_failure;
 			}
 #endif
-			if (ctx.stderr_valid)
-				eloop_event_add(ctx.eloop, ctx.stderr_fd,
-				    dhcpcd_stderr_cb, &ctx);
+			eloop_event_add(ctx.eloop, ctx.stderr_fd,
+			    dhcpcd_stderr_cb, &ctx);
 		}
 #ifdef PRIVSEP
 		if (IN_PRIVSEP(&ctx) && ps_mastersandbox(&ctx, NULL) == -1)
@@ -2463,8 +2454,7 @@ printpidfile:
 	TAILQ_FOREACH(ifp, ctx.ifaces, next) {
 		if (ifp->active) {
 			run_preinit(ifp);
-			if (!(ifp->options->options & DHCPCD_LINK) ||
-			    ifp->carrier != LINK_DOWN)
+			if (if_is_link_up(ifp))
 				opt = 1;
 		}
 	}
@@ -2582,7 +2572,7 @@ exit1:
 	free(ctx.logfile);
 	free(ctx.ctl_buf);
 #ifdef SETPROCTITLE_H
-	setproctitle_free();
+	setproctitle_fini();
 #endif
 #ifdef USE_SIGNALS
 	if (ctx.options & DHCPCD_STARTED) {

Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.24 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.25
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.24	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c	Mon Oct 12 14:09:03 2020
@@ -385,7 +385,7 @@ static int if_indirect_ioctl(struct dhcp
 }
 
 int
-if_carrier(__unused struct interface *ifp, const void *ifadata)
+if_carrier(struct interface *ifp, const void *ifadata)
 {
 	const struct if_data *ifi = ifadata;
 
@@ -398,8 +398,15 @@ if_carrier(__unused struct interface *if
 
 	if (ifi->ifi_link_state >= LINK_STATE_UP)
 		return LINK_UP;
-	if (ifi->ifi_link_state == LINK_STATE_UNKNOWN)
+	if (ifi->ifi_link_state == LINK_STATE_UNKNOWN) {
+		/*
+		 * Work around net80211 issues in some BSDs.
+		 * Wireless MUST support link state change.
+		 */
+		if (ifp->wireless)
+			return LINK_DOWN;
 		return LINK_UNKNOWN;
+	}
 	return LINK_DOWN;
 }
 
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.24 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.25
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.24	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c	Mon Oct 12 14:09:03 2020
@@ -437,7 +437,7 @@ ipv6nd_sendadvertisement(void *arg)
 	const struct rs_state *state = RS_CSTATE(ifp);
 	int s;
 
-	if (state == NULL || ifp->carrier <= LINK_DOWN)
+	if (state == NULL || !if_is_link_up(ifp))
 		goto freeit;
 
 #ifdef SIN6_LEN
@@ -505,7 +505,7 @@ ipv6nd_advertise(struct ipv6_addr *ia)
 	iaf = NULL;
 	TAILQ_FOREACH(ifp, ctx->ifaces, next) {
 		state = IPV6_STATE(ifp);
-		if (state == NULL || ifp->carrier <= LINK_DOWN)
+		if (state == NULL || !if_is_link_up(ifp))
 			continue;
 
 		TAILQ_FOREACH(iap, &state->addrs, next) {

Index: src/external/bsd/dhcpcd/dist/src/ipv6.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.14 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.15
--- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.14	Sun Sep  6 14:55:34 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6.c	Mon Oct 12 14:09:03 2020
@@ -105,7 +105,7 @@
     defined(IFF_NOLINKLOCAL)
 /* Only add the LL address if we have a carrier, so DaD works. */
 #define	CAN_ADD_LLADDR(ifp) \
-    (!((ifp)->options->options & DHCPCD_LINK) || (ifp)->carrier != LINK_DOWN)
+    (!((ifp)->options->options & DHCPCD_LINK) || if_is_link_up((ifp)))
 #ifdef __sun
 /* Although we can add our own LL address, we cannot drop it
  * without unplumbing the if which is a lot of code.

Index: src/external/bsd/dhcpcd/dist/src/logerr.c
diff -u src/external/bsd/dhcpcd/dist/src/logerr.c:1.9 src/external/bsd/dhcpcd/dist/src/logerr.c:1.10
--- src/external/bsd/dhcpcd/dist/src/logerr.c:1.9	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/logerr.c	Mon Oct 12 14:09:03 2020
@@ -366,20 +366,24 @@ int
 logopen(const char *path)
 {
 	struct logctx *ctx = &_logctx;
+	int opts = 0;
 
 	/* Cache timezone */
 	tzset();
 
 	(void)setvbuf(stderr, ctx->log_buf, _IOLBF, sizeof(ctx->log_buf));
 
-	if (path == NULL) {
-		int opts = 0;
+	if (!(ctx->log_opts & LOGERR_LOG))
+		return 1;
 
-		if (ctx->log_opts & LOGERR_LOG_PID)
-			opts |= LOG_PID;
-		openlog(NULL, opts, LOGERR_SYSLOG_FACILITY);
+#ifdef LOG_NDELAY
+	opts |= LOG_NDELAY;
+#endif
+	if (ctx->log_opts & LOGERR_LOG_PID)
+		opts |= LOG_PID;
+	openlog(NULL, opts, LOGERR_SYSLOG_FACILITY);
+	if (path == NULL)
 		return 1;
-	}
 
 #ifndef SMALL
 	if ((ctx->log_file = fopen(path, "ae")) == NULL)

Index: src/external/bsd/dhcpcd/dist/src/privsep.c
diff -u src/external/bsd/dhcpcd/dist/src/privsep.c:1.8 src/external/bsd/dhcpcd/dist/src/privsep.c:1.9
--- src/external/bsd/dhcpcd/dist/src/privsep.c:1.8	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/privsep.c	Mon Oct 12 14:09:03 2020
@@ -116,7 +116,7 @@ ps_dropprivs(struct dhcpcd_ctx *ctx)
 {
 	struct passwd *pw = ctx->ps_user;
 
-	if (!(ctx->options & DHCPCD_FORKED))
+	if (ctx->options & DHCPCD_LAUNCHER)
 		logdebugx("chrooting as %s to %s", pw->pw_name, pw->pw_dir);
 	if (chroot(pw->pw_dir) == -1 &&
 	    (errno != EPERM || ctx->options & DHCPCD_FORKED))
@@ -166,7 +166,10 @@ ps_dropprivs(struct dhcpcd_ctx *ctx)
 	/* Prohibit writing to files.
 	 * Obviously this won't work if we are using a logfile
 	 * or redirecting stderr to a file. */
-	if (ctx->logfile == NULL) {
+	if (ctx->logfile == NULL &&
+	    (ctx->options & DHCPCD_STARTED ||
+	     !ctx->stderr_valid || isatty(STDERR_FILENO) == 1))
+	{
 		if (setrlimit(RLIMIT_FSIZE, &rzero) == -1)
 			logerr("setrlimit RLIMIT_FSIZE");
 	}
@@ -467,13 +470,11 @@ ps_start(struct dhcpcd_ctx *ctx)
 
 	/* No point in spawning the generic network listener if we're
 	 * not going to use it. */
-	if (!(ctx->options & (DHCPCD_MASTER | DHCPCD_IPV6)))
+	if (!ps_inet_canstart(ctx))
 		goto started_net;
 
 	switch (pid = ps_inet_start(ctx)) {
 	case -1:
-		if (errno == ENXIO)
-			return 0;
 		return -1;
 	case 0:
 		return 0;
@@ -566,7 +567,7 @@ ps_mastersandbox(struct dhcpcd_ctx *ctx,
 		}
 		logerr("%s: %s", __func__, sandbox);
 		return -1;
-	} else if (!forked)
+	} else if (ctx->options & DHCPCD_LAUNCHER)
 		logdebugx("sandbox: %s", sandbox);
 	return 0;
 }

Index: src/external/bsd/dhcpcd/dist/src/script.c
diff -u src/external/bsd/dhcpcd/dist/src/script.c:1.10 src/external/bsd/dhcpcd/dist/src/script.c:1.11
--- src/external/bsd/dhcpcd/dist/src/script.c:1.10	Mon Oct  5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/script.c	Mon Oct 12 14:09:03 2020
@@ -589,7 +589,6 @@ send_interface(struct fd_list *fd, const
 			reason = "CARRIER";
 			break;
 		case LINK_DOWN:
-		case LINK_DOWN_IFFUP:
 			reason = "NOCARRIER";
 			break;
 		default:

Reply via email to