Module Name:    src
Committed By:   pgoyette
Date:           Mon Dec  7 03:25:58 UTC 2015

Modified Files:
        src/distrib/sets/lists/modules: mi
        src/sys/compat/common: kern_time_50.c
        src/sys/dev: clockctl.c
        src/sys/modules: Makefile
Added Files:
        src/sys/modules/clockctl: Makefile clockctl.ioconf

Log Message:
Modularize the clockctl pseudo-device and link to the build.


To generate a diff of this commit:
cvs rdiff -u -r1.80 -r1.81 src/distrib/sets/lists/modules/mi
cvs rdiff -u -r1.29 -r1.30 src/sys/compat/common/kern_time_50.c
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/clockctl.c
cvs rdiff -u -r1.162 -r1.163 src/sys/modules/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/clockctl/Makefile \
    src/sys/modules/clockctl/clockctl.ioconf

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/modules/mi
diff -u src/distrib/sets/lists/modules/mi:1.80 src/distrib/sets/lists/modules/mi:1.81
--- src/distrib/sets/lists/modules/mi:1.80	Thu Dec  3 02:57:47 2015
+++ src/distrib/sets/lists/modules/mi	Mon Dec  7 03:25:57 2015
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.80 2015/12/03 02:57:47 pgoyette Exp $
+# $NetBSD: mi,v 1.81 2015/12/07 03:25:57 pgoyette Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -34,6 +34,8 @@
 ./@MODULEDIR@/cgd/cgd.kmod			base-kernel-modules	kmod
 ./@MODULEDIR@/chfs				base-kernel-modules	kmod
 ./@MODULEDIR@/chfs/chfs.kmod			base-kernel-modules	kmod
+./@MODULEDIR@/clockctl				base-kernel-modules	kmod
+./@MODULEDIR@/clockctl/clockctl.kmod		base-kernel-modules	kmod
 ./@MODULEDIR@/coda				base-kernel-modules	kmod
 ./@MODULEDIR@/coda/coda.kmod			base-kernel-modules	kmod
 ./@MODULEDIR@/coda5				base-kernel-modules	kmod

Index: src/sys/compat/common/kern_time_50.c
diff -u src/sys/compat/common/kern_time_50.c:1.29 src/sys/compat/common/kern_time_50.c:1.30
--- src/sys/compat/common/kern_time_50.c:1.29	Fri Jul 24 13:02:52 2015
+++ src/sys/compat/common/kern_time_50.c	Mon Dec  7 03:25:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $	*/
+/*	$NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.29 2015/07/24 13:02:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.30 2015/12/07 03:25:57 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_aio.h"
@@ -542,71 +542,6 @@ compat_50_sys___ntp_gettime30(struct lwp
 	return ENOSYS;
 #endif
 }
-int
-compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags,
-    struct lwp *l)
-{
-	int error = 0;
-	const struct cdevsw *cd = cdevsw_lookup(dev);
-
-	if (cd == NULL || cd->d_ioctl == NULL)
-		return ENXIO;
-
-	switch (cmd) {
-	case CLOCKCTL_OSETTIMEOFDAY: {
-		struct timeval50 tv50;
-		struct timeval tv;
-		struct clockctl50_settimeofday *args = data;
-
-		error = copyin(args->tv, &tv50, sizeof(tv50));
-		if (error)
-			return (error);
-		timeval50_to_timeval(&tv50, &tv);
-		error = settimeofday1(&tv, false, args->tzp, l, false);
-		break;
-	}
-	case CLOCKCTL_OADJTIME: {
-		struct timeval atv, oldatv;
-		struct timeval50 atv50;
-		struct clockctl50_adjtime *args = data;
-
-		if (args->delta) {
-			error = copyin(args->delta, &atv50, sizeof(atv50));
-			if (error)
-				return (error);
-			timeval50_to_timeval(&atv50, &atv);
-		}
-		adjtime1(args->delta ? &atv : NULL,
-		    args->olddelta ? &oldatv : NULL, l->l_proc);
-		if (args->olddelta) {
-			timeval_to_timeval50(&oldatv, &atv50);
-			error = copyout(&atv50, args->olddelta, sizeof(atv50));
-		}
-		break;
-	}
-	case CLOCKCTL_OCLOCK_SETTIME: {
-		struct timespec50 tp50;
-		struct timespec tp;
-		struct clockctl50_clock_settime *args = data;
-
-		error = copyin(args->tp, &tp50, sizeof(tp50));
-		if (error)
-			return (error);
-		timespec50_to_timespec(&tp50, &tp);
-		error = clock_settime1(l->l_proc, args->clock_id, &tp, true);
-		break;
-	}
-	case CLOCKCTL_ONTP_ADJTIME:
-		/* The ioctl number changed but the data did not change. */
-		error = (cd->d_ioctl)(dev, CLOCKCTL_NTP_ADJTIME,
-		    data, flags, l);
-		break;
-	default:
-		error = EINVAL;
-	}
-
-	return (error);
-}
 
 void
 compat_sysctl_time(struct sysctllog **clog)

