Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src add the device publish daemon, written by jmcneill@.



details:   https://anonhg.NetBSD.org/src/rev/7adcb7f1e8ea
branches:  trunk
changeset: 768929:7adcb7f1e8ea
user:      mrg <mrg%NetBSD.org@localhost>
date:      Mon Aug 29 11:38:48 2011 +0000

description:
add the device publish daemon, written by jmcneill@.

listens on drvctl for new devices and invokes MAKEDEV for them.

missing:
  - manual page
  - rc.d script
  - more testing

but it works well enough to make new disk nodes appear in /dev when
netbsd sees them and they're missing.  you will need to make sure
you have a new /dev/MAKEDEV for this to work properly (postinstall
should handle this normally, of course.)


thanks jared!

diffstat:

 distrib/sets/lists/base/mi        |   14 +-
 doc/CHANGES                       |    4 +-
 etc/mtree/NetBSD.dist.base        |    3 +-
 sbin/Makefile                     |    4 +-
 sbin/devpubd/Makefile             |   33 +++++
 sbin/devpubd/devpubd-run-hooks.in |   21 +++
 sbin/devpubd/devpubd.c            |  247 ++++++++++++++++++++++++++++++++++++++
 sbin/devpubd/hooks/01-makedev     |   15 ++
 8 files changed, 332 insertions(+), 9 deletions(-)

diffs (truncated from 425 to 300 lines):

diff -r cf5c4031f80b -r 7adcb7f1e8ea distrib/sets/lists/base/mi
--- a/distrib/sets/lists/base/mi        Mon Aug 29 11:23:53 2011 +0000
+++ b/distrib/sets/lists/base/mi        Mon Aug 29 11:38:48 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.950 2011/08/27 18:35:19 joerg Exp $
+# $NetBSD: mi,v 1.951 2011/08/29 11:38:48 mrg Exp $
 #
 # Note:        Don't delete entries from here - mark them as "obsolete" instead,
 #      unless otherwise stated below.
@@ -183,18 +183,21 @@
 ./libdata/firmware/rum/rum-rt2573              base-firmware-root
 ./libdata/firmware/upgt                                base-firmware-root
 ./libdata/firmware/zyd                         base-firmware-root
-./libdata/firmware/zyd/zd1211-licence          base-obsolete   obsolete
+./libdata/firmware/zyd/zd1211-licence          base-obsolete                   obsolete
 ./libdata/firmware/zyd/zd1211-license          base-firmware-root
 ./libdata/firmware/zyd/zyd-zd1211              base-firmware-root
 ./libdata/firmware/zyd/zyd-zd1211b             base-firmware-root
 ./libexec                                      base-sys-root
+./libexec/devpubd-hooks                                base-sysutil-root
+./libexec/devpubd-hooks/01-makedev             base-sysutil-root
+./libexec/devpubd-run-hooks                    base-sysutil-root
 ./libexec/dhcpcd-hooks                         base-dhcpcd-root
 ./libexec/dhcpcd-hooks/01-test                 base-dhcpcd-root
 ./libexec/dhcpcd-hooks/02-dump                 base-dhcpcd-root
 ./libexec/dhcpcd-hooks/10-mtu                  base-dhcpcd-root
-./libexec/dhcpcd-hooks/10-resolv.conf          base-obsolete obsolete
-./libexec/dhcpcd-hooks/14-lookup-hostname      base-obsolete obsolete
-./libexec/dhcpcd-hooks/15-hostname             base-obsolete obsolete
+./libexec/dhcpcd-hooks/10-resolv.conf          base-obsolete                   obsolete
+./libexec/dhcpcd-hooks/14-lookup-hostname      base-obsolete                   obsolete
+./libexec/dhcpcd-hooks/15-hostname             base-obsolete                   obsolete
 ./libexec/dhcpcd-hooks/20-resolv.conf          base-dhcpcd-root
 ./libexec/dhcpcd-hooks/29-lookup-hostname      base-dhcpcd-root
 ./libexec/dhcpcd-hooks/30-hostname             base-dhcpcd-root
@@ -221,6 +224,7 @@
 ./sbin/chown                                   base-sysutil-root
 ./sbin/rump.cgdconfig                          base-sysutil-root       crypto
 ./sbin/clri                                    base-sysutil-root
+./sbin/devpubd                                 base-sysutil-root
 ./sbin/dhclient                                        base-dhclient-root
 ./sbin/dhclient-script                         base-dhclient-root
 ./sbin/dhcpcd                                  base-dhcpcd-root
