1 /* $NetBSD: init_sysctl_base.c,v 1.3 2014/02/25 18:30:11 pooka Exp $ */ 2 3 /*- 4 * Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Andrew Brown, and by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 __KERNEL_RCSID(0, "$NetBSD: init_sysctl_base.c,v 1.3 2014/02/25 18:30:11 pooka Exp $"); 34 35 #include <sys/param.h> 36 #include <sys/sysctl.h> 37 #include <sys/kernel.h> 38 #include <sys/disklabel.h> 39 40 static int sysctl_setlen(SYSCTLFN_PROTO); 41 42 /* 43 * sets up the base nodes... 44 */ 45 void 46 sysctl_basenode_init(void) 47 { 48 49 sysctl_createv(NULL, 0, NULL, NULL, 50 CTLFLAG_PERMANENT, 51 CTLTYPE_NODE, "kern", 52 SYSCTL_DESCR("High kernel"), 53 NULL, 0, NULL, 0, 54 CTL_KERN, CTL_EOL); 55 sysctl_createv(NULL, 0, NULL, NULL, 56 CTLFLAG_PERMANENT, 57 CTLTYPE_NODE, "vm", 58 SYSCTL_DESCR("Virtual memory"), 59 NULL, 0, NULL, 0, 60 CTL_VM, CTL_EOL); 61 sysctl_createv(NULL, 0, NULL, NULL, 62 CTLFLAG_PERMANENT, 63 CTLTYPE_NODE, "vfs", 64 SYSCTL_DESCR("Filesystem"), 65 NULL, 0, NULL, 0, 66 CTL_VFS, CTL_EOL); 67 sysctl_createv(NULL, 0, NULL, NULL, 68 CTLFLAG_PERMANENT, 69 CTLTYPE_NODE, "net", 70 SYSCTL_DESCR("Networking"), 71 NULL, 0, NULL, 0, 72 CTL_NET, CTL_EOL); 73 sysctl_createv(NULL, 0, NULL, NULL, 74 CTLFLAG_PERMANENT, 75 CTLTYPE_NODE, "debug", 76 SYSCTL_DESCR("Debugging"), 77 NULL, 0, NULL, 0, 78 CTL_DEBUG, CTL_EOL); 79 sysctl_createv(NULL, 0, NULL, NULL, 80 CTLFLAG_PERMANENT, 81 CTLTYPE_NODE, "hw", 82 SYSCTL_DESCR("Generic CPU, I/O"), 83 NULL, 0, NULL, 0, 84 CTL_HW, CTL_EOL); 85 sysctl_createv(NULL, 0, NULL, NULL, 86 CTLFLAG_PERMANENT, 87 CTLTYPE_NODE, "machdep", 88 SYSCTL_DESCR("Machine dependent"), 89 NULL, 0, NULL, 0, 90 CTL_MACHDEP, CTL_EOL); 91 /* 92 * this node is inserted so that the sysctl nodes in libc can 93 * operate. 94 */ 95 sysctl_createv(NULL, 0, NULL, NULL, 96 CTLFLAG_PERMANENT, 97 CTLTYPE_NODE, "user", 98 SYSCTL_DESCR("User-level"), 99 NULL, 0, NULL, 0, 100 CTL_USER, CTL_EOL); 101 sysctl_createv(NULL, 0, NULL, NULL, 102 CTLFLAG_PERMANENT, 103 CTLTYPE_NODE, "ddb", 104 SYSCTL_DESCR("In-kernel debugger"), 105 NULL, 0, NULL, 0, 106 CTL_DDB, CTL_EOL); 107 sysctl_createv(NULL, 0, NULL, NULL, 108 CTLFLAG_PERMANENT, 109 CTLTYPE_NODE, "proc", 110 SYSCTL_DESCR("Per-process"), 111 NULL, 0, NULL, 0, 112 CTL_PROC, CTL_EOL); 113 sysctl_createv(NULL, 0, NULL, NULL, 114 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 115 CTLTYPE_NODE, "vendor", 116 SYSCTL_DESCR("Vendor specific"), 117 NULL, 0, NULL, 0, 118 CTL_VENDOR, CTL_EOL); 119 sysctl_createv(NULL, 0, NULL, NULL, 120 CTLFLAG_PERMANENT, 121 CTLTYPE_NODE, "emul", 122 SYSCTL_DESCR("Emulation settings"), 123 NULL, 0, NULL, 0, 124 CTL_EMUL, CTL_EOL); 125 sysctl_createv(NULL, 0, NULL, NULL, 126 CTLFLAG_PERMANENT, 127 CTLTYPE_NODE, "security", 128 SYSCTL_DESCR("Security"), 129 NULL, 0, NULL, 0, 130 CTL_SECURITY, CTL_EOL); 131 } 132 133 /* 134 * now add some nodes which both rump kernel and standard 135 * NetBSD both need, as rump cannot use sys/kern/init_sysctl.c 136 */ 137 SYSCTL_SETUP(sysctl_kernbase_setup, "sysctl kern subtree base setup") 138 { 139 140 sysctl_createv(clog, 0, NULL, NULL, 141 CTLFLAG_PERMANENT, 142 CTLTYPE_STRING, "ostype", 143 SYSCTL_DESCR("Operating system type"), 144 NULL, 0, __UNCONST(&ostype), 0, 145 CTL_KERN, KERN_OSTYPE, CTL_EOL); 146 sysctl_createv(clog, 0, NULL, NULL, 147 CTLFLAG_PERMANENT, 148 CTLTYPE_STRING, "osrelease", 149 SYSCTL_DESCR("Operating system release"), 150 NULL, 0, __UNCONST(&osrelease), 0, 151 CTL_KERN, KERN_OSRELEASE, CTL_EOL); 152 sysctl_createv(clog, 0, NULL, NULL, 153 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 154 CTLTYPE_INT, "osrevision", 155 SYSCTL_DESCR("Operating system revision"), 156 NULL, __NetBSD_Version__, NULL, 0, 157 CTL_KERN, KERN_OSREV, CTL_EOL); 158 sysctl_createv(clog, 0, NULL, NULL, 159 CTLFLAG_PERMANENT, 160 CTLTYPE_STRING, "version", 161 SYSCTL_DESCR("Kernel version"), 162 NULL, 0, __UNCONST(&version), 0, 163 CTL_KERN, KERN_VERSION, CTL_EOL); 164 sysctl_createv(clog, 0, NULL, NULL, 165 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 166 CTLTYPE_STRING, "hostname", 167 SYSCTL_DESCR("System hostname"), 168 sysctl_setlen, 0, hostname, MAXHOSTNAMELEN, 169 CTL_KERN, KERN_HOSTNAME, CTL_EOL); 170 sysctl_createv(clog, 0, NULL, NULL, 171 CTLFLAG_PERMANENT|CTLFLAG_READWRITE, 172 CTLTYPE_STRING, "domainname", 173 SYSCTL_DESCR("YP domain name"), 174 sysctl_setlen, 0, domainname, MAXHOSTNAMELEN, 175 CTL_KERN, KERN_DOMAINNAME, CTL_EOL); 176 sysctl_createv(clog, 0, NULL, NULL, 177 CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE, 178 CTLTYPE_INT, "rawpartition", 179 SYSCTL_DESCR("Raw partition of a disk"), 180 NULL, RAW_PART, NULL, 0, 181 CTL_KERN, KERN_RAWPARTITION, CTL_EOL); 182 } 183 184 /* 185 * sysctl helper function for kern.hostname and kern.domainnname. 186 * resets the relevant recorded length when the underlying name is 187 * changed. 188 */ 189 static int 190 sysctl_setlen(SYSCTLFN_ARGS) 191 { 192 int error; 193 194 error = sysctl_lookup(SYSCTLFN_CALL(rnode)); 195 if (error || newp == NULL) 196 return (error); 197 198 switch (rnode->sysctl_num) { 199 case KERN_HOSTNAME: 200 hostnamelen = strlen((const char*)rnode->sysctl_data); 201 break; 202 case KERN_DOMAINNAME: 203 domainnamelen = strlen((const char*)rnode->sysctl_data); 204 break; 205 } 206 207 return (0); 208 } 209