summaryrefslogtreecommitdiff
path: root/sys/kern/init_sysctl_base.c
diff options
context:
space:
mode:
authorjustin <justin@NetBSD.org>2014-02-25 01:02:42 +0000
committerjustin <justin@NetBSD.org>2014-02-25 01:02:42 +0000
commit819da2cfb45ff04fa2e0f3b7a53832184957ce5b (patch)
treeb9e4a8beba51ba3a166fa17e7d3cf47dbb745cf4 /sys/kern/init_sysctl_base.c
parent29c3df4d33dc5964cd8012f4c9395be64416019b (diff)
Add kern.{ostype,osrelease,osrevision,version} kern.domainname,
kern.rawpartition sysctl support to rump kernel. Moved the sysctl support that is shared between rump and normal kernels to init_sysctl_base.c as rump cannot use init_sysctl.c in order to avoid code duplication. Agreed with pooka@.
Diffstat (limited to 'sys/kern/init_sysctl_base.c')
-rw-r--r--sys/kern/init_sysctl_base.c90
1 files changed, 88 insertions, 2 deletions
diff --git a/sys/kern/init_sysctl_base.c b/sys/kern/init_sysctl_base.c
index 822e5c66d42..51f85b839ee 100644
--- a/sys/kern/init_sysctl_base.c
+++ b/sys/kern/init_sysctl_base.c
@@ -1,4 +1,4 @@
-/* $NetBSD: init_sysctl_base.c,v 1.1 2009/09/16 15:03:56 pooka Exp $ */
+/* $NetBSD: init_sysctl_base.c,v 1.2 2014/02/25 01:02:42 justin Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -30,10 +30,14 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_sysctl_base.c,v 1.1 2009/09/16 15:03:56 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_sysctl_base.c,v 1.2 2014/02/25 01:02:42 justin Exp $");
#include <sys/param.h>
#include <sys/sysctl.h>
+#include <sys/kernel.h>
+#include <sys/disklabel.h>
+
+static int sysctl_setlen(SYSCTLFN_PROTO);
/*
* sets up the base nodes...
@@ -124,3 +128,85 @@ SYSCTL_SETUP(sysctl_root_setup, "sysctl base setup")
NULL, 0, NULL, 0,
CTL_SECURITY, CTL_EOL);
}
+
+/*
+ * now add some nodes which both rump kernel and standard
+ * NetBSD both need, as rump cannot use sys/kern/init_sysctl.c
+ */
+SYSCTL_SETUP(sysctl_kernbase_setup, "sysctl kern subtree base setup")
+{
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_NODE, "kern", NULL,
+ NULL, 0, NULL, 0,
+ CTL_KERN, CTL_EOL);
+
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_STRING, "ostype",
+ SYSCTL_DESCR("Operating system type"),
+ NULL, 0, __UNCONST(&ostype), 0,
+ CTL_KERN, KERN_OSTYPE, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_STRING, "osrelease",
+ SYSCTL_DESCR("Operating system release"),
+ NULL, 0, __UNCONST(&osrelease), 0,
+ CTL_KERN, KERN_OSRELEASE, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
+ CTLTYPE_INT, "osrevision",
+ SYSCTL_DESCR("Operating system revision"),
+ NULL, __NetBSD_Version__, NULL, 0,
+ CTL_KERN, KERN_OSREV, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_STRING, "version",
+ SYSCTL_DESCR("Kernel version"),
+ NULL, 0, __UNCONST(&version), 0,
+ CTL_KERN, KERN_VERSION, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_STRING, "hostname",
+ SYSCTL_DESCR("System hostname"),
+ sysctl_setlen, 0, hostname, MAXHOSTNAMELEN,
+ CTL_KERN, KERN_HOSTNAME, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_STRING, "domainname",
+ SYSCTL_DESCR("YP domain name"),
+ sysctl_setlen, 0, domainname, MAXHOSTNAMELEN,
+ CTL_KERN, KERN_DOMAINNAME, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
+ CTLTYPE_INT, "rawpartition",
+ SYSCTL_DESCR("Raw partition of a disk"),
+ NULL, RAW_PART, NULL, 0,
+ CTL_KERN, KERN_RAWPARTITION, CTL_EOL);
+}
+
+/*
+ * sysctl helper function for kern.hostname and kern.domainnname.
+ * resets the relevant recorded length when the underlying name is
+ * changed.
+ */
+static int
+sysctl_setlen(SYSCTLFN_ARGS)
+{
+ int error;
+
+ error = sysctl_lookup(SYSCTLFN_CALL(rnode));
+ if (error || newp == NULL)
+ return (error);
+
+ switch (rnode->sysctl_num) {
+ case KERN_HOSTNAME:
+ hostnamelen = strlen((const char*)rnode->sysctl_data);
+ break;
+ case KERN_DOMAINNAME:
+ domainnamelen = strlen((const char*)rnode->sysctl_data);
+ break;
+ }
+
+ return (0);
+}