diff -r cf5c4031f80b -r 7adcb7f1e8ea doc/CHANGES
--- a/doc/CHANGES       Mon Aug 29 11:23:53 2011 +0000
+++ b/doc/CHANGES       Mon Aug 29 11:38:48 2011 +0000
@@ -1,4 +1,4 @@
-# LIST OF CHANGES FROM LAST RELEASE:                   <$Revision: 1.1597 $>
+# LIST OF CHANGES FROM LAST RELEASE:                   <$Revision: 1.1598 $>
 #
 #
 # [Note: This file does not mention every change made to the NetBSD source tree.
@@ -1107,3 +1107,5 @@
        mips: add support for MIPS DSP v2 ASE. [matt 20110815]
        sparc: Switch to GCC 4.5.3  [mrg 20110817]
        tmux(1): Import of tmux 1.5.  [jmmv 20110817]
+       devpubd(8): Add a device publishing daemon, written by Jared D.
+               McNeill.  [mrg 20110827]
diff -r cf5c4031f80b -r 7adcb7f1e8ea etc/mtree/NetBSD.dist.base
--- a/etc/mtree/NetBSD.dist.base        Mon Aug 29 11:23:53 2011 +0000
+++ b/etc/mtree/NetBSD.dist.base        Mon Aug 29 11:38:48 2011 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: NetBSD.dist.base,v 1.90 2011/08/26 21:22:10 dyoung Exp $
+#      $NetBSD: NetBSD.dist.base,v 1.91 2011/08/29 11:38:48 mrg Exp $
 #      @(#)4.4BSD.dist 8.1 (Berkeley) 6/13/93
 
 # Do not customize this file as it may be overwritten on upgrades.
@@ -74,6 +74,7 @@
 ./libdata/firmware/zyd
 ./libexec
 ./libexec/dhcpcd-hooks
+./libexec/devpubd-hooks
 ./libexec/resolvconf
 ./mnt
 ./rescue
diff -r cf5c4031f80b -r 7adcb7f1e8ea sbin/Makefile
--- a/sbin/Makefile     Mon Aug 29 11:23:53 2011 +0000
+++ b/sbin/Makefile     Mon Aug 29 11:38:48 2011 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile,v 1.120 2011/06/27 11:52:23 uch Exp $
+#      $NetBSD: Makefile,v 1.121 2011/08/29 11:38:48 mrg Exp $
 #      @(#)Makefile    8.5 (Berkeley) 3/31/94
 
 # Not ported: XNSrouted enpload scsiformat startslip
@@ -7,7 +7,7 @@
 .include <bsd.own.mk>
 
 SUBDIR=        amrctl apmlabel atactl badsect bioctl brconfig ccdconfig \
-       chown disklabel dkctl dkscan_bsdlabel dmesg dmctl \
+       chown devpubd disklabel dkctl dkscan_bsdlabel dmesg dmctl \
        drvctl fastboot fdisk fsck fsirand gpt ifconfig init ldconfig \
        mbrlabel mknod modload modstat modunload mount newbtconf nologin \
        pdisk ping pppoectl raidctl reboot rcorder rndctl route routed \