Index: src/sys/dev/clockctl.c
diff -u src/sys/dev/clockctl.c:1.32 src/sys/dev/clockctl.c:1.33
--- src/sys/dev/clockctl.c:1.32	Fri Jul 25 08:10:35 2014
+++ src/sys/dev/clockctl.c	Mon Dec  7 03:25:57 2015
@@ -1,4 +1,4 @@
-/*      $NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $ */
+/*      $NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $ */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -31,10 +31,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.32 2014/07/25 08:10:35 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clockctl.c,v 1.33 2015/12/07 03:25:57 pgoyette Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_ntp.h"
 #include "opt_compat_netbsd.h"
+#endif
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -48,17 +50,28 @@ __KERNEL_RCSID(0, "$NetBSD: clockctl.c,v
 #include <sys/timex.h>
 #endif /* NTP */
 #include <sys/kauth.h>
+#include <sys/module.h>
+#include <sys/mutex.h>
+#include <sys/once.h>
 
 #include <sys/clockctl.h>
 #ifdef COMPAT_50
 #include <compat/sys/clockctl.h>
+#include <compat/sys/time_types.h>
 #endif
 
+kmutex_t clockctl_mtx;
+int clockctl_refcnt;
+
+ONCE_DECL(clockctl_once);
+
+#include "ioconf.h"
+
 dev_type_ioctl(clockctlioctl);
 
 const struct cdevsw clockctl_cdevsw = {
-	.d_open = nullopen,
-	.d_close = nullclose,
+	.d_open = clockctlopen,
+	.d_close = clockctlclose,
 	.d_read = noread,
 	.d_write = nowrite,
 	.d_ioctl = clockctlioctl,
@@ -102,8 +115,102 @@ void
 clockctlattach(int num)
 {
 
+/*
+ * Don't initialize the listener here - it will get handled as part
+ * of module initialization.
+ */
+#if 0
 	clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
 	    clockctl_listener_cb, NULL);
+#endif
+}
+
+/*
+ * Maintain a refcount for each open/close, so we know when it is
+ * safe to call devsw_detach()
+ */
+int
+clockctlopen(dev_t dev, int flag, int mode, struct lwp *l)
+{
+
+	mutex_enter(&clockctl_mtx);
+	clockctl_refcnt++;
+	mutex_exit(&clockctl_mtx);
+
+	return 0;
+}
+
+int
+clockctlclose(dev_t dev, int flag, int mode, struct lwp *l)
+{
+
+	mutex_enter(&clockctl_mtx);
+	clockctl_refcnt--;
+	mutex_exit(&clockctl_mtx);
+
+	return 0;
+}
+
+int
+clockctl_init(void)
+{
+
+	mutex_init(&clockctl_mtx, MUTEX_DEFAULT, IPL_NONE);
+	clockctl_refcnt = 0;
+	return 0;
+}
+
+MODULE(MODULE_CLASS_DRIVER, clockctl, NULL);
+
+int
+clockctl_modcmd(modcmd_t cmd, void *data)
+{
+	int error;
+#ifdef _MODULE
+	int bmajor, cmajor;
+#endif
+
+	error = 0;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		RUN_ONCE(&clockctl_once, clockctl_init);
+
+		clockctl_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
+		    clockctl_listener_cb, NULL);
+
+#ifdef _MODULE
+		bmajor = cmajor = -1;
+		error = devsw_attach("clockctl", NULL, &bmajor,
+		    &clockctl_cdevsw, &cmajor);
+		if (error != 0)
+			kauth_unlisten_scope(clockctl_listener);
+#endif
+
+		break;
+
+	case MODULE_CMD_FINI:
+		mutex_enter(&clockctl_mtx);
+		if (clockctl_refcnt != 0) {
+			mutex_exit(&clockctl_mtx);
+			return EBUSY;
+		}
+#ifdef _MODULE
+		error = devsw_detach(NULL, &clockctl_cdevsw);
+#endif
+		mutex_exit(&clockctl_mtx);
+
+		if (error == 0)
+			kauth_unlisten_scope(clockctl_listener);
+
+		break;
+
+	default:
+		error = ENOTTY;
+		break;
+	}
+
+	return error;
 }
 
 int
