summaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2017-07-20 17:44:14 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2017-07-20 17:44:14 +0000
commita9928f0ba236806bb876d27b0498091c964ec03e (patch)
tree0a3a13a1417c122c3affa3f3884e05ac8b985b31 /sbin
parent15b564cc6e1236313f29b674281ab4323a608989 (diff)
Restore RTM_DELADDR/RTM_NEWADDR monitoring to the
minimum required to ensure that resolv.conf is written out on startup/HUP. Noticed by and fix tested by jmc@
Diffstat (limited to 'sbin')
-rw-r--r--sbin/dhclient/dhclient.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 37f7236928a..5c471a772d9 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dhclient.c,v 1.471 2017/07/17 16:13:13 krw Exp $ */
+/* $OpenBSD: dhclient.c,v 1.472 2017/07/20 17:44:13 krw Exp $ */
/*
* Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -133,6 +133,7 @@ int addressinuse(char *, struct in_addr, char *);
void fork_privchld(struct interface_info *, int, int);
void get_ifname(struct interface_info *, int, char *);
+int get_ifa_family(char *, int);
struct client_lease *apply_defaults(struct client_lease *);
struct client_lease *clone_lease(struct client_lease *);
@@ -184,6 +185,24 @@ sighdlr(int sig)
quit = sig;
}
+int
+get_ifa_family(char *cp, int n)
+{
+ struct sockaddr *sa;
+ unsigned int i;
+
+ for (i = 1; i; i <<= 1) {
+ if ((i & n) != 0) {
+ sa = (struct sockaddr *)cp;
+ if (i == RTA_IFA)
+ return sa->sa_family;
+ ADVANCE(cp, sa);
+ }
+ }
+
+ return AF_UNSPEC;
+}
+
void
routehandler(struct interface_info *ifi, int routefd)
{
@@ -191,6 +210,7 @@ routehandler(struct interface_info *ifi, int routefd)
struct rt_msghdr *rtm;
struct if_msghdr *ifm;
struct if_announcemsghdr *ifan;
+ struct ifa_msghdr *ifam;
char *errmsg, *rtmmsg;
ssize_t n;
int linkstat, rslt;
@@ -279,6 +299,16 @@ routehandler(struct interface_info *ifi, int routefd)
goto die;
}
break;
+ case RTM_NEWADDR:
+ case RTM_DELADDR:
+ /* Need to check if it is time to write resolv.conf. */
+ ifam = (struct ifa_msghdr *)rtm;
+ if (ifam->ifam_index != ifi->index)
+ goto done;
+ if (get_ifa_family((char *)ifam + ifam->ifam_hdrlen,
+ ifam->ifam_addrs) != AF_INET)
+ goto done;
+ break;
default:
break;
}
@@ -484,6 +514,7 @@ main(int argc, char *argv[])
fatal("socket(PF_ROUTE, SOCK_RAW)");
rtfilter = ROUTE_FILTER(RTM_PROPOSAL) | ROUTE_FILTER(RTM_IFINFO) |
+ ROUTE_FILTER(RTM_NEWADDR) | ROUTE_FILTER(RTM_DELADDR) |
ROUTE_FILTER(RTM_IFANNOUNCE);
if (setsockopt(routefd, PF_ROUTE, ROUTE_MSGFILTER,