Stop trying to clean up addresses, routes and "-L" file
authorkrw <krw@openbsd.org>
Wed, 28 Jun 2017 14:35:43 +0000 (14:35 +0000)
committerkrw <krw@openbsd.org>
Wed, 28 Jun 2017 14:35:43 +0000 (14:35 +0000)
whenever dhclient dies. Eliminates differences in handling
and thus need to intercept signals INT, TERM, USR1,
USR2. Eliminates need for 'zapzombies' field and thus
entire struct imsg_flushroutes. Eliminates need for 'imsg'
parameter to and associated logic in priv_flush_routes().

Address, routes and '-L' file are still cleaned out when
binding a lease.

sbin/dhclient/dhclient.8
sbin/dhclient/dhclient.c
sbin/dhclient/dhcpd.h
sbin/dhclient/kroute.c
sbin/dhclient/privsep.c
sbin/dhclient/privsep.h

index f440a05..6c6e0f1 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: dhclient.8,v 1.29 2017/02/15 19:36:24 krw Exp $
+.\" $OpenBSD: dhclient.8,v 1.30 2017/06/28 14:35:43 krw Exp $
 .\"
 .\" Copyright (c) 1997 The Internet Software Consortium.
 .\" All rights reserved.
@@ -35,7 +35,7 @@
 .\" Enterprises.  To learn more about the Internet Software Consortium,
 .\" see ``http://www.isc.org/isc''.  To learn more about Vixie
 .\" Enterprises, see ``http://www.vix.com''.
-.Dd $Mdocdate: February 15 2017 $
+.Dd $Mdocdate: June 28 2017 $
 .Dt DHCLIENT 8
 .Os
 .Sh NAME
@@ -117,9 +117,6 @@ to the specified file.
 will be the lease offered by the DHCP server;
 .Dq effective
 will be the modified lease bound to the interface.
-.Ar file
-will be truncated when a lease is no longer bound to the interface or the
-link goes down.
 .It Fl l Ar file
 Specify an alternate location to
 .Pa /var/db/dhclient.leases. Ns Aq Ar IFNAME
@@ -248,10 +245,7 @@ arrange with the network administrator for an entry on the BOOTP
 database, so that the host can boot quickly on that network rather
 than cycling through the list of old leases.
 .Sh SIGNALS
-While running,
-.Nm
-reacts to a few different signals:
-.Bl -tag -width "USR1, USR2XXX"
+.Bl -tag -width "HUP"
 .It Dv HUP
 On receiving
 .Dv HUP
@@ -259,33 +253,6 @@ On receiving
 will restart itself, reading
 .Xr dhclient.conf 5
 and obtaining a new lease.
-.It Dv INT
-On receiving
-.Dv INT
-.Nm
-will exit after attempting to remove any routes, interface addresses
-or temporary files it created.
-.It Dv QUIT
-On receiving
-.Dv QUIT
-.Nm
-will dump core and exit without attempting to remove any routes, interface
-addresses or temporary files it created.
-.It Dv TERM
-On receiving
-.Dv TERM
-.Nm
-will exit without attempting to remove any routes, interface addresses
-or temporary files it created.
-.It Dv USR1, USR2
-On receiving either
-.Dv USR1
-or
-.Dv USR2 ,
-.Nm
-will exit after attempting to remove any routes, interface addresses
-or temporary files it created.
-.El
 .Sh FILES
 .Bl -tag -width "/var/db/dhclient.leases.<IFNAME>XXX" -compact
 .It Pa /etc/dhclient.conf
index 6acc6c5..b4c1fb3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dhclient.c,v 1.450 2017/06/28 12:53:46 krw Exp $      */
+/*     $OpenBSD: dhclient.c,v 1.451 2017/06/28 14:35:43 krw Exp $      */
 
 /*
  * Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -392,11 +392,6 @@ routehandler(struct interface_info *ifi)
                                        state_reboot(ifi);
                                }
                        } else {
-                               /* Let monitoring programs see link loss. */
-                               if (optionDB) {
-                                       rewind(optionDB);
-                                       ftruncate(fileno(optionDB), 0);
-                               }
                                /* No need to wait for anything but link. */
                                cancel_timeout(ifi);
                        }
