kern_mib.c revision 273736
1156230Smux/*- 2156230Smux * Copyright (c) 1982, 1986, 1989, 1993 3156230Smux * The Regents of the University of California. All rights reserved. 4156230Smux * 5156230Smux * This code is derived from software contributed to Berkeley by 6156230Smux * Mike Karels at Berkeley Software Design, Inc. 7156230Smux * 8156230Smux * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD 9156230Smux * project, to make these variables more userfriendly. 10156230Smux * 11156230Smux * Redistribution and use in source and binary forms, with or without 12156230Smux * modification, are permitted provided that the following conditions 13156230Smux * are met: 14156230Smux * 1. Redistributions of source code must retain the above copyright 15156230Smux * notice, this list of conditions and the following disclaimer. 16156230Smux * 2. Redistributions in binary form must reproduce the above copyright 17156230Smux * notice, this list of conditions and the following disclaimer in the 18156230Smux * documentation and/or other materials provided with the distribution. 19156230Smux * 4. Neither the name of the University nor the names of its contributors 20156230Smux * may be used to endorse or promote products derived from this software 21156230Smux * without specific prior written permission. 22156230Smux * 23156230Smux * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24156230Smux * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25156230Smux * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26156230Smux * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27156230Smux * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28156230Smux * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29156230Smux * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30156230Smux * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31156230Smux * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32156230Smux * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33156230Smux * SUCH DAMAGE. 34156230Smux * 35156230Smux * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 36156701Smux */ 37156230Smux 38156230Smux#include <sys/cdefs.h> 39156230Smux__FBSDID("$FreeBSD: stable/10/sys/kern/kern_mib.c 273736 2014-10-27 14:38:00Z hselasky $"); 40156230Smux 41156230Smux#include "opt_compat.h" 42156230Smux#include "opt_posix.h" 43156230Smux#include "opt_config.h" 44156230Smux 45156230Smux#include <sys/param.h> 46156230Smux#include <sys/kernel.h> 47156230Smux#include <sys/sbuf.h> 48156230Smux#include <sys/systm.h> 49156230Smux#include <sys/sysctl.h> 50156230Smux#include <sys/proc.h> 51156230Smux#include <sys/lock.h> 52156230Smux#include <sys/mutex.h> 53156230Smux#include <sys/jail.h> 54156230Smux#include <sys/smp.h> 55156230Smux#include <sys/sx.h> 56156230Smux#include <sys/unistd.h> 57156230Smux 58156230SmuxSYSCTL_ROOT_NODE(0, sysctl, CTLFLAG_RW, 0, 59156230Smux "Sysctl internal magic"); 60156230SmuxSYSCTL_ROOT_NODE(CTL_KERN, kern, CTLFLAG_RW|CTLFLAG_CAPRD, 0, 61156230Smux "High kernel, proc, limits &c"); 62156230SmuxSYSCTL_ROOT_NODE(CTL_VM, vm, CTLFLAG_RW, 0, 63156230Smux "Virtual memory"); 64156230SmuxSYSCTL_ROOT_NODE(CTL_VFS, vfs, CTLFLAG_RW, 0, 65156230Smux "File system"); 66156230SmuxSYSCTL_ROOT_NODE(CTL_NET, net, CTLFLAG_RW, 0, 67156701Smux "Network, (see socket.h)"); 68156701SmuxSYSCTL_ROOT_NODE(CTL_DEBUG, debug, CTLFLAG_RW, 0, 69156701Smux "Debugging"); 70156701SmuxSYSCTL_NODE(_debug, OID_AUTO, sizeof, CTLFLAG_RW, 0, 71156701Smux "Sizeof various things"); 72156701SmuxSYSCTL_ROOT_NODE(CTL_HW, hw, CTLFLAG_RW, 0, 73156701Smux "hardware"); 74156701SmuxSYSCTL_ROOT_NODE(CTL_MACHDEP, machdep, CTLFLAG_RW, 0, 75156701Smux "machine dependent"); 76156701SmuxSYSCTL_ROOT_NODE(CTL_USER, user, CTLFLAG_RW, 0, 77156701Smux "user-level"); 78156701SmuxSYSCTL_ROOT_NODE(CTL_P1003_1B, p1003_1b, CTLFLAG_RW, 0, 79156701Smux "p1003_1b, (see p1003_1b.h)"); 80156701Smux 81156701SmuxSYSCTL_ROOT_NODE(OID_AUTO, compat, CTLFLAG_RW, 0, 82156701Smux "Compatibility code"); 83156701SmuxSYSCTL_ROOT_NODE(OID_AUTO, security, CTLFLAG_RW, 0, 84156701Smux "Security"); 85156230Smux#ifdef REGRESSION 86156230SmuxSYSCTL_ROOT_NODE(OID_AUTO, regression, CTLFLAG_RW, 0, 87156230Smux "Regression test MIB"); 88156230Smux#endif 89156230Smux 90156230SmuxSYSCTL_STRING(_kern, OID_AUTO, ident, CTLFLAG_RD|CTLFLAG_MPSAFE, 91156230Smux kern_ident, 0, "Kernel identifier"); 92156230Smux 93156230SmuxSYSCTL_STRING(_kern, KERN_OSRELEASE, osrelease, CTLFLAG_RD|CTLFLAG_MPSAFE| 94156230Smux CTLFLAG_CAPRD, osrelease, 0, "Operating system release"); 95156230Smux 96156230SmuxSYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD|CTLFLAG_CAPRD, 97156230Smux SYSCTL_NULL_INT_PTR, BSD, "Operating system revision"); 98156230Smux 99156230SmuxSYSCTL_STRING(_kern, KERN_VERSION, version, CTLFLAG_RD|CTLFLAG_MPSAFE, 100156230Smux version, 0, "Kernel version"); 101156230Smux 102156230SmuxSYSCTL_STRING(_kern, OID_AUTO, compiler_version, CTLFLAG_RD|CTLFLAG_MPSAFE, 103156230Smux compiler_version, 0, "Version of compiler used to compile kernel"); 104156230Smux 105156230SmuxSYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD|CTLFLAG_MPSAFE| 106156230Smux CTLFLAG_CAPRD, ostype, 0, "Operating system type"); 107156230Smux 108156230Smux/* 109156230Smux * NOTICE: The *userland* release date is available in 110156230Smux * /usr/include/osreldate.h 111156230Smux */ 112156230SmuxSYSCTL_INT(_kern, KERN_OSRELDATE, osreldate, CTLFLAG_RD|CTLFLAG_CAPRD, 113156230Smux &osreldate, 0, "Kernel release date"); 114156230Smux 115156230SmuxSYSCTL_INT(_kern, KERN_MAXPROC, maxproc, CTLFLAG_RDTUN, 116156230Smux &maxproc, 0, "Maximum number of processes"); 117156230Smux 118156230SmuxSYSCTL_INT(_kern, KERN_MAXPROCPERUID, maxprocperuid, CTLFLAG_RW, 119156230Smux &maxprocperuid, 0, "Maximum processes allowed per userid"); 120156230Smux 121156230SmuxSYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RDTUN, 122156230Smux &maxusers, 0, "Hint for kernel tuning"); 123156230Smux 124156230SmuxSYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD|CTLFLAG_CAPRD, 125156230Smux SYSCTL_NULL_INT_PTR, ARG_MAX, "Maximum bytes of argument to execve(2)"); 126156230Smux 127156230SmuxSYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD|CTLFLAG_CAPRD, 128156230Smux SYSCTL_NULL_INT_PTR, _POSIX_VERSION, "Version of POSIX attempting to comply to"); 129156230Smux 130156230SmuxSYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RDTUN|CTLFLAG_CAPRD, 131156230Smux &ngroups_max, 0, 132156230Smux "Maximum number of supplemental groups a user can belong to"); 133156230Smux 134156230SmuxSYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD|CTLFLAG_CAPRD, 135156230Smux SYSCTL_NULL_INT_PTR, 1, "Whether job control is available"); 136156230Smux 137156230Smux#ifdef _POSIX_SAVED_IDS 138156230SmuxSYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD, 139156230Smux SYSCTL_NULL_INT_PTR, 1, "Whether saved set-group/user ID is available"); 140156230Smux#else 141156230SmuxSYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD, 142156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether saved set-group/user ID is available"); 143156230Smux#endif 144156230Smux 145156230Smuxchar kernelname[MAXPATHLEN] = "/kernel"; /* XXX bloat */ 146156230Smux 147156230SmuxSYSCTL_STRING(_kern, KERN_BOOTFILE, bootfile, CTLFLAG_RW, 148156230Smux kernelname, sizeof kernelname, "Name of kernel file booted"); 149156230Smux 150156230SmuxSYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD|CTLFLAG_CAPRD, 151156230Smux &mp_ncpus, 0, "Number of active CPUs"); 152156230Smux 153156230SmuxSYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD|CTLFLAG_CAPRD, 154156230Smux SYSCTL_NULL_INT_PTR, BYTE_ORDER, "System byte order"); 155156230Smux 156156230SmuxSYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD|CTLFLAG_CAPRD, 157156230Smux SYSCTL_NULL_INT_PTR, PAGE_SIZE, "System memory page size"); 158156230Smux 159156230Smuxstatic int 160156230Smuxsysctl_kern_arnd(SYSCTL_HANDLER_ARGS) 161156230Smux{ 162156230Smux char buf[256]; 163156230Smux size_t len; 164156230Smux 165156230Smux len = req->oldlen; 166156230Smux if (len > sizeof(buf)) 167156230Smux len = sizeof(buf); 168156230Smux arc4rand(buf, len, 0); 169156230Smux return (SYSCTL_OUT(req, buf, len)); 170156230Smux} 171156230Smux 172156230SmuxSYSCTL_PROC(_kern, KERN_ARND, arandom, 173156230Smux CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_CAPRD, NULL, 0, 174156230Smux sysctl_kern_arnd, "", "arc4rand"); 175156230Smux 176156230Smuxstatic int 177156230Smuxsysctl_hw_physmem(SYSCTL_HANDLER_ARGS) 178156230Smux{ 179156230Smux u_long val; 180156230Smux 181156230Smux val = ctob(physmem); 182156230Smux return (sysctl_handle_long(oidp, &val, 0, req)); 183156230Smux} 184156230Smux 185156230SmuxSYSCTL_PROC(_hw, HW_PHYSMEM, physmem, CTLTYPE_ULONG | CTLFLAG_RD, 186156230Smux 0, 0, sysctl_hw_physmem, "LU", ""); 187156230Smux 188156230Smuxstatic int 189156230Smuxsysctl_hw_realmem(SYSCTL_HANDLER_ARGS) 190156230Smux{ 191156230Smux u_long val; 192156230Smux val = ctob(realmem); 193156230Smux return (sysctl_handle_long(oidp, &val, 0, req)); 194156230Smux} 195156230SmuxSYSCTL_PROC(_hw, HW_REALMEM, realmem, CTLTYPE_ULONG | CTLFLAG_RD, 196156230Smux 0, 0, sysctl_hw_realmem, "LU", ""); 197156230Smuxstatic int 198156230Smuxsysctl_hw_usermem(SYSCTL_HANDLER_ARGS) 199156230Smux{ 200156230Smux u_long val; 201156230Smux 202156230Smux val = ctob(physmem - cnt.v_wire_count); 203156230Smux return (sysctl_handle_long(oidp, &val, 0, req)); 204186781Slulf} 205186781Slulf 206156230SmuxSYSCTL_PROC(_hw, HW_USERMEM, usermem, CTLTYPE_ULONG | CTLFLAG_RD, 207186781Slulf 0, 0, sysctl_hw_usermem, "LU", ""); 208156230Smux 209156230SmuxSYSCTL_LONG(_hw, OID_AUTO, availpages, CTLFLAG_RD, &physmem, 0, ""); 210156230Smux 211156230Smuxu_long pagesizes[MAXPAGESIZES] = { PAGE_SIZE }; 212156230Smux 213156230Smuxstatic int 214156230Smuxsysctl_hw_pagesizes(SYSCTL_HANDLER_ARGS) 215156230Smux{ 216156230Smux int error; 217156230Smux#ifdef SCTL_MASK32 218156230Smux int i; 219156230Smux uint32_t pagesizes32[MAXPAGESIZES]; 220156230Smux 221156230Smux if (req->flags & SCTL_MASK32) { 222156230Smux /* 223156230Smux * Recreate the "pagesizes" array with 32-bit elements. Truncate 224156230Smux * any page size greater than UINT32_MAX to zero. 225156251Smux */ 226156230Smux for (i = 0; i < MAXPAGESIZES; i++) 227156230Smux pagesizes32[i] = (uint32_t)pagesizes[i]; 228156230Smux 229156230Smux error = SYSCTL_OUT(req, pagesizes32, sizeof(pagesizes32)); 230156230Smux } else 231156230Smux#endif 232156230Smux error = SYSCTL_OUT(req, pagesizes, sizeof(pagesizes)); 233156230Smux return (error); 234156230Smux} 235156230SmuxSYSCTL_PROC(_hw, OID_AUTO, pagesizes, CTLTYPE_ULONG | CTLFLAG_RD, 236156230Smux NULL, 0, sysctl_hw_pagesizes, "LU", "Supported page sizes"); 237156230Smux 238156230Smux#ifdef SCTL_MASK32 239156230Smuxint adaptive_machine_arch = 1; 240156230SmuxSYSCTL_INT(_debug, OID_AUTO, adaptive_machine_arch, CTLFLAG_RW, 241156230Smux &adaptive_machine_arch, 1, 242156230Smux "Adapt reported machine architecture to the ABI of the binary"); 243156230Smux#endif 244156230Smux 245156230Smuxstatic int 246156230Smuxsysctl_hw_machine_arch(SYSCTL_HANDLER_ARGS) 247156230Smux{ 248156230Smux int error; 249156230Smux static const char machine_arch[] = MACHINE_ARCH; 250156230Smux#ifdef SCTL_MASK32 251186781Slulf static const char machine_arch32[] = MACHINE_ARCH32; 252186781Slulf 253186781Slulf if ((req->flags & SCTL_MASK32) != 0 && adaptive_machine_arch) 254186781Slulf error = SYSCTL_OUT(req, machine_arch32, sizeof(machine_arch32)); 255186781Slulf else 256186781Slulf#endif 257186781Slulf error = SYSCTL_OUT(req, machine_arch, sizeof(machine_arch)); 258186781Slulf return (error); 259186781Slulf 260186781Slulf} 261186781SlulfSYSCTL_PROC(_hw, HW_MACHINE_ARCH, machine_arch, CTLTYPE_STRING | CTLFLAG_RD, 262186781Slulf NULL, 0, sysctl_hw_machine_arch, "A", "System architecture"); 263186781Slulf 264186781SlulfSYSCTL_STRING(_kern, OID_AUTO, supported_archs, CTLFLAG_RD | CTLFLAG_MPSAFE, 265186781Slulf#ifdef COMPAT_FREEBSD32 266186781Slulf MACHINE_ARCH " " MACHINE_ARCH32, 0, "Supported architectures for binaries"); 267186781Slulf#else 268186781Slulf MACHINE_ARCH, 0, "Supported architectures for binaries"); 269186781Slulf#endif 270186781Slulf 271186781Slulfstatic int 272186781Slulfsysctl_hostname(SYSCTL_HANDLER_ARGS) 273186781Slulf{ 274186781Slulf struct prison *pr, *cpr; 275186781Slulf size_t pr_offset; 276156230Smux char tmpname[MAXHOSTNAMELEN]; 277156230Smux int descend, error, len; 278156230Smux 279156230Smux /* 280156230Smux * This function can set: hostname domainname hostuuid. 281156230Smux * Keep that in mind when comments say "hostname". 282156230Smux */ 283156230Smux pr_offset = (size_t)arg1; 284156230Smux len = arg2; 285156230Smux KASSERT(len <= sizeof(tmpname), 286156230Smux ("length %d too long for %s", len, __func__)); 287186781Slulf 288156230Smux pr = req->td->td_ucred->cr_prison; 289156230Smux if (!(pr->pr_allow & PR_ALLOW_SET_HOSTNAME) && req->newptr) 290156230Smux return (EPERM); 291156230Smux /* 292156230Smux * Make a local copy of hostname to get/set so we don't have to hold 293186781Slulf * the jail mutex during the sysctl copyin/copyout activities. 294186781Slulf */ 295186781Slulf mtx_lock(&pr->pr_mtx); 296186781Slulf bcopy((char *)pr + pr_offset, tmpname, len); 297186781Slulf mtx_unlock(&pr->pr_mtx); 298186781Slulf 299186781Slulf error = sysctl_handle_string(oidp, tmpname, len, req); 300186781Slulf 301186781Slulf if (req->newptr != NULL && error == 0) { 302186781Slulf /* 303186781Slulf * Copy the locally set hostname to all jails that share 304186781Slulf * this host info. 305186781Slulf */ 306186781Slulf sx_slock(&allprison_lock); 307186781Slulf while (!(pr->pr_flags & PR_HOST)) 308186781Slulf pr = pr->pr_parent; 309186781Slulf mtx_lock(&pr->pr_mtx); 310186781Slulf bcopy(tmpname, (char *)pr + pr_offset, len); 311186781Slulf FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) 312186781Slulf if (cpr->pr_flags & PR_HOST) 313186781Slulf descend = 0; 314186781Slulf else 315186781Slulf bcopy(tmpname, (char *)cpr + pr_offset, len); 316186781Slulf mtx_unlock(&pr->pr_mtx); 317186781Slulf sx_sunlock(&allprison_lock); 318186781Slulf } 319186781Slulf return (error); 320186781Slulf} 321186781Slulf 322186781SlulfSYSCTL_PROC(_kern, KERN_HOSTNAME, hostname, 323186781Slulf CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 324186781Slulf (void *)(offsetof(struct prison, pr_hostname)), MAXHOSTNAMELEN, 325186781Slulf sysctl_hostname, "A", "Hostname"); 326186781SlulfSYSCTL_PROC(_kern, KERN_NISDOMAINNAME, domainname, 327186781Slulf CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 328186781Slulf (void *)(offsetof(struct prison, pr_domainname)), MAXHOSTNAMELEN, 329186781Slulf sysctl_hostname, "A", "Name of the current YP/NIS domain"); 330186781SlulfSYSCTL_PROC(_kern, KERN_HOSTUUID, hostuuid, 331186781Slulf CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 332156230Smux (void *)(offsetof(struct prison, pr_hostuuid)), HOSTUUIDLEN, 333156230Smux sysctl_hostname, "A", "Host UUID"); 334156230Smux 335156230Smuxstatic int regression_securelevel_nonmonotonic = 0; 336156230Smux 337156230Smux#ifdef REGRESSION 338156230SmuxSYSCTL_INT(_regression, OID_AUTO, securelevel_nonmonotonic, CTLFLAG_RW, 339156230Smux ®ression_securelevel_nonmonotonic, 0, "securelevel may be lowered"); 340156230Smux#endif 341156230Smux 342156230Smuxstatic int 343156230Smuxsysctl_kern_securelvl(SYSCTL_HANDLER_ARGS) 344156230Smux{ 345156230Smux struct prison *pr, *cpr; 346156230Smux int descend, error, level; 347156230Smux 348156230Smux pr = req->td->td_ucred->cr_prison; 349156230Smux 350156230Smux /* 351156230Smux * Reading the securelevel is easy, since the current jail's level 352156230Smux * is known to be at least as secure as any higher levels. Perform 353156230Smux * a lockless read since the securelevel is an integer. 354156230Smux */ 355156230Smux level = pr->pr_securelevel; 356156230Smux error = sysctl_handle_int(oidp, &level, 0, req); 357156230Smux if (error || !req->newptr) 358156230Smux return (error); 359156230Smux /* Permit update only if the new securelevel exceeds the old. */ 360156230Smux sx_slock(&allprison_lock); 361156230Smux mtx_lock(&pr->pr_mtx); 362156230Smux if (!regression_securelevel_nonmonotonic && 363156230Smux level < pr->pr_securelevel) { 364156230Smux mtx_unlock(&pr->pr_mtx); 365156230Smux sx_sunlock(&allprison_lock); 366156230Smux return (EPERM); 367156230Smux } 368156230Smux pr->pr_securelevel = level; 369156230Smux /* 370156230Smux * Set all child jails to be at least this level, but do not lower 371156230Smux * them (even if regression_securelevel_nonmonotonic). 372156230Smux */ 373156230Smux FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) { 374156230Smux if (cpr->pr_securelevel < level) 375156230Smux cpr->pr_securelevel = level; 376156230Smux } 377156230Smux mtx_unlock(&pr->pr_mtx); 378156230Smux sx_sunlock(&allprison_lock); 379156230Smux return (error); 380156230Smux} 381156230Smux 382156230SmuxSYSCTL_PROC(_kern, KERN_SECURELVL, securelevel, 383156230Smux CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, sysctl_kern_securelvl, 384156230Smux "I", "Current secure level"); 385156230Smux 386156230Smux#ifdef INCLUDE_CONFIG_FILE 387156230Smux/* Actual kernel configuration options. */ 388156230Smuxextern char kernconfstring[]; 389156230Smux 390156230SmuxSYSCTL_STRING(_kern, OID_AUTO, conftxt, CTLFLAG_RD, kernconfstring, 0, 391156230Smux "Kernel configuration file"); 392156230Smux#endif 393156230Smux 394156230Smuxstatic int 395156230Smuxsysctl_hostid(SYSCTL_HANDLER_ARGS) 396156230Smux{ 397156230Smux struct prison *pr, *cpr; 398156230Smux u_long tmpid; 399156230Smux int descend, error; 400156230Smux 401156230Smux /* 402156230Smux * Like sysctl_hostname, except it operates on a u_long 403156230Smux * instead of a string, and is used only for hostid. 404156230Smux */ 405156230Smux pr = req->td->td_ucred->cr_prison; 406156230Smux if (!(pr->pr_allow & PR_ALLOW_SET_HOSTNAME) && req->newptr) 407156230Smux return (EPERM); 408156230Smux tmpid = pr->pr_hostid; 409156230Smux error = sysctl_handle_long(oidp, &tmpid, 0, req); 410156230Smux 411156230Smux if (req->newptr != NULL && error == 0) { 412156230Smux sx_slock(&allprison_lock); 413156230Smux while (!(pr->pr_flags & PR_HOST)) 414156230Smux pr = pr->pr_parent; 415156230Smux mtx_lock(&pr->pr_mtx); 416156230Smux pr->pr_hostid = tmpid; 417156230Smux FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) 418156230Smux if (cpr->pr_flags & PR_HOST) 419156230Smux descend = 0; 420156230Smux else 421156230Smux cpr->pr_hostid = tmpid; 422156230Smux mtx_unlock(&pr->pr_mtx); 423156230Smux sx_sunlock(&allprison_lock); 424156230Smux } 425156230Smux return (error); 426156230Smux} 427156230Smux 428156230SmuxSYSCTL_PROC(_kern, KERN_HOSTID, hostid, 429156230Smux CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 430156230Smux NULL, 0, sysctl_hostid, "LU", "Host ID"); 431156230Smux 432156230SmuxSYSCTL_NODE(_kern, OID_AUTO, features, CTLFLAG_RD, 0, "Kernel Features"); 433156230Smux 434156230Smux#ifdef COMPAT_FREEBSD4 435156230SmuxFEATURE(compat_freebsd4, "Compatible with FreeBSD 4"); 436156230Smux#endif 437156230Smux 438156230Smux#ifdef COMPAT_FREEBSD5 439156230SmuxFEATURE(compat_freebsd5, "Compatible with FreeBSD 5"); 440156230Smux#endif 441156230Smux 442156230Smux#ifdef COMPAT_FREEBSD6 443156230SmuxFEATURE(compat_freebsd6, "Compatible with FreeBSD 6"); 444156230Smux#endif 445156230Smux 446156230Smux#ifdef COMPAT_FREEBSD7 447156230SmuxFEATURE(compat_freebsd7, "Compatible with FreeBSD 7"); 448156230Smux#endif 449156230Smux 450156230Smux/* 451156230Smux * This is really cheating. These actually live in the libc, something 452156230Smux * which I'm not quite sure is a good idea anyway, but in order for 453156230Smux * getnext and friends to actually work, we define dummies here. 454156230Smux * 455156230Smux * XXXRW: These probably should be CTLFLAG_CAPRD. 456156230Smux */ 457156230SmuxSYSCTL_STRING(_user, USER_CS_PATH, cs_path, CTLFLAG_RD, 458156230Smux "", 0, "PATH that finds all the standard utilities"); 459156230SmuxSYSCTL_INT(_user, USER_BC_BASE_MAX, bc_base_max, CTLFLAG_RD, 460156230Smux SYSCTL_NULL_INT_PTR, 0, "Max ibase/obase values in bc(1)"); 461156230SmuxSYSCTL_INT(_user, USER_BC_DIM_MAX, bc_dim_max, CTLFLAG_RD, 462156230Smux SYSCTL_NULL_INT_PTR, 0, "Max array size in bc(1)"); 463156230SmuxSYSCTL_INT(_user, USER_BC_SCALE_MAX, bc_scale_max, CTLFLAG_RD, 464156230Smux SYSCTL_NULL_INT_PTR, 0, "Max scale value in bc(1)"); 465156230SmuxSYSCTL_INT(_user, USER_BC_STRING_MAX, bc_string_max, CTLFLAG_RD, 466156230Smux SYSCTL_NULL_INT_PTR, 0, "Max string length in bc(1)"); 467156230SmuxSYSCTL_INT(_user, USER_COLL_WEIGHTS_MAX, coll_weights_max, CTLFLAG_RD, 468156230Smux SYSCTL_NULL_INT_PTR, 0, "Maximum number of weights assigned to an LC_COLLATE locale entry"); 469156230SmuxSYSCTL_INT(_user, USER_EXPR_NEST_MAX, expr_nest_max, CTLFLAG_RD, 470156230Smux SYSCTL_NULL_INT_PTR, 0, ""); 471156230SmuxSYSCTL_INT(_user, USER_LINE_MAX, line_max, CTLFLAG_RD, 472156230Smux SYSCTL_NULL_INT_PTR, 0, "Max length (bytes) of a text-processing utility's input line"); 473156230SmuxSYSCTL_INT(_user, USER_RE_DUP_MAX, re_dup_max, CTLFLAG_RD, 474156230Smux SYSCTL_NULL_INT_PTR, 0, "Maximum number of repeats of a regexp permitted"); 475156230SmuxSYSCTL_INT(_user, USER_POSIX2_VERSION, posix2_version, CTLFLAG_RD, 476156230Smux SYSCTL_NULL_INT_PTR, 0, 477156230Smux "The version of POSIX 1003.2 with which the system attempts to comply"); 478156230SmuxSYSCTL_INT(_user, USER_POSIX2_C_BIND, posix2_c_bind, CTLFLAG_RD, 479156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether C development supports the C bindings option"); 480156230SmuxSYSCTL_INT(_user, USER_POSIX2_C_DEV, posix2_c_dev, CTLFLAG_RD, 481156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports the C development utilities option"); 482156230SmuxSYSCTL_INT(_user, USER_POSIX2_CHAR_TERM, posix2_char_term, CTLFLAG_RD, 483156230Smux SYSCTL_NULL_INT_PTR, 0, ""); 484156230SmuxSYSCTL_INT(_user, USER_POSIX2_FORT_DEV, posix2_fort_dev, CTLFLAG_RD, 485156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports FORTRAN development utilities"); 486156230SmuxSYSCTL_INT(_user, USER_POSIX2_FORT_RUN, posix2_fort_run, CTLFLAG_RD, 487156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports FORTRAN runtime utilities"); 488156230SmuxSYSCTL_INT(_user, USER_POSIX2_LOCALEDEF, posix2_localedef, CTLFLAG_RD, 489156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports creation of locales"); 490156230SmuxSYSCTL_INT(_user, USER_POSIX2_SW_DEV, posix2_sw_dev, CTLFLAG_RD, 491156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports software development utilities"); 492156230SmuxSYSCTL_INT(_user, USER_POSIX2_UPE, posix2_upe, CTLFLAG_RD, 493156230Smux SYSCTL_NULL_INT_PTR, 0, "Whether system supports the user portability utilities"); 494156230SmuxSYSCTL_INT(_user, USER_STREAM_MAX, stream_max, CTLFLAG_RD, 495156230Smux SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of streams a process may have open at one time"); 496156230SmuxSYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RD, 497156230Smux SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of types supported for timezone names"); 498156230Smux 499156230Smux#include <sys/vnode.h> 500156230SmuxSYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD, 501156230Smux SYSCTL_NULL_INT_PTR, sizeof(struct vnode), "sizeof(struct vnode)"); 502156230Smux 503156230SmuxSYSCTL_INT(_debug_sizeof, OID_AUTO, proc, CTLFLAG_RD, 504156230Smux SYSCTL_NULL_INT_PTR, sizeof(struct proc), "sizeof(struct proc)"); 505156230Smux 506156230Smuxstatic int 507156230Smuxsysctl_kern_pid_max(SYSCTL_HANDLER_ARGS) 508156230Smux{ 509156230Smux int error, pm; 510156230Smux 511156230Smux pm = pid_max; 512156230Smux error = sysctl_handle_int(oidp, &pm, 0, req); 513156230Smux if (error || !req->newptr) 514156230Smux return (error); 515156230Smux sx_xlock(&proctree_lock); 516156230Smux sx_xlock(&allproc_lock); 517156230Smux 518156230Smux /* 519156230Smux * Only permit the values less then PID_MAX. 520156230Smux * As a safety measure, do not allow to limit the pid_max too much. 521156230Smux */ 522156230Smux if (pm < 300 || pm > PID_MAX) 523156230Smux error = EINVAL; 524156230Smux else 525156230Smux pid_max = pm; 526156230Smux sx_xunlock(&allproc_lock); 527156230Smux sx_xunlock(&proctree_lock); 528156230Smux return (error); 529156230Smux} 530156230SmuxSYSCTL_PROC(_kern, OID_AUTO, pid_max, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_TUN | 531156230Smux CTLFLAG_MPSAFE, 0, 0, sysctl_kern_pid_max, "I", 532156230Smux "Maximum allowed pid"); 533156230Smux 534156230Smux#include <sys/bio.h> 535156230Smux#include <sys/buf.h> 536156230SmuxSYSCTL_INT(_debug_sizeof, OID_AUTO, bio, CTLFLAG_RD, 537156230Smux SYSCTL_NULL_INT_PTR, sizeof(struct bio), "sizeof(struct bio)"); 538156230SmuxSYSCTL_INT(_debug_sizeof, OID_AUTO, buf, CTLFLAG_RD, 539156230Smux SYSCTL_NULL_INT_PTR, sizeof(struct buf), "sizeof(struct buf)"); 540156230Smux 541156230Smux#include <sys/user.h> 542156230SmuxSYSCTL_INT(_debug_sizeof, OID_AUTO, kinfo_proc, CTLFLAG_RD, 543156230Smux SYSCTL_NULL_INT_PTR, sizeof(struct kinfo_proc), "sizeof(struct kinfo_proc)"); 544156230Smux 545156230Smux/* XXX compatibility, remove for 6.0 */ 546156230Smux#include <sys/imgact.h> 547156230Smux#include <sys/imgact_elf.h> 548156230SmuxSYSCTL_INT(_kern, OID_AUTO, fallback_elf_brand, CTLFLAG_RW, 549156230Smux &__elfN(fallback_brand), sizeof(__elfN(fallback_brand)), 550156230Smux "compatibility for kern.fallback_elf_brand"); 551156230Smux