diff -r cf5c4031f80b -r 7adcb7f1e8ea sbin/devpubd/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/devpubd/Makefile     Mon Aug 29 11:38:48 2011 +0000
@@ -0,0 +1,33 @@
+# $NetBSD: Makefile,v 1.1 2011/08/29 11:38:48 mrg Exp $
+
+PROG=          devpubd
+SRCS=          devpubd.c
+NOMAN=         # defined
+WARNS=         4
+
+BINDIR?=       /sbin
+
+CPPFLAGS+=     -DDEVPUBD_RUN_HOOKS=\"/libexec/devpubd-run-hooks\"
+
+SCRIPTS=       devpubd-run-hooks
+SCRIPTSDIR_devpubd-run-hooks=  /libexec
+
+.PATH: ${.CURDIR}/hooks
+HOOKS=         01-makedev
+SCRIPTS+=      ${HOOKS:C,^,hooks/,}
+.for f in ${HOOKS}
+SCRIPTSDIR_hooks/${f}= /libexec/devpubd-hooks
+.endfor
+
+LDADD+=        -lprop
+DPADD+=        ${LIBPROP}
+
+CLEANFILES=    devpubd-run-hooks
+
+.for f in devpubd-run-hooks
+${f}: ${f}.in
+       ${TOOL_SED} -e 's,@HOOKSDIR@,/libexec/devpubd-hooks,g' \
+           ${.CURDIR}/${f}.in > $@
+.endfor
+
+.include <bsd.prog.mk>
diff -r cf5c4031f80b -r 7adcb7f1e8ea sbin/devpubd/devpubd-run-hooks.in
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/devpubd/devpubd-run-hooks.in Mon Aug 29 11:38:48 2011 +0000
@@ -0,0 +1,21 @@
+#!/bin/sh
+#
+# $NetBSD: devpubd-run-hooks.in,v 1.1 2011/08/29 11:38:48 mrg Exp $
+#
+# devpubd run hooks
+
+devpubd_event=$1
+devpubd_device=$2
+devpubd_hooks_base=@HOOKSDIR@
+
+case $devpubd_event in
+device-attach|device-detach)
+       for hook in ${devpubd_hooks_base}/*; do
+               if [ -x "${hook}" ]; then
+                       "${hook}" ${devpubd_event} ${devpubd_device}
+               fi
+       done
+       ;;
+*)
+       ;;
+esac
diff -r cf5c4031f80b -r 7adcb7f1e8ea sbin/devpubd/devpubd.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/devpubd/devpubd.c    Mon Aug 29 11:38:48 2011 +0000
@@ -0,0 +1,247 @@
+/*     $NetBSD: devpubd.c,v 1.1 2011/08/29 11:38:48 mrg Exp $  */
+
+/*-
+ * Copyright (c) 2011 Jared D. McNeill <jmcneill%invisible.ca@localhost>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__COPYRIGHT("@(#) Copyright (c) 2011\
+Jared D. McNeill <jmcneill%invisible.ca@localhost>. All rights reserved.");
+__RCSID("$NetBSD: devpubd.c,v 1.1 2011/08/29 11:38:48 mrg Exp $");
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/drvctlio.h>
+#include <sys/wait.h>
+#include <sys/poll.h>
+
+#include <assert.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <unistd.h>
+
+static int drvctl_fd = -1;
+static const char *devpubd_script = DEVPUBD_RUN_HOOKS;
+
+#define        DEVPUBD_ATTACH_EVENT    "device-attach"
+#define        DEVPUBD_DETACH_EVENT    "device-detach"
+
+static void
+devpubd_exec(const char *path, const char *event, const char *device)
+{
+       int error;
+
+       error = execl(path, path, event, device, NULL);
+       if (error) {
+               syslog(LOG_ERR, "couldn't exec '%s %s %s': %m",
+                   path, event, device);
+               exit(EXIT_FAILURE);
+       }
+
+       exit(EXIT_SUCCESS);
+}
+
+static void
+devpubd_eventhandler(const char *event, const char *device)
+{
+       pid_t pid;
+       int status;
+
+       syslog(LOG_DEBUG, "event = '%s', device = '%s'", event, device);
+
+       pid = fork();
+       switch (pid) {
+       case -1:
+               syslog(LOG_ERR, "fork failed: %m");
+               break;
+       case 0:
+               devpubd_exec(devpubd_script, event, device);
+               /* NOTREACHED */
+       default:
+               if (waitpid(pid, &status, 0) == -1) {
+                       syslog(LOG_ERR, "waitpid(%d) failed: %m", pid);
+                       break;
+               }
+               if (WIFEXITED(status) && WEXITSTATUS(status)) {
+                       syslog(LOG_WARNING, "%s exited with status %d",
+                           devpubd_script, WEXITSTATUS(status));
+               } else if (WIFSIGNALED(status)) {
+                       syslog(LOG_WARNING, "%s received signal %d",
+                           devpubd_script, WTERMSIG(status));
+               }
+               break;
+       }
+}
+
+static void
+devpubd_eventloop(void)
+{
+       const char *event, *device;
+       prop_dictionary_t ev;
+       int res;
+
+       assert(drvctl_fd != -1);
+
+       for (;;) {
+               res = prop_dictionary_recv_ioctl(drvctl_fd, DRVGETEVENT, &ev);
+               if (res)
+                       err(EXIT_FAILURE, "DRVGETEVENT failed");
+               prop_dictionary_get_cstring_nocopy(ev, "event", &event);
+               prop_dictionary_get_cstring_nocopy(ev, "device", &device);
+
+               printf("%s: event='%s', device='%s'\n", __func__,
+                   event, device);
+
+               devpubd_eventhandler(event, device);
+
+               prop_object_release(ev);
+       }
+}
+
+static void
+devpubd_probe(const char *device)
+{
+       struct devlistargs laa;
+       size_t len, children, n;
+       void *p;
+       int error;



Home | Main Index | Thread Index | Old Index