@@ -638,7 +633,7 @@ main(int argc, char *argv[])
        close(fd);
 
        if (strlen(path_option_db) != 0) {
-               if ((optionDB = fopen(path_option_db, "w")) == NULL)
+               if ((optionDB = fopen(path_option_db, "a")) == NULL)
                        fatal("can't open %s", path_option_db);
        }
 
@@ -1919,13 +1914,7 @@ go_daemon(void)
        if (rdaemon(nullfd) == -1)
                fatal("Cannot daemonize");
 
-       /* Catch stuff that might be trying to terminate the program. */
        signal(SIGHUP, sighdlr);
-       signal(SIGINT, sighdlr);
-       signal(SIGTERM, sighdlr);
-       signal(SIGUSR1, sighdlr);
-       signal(SIGUSR2, sighdlr);
-
        signal(SIGPIPE, SIG_IGN);
 }
 
@@ -2027,7 +2016,7 @@ fork_privchld(struct interface_info *ifi, int fd, int fd2)
        struct pollfd pfd[1];
        struct imsgbuf *priv_ibuf;
        ssize_t n;
-       int nfds, rslt, got_imsg_hup = 0;
+       int nfds, got_imsg_hup = 0;
 
        switch (fork()) {
        case -1:
@@ -2087,21 +2076,6 @@ fork_privchld(struct interface_info *ifi, int fd, int fd2)
        imsg_clear(priv_ibuf);
        close(fd);
 
-       if (strlen(path_option_db)) {
-               /* Truncate the file so monitoring process see exit. */
-               rslt = truncate(path_option_db, 0);
-               if (rslt == -1)
-                       log_warn("Unable to truncate '%s'", path_option_db);
-       }
-
-       /*
-        * SIGTERM is used by system at shut down. Be nice and don't cleanup
-        * routes, possibly preventing NFS from properly shutting down.
-        */
-       if (quit != SIGTERM) {
-               priv_cleanup(ifi);
-       }
-
        if (quit == SIGHUP) {
                if (!got_imsg_hup)
                        log_warnx("%s; restarting.", strsignal(quit));
index 9094e34..2151304 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dhcpd.h,v 1.196 2017/06/27 13:24:49 krw Exp $ */
+/*     $OpenBSD: dhcpd.h,v 1.197 2017/06/28 14:35:43 krw Exp $ */
 
 /*
  * Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -165,7 +165,6 @@ extern struct imsgbuf *unpriv_ibuf;
 extern volatile sig_atomic_t quit;
 extern struct in_addr deleting;
 extern struct in_addr adding;
-extern struct in_addr active_addr;
 
 /* options.c */
 int cons_options(struct interface_info *, struct option_data *);
index e895344..94474c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kroute.c,v 1.95 2017/06/28 11:53:08 krw Exp $ */
+/*     $OpenBSD: kroute.c,v 1.96 2017/06/28 14:35:43 krw Exp $ */
 
 /*
  * Copyright 2012 Kenneth R Westerback <krw@openbsd.org>
@@ -70,7 +70,6 @@ flush_unpriv_ibuf(const char *who)
        }
 }
 
-struct in_addr active_addr;
 struct in_addr deleting;
 struct in_addr adding;
 
@@ -130,13 +129,9 @@ check_route_label(struct sockaddr_rtlabel *label)
 void
 flush_routes(void)
 {
-       struct imsg_flush_routes imsg;
        int                      rslt;
 
-       imsg.zapzombies = 1;
-
-       rslt = imsg_compose(unpriv_ibuf, IMSG_FLUSH_ROUTES, 0, 0, -1,
-           &imsg, sizeof(imsg));
+       rslt = imsg_compose(unpriv_ibuf, IMSG_FLUSH_ROUTES, 0, 0, -1, NULL, 0);
        if (rslt == -1)
                log_warn("flush_routes: imsg_compose");
 
@@ -144,7 +139,7 @@ flush_routes(void)
 }
 
 void
-priv_flush_routes(struct interface_info *ifi, struct imsg_flush_routes *imsg)
+priv_flush_routes(struct interface_info *ifi)
 {
        char ifname[IF_NAMESIZE];
        struct sockaddr *rti_info[RTAX_MAX];
@@ -214,8 +209,7 @@ priv_flush_routes(struct interface_info *ifi, struct imsg_flush_routes *imsg)
                        delete_route(ifi, s, rtm);
                        break;
                case ROUTE_LABEL_DHCLIENT_DEAD:
-                       if (imsg->zapzombies)
-                               delete_route(ifi, s, rtm);
+                       delete_route(ifi, s, rtm);
                        break;
                case ROUTE_LABEL_DHCLIENT_LIVE:
                case ROUTE_LABEL_DHCLIENT_UNKNOWN:
@@ -731,27 +725,6 @@ priv_add_address(struct interface_info *ifi, struct imsg_add_address *imsg)
                log_warn("SIOCAIFADDR failed (%s)", inet_ntoa(imsg->addr));
 
        close(s);
-
-       active_addr = imsg->addr;
-}
-
-/*
- * priv_cleanup removes dhclient installed routes and address.
- */
-void
-priv_cleanup(struct interface_info *ifi)
-{
-       struct imsg_flush_routes fimsg;
-       struct imsg_delete_address dimsg;
-
-       fimsg.zapzombies = 0;   /* Only zapzombies when binding a lease. */
-       priv_flush_routes(ifi, &fimsg);
-
-       if (active_addr.s_addr == INADDR_ANY)
-               return;
-
-       dimsg.addr = active_addr;
-       priv_delete_address(ifi, &dimsg);
 }
 
 /*
index 446570c..3833ce5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: privsep.c,v 1.50 2017/06/24 23:32:57 krw Exp $ */
+/*     $OpenBSD: privsep.c,v 1.51 2017/06/28 14:35:43 krw Exp $ */
 
 /*
  * Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -66,11 +66,10 @@ dispatch_imsg(struct interface_info *ifi, struct imsgbuf *ibuf)
                        break;
 
                case IMSG_FLUSH_ROUTES:
-                       if (imsg.hdr.len != IMSG_HEADER_SIZE +
-                           sizeof(struct imsg_flush_routes))
+                       if (imsg.hdr.len != IMSG_HEADER_SIZE)
                                log_warnx("bad IMSG_FLUSH_ROUTES");
                        else
-                               priv_flush_routes(ifi, imsg.data);
+                               priv_flush_routes(ifi);
                        break;
 
                case IMSG_ADD_ROUTE:
index 777b96d..c2319a0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: privsep.h,v 1.38 2017/06/24 23:32:57 krw Exp $ */
+/*     $OpenBSD: privsep.h,v 1.39 2017/06/28 14:35:43 krw Exp $ */
 
 /*
  * Copyright (c) 2004 Henning Brauer <henning@openbsd.org>
@@ -36,10 +36,6 @@ struct imsg_add_address {
        struct  in_addr mask;
 };
 
-struct imsg_flush_routes {
-       int     zapzombies;
-};
-
 struct imsg_add_route {
        struct in_addr  dest;
        struct in_addr  netmask;
@@ -60,7 +56,7 @@ void  add_default_route(struct in_addr, struct in_addr);
 void   add_static_routes(struct option_data *, struct in_addr);
 void   add_classless_static_routes(struct option_data *, struct in_addr);
 void   priv_add_route(struct interface_info *, struct imsg_add_route *);
-void   priv_flush_routes(struct interface_info *, struct imsg_flush_routes *);
+void   priv_flush_routes(struct interface_info *);
 
 char   *resolv_conf_contents(struct interface_info *ifi, struct option_data *,
            struct option_data *, struct option_data *);
@@ -73,5 +69,3 @@ void  priv_add_address(struct interface_info *, struct imsg_add_address *);
 
 void   priv_set_interface_mtu(struct interface_info *,
            struct imsg_set_interface_mtu *);
-
-void   priv_cleanup(struct interface_info *);