Make -L even more useful to monitoring processes. Truncate and
authorkrw <krw@openbsd.org>
Sun, 20 Apr 2014 21:25:07 +0000 (21:25 +0000)
committerkrw <krw@openbsd.org>
Sun, 20 Apr 2014 21:25:07 +0000 (21:25 +0000)
refill the file rather than creating a new one, which preserves
an fd being monitored. And truncate file on losing link.

Things like sysutils/ertn should now be able to see new leases, lease
renewals and cable unplugs.

tweaks by and ok sthen@

sbin/dhclient/dhclient.8
sbin/dhclient/dhclient.c

index 0028a41..cf2e6c3 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: dhclient.8,v 1.24 2013/08/22 19:15:41 jmc Exp $
+.\" $OpenBSD: dhclient.8,v 1.25 2014/04/20 21:25:07 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: August 22 2013 $
+.Dd $Mdocdate: April 20 2014 $
 .Dt DHCLIENT 8
 .Os
 .Sh NAME
@@ -114,9 +114,13 @@ to write two pseudo-leases,
 and
 .Dq effective ,
 to the specified file.
-The offered block will contain the lease offered by the DHCP server;
-the effective block will contain the modified lease used to configure the
-interface.
+.Dq offered
+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
index b0def3b..8f50b17 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dhclient.c,v 1.297 2014/04/17 13:46:48 krw Exp $      */
+/*     $OpenBSD: dhclient.c,v 1.298 2014/04/20 21:25:07 krw Exp $      */
 
 /*
  * Copyright 2004 Henning Brauer <henning@openbsd.org>
@@ -348,6 +348,11 @@ routehandler(void)
                                client->state = S_REBOOTING;
                                state_reboot();
                        } else {
+                               /* Let monitoring programs see link loss. */
+                               write_file(path_option_db,
+                                   O_WRONLY | O_CREAT | O_TRUNC | O_SYNC |
+                                   O_EXLOCK | O_NOFOLLOW, S_IRUSR | S_IWUSR |
+                                   S_IRGRP, 0, 0, "", 0);
                                /* No need to wait for anything but link. */
                                cancel_timeout();
                        }
@@ -1955,10 +1960,11 @@ fork_privchld(int fd, int fd2)
        close(fd);
 
        if (strlen(path_option_db)) {
-               rslt = unlink(path_option_db);
+               /* Truncate the file so monitoring process see exit. */
+               rslt = truncate(path_option_db, 0);
                if (rslt == -1)
-                       warning("Could not unlink '%s': %s",
-                           path_option_db, strerror(errno));
+                       warning("Unable to truncate '%s': %s", path_option_db,
+                           strerror(errno));
        }
 
        /*