Module Name: src
Committed By: roy
Date: Fri Oct 22 13:23:20 UTC 2021
Modified Files:
src/external/bsd/dhcpcd/dist/src: bpf.c dhcp.c dhcp6.c dhcpcd.c
if-bsd.c if-options.c ipv6.c ipv6.h ipv6nd.c logerr.c privsep.c
script.c
Added Files:
src/external/bsd/dhcpcd/dist/hooks: 30-hostname
Removed Files:
src/external/bsd/dhcpcd/dist/hooks: 30-hostname.in 50-ypbind.in
dhcpcd-run-hooks.8.in dhcpcd-run-hooks.in
src/external/bsd/dhcpcd/dist/src: dhcpcd.8.in dhcpcd.conf.5.in
Log Message:
Sync update
To generate a diff of this commit:
cvs rdiff -u -r0 -r1.5 src/external/bsd/dhcpcd/dist/hooks/30-hostname
cvs rdiff -u -r1.1.1.3 -r0 src/external/bsd/dhcpcd/dist/hooks/30-hostname.in
cvs rdiff -u -r1.3 -r0 src/external/bsd/dhcpcd/dist/hooks/50-ypbind.in
cvs rdiff -u -r1.1.1.8 -r0 \
src/external/bsd/dhcpcd/dist/hooks/dhcpcd-run-hooks.8.in
cvs rdiff -u -r1.6 -r0 src/external/bsd/dhcpcd/dist/hooks/dhcpcd-run-hooks.in
cvs rdiff -u -r1.17 -r1.18 src/external/bsd/dhcpcd/dist/src/bpf.c
cvs rdiff -u -r1.45 -r1.46 src/external/bsd/dhcpcd/dist/src/dhcp.c
cvs rdiff -u -r1.27 -r1.28 src/external/bsd/dhcpcd/dist/src/dhcp6.c \
src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.11 -r0 src/external/bsd/dhcpcd/dist/src/dhcpcd.8.in
cvs rdiff -u -r1.48 -r1.49 src/external/bsd/dhcpcd/dist/src/dhcpcd.c
cvs rdiff -u -r1.1.1.25 -r0 src/external/bsd/dhcpcd/dist/src/dhcpcd.conf.5.in
cvs rdiff -u -r1.26 -r1.27 src/external/bsd/dhcpcd/dist/src/if-bsd.c
cvs rdiff -u -r1.31 -r1.32 src/external/bsd/dhcpcd/dist/src/if-options.c
cvs rdiff -u -r1.16 -r1.17 src/external/bsd/dhcpcd/dist/src/ipv6.c
cvs rdiff -u -r1.12 -r1.13 src/external/bsd/dhcpcd/dist/src/ipv6.h \
src/external/bsd/dhcpcd/dist/src/privsep.c
cvs rdiff -u -r1.11 -r1.12 src/external/bsd/dhcpcd/dist/src/logerr.c
cvs rdiff -u -r1.13 -r1.14 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/bpf.c
diff -u src/external/bsd/dhcpcd/dist/src/bpf.c:1.17 src/external/bsd/dhcpcd/dist/src/bpf.c:1.18
--- src/external/bsd/dhcpcd/dist/src/bpf.c:1.17 Mon Oct 5 16:02:15 2020
+++ src/external/bsd/dhcpcd/dist/src/bpf.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd: BPF arp and bootp filtering
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.45 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.46
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.45 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -2031,14 +2031,14 @@ dhcp_finish_dad(struct interface *ifp, s
#ifdef IPV4LL
/* Stop IPv4LL now we have a working DHCP address */
- ipv4ll_drop(ifp);
+ if (!IN_LINKLOCAL(ntohl(ia->s_addr)))
+ ipv4ll_drop(ifp);
#endif
if (ifp->options->options & DHCPCD_INFORM)
dhcp_inform(ifp);
}
-
static bool
dhcp_addr_duplicated(struct interface *ifp, struct in_addr *ia)
{
@@ -2069,7 +2069,7 @@ dhcp_addr_duplicated(struct interface *i
if (opts & (DHCPCD_STATIC | DHCPCD_INFORM)) {
state->reason = "EXPIRE";
script_runreason(ifp, state->reason);
-#define NOT_ONLY_SELF (DHCPCD_MASTER | DHCPCD_IPV6RS | DHCPCD_DHCP6)
+#define NOT_ONLY_SELF (DHCPCD_MANAGER | DHCPCD_IPV6RS | DHCPCD_DHCP6)
if (!(ctx->options & NOT_ONLY_SELF))
eloop_exit(ifp->ctx->eloop, EXIT_FAILURE);
return deleted;
@@ -2380,8 +2380,9 @@ dhcp_bind(struct interface *ifp)
dhcp_closebpf(ifp);
openudp:
- /* If not in master mode, open an address specific socket. */
- if (ctx->options & DHCPCD_MASTER ||
+ /* If not in manager mode, open an address specific socket. */
+ if (ctx->options & DHCPCD_MANAGER ||
+ ifo->options & DHCPCD_STATIC ||
(state->old != NULL &&
state->old->yiaddr == state->new->yiaddr &&
old_state & STATE_ADDED && !(old_state & STATE_FAKE)))
@@ -2399,7 +2400,7 @@ openudp:
state->udp_rfd = dhcp_openudp(&state->addr->addr);
if (state->udp_rfd == -1) {
logerr(__func__);
- /* Address sharing without master mode is not supported.
+ /* Address sharing without manager mode is not supported.
* It's also possible another DHCP client could be running,
* which is even worse.
* We still need to work, so re-open BPF. */
@@ -2569,7 +2570,6 @@ dhcp_inform(struct interface *ifp)
state = D_STATE(ifp);
ifo = ifp->options;
- state->state = DHS_INFORM;
free(state->offer);
state->offer = NULL;
state->offer_len = 0;
@@ -2610,6 +2610,7 @@ dhcp_inform(struct interface *ifp)
}
}
+ state->state = DHS_INFORM;
state->addr = ia;
state->offer_len = dhcp_message_new(&state->offer,
&ia->addr, &ia->mask);
@@ -3952,9 +3953,9 @@ dhcp_start1(void *arg)
/* Listen on *.*.*.*:bootpc so that the kernel never sends an
* ICMP port unreachable message back to the DHCP server.
- * Only do this in master mode so we don't swallow messages
+ * Only do this in manager mode so we don't swallow messages
* for dhcpcd running on another interface. */
- if ((ctx->options & (DHCPCD_MASTER|DHCPCD_PRIVSEP)) == DHCPCD_MASTER
+ if ((ctx->options & (DHCPCD_MANAGER|DHCPCD_PRIVSEP)) == DHCPCD_MANAGER
&& ctx->udp_rfd == -1)
{
ctx->udp_rfd = dhcp_openudp(NULL);
@@ -4244,7 +4245,7 @@ dhcp_handleifa(int cmd, struct ipv4_addr
#ifdef PRIVSEP
if (IN_PRIVSEP_SE(ifp->ctx) &&
- !(ifp->ctx->options & (DHCPCD_MASTER | DHCPCD_CONFIGURE)) &&
+ !(ifp->ctx->options & (DHCPCD_MANAGER | DHCPCD_CONFIGURE)) &&
IN_ARE_ADDR_EQUAL(&state->lease.addr, &ia->addr))
{
state->addr = ia;
@@ -4255,37 +4256,38 @@ dhcp_handleifa(int cmd, struct ipv4_addr
}
#endif
+ /* If we have requested a specific address, return now.
+ * The below code is only for when inform or static has been
+ * requested without a specific address. */
+ if (ifo->req_addr.s_addr != INADDR_ANY)
+ return ia;
+
+ /* Only inform if we are NOT in the inform state or bound. */
if (ifo->options & DHCPCD_INFORM) {
- if (state->state != DHS_INFORM)
+ if (state->state != DHS_INFORM && state->state != DHS_BOUND)
dhcp_inform(ifp);
return ia;
}
+ /* Static and inform are mutually exclusive. If not static, return. */
if (!(ifo->options & DHCPCD_STATIC))
return ia;
- if (ifo->req_addr.s_addr != INADDR_ANY)
- return ia;
free(state->old);
state->old = state->new;
state->new_len = dhcp_message_new(&state->new, &ia->addr, &ia->mask);
if (state->new == NULL)
return ia;
+
if (ifp->flags & IFF_POINTOPOINT) {
for (i = 1; i < 255; i++)
if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
dhcp_message_add_addr(state->new, i, ia->brd);
}
+
state->reason = "STATIC";
rt_build(ifp->ctx, AF_INET);
script_runreason(ifp, state->reason);
- if (ifo->options & DHCPCD_INFORM) {
- state->state = DHS_INFORM;
- dhcp_new_xid(ifp);
- state->lease.server.s_addr = INADDR_ANY;
- state->addr = ia;
- dhcp_inform(ifp);
- }
return ia;
}
Index: src/external/bsd/dhcpcd/dist/src/dhcp6.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.27 src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.28
--- src/external/bsd/dhcpcd/dist/src/dhcp6.c:1.27 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcp6.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -637,7 +637,7 @@ dhcp6_makemessage(struct interface *ifp)
uint8_t type;
uint16_t si_len, uni_len, n_options;
uint8_t *o_lenp;
- struct if_options *ifo;
+ struct if_options *ifo = ifp->options;
const struct dhcp_opt *opt, *opt2;
const struct ipv6_addr *ap;
char hbuf[HOSTNAME_MAX_LEN + 1];
@@ -658,8 +658,50 @@ dhcp6_makemessage(struct interface *ifp)
state->send = NULL;
}
- ifo = ifp->options;
- fqdn = ifo->fqdn;
+ switch(state->state) {
+ case DH6S_INIT: /* FALLTHROUGH */
+ case DH6S_DISCOVER:
+ type = DHCP6_SOLICIT;
+ break;
+ case DH6S_REQUEST:
+ type = DHCP6_REQUEST;
+ break;
+ case DH6S_CONFIRM:
+ type = DHCP6_CONFIRM;
+ break;
+ case DH6S_REBIND:
+ type = DHCP6_REBIND;
+ break;
+ case DH6S_RENEW:
+ type = DHCP6_RENEW;
+ break;
+ case DH6S_INFORM:
+ type = DHCP6_INFORMATION_REQ;
+ break;
+ case DH6S_RELEASE:
+ type = DHCP6_RELEASE;
+ break;
+ case DH6S_DECLINE:
+ type = DHCP6_DECLINE;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* RFC 4704 Section 5 says we can only send FQDN for these
+ * message types. */
+ switch(type) {
+ case DHCP6_SOLICIT:
+ case DHCP6_REQUEST:
+ case DHCP6_RENEW:
+ case DHCP6_REBIND:
+ fqdn = ifo->fqdn;
+ break;
+ default:
+ fqdn = FQDN_DISABLE;
+ break;
+ }
if (fqdn == FQDN_DISABLE && ifo->options & DHCPCD_HOSTNAME) {
/* We're sending the DHCPv4 hostname option, so send FQDN as
@@ -823,37 +865,6 @@ dhcp6_makemessage(struct interface *ifp)
}
switch(state->state) {
- case DH6S_INIT: /* FALLTHROUGH */
- case DH6S_DISCOVER:
- type = DHCP6_SOLICIT;
- break;
- case DH6S_REQUEST:
- type = DHCP6_REQUEST;
- break;
- case DH6S_CONFIRM:
- type = DHCP6_CONFIRM;
- break;
- case DH6S_REBIND:
- type = DHCP6_REBIND;
- break;
- case DH6S_RENEW:
- type = DHCP6_RENEW;
- break;
- case DH6S_INFORM:
- type = DHCP6_INFORMATION_REQ;
- break;
- case DH6S_RELEASE:
- type = DHCP6_RELEASE;
- break;
- case DH6S_DECLINE:
- type = DHCP6_DECLINE;
- break;
- default:
- errno = EINVAL;
- return -1;
- }
-
- switch(state->state) {
case DH6S_REQUEST: /* FALLTHROUGH */
case DH6S_RENEW: /* FALLTHROUGH */
case DH6S_RELEASE:
@@ -868,11 +879,11 @@ dhcp6_makemessage(struct interface *ifp)
break;
}
- /* In non master mode we listen and send from fixed addresses.
+ /* In non manager mode we listen and send from fixed addresses.
* We should try and match an address we have to unicast to,
* but for now this is the safest policy. */
- if (unicast != NULL && !(ifp->ctx->options & DHCPCD_MASTER)) {
- logdebugx("%s: ignoring unicast option as not master",
+ if (unicast != NULL && !(ifp->ctx->options & DHCPCD_MANAGER)) {
+ logdebugx("%s: ignoring unicast option as not manager",
ifp->name);
unicast = NULL;
}
@@ -1638,7 +1649,7 @@ dhcp6_startinform(void *arg)
ifp = arg;
state = D6_STATE(ifp);
- if (state->new == NULL && !state->failed)
+ if (state->new_start || (state->new == NULL && !state->failed))
llevel = LOG_INFO;
else
llevel = LOG_DEBUG;
@@ -3035,18 +3046,25 @@ static void
dhcp6_bind(struct interface *ifp, const char *op, const char *sfrom)
{
struct dhcp6_state *state = D6_STATE(ifp);
- bool timedout = (op == NULL), has_new = false, confirmed;
+ bool timedout = (op == NULL), confirmed;
struct ipv6_addr *ia;
int loglevel;
struct timespec now;
- TAILQ_FOREACH(ia, &state->addrs, next) {
- if (ia->flags & IPV6_AF_NEW) {
- has_new = true;
- break;
+ if (state->state == DH6S_RENEW && !state->new_start) {
+ loglevel = LOG_DEBUG;
+ TAILQ_FOREACH(ia, &state->addrs, next) {
+ if (ia->flags & IPV6_AF_NEW) {
+ loglevel = LOG_INFO;
+ break;
+ }
}
- }
- loglevel = has_new || state->state != DH6S_RENEW ? LOG_INFO : LOG_DEBUG;
+ } else if (state->state == DH6S_INFORM)
+ loglevel = state->new_start ? LOG_INFO : LOG_DEBUG;
+ else
+ loglevel = LOG_INFO;
+ state->new_start = false;
+
if (!timedout) {
logmessage(loglevel, "%s: %s received from %s",
ifp->name, op, sfrom);
@@ -3245,7 +3263,7 @@ dhcp6_bind(struct interface *ifp, const
if (ifp->ctx->options & DHCPCD_TEST ||
(ifp->options->options & DHCPCD_INFORM &&
- !(ifp->ctx->options & DHCPCD_MASTER)))
+ !(ifp->ctx->options & DHCPCD_MANAGER)))
{
eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS);
}
@@ -3852,7 +3870,7 @@ dhcp6_start1(void *arg)
size_t i;
const struct dhcp_compat *dhc;
- if ((ctx->options & (DHCPCD_MASTER|DHCPCD_PRIVSEP)) == DHCPCD_MASTER &&
+ if ((ctx->options & (DHCPCD_MANAGER|DHCPCD_PRIVSEP)) == DHCPCD_MANAGER &&
ctx->dhcp6_rfd == -1)
{
ctx->dhcp6_rfd = dhcp6_openudp(0, NULL);
@@ -3923,7 +3941,13 @@ dhcp6_start(struct interface *ifp, enum
(state->state == DH6S_DISCOVER &&
!(ifp->options->options & DHCPCD_IA_FORCED) &&
!ipv6nd_hasradhcp(ifp, true)))
+ {
+ /* We don't want log spam when the RA
+ * has just adjusted it's prefix times. */
+ if (state->state != DH6S_INFORMED)
+ state->new_start = true;
dhcp6_startinform(ifp);
+ }
break;
case DH6S_REQUEST:
if (ifp->options->options & DHCPCD_DHCP6 &&
@@ -3972,6 +3996,7 @@ dhcp6_start(struct interface *ifp, enum
TAILQ_INIT(&state->addrs);
gogogo:
+ state->new_start = true;
state->state = init_state;
state->lerror = 0;
state->failed = false;
@@ -4155,11 +4180,11 @@ dhcp6_handleifa(int cmd, struct ipv6_add
struct dhcp6_state *state;
struct interface *ifp = ia->iface;
- /* If not running in master mode, listen to this address */
+ /* If not running in manager mode, listen to this address */
if (cmd == RTM_NEWADDR &&
!(ia->addr_flags & IN6_IFF_NOTUSEABLE) &&
ifp->active == IF_ACTIVE_USER &&
- !(ifp->ctx->options & DHCPCD_MASTER) &&
+ !(ifp->ctx->options & DHCPCD_MANAGER) &&
ifp->options->options & DHCPCD_DHCP6)
{
#ifdef PRIVSEP
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.27 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.28
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.27 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - IPv6 ND handling
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
Index: src/external/bsd/dhcpcd/dist/src/dhcpcd.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.48 src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.49
--- src/external/bsd/dhcpcd/dist/src/dhcpcd.c:1.48 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/dhcpcd.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -26,7 +26,7 @@
* SUCH DAMAGE.
*/
-static const char dhcpcd_copyright[] = "Copyright (c) 2006-2020 Roy Marples";
+static const char dhcpcd_copyright[] = "Copyright (c) 2006-2021 Roy Marples";
#include <sys/file.h>
#include <sys/ioctl.h>
@@ -107,7 +107,7 @@ printf("usage: "PACKAGE"\t[-146ABbDdEGgH
"\t\t[-C, --nohook hook] [-c, --script script]\n"
"\t\t[-e, --env value] [-F, --fqdn FQDN] [-f, --config file]\n"
"\t\t[-h, --hostname hostname] [-I, --clientid clientid]\n"
- "\t\t[-i, --vendorclassid vendorclassid] [-j, --logfile logfile]\n"
+ "\t\t[-i, --vendorclassid vendorclassid] [-j, --logfile logfile]\n"
"\t\t[-l, --leasetime seconds] [-m, --metric metric]\n"
"\t\t[-O, --nooption option] [-o, --option option]\n"
"\t\t[-Q, --require option] [-r, --request address]\n"
@@ -196,7 +196,7 @@ handle_exit_timeout(void *arg)
ctx = arg;
logerrx("timed out");
- if (!(ctx->options & DHCPCD_MASTER)) {
+ if (!(ctx->options & DHCPCD_MANAGER)) {
struct interface *ifp;
TAILQ_FOREACH(ifp, ctx->ifaces, next) {
@@ -370,12 +370,12 @@ dhcpcd_daemonise(struct dhcpcd_ctx *ctx)
/*
* Stop writing to stderr.
- * On the happy path, only the master process writes to stderr,
+ * On the happy path, only the manager process writes to stderr,
* so this just stops wasting fprintf calls to nowhere.
* All other calls - ie errors in privsep processes or script output,
* will error when printing.
* If we *really* want to fix that, then we need to suck
- * stderr/stdout in the master process and either disacrd it or pass
+ * stderr/stdout in the manager process and either disacrd it or pass
* it to the launcher process and then to stderr.
*/
logopts &= ~LOGERR_ERR;
@@ -427,7 +427,7 @@ stop_interface(struct interface *ifp, co
ifp->active = IF_INACTIVE;
ifp->options->options &= ~DHCPCD_STOPPING;
- if (!(ctx->options & (DHCPCD_MASTER | DHCPCD_TEST)))
+ if (!(ctx->options & (DHCPCD_MANAGER | DHCPCD_TEST)))
eloop_exit(ctx->eloop, EXIT_FAILURE);
}
@@ -980,7 +980,7 @@ dhcpcd_prestartinterface(void *arg)
} else
randmac_down = false;
- if ((!(ctx->options & DHCPCD_MASTER) ||
+ if ((!(ctx->options & DHCPCD_MANAGER) ||
ifp->options->options & DHCPCD_IF_UP || randmac_down) &&
!(ifp->flags & IFF_UP))
{
@@ -1311,8 +1311,8 @@ reload_config(struct dhcpcd_ctx *ctx)
/* We need to preserve these options. */
if (ctx->options & DHCPCD_STARTED)
ifo->options |= DHCPCD_STARTED;
- if (ctx->options & DHCPCD_MASTER)
- ifo->options |= DHCPCD_MASTER;
+ if (ctx->options & DHCPCD_MANAGER)
+ ifo->options |= DHCPCD_MANAGER;
if (ctx->options & DHCPCD_DAEMONISED)
ifo->options |= DHCPCD_DAEMONISED;
if (ctx->options & DHCPCD_PRIVSEP)
@@ -1988,7 +1988,7 @@ main(int argc, char **argv, char **envp)
}
if (optind != argc - 1)
- ctx.options |= DHCPCD_MASTER;
+ ctx.options |= DHCPCD_MANAGER;
logsetopts(logopts);
logopen(ctx.logfile);
@@ -2068,7 +2068,7 @@ main(int argc, char **argv, char **envp)
printpidfile:
/* If we have any other args, we should run as a single dhcpcd
* instance for that interface. */
- if (optind == argc - 1 && !(ctx.options & DHCPCD_MASTER)) {
+ if (optind == argc - 1 && !(ctx.options & DHCPCD_MANAGER)) {
const char *per;
const char *ifname;
@@ -2094,7 +2094,7 @@ printpidfile:
} else {
snprintf(ctx.pidfile, sizeof(ctx.pidfile),
PIDFILE, "", "", "");
- ctx.options |= DHCPCD_MASTER;
+ ctx.options |= DHCPCD_MANAGER;
}
if (ctx.options & DHCPCD_PRINT_PIDFILE) {
printf("%s\n", ctx.pidfile);
@@ -2170,7 +2170,7 @@ printpidfile:
{
ctx.options |= DHCPCD_FORKED; /* pretend child process */
#ifdef PRIVSEP
- if (IN_PRIVSEP(&ctx) && ps_mastersandbox(&ctx, NULL) == -1)
+ if (IN_PRIVSEP(&ctx) && ps_managersandbox(&ctx, NULL) == -1)
goto exit_failure;
#endif
ifp = calloc(1, sizeof(*ifp));
@@ -2214,10 +2214,10 @@ printpidfile:
!(ctx.options & DHCPCD_TEST))
{
ctx.options |= DHCPCD_FORKED; /* avoid socket unlink */
- if (!(ctx.options & DHCPCD_MASTER))
+ if (!(ctx.options & DHCPCD_MANAGER))
ctx.control_fd = control_open(argv[optind], family,
ctx.options & DHCPCD_DUMPLEASE);
- if (!(ctx.options & DHCPCD_MASTER) && ctx.control_fd == -1)
+ if (!(ctx.options & DHCPCD_MANAGER) && ctx.control_fd == -1)
ctx.control_fd = control_open(argv[optind], AF_UNSPEC,
ctx.options & DHCPCD_DUMPLEASE);
if (ctx.control_fd == -1)
@@ -2226,7 +2226,7 @@ printpidfile:
if (ctx.control_fd != -1) {
#ifdef PRIVSEP
if (IN_PRIVSEP(&ctx) &&
- ps_mastersandbox(&ctx, NULL) == -1)
+ ps_managersandbox(&ctx, NULL) == -1)
goto exit_failure;
#endif
if (!(ctx.options & DHCPCD_DUMPLEASE))
@@ -2284,7 +2284,7 @@ printpidfile:
#if defined(USE_SIGNALS) && !defined(THERE_IS_NO_FORK)
if (!(ctx.options & DHCPCD_DAEMONISE))
- goto start_master;
+ goto start_manager;
if (xsocketpair(AF_UNIX, SOCK_DGRAM | SOCK_CXNB, 0, fork_fd) == -1 ||
(ctx.stderr_valid &&
@@ -2368,7 +2368,7 @@ printpidfile:
dhcpcd_stderr_cb, &ctx);
}
#ifdef PRIVSEP
- if (IN_PRIVSEP(&ctx) && ps_mastersandbox(&ctx, NULL) == -1)
+ if (IN_PRIVSEP(&ctx) && ps_managersandbox(&ctx, NULL) == -1)
goto exit_failure;
#endif
goto run_loop;
@@ -2376,8 +2376,8 @@ printpidfile:
/* We have now forked, setsid, forked once more.
* From this point on, we are the controlling daemon. */
- logdebugx("spawned master process on PID %d", getpid());
-start_master:
+ logdebugx("spawned manager process on PID %d", getpid());
+start_manager:
ctx.options |= DHCPCD_STARTED;
if ((pid = pidfile_lock(ctx.pidfile)) != 0) {
logerr("%s: pidfile_lock %d", __func__, pid);
@@ -2408,7 +2408,7 @@ start_master:
if (!(ctx.options & DHCPCD_TEST)) {
if (control_start(&ctx,
- ctx.options & DHCPCD_MASTER ?
+ ctx.options & DHCPCD_MANAGER ?
NULL : argv[optind], family) == -1)
{
logerr("%s: control_start", __func__);
@@ -2420,13 +2420,13 @@ start_master:
/* Start any dev listening plugin which may want to
* change the interface name provided by the kernel */
if (!IN_PRIVSEP(&ctx) &&
- (ctx.options & (DHCPCD_MASTER | DHCPCD_DEV)) ==
- (DHCPCD_MASTER | DHCPCD_DEV))
+ (ctx.options & (DHCPCD_MANAGER | DHCPCD_DEV)) ==
+ (DHCPCD_MANAGER | DHCPCD_DEV))
dev_start(&ctx, dhcpcd_handleinterface);
#endif
setproctitle("%s%s%s",
- ctx.options & DHCPCD_MASTER ? "[master]" : argv[optind],
+ ctx.options & DHCPCD_MANAGER ? "[manager]" : argv[optind],
ctx.options & DHCPCD_IPV4 ? " [ip4]" : "",
ctx.options & DHCPCD_IPV6 ? " [ip6]" : "");
@@ -2450,7 +2450,7 @@ start_master:
eloop_event_add(ctx.eloop, ctx.link_fd, dhcpcd_handlelink, &ctx);
#ifdef PRIVSEP
- if (IN_PRIVSEP(&ctx) && ps_mastersandbox(&ctx, "stdio route") == -1)
+ if (IN_PRIVSEP(&ctx) && ps_managersandbox(&ctx, "stdio route") == -1)
goto exit_failure;
#endif
@@ -2511,7 +2511,7 @@ start_master:
}
if (!(ctx.options & DHCPCD_BACKGROUND)) {
- if (ctx.options & DHCPCD_MASTER)
+ if (ctx.options & DHCPCD_MANAGER)
t = ifo->timeout;
else {
t = 0;
Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.26 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.27
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.26 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* BSD interface driver for dhcpcd
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -235,6 +235,7 @@ if_closesockets_os(struct dhcpcd_ctx *ct
close(priv->pf_inet6_fd);
free(priv);
ctx->priv = NULL;
+ free(ctx->rt_missfilter);
}
#if defined(SIOCALIFADDR) && defined(IFLR_ACTIVE) /*NetBSD */
@@ -626,6 +627,8 @@ if_findsa(struct dhcpcd_ctx *ctx, const
sin = (const void *)sa;
if ((ia = ipv4_findmaskaddr(ctx, &sin->sin_addr)))
return ia->iface;
+ if ((ia = ipv4_findmaskbrd(ctx, &sin->sin_addr)))
+ return ia->iface;
break;
}
#endif
Index: src/external/bsd/dhcpcd/dist/src/if-options.c
diff -u src/external/bsd/dhcpcd/dist/src/if-options.c:1.31 src/external/bsd/dhcpcd/dist/src/if-options.c:1.32
--- src/external/bsd/dhcpcd/dist/src/if-options.c:1.31 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/if-options.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -104,7 +104,7 @@ const struct option cf_options[] = {
{"broadcast", no_argument, NULL, 'J'},
{"nolink", no_argument, NULL, 'K'},
{"noipv4ll", no_argument, NULL, 'L'},
- {"master", no_argument, NULL, 'M'},
+ {"manager", no_argument, NULL, 'M'},
{"renew", no_argument, NULL, 'N'},
{"nooption", required_argument, NULL, 'O'},
{"printpidfile", no_argument, NULL, 'P'},
@@ -321,9 +321,10 @@ parse_str(char *sbuf, size_t slen, const
break;
c[i] = *str++;
}
- if (c[1] != '\0' && sbuf) {
+ if (c[1] != '\0') {
c[2] = '\0';
- *sbuf++ = (char)strtol(c, NULL, 16);
+ if (sbuf)
+ *sbuf++ = (char)strtol(c, NULL, 16);
} else
l--;
break;
@@ -335,11 +336,12 @@ parse_str(char *sbuf, size_t slen, const
break;
c[i] = *str++;
}
- if (c[2] != '\0' && sbuf) {
+ if (c[2] != '\0') {
i = (int)strtol(c, NULL, 8);
if (i > 255)
i = 255;
- *sbuf ++= (char)i;
+ if (sbuf)
+ *sbuf++ = (char)i;
} else
l--;
break;
@@ -1068,7 +1070,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
ifo->options &= ~DHCPCD_IPV4LL;
break;
case 'M':
- ifo->options |= DHCPCD_MASTER;
+ ifo->options |= DHCPCD_MANAGER;
break;
case 'O':
ARG_REQUIRED;
@@ -1356,7 +1358,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
#endif
case O_IAID:
ARG_REQUIRED;
- if (ctx->options & DHCPCD_MASTER && !IN_CONFIG_BLOCK(ifo)) {
+ if (ctx->options & DHCPCD_MANAGER && !IN_CONFIG_BLOCK(ifo)) {
logerrx("IAID must belong in an interface block");
return -1;
}
@@ -1398,7 +1400,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
logwarnx("%s: IA_PD not compiled in", ifname);
return -1;
#else
- if (ctx->options & DHCPCD_MASTER &&
+ if (ctx->options & DHCPCD_MANAGER &&
!IN_CONFIG_BLOCK(ifo))
{
logerrx("IA PD must belong in an "
@@ -1408,7 +1410,7 @@ parse_option(struct dhcpcd_ctx *ctx, con
i = D6_OPTION_IA_PD;
#endif
}
- if (ctx->options & DHCPCD_MASTER &&
+ if (ctx->options & DHCPCD_MANAGER &&
!IN_CONFIG_BLOCK(ifo) && arg)
{
logerrx("IA with IAID must belong in an "
Index: src/external/bsd/dhcpcd/dist/src/ipv6.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.16 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.17
--- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.16 Fri Nov 20 13:24:58 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -596,7 +596,7 @@ ipv6_deletedaddr(struct ipv6_addr *ia)
#ifdef DHCP6
#ifdef PRIVSEP
- if (!(ia->iface->ctx->options & DHCPCD_MASTER))
+ if (!(ia->iface->ctx->options & DHCPCD_MANAGER))
ps_inet_closedhcp6(ia);
#elif defined(SMALL)
UNUSED(ia);
Index: src/external/bsd/dhcpcd/dist/src/ipv6.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.h:1.12 src/external/bsd/dhcpcd/dist/src/ipv6.h:1.13
--- src/external/bsd/dhcpcd/dist/src/ipv6.h:1.12 Thu Jul 2 13:59:19 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6.h Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
Index: src/external/bsd/dhcpcd/dist/src/privsep.c
diff -u src/external/bsd/dhcpcd/dist/src/privsep.c:1.12 src/external/bsd/dhcpcd/dist/src/privsep.c:1.13
--- src/external/bsd/dhcpcd/dist/src/privsep.c:1.12 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/privsep.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Privilege Separation for dhcpcd
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -33,8 +33,8 @@
* or address specific listener.
* Spawn an unpriv process to send/receive common network data.
* Then drop all privs and start running.
- * Every process aside from the privileged actioneer is chrooted.
- * All privsep processes ignore signals - only the master process accepts them.
+ * Every process aside from the privileged proxy is chrooted.
+ * All privsep processes ignore signals - only the manager process accepts them.
*
* dhcpcd will maintain the config file in the chroot, no need to handle
* this in a script or something.
@@ -81,6 +81,15 @@
#include <util.h>
#endif
+/* CMSG_ALIGN is a Linux extension */
+#ifndef CMSG_ALIGN
+#define CMSG_ALIGN(n) (CMSG_SPACE((n)) - CMSG_SPACE(0))
+#endif
+
+/* Calculate number of padding bytes to achieve 'struct cmsghdr' alignment */
+#define CALC_CMSG_PADLEN(has_cmsg, pos) \
+ ((has_cmsg) ? (socklen_t)(CMSG_ALIGN((pos)) - (pos)) : 0)
+
int
ps_init(struct dhcpcd_ctx *ctx)
{
@@ -369,7 +378,15 @@ ps_dostart(struct dhcpcd_ctx *ctx,
ctx->fork_fd = -1;
}
pidfile_clean();
+
eloop_clear(ctx->eloop);
+ eloop_signal_set_cb(ctx->eloop,
+ dhcpcd_signals, dhcpcd_signals_len, signal_cb, ctx);
+ /* ctx->sigset aready has the initial sigmask set in main() */
+ if (eloop_signal_mask(ctx->eloop, NULL) == -1) {
+ logerr("%s: eloop_signal_mask", __func__);
+ goto errexit;
+ }
/* We are not root */
if (priv_fd != &ctx->ps_root_fd) {
@@ -393,15 +410,6 @@ ps_dostart(struct dhcpcd_ctx *ctx,
ctx->ps_inet_fd = -1;
}
- eloop_signal_set_cb(ctx->eloop,
- dhcpcd_signals, dhcpcd_signals_len, signal_cb, ctx);
-
- /* ctx->sigset aready has the initial sigmask set in main() */
- if (eloop_signal_mask(ctx->eloop, NULL) == -1) {
- logerr("%s: eloop_signal_mask", __func__);
- goto errexit;
- }
-
if (eloop_event_add(ctx->eloop, *priv_fd, recv_msg, recv_ctx) == -1)
{
logerr("%s: eloop_event_add", __func__);
@@ -466,7 +474,7 @@ ps_start(struct dhcpcd_ctx *ctx)
case 0:
return 0;
default:
- logdebugx("spawned privileged actioneer on PID %d", pid);
+ logdebugx("spawned privileged proxy on PID %d", pid);
}
/* No point in spawning the generic network listener if we're
@@ -532,7 +540,7 @@ ps_entersandbox(const char *_pledge, con
}
int
-ps_mastersandbox(struct dhcpcd_ctx *ctx, const char *_pledge)
+ps_managersandbox(struct dhcpcd_ctx *ctx, const char *_pledge)
{
const char *sandbox = NULL;
bool forked;
@@ -583,7 +591,7 @@ ps_mastersandbox(struct dhcpcd_ctx *ctx,
return -1;
} else if (ctx->options & DHCPCD_LAUNCHER ||
((!(ctx->options & DHCPCD_DAEMONISE)) &&
- ctx->options & DHCPCD_MASTER))
+ ctx->options & DHCPCD_MANAGER))
logdebugx("sandbox: %s", sandbox);
return 0;
}
@@ -607,7 +615,7 @@ ps_stop(struct dhcpcd_ctx *ctx)
ret = r;
/* We've been chrooted, so we need to tell the
- * privileged actioneer to remove the pidfile. */
+ * privileged proxy to remove the pidfile. */
ps_root_unlink(ctx, ctx->pidfile);
r = ps_root_stop(ctx);
@@ -656,9 +664,11 @@ ps_unrollmsg(struct msghdr *msg, struct
const void *data, size_t len)
{
uint8_t *datap, *namep, *controlp;
+ socklen_t cmsg_padlen =
+ CALC_CMSG_PADLEN(psm->ps_controllen, psm->ps_namelen);
namep = UNCONST(data);
- controlp = namep + psm->ps_namelen;
+ controlp = namep + psm->ps_namelen + cmsg_padlen;
datap = controlp + psm->ps_controllen;
if (psm->ps_namelen != 0) {
@@ -678,7 +688,7 @@ ps_unrollmsg(struct msghdr *msg, struct
return -1;
}
msg->msg_control = controlp;
- len -= psm->ps_controllen;
+ len -= psm->ps_controllen + cmsg_padlen;
} else
msg->msg_control = NULL;
msg->msg_controllen = psm->ps_controllen;
@@ -699,9 +709,11 @@ ssize_t
ps_sendpsmmsg(struct dhcpcd_ctx *ctx, int fd,
struct ps_msghdr *psm, const struct msghdr *msg)
{
+ long padding[1] = { 0 };
struct iovec iov[] = {
{ .iov_base = UNCONST(psm), .iov_len = sizeof(*psm) },
{ .iov_base = NULL, }, /* name */
+ { .iov_base = NULL, }, /* control padding */
{ .iov_base = NULL, }, /* control */
{ .iov_base = NULL, }, /* payload 1 */
{ .iov_base = NULL, }, /* payload 2 */
@@ -713,6 +725,7 @@ ps_sendpsmmsg(struct dhcpcd_ctx *ctx, in
if (msg != NULL) {
struct iovec *iovp = &iov[1];
int i;
+ socklen_t cmsg_padlen;
psm->ps_namelen = msg->msg_namelen;
psm->ps_controllen = (socklen_t)msg->msg_controllen;
@@ -720,9 +733,17 @@ ps_sendpsmmsg(struct dhcpcd_ctx *ctx, in
iovp->iov_base = msg->msg_name;
iovp->iov_len = msg->msg_namelen;
iovp++;
+
+ cmsg_padlen =
+ CALC_CMSG_PADLEN(msg->msg_controllen, msg->msg_namelen);
+ assert(cmsg_padlen <= sizeof(padding));
+ iovp->iov_len = cmsg_padlen;
+ iovp->iov_base = cmsg_padlen != 0 ? padding : NULL;
+ iovp++;
+
iovp->iov_base = msg->msg_control;
iovp->iov_len = msg->msg_controllen;
- iovlen = 3;
+ iovlen = 4;
for (i = 0; i < (int)msg->msg_iovlen; i++) {
if ((size_t)(iovlen + i) > __arraycount(iov)) {
@@ -833,6 +854,8 @@ ps_sendcmdmsg(int fd, uint16_t cmd, cons
{ .iov_base = data, .iov_len = 0 },
};
size_t dl = sizeof(data);
+ socklen_t cmsg_padlen =
+ CALC_CMSG_PADLEN(msg->msg_controllen, msg->msg_namelen);
if (msg->msg_namelen != 0) {
if (msg->msg_namelen > dl)
@@ -844,8 +867,13 @@ ps_sendcmdmsg(int fd, uint16_t cmd, cons
}
if (msg->msg_controllen != 0) {
- if (msg->msg_controllen > dl)
+ if (msg->msg_controllen + cmsg_padlen > dl)
goto nobufs;
+ if (cmsg_padlen != 0) {
+ memset(p, 0, cmsg_padlen);
+ p += cmsg_padlen;
+ dl -= cmsg_padlen;
+ }
psm.ps_controllen = (socklen_t)msg->msg_controllen;
memcpy(p, msg->msg_control, msg->msg_controllen);
p += msg->msg_controllen;
@@ -856,7 +884,8 @@ ps_sendcmdmsg(int fd, uint16_t cmd, cons
if (psm.ps_datalen > dl)
goto nobufs;
- iov[1].iov_len = psm.ps_namelen + psm.ps_controllen + psm.ps_datalen;
+ iov[1].iov_len =
+ psm.ps_namelen + psm.ps_controllen + psm.ps_datalen + cmsg_padlen;
if (psm.ps_datalen != 0)
memcpy(p, msg->msg_iov[0].iov_base, psm.ps_datalen);
return writev(fd, iov, __arraycount(iov));
Index: src/external/bsd/dhcpcd/dist/src/logerr.c
diff -u src/external/bsd/dhcpcd/dist/src/logerr.c:1.11 src/external/bsd/dhcpcd/dist/src/logerr.c:1.12
--- src/external/bsd/dhcpcd/dist/src/logerr.c:1.11 Sun Nov 1 14:24:01 2020
+++ src/external/bsd/dhcpcd/dist/src/logerr.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* logerr: errx with logging
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -484,13 +484,14 @@ logclose(void)
#endif
closelog();
+#if defined(__linux__)
+ free(_logprog);
+ _logprog = NULL;
+#endif
#ifndef SMALL
if (ctx->log_file == NULL)
return;
fclose(ctx->log_file);
ctx->log_file = NULL;
#endif
-#if defined(__linux__)
- free(_logprog);
-#endif
}
Index: src/external/bsd/dhcpcd/dist/src/script.c
diff -u src/external/bsd/dhcpcd/dist/src/script.c:1.13 src/external/bsd/dhcpcd/dist/src/script.c:1.14
--- src/external/bsd/dhcpcd/dist/src/script.c:1.13 Mon Dec 28 13:57:40 2020
+++ src/external/bsd/dhcpcd/dist/src/script.c Fri Oct 22 13:23:20 2021
@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2020 Roy Marples <[email protected]>
+ * Copyright (c) 2006-2021 Roy Marples <[email protected]>
* All rights reserved
* Redistribution and use in source and binary forms, with or without
@@ -390,6 +390,7 @@ make_env(struct dhcpcd_ctx *ctx, const s
if (ifp->ctx->options & DHCPCD_DUMPLEASE)
goto dumplease;
+ ifp->ctx->rt_order = 0;
rb_tree_init(&ifaces, &rt_compare_proto_ops);
TAILQ_FOREACH(ifp2, ifp->ctx->ifaces, next) {
if (!ifp2->active)
@@ -397,7 +398,7 @@ make_env(struct dhcpcd_ctx *ctx, const s
rt = rt_new(UNCONST(ifp2));
if (rt == NULL)
goto eexit;
- if (rb_tree_insert_node(&ifaces, rt) != rt)
+ if (rt_proto_add(&ifaces, rt) != rt)
goto eexit;
}
if (fprintf(fp, "interface_order=") == -1)
Added files:
Index: src/external/bsd/dhcpcd/dist/hooks/30-hostname
diff -u /dev/null src/external/bsd/dhcpcd/dist/hooks/30-hostname:1.5
--- /dev/null Fri Oct 22 13:23:20 2021
+++ src/external/bsd/dhcpcd/dist/hooks/30-hostname Fri Oct 22 13:23:20 2021
@@ -0,0 +1,158 @@
+# Set the hostname from DHCP data if required
+
+# A hostname can either be a short hostname or a FQDN.
+# hostname_fqdn=true
+# hostname_fqdn=false
+# hostname_fqdn=server
+
+# A value of server means just what the server says, don't manipulate it.
+# This could lead to an inconsistent hostname on a DHCPv4 and DHCPv6 network
+# where the DHCPv4 hostname is short and the DHCPv6 has an FQDN.
+# DHCPv6 has no hostname option.
+# RFC4702 section 3.1 says FQDN should be prefered over hostname.
+#
+# As such, the default is hostname_fqdn=true so that a consistent hostname
+# is always assigned.
+: ${hostname_fqdn:=true}
+
+# If we used to set the hostname, but relinquish control of it, we should
+# reset to the default value.
+: ${hostname_default=}
+
+# Some systems don't have hostname(1)
+_hostname()
+{
+ if [ -z "${1+x}" ]; then
+ if [ -r /proc/sys/kernel/hostname ]; then
+ read name </proc/sys/kernel/hostname && echo "$name"
+ elif type hostname >/dev/null 2>/dev/null; then
+ hostname
+ elif sysctl kern.hostname >/dev/null 2>&1; then
+ sysctl -n kern.hostname
+ elif sysctl kernel.hostname >/dev/null 2>&1; then
+ sysctl -n kernel.hostname
+ else
+ return 1
+ fi
+ return $?
+ fi
+
+ if [ -w /proc/sys/kernel/hostname ]; then
+ echo "$1" >/proc/sys/kernel/hostname
+ elif [ -n "$1" ] && type hostname >/dev/null 2>&1; then
+ hostname "$1"
+ elif sysctl kern.hostname >/dev/null 2>&1; then
+ sysctl -w "kern.hostname=$1" >/dev/null
+ elif sysctl kernel.hostname >/dev/null 2>&1; then
+ sysctl -w "kernel.hostname=$1" >/dev/null
+ else
+ # May fail to set a blank hostname
+ hostname "$1"
+ fi
+}
+
+is_default_hostname()
+{
+ case "$1" in
+ ""|"$hostname_default"|localhost|localhost.localdomain)
+ return 0;;
+ esac
+ return 1
+}
+
+need_hostname()
+{
+ # Always load the hostname variable for future use
+ hostname="$(_hostname)"
+ is_default_hostname "$hostname" && return 0
+
+ case "$force_hostname" in
+ [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) return 0;;
+ esac
+
+ if [ -n "$old_fqdn" ]; then
+ if ${hfqdn} || ! ${hshort}; then
+ [ "$hostname" = "$old_fqdn" ]
+ else
+ [ "$hostname" = "${old_fqdn%%.*}" ]
+ fi
+ elif [ -n "$old_host_name" ]; then
+ if ${hfqdn}; then
+ if [ -n "$old_domain_name" ] &&
+ [ "$old_host_name" = "${old_host_name#*.}" ]
+ then
+ [ "$hostname" = \
+ "$old_host_name.$old_domain_name" ]
+ else
+ [ "$hostname" = "$old_host_name" ]
+ fi
+ elif ${hshort}; then
+ [ "$hostname" = "${old_host_name%%.*}" ]
+ else
+ [ "$hostname" = "$old_host_name" ]
+ fi
+ else
+ # No old hostname
+ false
+ fi
+}
+
+try_hostname()
+{
+ [ "$hostname" = "$1" ] && return 0
+ if valid_domainname "$1"; then
+ syslog info "Setting hostname: $1"
+ _hostname "$1"
+ else
+ syslog err "Invalid hostname: $1"
+ fi
+}
+
+set_hostname()
+{
+ hfqdn=false
+ hshort=false
+ case "$hostname_fqdn" in
+ [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|1) hfqdn=true;;
+ ""|[Ss][Ee][Rr][Vv][Ee][Rr]) ;;
+ *) hshort=true;;
+ esac
+
+ need_hostname || return
+
+ if [ -n "$new_fqdn" ]; then
+ if ${hfqdn} || ! ${hshort}; then
+ try_hostname "$new_fqdn"
+ else
+ try_hostname "${new_fqdn%%.*}"
+ fi
+ elif [ -n "$new_host_name" ]; then
+ if ${hfqdn}; then
+ if [ -n "$new_domain_name" ] &&
+ [ "$new_host_name" = "${new_host_name#*.}" ]
+ then
+ try_hostname "$new_host_name.$new_domain_name"
+ else
+ try_hostname "$new_host_name"
+ fi
+ elif ${hshort}; then
+ try_hostname "${new_host_name%%.*}"
+ else
+ try_hostname "$new_host_name"
+ fi
+ elif ! is_default_hostname "$hostname"; then
+ try_hostname "$hostname_default"
+ fi
+}
+
+# For ease of use, map DHCP6 names onto our DHCP4 names
+case "$reason" in
+BOUND6|RENEW6|REBIND6|REBOOT6|INFORM6)
+ new_fqdn="$new_dhcp6_fqdn"
+ old_fqdn="$old_dhcp6_fqdn"
+ ;;
+esac
+
+if $if_configured && $if_up && [ "$reason" != ROUTERADVERT ]; then
+ set_hostname
+fi