kern_mib.c revision 354762
1/*- 2 * Copyright (c) 1982, 1986, 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Mike Karels at Berkeley Software Design, Inc. 7 * 8 * Quite extensively rewritten by Poul-Henning Kamp of the FreeBSD 9 * project, to make these variables more userfriendly. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)kern_sysctl.c 8.4 (Berkeley) 4/14/94 36 */ 37 38#include <sys/cdefs.h> 39__FBSDID("$FreeBSD: stable/11/sys/kern/kern_mib.c 354762 2019-11-16 00:33:02Z scottl $"); 40 41#include "opt_compat.h" 42#include "opt_posix.h" 43#include "opt_config.h" 44 45#include <sys/param.h> 46#include <sys/jail.h> 47#include <sys/kernel.h> 48#include <sys/limits.h> 49#include <sys/lock.h> 50#include <sys/mutex.h> 51#include <sys/proc.h> 52#include <sys/random.h> 53#include <sys/sbuf.h> 54#include <sys/smp.h> 55#include <sys/sx.h> 56#include <sys/vmmeter.h> 57#include <sys/sysctl.h> 58#include <sys/systm.h> 59#include <sys/unistd.h> 60 61SYSCTL_ROOT_NODE(0, sysctl, CTLFLAG_RW, 0, 62 "Sysctl internal magic"); 63SYSCTL_ROOT_NODE(CTL_KERN, kern, CTLFLAG_RW|CTLFLAG_CAPRD, 0, 64 "High kernel, proc, limits &c"); 65SYSCTL_ROOT_NODE(CTL_VM, vm, CTLFLAG_RW, 0, 66 "Virtual memory"); 67SYSCTL_ROOT_NODE(CTL_VFS, vfs, CTLFLAG_RW, 0, 68 "File system"); 69SYSCTL_ROOT_NODE(CTL_NET, net, CTLFLAG_RW, 0, 70 "Network, (see socket.h)"); 71SYSCTL_ROOT_NODE(CTL_DEBUG, debug, CTLFLAG_RW, 0, 72 "Debugging"); 73SYSCTL_NODE(_debug, OID_AUTO, sizeof, CTLFLAG_RW, 0, 74 "Sizeof various things"); 75SYSCTL_ROOT_NODE(CTL_HW, hw, CTLFLAG_RW, 0, 76 "hardware"); 77SYSCTL_ROOT_NODE(CTL_MACHDEP, machdep, CTLFLAG_RW, 0, 78 "machine dependent"); 79SYSCTL_NODE(_machdep, OID_AUTO, mitigations, CTLFLAG_RW, 0, 80 "Machine dependent platform mitigations."); 81SYSCTL_ROOT_NODE(CTL_USER, user, CTLFLAG_RW, 0, 82 "user-level"); 83SYSCTL_ROOT_NODE(CTL_P1003_1B, p1003_1b, CTLFLAG_RW, 0, 84 "p1003_1b, (see p1003_1b.h)"); 85 86SYSCTL_ROOT_NODE(OID_AUTO, compat, CTLFLAG_RW, 0, 87 "Compatibility code"); 88SYSCTL_ROOT_NODE(OID_AUTO, security, CTLFLAG_RW, 0, 89 "Security"); 90#ifdef REGRESSION 91SYSCTL_ROOT_NODE(OID_AUTO, regression, CTLFLAG_RW, 0, 92 "Regression test MIB"); 93#endif 94 95SYSCTL_STRING(_kern, OID_AUTO, ident, CTLFLAG_RD|CTLFLAG_MPSAFE, 96 kern_ident, 0, "Kernel identifier"); 97 98SYSCTL_INT(_kern, KERN_OSREV, osrevision, CTLFLAG_RD|CTLFLAG_CAPRD, 99 SYSCTL_NULL_INT_PTR, BSD, "Operating system revision"); 100 101SYSCTL_STRING(_kern, KERN_VERSION, version, CTLFLAG_RD|CTLFLAG_MPSAFE, 102 version, 0, "Kernel version"); 103 104SYSCTL_STRING(_kern, OID_AUTO, compiler_version, CTLFLAG_RD|CTLFLAG_MPSAFE, 105 compiler_version, 0, "Version of compiler used to compile kernel"); 106 107SYSCTL_STRING(_kern, KERN_OSTYPE, ostype, CTLFLAG_RD|CTLFLAG_MPSAFE| 108 CTLFLAG_CAPRD, ostype, 0, "Operating system type"); 109 110SYSCTL_INT(_kern, KERN_MAXPROC, maxproc, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, 111 &maxproc, 0, "Maximum number of processes"); 112 113SYSCTL_INT(_kern, KERN_MAXPROCPERUID, maxprocperuid, CTLFLAG_RW, 114 &maxprocperuid, 0, "Maximum processes allowed per userid"); 115 116SYSCTL_INT(_kern, OID_AUTO, maxusers, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, 117 &maxusers, 0, "Hint for kernel tuning"); 118 119SYSCTL_INT(_kern, KERN_ARGMAX, argmax, CTLFLAG_RD|CTLFLAG_CAPRD, 120 SYSCTL_NULL_INT_PTR, ARG_MAX, "Maximum bytes of argument to execve(2)"); 121 122SYSCTL_INT(_kern, KERN_POSIX1, posix1version, CTLFLAG_RD|CTLFLAG_CAPRD, 123 SYSCTL_NULL_INT_PTR, _POSIX_VERSION, "Version of POSIX attempting to comply to"); 124 125SYSCTL_INT(_kern, KERN_NGROUPS, ngroups, CTLFLAG_RDTUN | 126 CTLFLAG_NOFETCH | CTLFLAG_CAPRD, &ngroups_max, 0, 127 "Maximum number of supplemental groups a user can belong to"); 128 129SYSCTL_INT(_kern, KERN_JOB_CONTROL, job_control, CTLFLAG_RD|CTLFLAG_CAPRD, 130 SYSCTL_NULL_INT_PTR, 1, "Whether job control is available"); 131 132#ifdef _POSIX_SAVED_IDS 133SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD, 134 SYSCTL_NULL_INT_PTR, 1, "Whether saved set-group/user ID is available"); 135#else 136SYSCTL_INT(_kern, KERN_SAVED_IDS, saved_ids, CTLFLAG_RD|CTLFLAG_CAPRD, 137 SYSCTL_NULL_INT_PTR, 0, "Whether saved set-group/user ID is available"); 138#endif 139 140char kernelname[MAXPATHLEN] = "/boot/kernel/kernel"; /* XXX bloat */ 141 142SYSCTL_STRING(_kern, KERN_BOOTFILE, bootfile, CTLFLAG_RW | CTLFLAG_MPSAFE, 143 kernelname, sizeof kernelname, "Name of kernel file booted"); 144 145SYSCTL_INT(_hw, HW_NCPU, ncpu, CTLFLAG_RD|CTLFLAG_CAPRD, 146 &mp_ncpus, 0, "Number of active CPUs"); 147 148SYSCTL_INT(_hw, HW_BYTEORDER, byteorder, CTLFLAG_RD|CTLFLAG_CAPRD, 149 SYSCTL_NULL_INT_PTR, BYTE_ORDER, "System byte order"); 150 151SYSCTL_INT(_hw, HW_PAGESIZE, pagesize, CTLFLAG_RD|CTLFLAG_CAPRD, 152 SYSCTL_NULL_INT_PTR, PAGE_SIZE, "System memory page size"); 153 154static int 155sysctl_kern_arnd(SYSCTL_HANDLER_ARGS) 156{ 157 char buf[256]; 158 size_t len; 159 160 /*- 161 * This is one of the very few legitimate uses of read_random(9). 162 * Use of arc4random(9) is not recommended as that will ignore 163 * an unsafe (i.e. unseeded) random(4). 164 * 165 * If random(4) is not seeded, then this returns 0, so the 166 * sysctl will return a zero-length buffer. 167 */ 168 len = read_random(buf, MIN(req->oldlen, sizeof(buf))); 169 return (SYSCTL_OUT(req, buf, len)); 170} 171 172SYSCTL_PROC(_kern, KERN_ARND, arandom, 173 CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_CAPRD, NULL, 0, 174 sysctl_kern_arnd, "", "arc4rand"); 175 176static int 177sysctl_hw_physmem(SYSCTL_HANDLER_ARGS) 178{ 179 u_long val, p; 180 181 p = SIZE_T_MAX >> PAGE_SHIFT; 182 if (physmem < p) 183 p = physmem; 184 val = ctob(p); 185 return (sysctl_handle_long(oidp, &val, 0, req)); 186} 187SYSCTL_PROC(_hw, HW_PHYSMEM, physmem, CTLTYPE_ULONG | CTLFLAG_RD, 188 0, 0, sysctl_hw_physmem, "LU", 189 "Amount of physical memory (in bytes)"); 190 191static int 192sysctl_hw_realmem(SYSCTL_HANDLER_ARGS) 193{ 194 u_long val, p; 195 196 p = SIZE_T_MAX >> PAGE_SHIFT; 197 if (realmem < p) 198 p = realmem; 199 val = ctob(p); 200 return (sysctl_handle_long(oidp, &val, 0, req)); 201} 202SYSCTL_PROC(_hw, HW_REALMEM, realmem, CTLTYPE_ULONG | CTLFLAG_RD, 203 0, 0, sysctl_hw_realmem, "LU", 204 "Amount of memory (in bytes) reported by the firmware"); 205 206static int 207sysctl_hw_usermem(SYSCTL_HANDLER_ARGS) 208{ 209 u_long val, p, p1; 210 211 p1 = physmem - vm_cnt.v_wire_count; 212 p = SIZE_T_MAX >> PAGE_SHIFT; 213 if (p1 < p) 214 p = p1; 215 val = ctob(p); 216 return (sysctl_handle_long(oidp, &val, 0, req)); 217} 218SYSCTL_PROC(_hw, HW_USERMEM, usermem, CTLTYPE_ULONG | CTLFLAG_RD, 219 0, 0, sysctl_hw_usermem, "LU", 220 "Amount of memory (in bytes) which is not wired"); 221 222SYSCTL_LONG(_hw, OID_AUTO, availpages, CTLFLAG_RD, &physmem, 0, 223 "Amount of physical memory (in pages)"); 224 225u_long pagesizes[MAXPAGESIZES] = { PAGE_SIZE }; 226 227static int 228sysctl_hw_pagesizes(SYSCTL_HANDLER_ARGS) 229{ 230 int error; 231#ifdef SCTL_MASK32 232 int i; 233 uint32_t pagesizes32[MAXPAGESIZES]; 234 235 if (req->flags & SCTL_MASK32) { 236 /* 237 * Recreate the "pagesizes" array with 32-bit elements. Truncate 238 * any page size greater than UINT32_MAX to zero. 239 */ 240 for (i = 0; i < MAXPAGESIZES; i++) 241 pagesizes32[i] = (uint32_t)pagesizes[i]; 242 243 error = SYSCTL_OUT(req, pagesizes32, sizeof(pagesizes32)); 244 } else 245#endif 246 error = SYSCTL_OUT(req, pagesizes, sizeof(pagesizes)); 247 return (error); 248} 249SYSCTL_PROC(_hw, OID_AUTO, pagesizes, CTLTYPE_ULONG | CTLFLAG_RD, 250 NULL, 0, sysctl_hw_pagesizes, "LU", "Supported page sizes"); 251 252#ifdef SCTL_MASK32 253int adaptive_machine_arch = 1; 254SYSCTL_INT(_debug, OID_AUTO, adaptive_machine_arch, CTLFLAG_RW, 255 &adaptive_machine_arch, 1, 256 "Adapt reported machine architecture to the ABI of the binary"); 257#endif 258 259static int 260sysctl_hw_machine_arch(SYSCTL_HANDLER_ARGS) 261{ 262 int error; 263 static const char machine_arch[] = MACHINE_ARCH; 264#ifdef SCTL_MASK32 265 static const char machine_arch32[] = MACHINE_ARCH32; 266 267 if ((req->flags & SCTL_MASK32) != 0 && adaptive_machine_arch) 268 error = SYSCTL_OUT(req, machine_arch32, sizeof(machine_arch32)); 269 else 270#endif 271 error = SYSCTL_OUT(req, machine_arch, sizeof(machine_arch)); 272 return (error); 273 274} 275SYSCTL_PROC(_hw, HW_MACHINE_ARCH, machine_arch, CTLTYPE_STRING | CTLFLAG_RD | 276 CTLFLAG_MPSAFE, NULL, 0, sysctl_hw_machine_arch, "A", 277 "System architecture"); 278 279SYSCTL_STRING(_kern, OID_AUTO, supported_archs, CTLFLAG_RD | CTLFLAG_MPSAFE, 280#ifdef COMPAT_FREEBSD32 281 MACHINE_ARCH " " MACHINE_ARCH32, 0, "Supported architectures for binaries"); 282#else 283 MACHINE_ARCH, 0, "Supported architectures for binaries"); 284#endif 285 286static int 287sysctl_hostname(SYSCTL_HANDLER_ARGS) 288{ 289 struct prison *pr, *cpr; 290 size_t pr_offset; 291 char tmpname[MAXHOSTNAMELEN]; 292 int descend, error, len; 293 294 /* 295 * This function can set: hostname domainname hostuuid. 296 * Keep that in mind when comments say "hostname". 297 */ 298 pr_offset = (size_t)arg1; 299 len = arg2; 300 KASSERT(len <= sizeof(tmpname), 301 ("length %d too long for %s", len, __func__)); 302 303 pr = req->td->td_ucred->cr_prison; 304 if (!(pr->pr_allow & PR_ALLOW_SET_HOSTNAME) && req->newptr) 305 return (EPERM); 306 /* 307 * Make a local copy of hostname to get/set so we don't have to hold 308 * the jail mutex during the sysctl copyin/copyout activities. 309 */ 310 mtx_lock(&pr->pr_mtx); 311 bcopy((char *)pr + pr_offset, tmpname, len); 312 mtx_unlock(&pr->pr_mtx); 313 314 error = sysctl_handle_string(oidp, tmpname, len, req); 315 316 if (req->newptr != NULL && error == 0) { 317 /* 318 * Copy the locally set hostname to all jails that share 319 * this host info. 320 */ 321 sx_slock(&allprison_lock); 322 while (!(pr->pr_flags & PR_HOST)) 323 pr = pr->pr_parent; 324 mtx_lock(&pr->pr_mtx); 325 bcopy(tmpname, (char *)pr + pr_offset, len); 326 FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) 327 if (cpr->pr_flags & PR_HOST) 328 descend = 0; 329 else 330 bcopy(tmpname, (char *)cpr + pr_offset, len); 331 mtx_unlock(&pr->pr_mtx); 332 sx_sunlock(&allprison_lock); 333 } 334 return (error); 335} 336 337SYSCTL_PROC(_kern, KERN_HOSTNAME, hostname, 338 CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 339 (void *)(offsetof(struct prison, pr_hostname)), MAXHOSTNAMELEN, 340 sysctl_hostname, "A", "Hostname"); 341SYSCTL_PROC(_kern, KERN_NISDOMAINNAME, domainname, 342 CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 343 (void *)(offsetof(struct prison, pr_domainname)), MAXHOSTNAMELEN, 344 sysctl_hostname, "A", "Name of the current YP/NIS domain"); 345SYSCTL_PROC(_kern, KERN_HOSTUUID, hostuuid, 346 CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE, 347 (void *)(offsetof(struct prison, pr_hostuuid)), HOSTUUIDLEN, 348 sysctl_hostname, "A", "Host UUID"); 349 350static int regression_securelevel_nonmonotonic = 0; 351 352#ifdef REGRESSION 353SYSCTL_INT(_regression, OID_AUTO, securelevel_nonmonotonic, CTLFLAG_RW, 354 ®ression_securelevel_nonmonotonic, 0, "securelevel may be lowered"); 355#endif 356 357static int 358sysctl_kern_securelvl(SYSCTL_HANDLER_ARGS) 359{ 360 struct prison *pr, *cpr; 361 int descend, error, level; 362 363 pr = req->td->td_ucred->cr_prison; 364 365 /* 366 * Reading the securelevel is easy, since the current jail's level 367 * is known to be at least as secure as any higher levels. Perform 368 * a lockless read since the securelevel is an integer. 369 */ 370 level = pr->pr_securelevel; 371 error = sysctl_handle_int(oidp, &level, 0, req); 372 if (error || !req->newptr) 373 return (error); 374 /* Permit update only if the new securelevel exceeds the old. */ 375 sx_slock(&allprison_lock); 376 mtx_lock(&pr->pr_mtx); 377 if (!regression_securelevel_nonmonotonic && 378 level < pr->pr_securelevel) { 379 mtx_unlock(&pr->pr_mtx); 380 sx_sunlock(&allprison_lock); 381 return (EPERM); 382 } 383 pr->pr_securelevel = level; 384 /* 385 * Set all child jails to be at least this level, but do not lower 386 * them (even if regression_securelevel_nonmonotonic). 387 */ 388 FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) { 389 if (cpr->pr_securelevel < level) 390 cpr->pr_securelevel = level; 391 } 392 mtx_unlock(&pr->pr_mtx); 393 sx_sunlock(&allprison_lock); 394 return (error); 395} 396 397SYSCTL_PROC(_kern, KERN_SECURELVL, securelevel, 398 CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_PRISON, 0, 0, sysctl_kern_securelvl, 399 "I", "Current secure level"); 400 401#ifdef INCLUDE_CONFIG_FILE 402/* Actual kernel configuration options. */ 403extern char kernconfstring[]; 404 405SYSCTL_STRING(_kern, OID_AUTO, conftxt, CTLFLAG_RD | CTLFLAG_MPSAFE, 406 kernconfstring, 0, "Kernel configuration file"); 407#endif 408 409static int 410sysctl_hostid(SYSCTL_HANDLER_ARGS) 411{ 412 struct prison *pr, *cpr; 413 u_long tmpid; 414 int descend, error; 415 416 /* 417 * Like sysctl_hostname, except it operates on a u_long 418 * instead of a string, and is used only for hostid. 419 */ 420 pr = req->td->td_ucred->cr_prison; 421 if (!(pr->pr_allow & PR_ALLOW_SET_HOSTNAME) && req->newptr) 422 return (EPERM); 423 tmpid = pr->pr_hostid; 424 error = sysctl_handle_long(oidp, &tmpid, 0, req); 425 426 if (req->newptr != NULL && error == 0) { 427 sx_slock(&allprison_lock); 428 while (!(pr->pr_flags & PR_HOST)) 429 pr = pr->pr_parent; 430 mtx_lock(&pr->pr_mtx); 431 pr->pr_hostid = tmpid; 432 FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend) 433 if (cpr->pr_flags & PR_HOST) 434 descend = 0; 435 else 436 cpr->pr_hostid = tmpid; 437 mtx_unlock(&pr->pr_mtx); 438 sx_sunlock(&allprison_lock); 439 } 440 return (error); 441} 442 443SYSCTL_PROC(_kern, KERN_HOSTID, hostid, 444 CTLTYPE_ULONG | CTLFLAG_RW | CTLFLAG_PRISON | CTLFLAG_MPSAFE | CTLFLAG_CAPRD, 445 NULL, 0, sysctl_hostid, "LU", "Host ID"); 446 447/* 448 * The osrelease string is copied from the global (osrelease in vers.c) into 449 * prison0 by a sysinit and is inherited by child jails if not changed at jail 450 * creation, so we always return the copy from the current prison data. 451 */ 452static int 453sysctl_osrelease(SYSCTL_HANDLER_ARGS) 454{ 455 struct prison *pr; 456 457 pr = req->td->td_ucred->cr_prison; 458 return (SYSCTL_OUT(req, pr->pr_osrelease, strlen(pr->pr_osrelease) + 1)); 459 460} 461 462SYSCTL_PROC(_kern, KERN_OSRELEASE, osrelease, 463 CTLTYPE_STRING | CTLFLAG_CAPRD | CTLFLAG_RD | CTLFLAG_MPSAFE, 464 NULL, 0, sysctl_osrelease, "A", "Operating system release"); 465 466/* 467 * The osreldate number is copied from the global (osreldate in vers.c) into 468 * prison0 by a sysinit and is inherited by child jails if not changed at jail 469 * creation, so we always return the value from the current prison data. 470 */ 471static int 472sysctl_osreldate(SYSCTL_HANDLER_ARGS) 473{ 474 struct prison *pr; 475 476 pr = req->td->td_ucred->cr_prison; 477 return (SYSCTL_OUT(req, &pr->pr_osreldate, sizeof(pr->pr_osreldate))); 478 479} 480 481/* 482 * NOTICE: The *userland* release date is available in 483 * /usr/include/osreldate.h 484 */ 485SYSCTL_PROC(_kern, KERN_OSRELDATE, osreldate, 486 CTLTYPE_INT | CTLFLAG_CAPRD | CTLFLAG_RD | CTLFLAG_MPSAFE, 487 NULL, 0, sysctl_osreldate, "I", "Kernel release date"); 488 489SYSCTL_NODE(_kern, OID_AUTO, features, CTLFLAG_RD, 0, "Kernel Features"); 490 491#ifdef COMPAT_FREEBSD4 492FEATURE(compat_freebsd4, "Compatible with FreeBSD 4"); 493#endif 494 495#ifdef COMPAT_FREEBSD5 496FEATURE(compat_freebsd5, "Compatible with FreeBSD 5"); 497#endif 498 499#ifdef COMPAT_FREEBSD6 500FEATURE(compat_freebsd6, "Compatible with FreeBSD 6"); 501#endif 502 503#ifdef COMPAT_FREEBSD7 504FEATURE(compat_freebsd7, "Compatible with FreeBSD 7"); 505#endif 506 507/* 508 * This is really cheating. These actually live in the libc, something 509 * which I'm not quite sure is a good idea anyway, but in order for 510 * getnext and friends to actually work, we define dummies here. 511 * 512 * XXXRW: These probably should be CTLFLAG_CAPRD. 513 */ 514SYSCTL_STRING(_user, USER_CS_PATH, cs_path, CTLFLAG_RD, 515 "", 0, "PATH that finds all the standard utilities"); 516SYSCTL_INT(_user, USER_BC_BASE_MAX, bc_base_max, CTLFLAG_RD, 517 SYSCTL_NULL_INT_PTR, 0, "Max ibase/obase values in bc(1)"); 518SYSCTL_INT(_user, USER_BC_DIM_MAX, bc_dim_max, CTLFLAG_RD, 519 SYSCTL_NULL_INT_PTR, 0, "Max array size in bc(1)"); 520SYSCTL_INT(_user, USER_BC_SCALE_MAX, bc_scale_max, CTLFLAG_RD, 521 SYSCTL_NULL_INT_PTR, 0, "Max scale value in bc(1)"); 522SYSCTL_INT(_user, USER_BC_STRING_MAX, bc_string_max, CTLFLAG_RD, 523 SYSCTL_NULL_INT_PTR, 0, "Max string length in bc(1)"); 524SYSCTL_INT(_user, USER_COLL_WEIGHTS_MAX, coll_weights_max, CTLFLAG_RD, 525 SYSCTL_NULL_INT_PTR, 0, "Maximum number of weights assigned to an LC_COLLATE locale entry"); 526SYSCTL_INT(_user, USER_EXPR_NEST_MAX, expr_nest_max, CTLFLAG_RD, 527 SYSCTL_NULL_INT_PTR, 0, ""); 528SYSCTL_INT(_user, USER_LINE_MAX, line_max, CTLFLAG_RD, 529 SYSCTL_NULL_INT_PTR, 0, "Max length (bytes) of a text-processing utility's input line"); 530SYSCTL_INT(_user, USER_RE_DUP_MAX, re_dup_max, CTLFLAG_RD, 531 SYSCTL_NULL_INT_PTR, 0, "Maximum number of repeats of a regexp permitted"); 532SYSCTL_INT(_user, USER_POSIX2_VERSION, posix2_version, CTLFLAG_RD, 533 SYSCTL_NULL_INT_PTR, 0, 534 "The version of POSIX 1003.2 with which the system attempts to comply"); 535SYSCTL_INT(_user, USER_POSIX2_C_BIND, posix2_c_bind, CTLFLAG_RD, 536 SYSCTL_NULL_INT_PTR, 0, "Whether C development supports the C bindings option"); 537SYSCTL_INT(_user, USER_POSIX2_C_DEV, posix2_c_dev, CTLFLAG_RD, 538 SYSCTL_NULL_INT_PTR, 0, "Whether system supports the C development utilities option"); 539SYSCTL_INT(_user, USER_POSIX2_CHAR_TERM, posix2_char_term, CTLFLAG_RD, 540 SYSCTL_NULL_INT_PTR, 0, ""); 541SYSCTL_INT(_user, USER_POSIX2_FORT_DEV, posix2_fort_dev, CTLFLAG_RD, 542 SYSCTL_NULL_INT_PTR, 0, "Whether system supports FORTRAN development utilities"); 543SYSCTL_INT(_user, USER_POSIX2_FORT_RUN, posix2_fort_run, CTLFLAG_RD, 544 SYSCTL_NULL_INT_PTR, 0, "Whether system supports FORTRAN runtime utilities"); 545SYSCTL_INT(_user, USER_POSIX2_LOCALEDEF, posix2_localedef, CTLFLAG_RD, 546 SYSCTL_NULL_INT_PTR, 0, "Whether system supports creation of locales"); 547SYSCTL_INT(_user, USER_POSIX2_SW_DEV, posix2_sw_dev, CTLFLAG_RD, 548 SYSCTL_NULL_INT_PTR, 0, "Whether system supports software development utilities"); 549SYSCTL_INT(_user, USER_POSIX2_UPE, posix2_upe, CTLFLAG_RD, 550 SYSCTL_NULL_INT_PTR, 0, "Whether system supports the user portability utilities"); 551SYSCTL_INT(_user, USER_STREAM_MAX, stream_max, CTLFLAG_RD, 552 SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of streams a process may have open at one time"); 553SYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RD, 554 SYSCTL_NULL_INT_PTR, 0, "Min Maximum number of types supported for timezone names"); 555 556#include <sys/vnode.h> 557SYSCTL_INT(_debug_sizeof, OID_AUTO, vnode, CTLFLAG_RD, 558 SYSCTL_NULL_INT_PTR, sizeof(struct vnode), "sizeof(struct vnode)"); 559 560SYSCTL_INT(_debug_sizeof, OID_AUTO, proc, CTLFLAG_RD, 561 SYSCTL_NULL_INT_PTR, sizeof(struct proc), "sizeof(struct proc)"); 562 563static int 564sysctl_kern_pid_max(SYSCTL_HANDLER_ARGS) 565{ 566 int error, pm; 567 568 pm = pid_max; 569 error = sysctl_handle_int(oidp, &pm, 0, req); 570 if (error || !req->newptr) 571 return (error); 572 sx_xlock(&proctree_lock); 573 sx_xlock(&allproc_lock); 574 575 /* 576 * Only permit the values less then PID_MAX. 577 * As a safety measure, do not allow to limit the pid_max too much. 578 */ 579 if (pm < 300 || pm > PID_MAX) 580 error = EINVAL; 581 else 582 pid_max = pm; 583 sx_xunlock(&allproc_lock); 584 sx_xunlock(&proctree_lock); 585 return (error); 586} 587SYSCTL_PROC(_kern, OID_AUTO, pid_max, CTLTYPE_INT | 588 CTLFLAG_RWTUN | CTLFLAG_NOFETCH | CTLFLAG_MPSAFE, 589 0, 0, sysctl_kern_pid_max, "I", "Maximum allowed pid"); 590 591#include <sys/bio.h> 592#include <sys/buf.h> 593SYSCTL_INT(_debug_sizeof, OID_AUTO, bio, CTLFLAG_RD, 594 SYSCTL_NULL_INT_PTR, sizeof(struct bio), "sizeof(struct bio)"); 595SYSCTL_INT(_debug_sizeof, OID_AUTO, buf, CTLFLAG_RD, 596 SYSCTL_NULL_INT_PTR, sizeof(struct buf), "sizeof(struct buf)"); 597 598#include <sys/user.h> 599SYSCTL_INT(_debug_sizeof, OID_AUTO, kinfo_proc, CTLFLAG_RD, 600 SYSCTL_NULL_INT_PTR, sizeof(struct kinfo_proc), "sizeof(struct kinfo_proc)"); 601 602/* Used by kernel debuggers. */ 603const int pcb_size = sizeof(struct pcb); 604SYSCTL_INT(_debug_sizeof, OID_AUTO, pcb, CTLFLAG_RD, 605 SYSCTL_NULL_INT_PTR, sizeof(struct pcb), "sizeof(struct pcb)"); 606 607/* XXX compatibility, remove for 6.0 */ 608#include <sys/imgact.h> 609#include <sys/imgact_elf.h> 610SYSCTL_INT(_kern, OID_AUTO, fallback_elf_brand, CTLFLAG_RW, 611 &__elfN(fallback_brand), sizeof(__elfN(fallback_brand)), 612 "compatibility for kern.fallback_elf_brand"); 613