@@ -177,4 +284,70 @@ clockctlioctl(
 	return (error);
 }
 
+#ifdef COMPAT_50
+int
+compat50_clockctlioctl(dev_t dev, u_long cmd, void *data, int flags,
+    struct lwp *l)
+{
+	int error = 0;
+	const struct cdevsw *cd = cdevsw_lookup(dev);
+
+	if (cd == NULL || cd->d_ioctl == NULL)
+		return ENXIO;
+
+	switch (cmd) {
+	case CLOCKCTL_OSETTIMEOFDAY: {
+		struct timeval50 tv50;
+		struct timeval tv;
+		struct clockctl50_settimeofday *args = data;
 
+		error = copyin(args->tv, &tv50, sizeof(tv50));
+		if (error)
+			return (error);
+		timeval50_to_timeval(&tv50, &tv);
+		error = settimeofday1(&tv, false, args->tzp, l, false);
+		break;
+	}
+	case CLOCKCTL_OADJTIME: {
+		struct timeval atv, oldatv;
+		struct timeval50 atv50;
+		struct clockctl50_adjtime *args = data;
+
+		if (args->delta) {
+			error = copyin(args->delta, &atv50, sizeof(atv50));
+			if (error)
+				return (error);
+			timeval50_to_timeval(&atv50, &atv);
+		}
+		adjtime1(args->delta ? &atv : NULL,
+		    args->olddelta ? &oldatv : NULL, l->l_proc);
+		if (args->olddelta) {
+			timeval_to_timeval50(&oldatv, &atv50);
+			error = copyout(&atv50, args->olddelta, sizeof(atv50));
+		}
+		break;
+	}
+	case CLOCKCTL_OCLOCK_SETTIME: {
+		struct timespec50 tp50;
+		struct timespec tp;
+		struct clockctl50_clock_settime *args = data;
+
+		error = copyin(args->tp, &tp50, sizeof(tp50));
+		if (error)
+			return (error);
+		timespec50_to_timespec(&tp50, &tp);
+		error = clock_settime1(l->l_proc, args->clock_id, &tp, true);
+		break;
+	}
+	case CLOCKCTL_ONTP_ADJTIME:
+		/* The ioctl number changed but the data did not change. */
+		error = (cd->d_ioctl)(dev, CLOCKCTL_NTP_ADJTIME,
+		    data, flags, l);
+		break;
+	default:
+		error = EINVAL;
+	}
+
+	return (error);
+}
+#endif

Index: src/sys/modules/Makefile
diff -u src/sys/modules/Makefile:1.162 src/sys/modules/Makefile:1.163
--- src/sys/modules/Makefile:1.162	Thu Dec  3 10:38:21 2015
+++ src/sys/modules/Makefile	Mon Dec  7 03:25:57 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.162 2015/12/03 10:38:21 pgoyette Exp $
+#	$NetBSD: Makefile,v 1.163 2015/12/07 03:25:57 pgoyette Exp $
 
 .include <bsd.own.mk>
 
@@ -16,6 +16,7 @@ SUBDIR+=	ccd
 SUBDIR+=	cd9660
 SUBDIR+=	cgd
 SUBDIR+=	chfs
+SUBDIR+=	clockctl
 SUBDIR+=	crypto
 SUBDIR+=	coda
 SUBDIR+=	coda5

Added files:

Index: src/sys/modules/clockctl/Makefile
diff -u /dev/null src/sys/modules/clockctl/Makefile:1.1
--- /dev/null	Mon Dec  7 03:25:58 2015
+++ src/sys/modules/clockctl/Makefile	Mon Dec  7 03:25:57 2015
@@ -0,0 +1,13 @@
+# $NetBSD: Makefile,v 1.1 2015/12/07 03:25:57 pgoyette Exp $
+
+.include "../Makefile.inc"
+
+.PATH: ${S}/dev
+
+KMOD=		clockctl
+IOCONF=		clockctl.ioconf
+SRCS=		clockctl.c
+
+CPPFLAGS+=	-DNTP -DCOMPAT_50
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/clockctl/clockctl.ioconf
diff -u /dev/null src/sys/modules/clockctl/clockctl.ioconf:1.1
--- /dev/null	Mon Dec  7 03:25:58 2015
+++ src/sys/modules/clockctl/clockctl.ioconf	Mon Dec  7 03:25:57 2015
@@ -0,0 +1,7 @@
+#	$NetBSD: clockctl.ioconf,v 1.1 2015/12/07 03:25:57 pgoyette Exp $
+
+ioconf		clockctl
+
+include		"conf/files"
+
+pseudo-device   clockctl

Reply via email to