diff options
author | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
---|---|---|
committer | Cameron Katri <me@cameronkatri.com> | 2021-05-09 14:20:58 -0400 |
commit | 5fd83771641d15c418f747bd343ba6738d3875f7 (patch) | |
tree | 5abf0f78f680d9837dbd93d4d4c3933bb7509599 /system_cmds/sysctl.tproj | |
download | apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.gz apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.zst apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.zip |
Import macOS userland
adv_cmds-176
basic_cmds-55
bootstrap_cmds-116.100.1
developer_cmds-66
diskdev_cmds-667.40.1
doc_cmds-53.60.1
file_cmds-321.40.3
mail_cmds-35
misc_cmds-34
network_cmds-606.40.1
patch_cmds-17
remote_cmds-63
shell_cmds-216.60.1
system_cmds-880.60.2
text_cmds-106
Diffstat (limited to 'system_cmds/sysctl.tproj')
-rw-r--r-- | system_cmds/sysctl.tproj/sysctl.8 | 390 | ||||
-rw-r--r-- | system_cmds/sysctl.tproj/sysctl.c | 1009 | ||||
-rw-r--r-- | system_cmds/sysctl.tproj/sysctl.conf.5 | 75 |
3 files changed, 1474 insertions, 0 deletions
diff --git a/system_cmds/sysctl.tproj/sysctl.8 b/system_cmds/sysctl.tproj/sysctl.8 new file mode 100644 index 0000000..d421e7a --- /dev/null +++ b/system_cmds/sysctl.tproj/sysctl.8 @@ -0,0 +1,390 @@ +.\" Copyright (c) 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" From: @(#)sysctl.8 8.1 (Berkeley) 6/6/93 +.\" $FreeBSD$ +.\" +.Dd January 17, 2011 +.Dt SYSCTL 8 +.Os +.Sh NAME +.Nm sysctl +.Nd get or set kernel state +.Sh SYNOPSIS +.Nm +.Op Fl bdehiNnoqx +.Ar name Ns Op = Ns Ar value +.Ar ... +.Nm +.Op Fl bdehNnoqx +.Fl a +.Sh DESCRIPTION +The +.Nm +utility retrieves kernel state and allows processes with appropriate +privilege to set kernel state. +The state to be retrieved or set is described using a +.Dq Management Information Base +.Pq Dq MIB +style name, described as a dotted set of +components. +.Pp +The following options are available: +.Bl -tag -width indent +.It Fl A +Equivalent to +.Fl o a +(for compatibility). +.It Fl a +List all the currently available non-opaque values. +This option is ignored if one or more variable names are specified on +the command line. +.It Fl b +Force the value of the variable(s) to be output in raw, binary format. +No names are printed and no terminating newlines are output. +This is mostly useful with a single variable. +.It Fl d +Print the description of the variable instead of its value. +.It Fl e +Separate the name and the value of the variable(s) with +.Ql = . +This is useful for producing output which can be fed back to the +.Nm +utility. +This option is ignored if either +.Fl N +or +.Fl n +is specified, or a variable is being set. +.It Fl h +Format output for human, rather than machine, readability. +.It Fl i +Ignore unknown OIDs. +The purpose is to make use of +.Nm +for collecting data from a variety of machines (not all of which +are necessarily running exactly the same software) easier. +.It Fl N +Show only variable names, not their values. +This is particularly useful with shells that offer programmable +completion. +To enable completion of variable names in +.Xr zsh 1 Pq Pa ports/shells/zsh , +use the following code: +.Bd -literal -offset indent +listsysctls () { set -A reply $(sysctl -AN ${1%.*}) } +compctl -K listsysctls sysctl +.Ed +.Pp +To enable completion of variable names in +.Xr tcsh 1 , +use: +.Pp +.Dl "complete sysctl 'n/*/`sysctl -Na`/'" +.It Fl n +Show only variable values, not their names. +This option is useful for setting shell variables. +For instance, to save the pagesize in variable +.Va psize , +use: +.Pp +.Dl "set psize=`sysctl -n hw.pagesize`" +.It Fl o +Show opaque variables (which are normally suppressed). +The format and length are printed, as well as a hex dump of the first +sixteen bytes of the value. +.It Fl q +Suppress some warnings generated by +.Nm +to standard error. +.It Fl X +Equivalent to +.Fl x a +(for compatibility). +.It Fl x +As +.Fl o , +but prints a hex dump of the entire value instead of just the first +few bytes. +.El +.Pp +The information available from +.Nm +consists of integers, strings, and opaque types. +The +.Nm +utility +only knows about a couple of opaque types, and will resort to hexdumps +for the rest. +The opaque information is much more useful if retrieved by special +purpose programs such as +.Xr ps 1 , +.Xr systat 1 , +and +.Xr netstat 1 . +.Pp +.\" Some of the variables which cannot be modified during normal system +.\" operation can be initialized via +.\" .Xr loader 8 +.\" tunables. +.\" This can for example be done by setting them in +.\" .Xr loader.conf 5 . +.\" Please refer to +.\" .Xr loader.conf 5 +.\" for more information on which tunables are available and how to set them. +.\" .Pp +The string and integer information is summarized below. +For a detailed description of these variable see +.Xr sysctl 3 . +.Pp +The changeable column indicates whether a process with appropriate +privilege can change the value. +String and integer values can be set using +.Nm . +.Bl -column xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx integerxxx +.It Sy "Name Type Changeable" +.It "hw.activecpu integer no" +.It "hw.busfrequency integer no" +.It "hw.busfrequency_max integer no" +.It "hw.busfrequency_min integer no" +.It "hw.byteorder integer no" +.It "hw.cacheconfig struct no" +.It "hw.cachelinesize integer no" +.It "hw.cachesize struct no" +.It "hw.cpu64bit_capable integer no" +.It "hw.cpufamily integer no" +.It "hw.cpufrequency integer no" +.It "hw.cpufrequency_max integer no" +.It "hw.cpufrequency_min integer no" +.It "hw.cpusubtype integer no" +.It "hw.cputhreadtype integer no" +.It "hw.cputype integer no" +.It "hw.l1dcachesize integer no" +.It "hw.l1icachesize integer no" +.It "hw.l2cachesize integer no" +.It "hw.l3cachesize integer no" +.It "hw.logicalcpu integer no" +.It "hw.logicalcpu_max integer no" +.It "hw.memsize integer no" +.It "hw.ncpu integer no" +.It "hw.packages integer no" +.It "hw.pagesize integer no" +.It "hw.physicalcpu integer no" +.It "hw.physicalcpu_max integer no" +.It "hw.tbfrequency integer no" +.It "kern.argmax integer no" +.It "kern.bootargs string no" +.It "kern.boottime struct no" +.It "kern.clockrate struct no" +.It "kern.coredump integer yes" +.It "kern.corefile string yes" +.It "kern.flush_cache_on_write integer yes" +.It "kern.hostid integer yes" +.It "kern.hostname string yes" +.It "kern.job_control integer no" +.It "kern.maxfiles integer yes" +.It "kern.maxfilesperproc integer yes" +.It "kern.maxnbuf integer yes" +.It "kern.maxproc integer yes" +.It "kern.maxprocperuid integer yes" +.It "kern.maxvnodes integer yes" +.It "kern.msgbuf integer yes" +.It "kern.nbuf integer no" +.It "kern.netboot integer no" +.It "kern.ngroups integer no" +.It "kern.nisdomainname string yes" +.It "kern.num_files integer no" +.It "kern.num_tasks integer no" +.It "kern.num_taskthreads integer no" +.It "kern.num_threads integer no" +.It "kern.num_vnodes integer no" +.It "kern.nx integer yes" +.It "kern.osrelease string no" +.It "kern.osrevision integer no" +.It "kern.ostype string no" +.It "kern.osversion string yes" +.It "kern.posix1version integer no" +.It "kern.procname string yes" +.It "kern.safeboot integer no" +.It "kern.saved_ids integer no" +.It "kern.secure_kernel integer no" +.It "kern.securelevel integer yes" +.It "kern.singleuser integer no" +.It "kern.sleeptime struct no" +.It "kern.slide integer no" +.It "kern.stack_depth_max integer no" +.It "kern.stack_size integer no" +.It "kern.sugid_coredump integer yes" +.It "kern.sugid_scripts integer yes" +.It "kern.symfile string no" +.It "kern.usrstack integer no" +.It "kern.usrstack64 integer no" +.It "kern.uuid string no" +.It "kern.version string no" +.It "kern.waketime struct no" +.It "machdep.cpu.address_bits.physical integer no" +.It "machdep.cpu.address_bits.virtual integer no" +.It "machdep.cpu.brand integer no" +.It "machdep.cpu.brand_string string no" +.It "machdep.cpu.cache.L2_associativity integer no" +.It "machdep.cpu.cache.linesize integer no" +.It "machdep.cpu.cache.size integer no" +.It "machdep.cpu.core_count integer no" +.It "machdep.cpu.cores_per_package integer no" +.It "machdep.cpu.extfamily integer no" +.It "machdep.cpu.extfeature_bits integer no" +.It "machdep.cpu.extfeatures string no" +.It "machdep.cpu.extmodel integer no" +.It "machdep.cpu.family integer no" +.It "machdep.cpu.feature_bits integer no" +.It "machdep.cpu.features string no" +.It "machdep.cpu.leaf7_feature_bits integer no" +.It "machdep.cpu.leaf7_features string no" +.It "machdep.cpu.logical_per_package integer no" +.It "machdep.cpu.max_basic integer no" +.It "machdep.cpu.max_ext integer no" +.It "machdep.cpu.microcode_version integer no" +.It "machdep.cpu.model integer no" +.It "machdep.cpu.processor_flag integer no" +.It "machdep.cpu.signature integer no" +.It "machdep.cpu.stepping integer no" +.It "machdep.cpu.thread_count integer no" +.It "machdep.cpu.tlb.data.large integer no" +.It "machdep.cpu.tlb.data.large_level1 integer no" +.It "machdep.cpu.tlb.data.small integer no" +.It "machdep.cpu.tlb.data.small_level1 integer no" +.It "machdep.cpu.tlb.inst.large integer no" +.It "machdep.cpu.tlb.inst.small integer no" +.It "machdep.cpu.tlb.shared integer no" +.It "machdep.cpu.ucupdate integer yes" +.It "machdep.cpu.vendor string no" +.It "machdep.cpu.xsave.extended_state integer no" +.It "machdep.tsc.deep_idle_rebase integer yes" +.It "machdep.tsc.frequency integer no" +.It "machdep.tsc.nanotime.generation integer no" +.It "machdep.tsc.nanotime.shift integer no" +.It "net.inet.ip.forwarding integer yes" +.It "net.inet.ip.portrange.first integer yes" +.It "net.inet.ip.portrange.hifirst integer yes" +.It "net.inet.ip.portrange.hilast integer yes" +.It "net.inet.ip.portrange.last integer yes" +.It "net.inet.ip.portrange.lowfirst integer yes" +.It "net.inet.ip.portrange.lowlast integer yes" +.It "net.inet.ip.redirect integer yes" +.It "net.inet.ip.ttl integer yes" +.It "net.inet.udp.checksum integer yes" +.It "net.inet.udp.maxdgram integer yes" +.It "vm.loadavg struct no" +.It "vm.swapusage struct no" +.It "user.bc_base_max integer no" +.It "user.bc_dim_max integer no" +.It "user.bc_scale_max integer no" +.It "user.bc_string_max integer no" +.It "user.coll_weights_max integer no" +.It "user.cs_path string no" +.It "user.expr_nest_max integer no" +.It "user.line_max integer no" +.It "user.posix2_c_bind integer no" +.It "user.posix2_c_dev integer no" +.It "user.posix2_char_term integer no" +.It "user.posix2_fort_dev integer no" +.It "user.posix2_fort_run integer no" +.It "user.posix2_localedef integer no" +.It "user.posix2_sw_dev integer no" +.It "user.posix2_upe integer no" +.It "user.posix2_version integer no" +.It "user.re_dup_max integer no" +.It "user.stream_max integer no" +.It "user.tzname_max integer no" +.El +.Sh FILES +.Bl -tag -width ".In netinet/icmp_var.h" -compact +.It In sys/sysctl.h +definitions for top level identifiers, second level kernel and hardware +identifiers, and user level identifiers +.It In sys/socket.h +definitions for second level network identifiers +.It In sys/gmon.h +definitions for third level profiling identifiers +.It In vm/vm_param.h +definitions for second level virtual memory identifiers +.It In netinet/in.h +definitions for third level Internet identifiers and +fourth level IP identifiers +.It In netinet/icmp_var.h +definitions for fourth level ICMP identifiers +.It In netinet/udp_var.h +definitions for fourth level UDP identifiers +.El +.Sh EXAMPLES +For example, to retrieve the maximum number of processes allowed +in the system, one would use the following request: +.Pp +.Dl "sysctl kern.maxproc" +.Pp +To set the maximum number of processes allowed +per uid to 1000, one would use the following request: +.Pp +.Dl "sysctl kern.maxprocperuid=1000" +.Pp +Information about the system clock rate may be obtained with: +.Pp +.Dl "sysctl kern.clockrate" +.Pp +Information about the load average history may be obtained with: +.Pp +.Dl "sysctl vm.loadavg" +.Pp +More variables than these exist, and the best and likely only place +to search for their deeper meaning is undoubtedly the source where +they are defined. +.Sh COMPATIBILITY +The +.Fl w +option has been deprecated and is silently ignored. +.Sh SEE ALSO +.Xr sysctl 3 , +.\" .Xr loader.conf 5 , +.Xr sysctl.conf 5 +.\" .Xr loader 8 +.Sh HISTORY +A +.Nm +utility first appeared in +.Bx 4.4 . +.Pp +In +.Fx 2.2 , +.Nm +was significantly remodeled. +.\" .Sh BUGS +.\" The +.\" .Nm +.\" utility presently exploits an undocumented interface to the kernel +.\" sysctl facility to traverse the sysctl tree and to retrieve format +.\" and name information. +.\" This correct interface is being thought about for the time being. diff --git a/system_cmds/sysctl.tproj/sysctl.c b/system_cmds/sysctl.tproj/sysctl.c new file mode 100644 index 0000000..ca86999 --- /dev/null +++ b/system_cmds/sysctl.tproj/sysctl.c @@ -0,0 +1,1009 @@ +/* + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#ifndef lint +__unused static const char copyright[] = +"@(#) Copyright (c) 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; +#endif +__unused static const char rcsid[] = + "$FreeBSD$"; +#endif /* not lint */ + +#include <sys/param.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <sys/stat.h> +#include <sys/sysctl.h> +#ifdef __APPLE__ +#include <mach/machine/vm_param.h> +#include <mach/machine/vm_types.h> +#include <mach/mach_types.h> +#else // !__APPLE__ +#include <sys/vmmeter.h> +#endif // !__APPLE__ + +#include <ctype.h> +#include <err.h> +#include <errno.h> +#include <inttypes.h> +#include <locale.h> +#ifdef __APPLE__ +#endif +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +static int aflag, bflag, dflag, eflag, hflag, iflag; +static int Nflag, nflag, oflag, qflag, xflag, warncount; + +static int oidfmt(int *, int, char *, u_int *); +static void parse(const char *); +#ifdef __APPLE__ +static int show_var(int *, int, int); +#else +static int show_var(int *, int); +#endif +static int sysctl_all(int *oid, int len); +static int name2oid(char *, int *); + +#ifndef __APPLE__ +static int set_IK(const char *, int *); +#endif + +#ifdef __APPLE__ +// Shims for FreeBSD source compatibility. +#define CTLTYPE_UINT 0xa +#define CTLTYPE_LONG 0xb +#define CTLTYPE_ULONG 0xc +#define CTLTYPE_S64 0xd +#define CTLTYPE_U64 0xe + +#define CTLFLAG_TUN 0 + +// Support for CTL_USER +const struct ctlname names[] = CTL_NAMES; +const struct ctlname user_names[] = CTL_USER_NAMES; +const int user_names_count = sizeof(user_names) / sizeof(*user_names); +#endif + +static void +usage(void) +{ + + (void)fprintf(stderr, "%s\n%s\n", + "usage: sysctl [-bdehiNnoqx] name[=value] ...", + " sysctl [-bdehNnoqx] -a"); + exit(1); +} + +int +main(int argc, char **argv) +{ + int ch; + + setlocale(LC_NUMERIC, ""); + setbuf(stdout,0); + setbuf(stderr,0); + + while ((ch = getopt(argc, argv, "AabdehiNnoqwxX")) != -1) { + switch (ch) { + case 'A': + /* compatibility */ + aflag = oflag = 1; + break; + case 'a': + aflag = 1; + break; + case 'b': + bflag = 1; + break; + case 'd': + dflag = 1; + break; + case 'e': + eflag = 1; + break; + case 'h': + hflag = 1; + break; + case 'i': + iflag = 1; + break; + case 'N': + Nflag = 1; + break; + case 'n': + nflag = 1; + break; + case 'o': + oflag = 1; + break; + case 'q': + qflag = 1; + break; + case 'w': + /* compatibility */ + /* ignored */ + break; + case 'X': + /* compatibility */ + aflag = xflag = 1; + break; + case 'x': + xflag = 1; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (Nflag && nflag) + usage(); + if (aflag && argc == 0) + exit(sysctl_all(0, 0)); + if (argc == 0) + usage(); + + warncount = 0; + while (argc-- > 0) + parse(*argv++); + exit(warncount); +} + +/* + * Parse a name into a MIB entry. + * Lookup and print out the MIB entry if it exists. + * Set a new value if requested. + */ +static void +parse(const char *string) +{ + int len, i, j; + void *newval = 0; + int intval; + unsigned int uintval; + long longval; + unsigned long ulongval; + size_t newsize = 0; + int64_t i64val; + uint64_t u64val; + int mib[CTL_MAXNAME]; + char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ]; + u_int kind; + + cp = buf; + if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) + errx(1, "oid too long: '%s'", string); + bufp = strsep(&cp, "="); + if (cp != NULL) { + while (isspace(*cp)) + cp++; + newval = cp; + newsize = strlen(cp); + } + len = name2oid(bufp, mib); + + if (len < 0) { + if (iflag) + return; + if (qflag) + exit(1); + else + errx(1, "unknown oid '%s'", bufp); + } + + if (oidfmt(mib, len, fmt, &kind)) + err(1, "couldn't find format of oid '%s'", bufp); + + if (newval == NULL || dflag) { + if ((kind & CTLTYPE) == CTLTYPE_NODE) { + if (dflag) { +#ifdef __APPLE__ + i = show_var(mib, len, 1); +#else + i = show_var(mib, len); +#endif + if (!i && !bflag) + putchar('\n'); + } + sysctl_all(mib, len); + } else { +#ifdef __APPLE__ + i = show_var(mib, len, 1); +#else + i = show_var(mib, len); +#endif + if (!i && !bflag) + putchar('\n'); + } + } else { + if ((kind & CTLTYPE) == CTLTYPE_NODE) + errx(1, "oid '%s' isn't a leaf node", bufp); + + if (!(kind & CTLFLAG_WR)) { + if (kind & CTLFLAG_TUN) { + warnx("oid '%s' is a read only tunable", bufp); + errx(1, "Tunable values are set in /boot/loader.conf"); + } else { + errx(1, "oid '%s' is read only", bufp); + } + } + + if ((kind & CTLTYPE) == CTLTYPE_INT || + (kind & CTLTYPE) == CTLTYPE_UINT || + (kind & CTLTYPE) == CTLTYPE_LONG || + (kind & CTLTYPE) == CTLTYPE_ULONG || + (kind & CTLTYPE) == CTLTYPE_S64 || + (kind & CTLTYPE) == CTLTYPE_U64) { + if (strlen(newval) == 0) + errx(1, "empty numeric value"); + } + + switch (kind & CTLTYPE) { + case CTLTYPE_INT: + if (strcmp(fmt, "IK") == 0) { +#ifndef __APPLE__ + if (!set_IK(newval, &intval)) +#endif + errx(1, "invalid value '%s'", + (char *)newval); + } else { + intval = (int)strtol(newval, &endptr, + 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid integer '%s'", + (char *)newval); + } + newval = &intval; + newsize = sizeof(intval); + break; + case CTLTYPE_UINT: + uintval = (int) strtoul(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid unsigned integer '%s'", + (char *)newval); + newval = &uintval; + newsize = sizeof(uintval); + break; + case CTLTYPE_LONG: + longval = strtol(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid long integer '%s'", + (char *)newval); + newval = &longval; + newsize = sizeof(longval); + break; + case CTLTYPE_ULONG: + ulongval = strtoul(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid unsigned long integer" + " '%s'", (char *)newval); + newval = &ulongval; + newsize = sizeof(ulongval); + break; + case CTLTYPE_STRING: + break; + case CTLTYPE_S64: + i64val = strtoimax(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid int64_t '%s'", + (char *)newval); + newval = &i64val; + newsize = sizeof(i64val); + break; + case CTLTYPE_U64: + u64val = strtoumax(newval, &endptr, 0); + if (endptr == newval || *endptr != '\0') + errx(1, "invalid uint64_t '%s'", + (char *)newval); + newval = &u64val; + newsize = sizeof(u64val); + break; + case CTLTYPE_OPAQUE: + /* FALLTHROUGH */ + default: + errx(1, "oid '%s' is type %d," + " cannot set that", bufp, + kind & CTLTYPE); + } + +#ifdef __APPLE__ + i = show_var(mib, len, 1); +#else + i = show_var(mib, len); +#endif + if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { + if (!i && !bflag) + putchar('\n'); + switch (errno) { +#ifdef __APPLE__ + case ENOTSUP: +#endif // __APPLE__ + case EOPNOTSUPP: + errx(1, "%s: value is not available", + string); + case ENOTDIR: + errx(1, "%s: specification is incomplete", + string); + case ENOMEM: + errx(1, "%s: type is unknown to this program", + string); + default: + warn("%s", string); + warncount++; + return; + } + } + if (!bflag) + printf(" -> "); + i = nflag; + nflag = 1; +#ifdef __APPLE__ + j = show_var(mib, len, 1); +#else + j = show_var(mib, len); +#endif + if (!j && !bflag) + putchar('\n'); + nflag = i; + } +} + +/* These functions will dump out various interesting structures. */ + +static int +S_clockinfo(int l2, void *p) +{ + struct clockinfo *ci = (struct clockinfo*)p; + + if (l2 != sizeof(*ci)) { + warnx("S_clockinfo %d != %zu", l2, sizeof(*ci)); + return (1); + } +#ifdef __APPLE__ + printf(hflag ? "{ hz = %'d, tick = %'d, tickadj = %'d, profhz = %'d, stathz = %'d }" : + "{ hz = %d, tick = %d, tickadj = %d, profhz = %d, stathz = %d }", + ci->hz, ci->tick, ci->tickadj, ci->profhz, ci->stathz); +#else + printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : + "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", + ci->hz, ci->tick, ci->profhz, ci->stathz); +#endif + return (0); +} + +static int +S_loadavg(int l2, void *p) +{ + struct loadavg *tv = (struct loadavg*)p; + + if (l2 != sizeof(*tv)) { + warnx("S_loadavg %d != %zu", l2, sizeof(*tv)); + return (1); + } + printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", + (double)tv->ldavg[0]/(double)tv->fscale, + (double)tv->ldavg[1]/(double)tv->fscale, + (double)tv->ldavg[2]/(double)tv->fscale); + return (0); +} + +static int +S_timeval(int l2, void *p) +{ + struct timeval *tv = (struct timeval*)p; + time_t tv_sec; + char *p1, *p2; + + if (l2 != sizeof(*tv)) { + warnx("S_timeval %d != %zu", l2, sizeof(*tv)); + return (1); + } + printf(hflag ? "{ sec = %'jd, usec = %'ld } " : + "{ sec = %jd, usec = %ld } ", + (intmax_t)tv->tv_sec, (long)tv->tv_usec); + tv_sec = tv->tv_sec; + p1 = strdup(ctime(&tv_sec)); + for (p2=p1; *p2 ; p2++) + if (*p2 == '\n') + *p2 = '\0'; + fputs(p1, stdout); + free(p1); + return (0); +} + +#ifndef __APPLE__ +static int +S_vmtotal(int l2, void *p) +{ + struct vmtotal *v = (struct vmtotal *)p; + int pageKilo = getpagesize() / 1024; + + if (l2 != sizeof(*v)) { + warnx("S_vmtotal %d != %zu", l2, sizeof(*v)); + return (1); + } + + printf( + "\nSystem wide totals computed every five seconds:" + " (values in kilobytes)\n"); + printf("===============================================\n"); + printf( + "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: " + "%hd Sleep: %hd)\n", + v->t_rq, v->t_dw, v->t_pw, v->t_sl); + printf( + "Virtual Memory:\t\t(Total: %dK Active: %dK)\n", + v->t_vm * pageKilo, v->t_avm * pageKilo); + printf("Real Memory:\t\t(Total: %dK Active: %dK)\n", + v->t_rm * pageKilo, v->t_arm * pageKilo); + printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n", + v->t_vmshr * pageKilo, v->t_avmshr * pageKilo); + printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n", + v->t_rmshr * pageKilo, v->t_armshr * pageKilo); + printf("Free Memory:\t%dK\n", v->t_free * pageKilo); + + return (0); +} + +static int +set_IK(const char *str, int *val) +{ + float temp; + int len, kelv; + const char *p; + char *endptr; + + if ((len = strlen(str)) == 0) + return (0); + p = &str[len - 1]; + if (*p == 'C' || *p == 'F') { + temp = strtof(str, &endptr); + if (endptr == str || endptr != p) + return (0); + if (*p == 'F') + temp = (temp - 32) * 5 / 9; + kelv = temp * 10 + 2732; + } else { + kelv = (int)strtol(str, &endptr, 10); + if (endptr == str || *endptr != '\0') + return (0); + } + *val = kelv; + return (1); +} +#endif // !__APPLE__ + +#ifdef __APPLE__ +static int +S_xswusage(int l2, void *p) +{ + struct xsw_usage *xsu = (struct xsw_usage *)p; + + if (l2 != sizeof(*xsu)) { + warnx("S_xswusage %d != %ld", l2, sizeof(*xsu)); + return (1); + } + fprintf(stdout, + "total = %.2fM used = %.2fM free = %.2fM %s", + ((double)xsu->xsu_total) / (1024.0 * 1024.0), + ((double)xsu->xsu_used) / (1024.0 * 1024.0), + ((double)xsu->xsu_avail) / (1024.0 * 1024.0), + xsu->xsu_encrypted ? "(encrypted)" : ""); + return (0); +} + +static int +T_dev_t(int l2, void *p) +{ + dev_t *d = (dev_t *)p; + + if (l2 != sizeof(*d)) { + warnx("T_dev_T %d != %ld", l2, sizeof(*d)); + return (1); + } + if ((int)(*d) != -1) { + if (minor(*d) > 255 || minor(*d) < 0) + printf("{ major = %d, minor = 0x%x }", + major(*d), minor(*d)); + else + printf("{ major = %d, minor = %d }", + major(*d), minor(*d)); + } + return (0); +} + +static int +S_quads(int len, void *p) +{ + size_t size = sizeof(int64_t); + if (len & (size-1)) { + return 1; + } + while (len > 0) { + int64_t i = *(int64_t *)p; + printf("%llu", i); + if (len > size) { + len -= size; + p = (uintptr_t)p + size; + printf(" "); + } else { + break; + } + } + return 0; +} +#endif // __APPLE__ + +/* + * These functions uses a presently undocumented interface to the kernel + * to walk the tree and get the type so it can print the value. + * This interface is under work and consideration, and should probably + * be killed with a big axe by the first person who can find the time. + * (be aware though, that the proper interface isn't as obvious as it + * may seem, there are various conflicting requirements. + */ + +static int +name2oid(char *name, int *oidp) +{ + int oid[2]; + int i; + size_t j; + +#ifdef __APPLE__ + // Support for CTL_USER + const char *user = names[CTL_USER].ctl_name; + j = strlen(user); + if (!strncmp(name, user, j)) { + oidp[0] = CTL_USER; + if (name[j] == '.') { + for (i = 1; i < user_names_count; ++i) { + if (!strcmp(&name[j+1], user_names[i].ctl_name)) { + oidp[1] = i; + return 2; + } + } + return -1; + } else if (name[j] == 0) { + return 1; + } + return -1; + } +#endif + + oid[0] = 0; + oid[1] = 3; + + j = CTL_MAXNAME * sizeof(int); + i = sysctl(oid, 2, oidp, &j, name, strlen(name)); + if (i < 0) + return (i); + j /= sizeof(int); + return (int)j; +} + +static int +oidfmt(int *oid, int len, char *fmt, u_int *kind) +{ + int qoid[CTL_MAXNAME+2]; + u_char buf[BUFSIZ]; + int i; + size_t j; + + qoid[0] = 0; + qoid[1] = 4; + memcpy(qoid + 2, oid, len * sizeof(int)); + + j = sizeof(buf); + i = sysctl(qoid, len + 2, buf, &j, 0, 0); +#ifdef __APPLE__ + if (i && errno == ENOENT) { + // Support for CTL_USER + if (oid[0] == CTL_USER) { + if (len == 1) { + *kind = CTLTYPE_NODE; + return 0; + } else if (len == 2 && oid[1] < user_names_count) { + *kind = user_names[oid[1]].ctl_type; + return 0; + } + } + return 1; + } +#endif + if (i) + err(1, "sysctl fmt %d %zu %d", i, j, errno); + + if (kind) +#ifdef __APPLE__ + memcpy(kind, buf, sizeof(*kind)); +#else + *kind = *(u_int *)buf; +#endif + + if (fmt) + strcpy(fmt, (char *)(buf + sizeof(u_int))); + +#ifdef __APPLE__ + // Map Darwin sysctl types to FreeBSD types. + // - 0 with "I" -> CTLTYPE_INT + // - 0 with "S," -> CTLTYPE_STRUCT + // - CTLTYPE_INT with "IU" -> CTLTYPE_UINT + // - CTLTYPE_INT with "L" -> CTLTYPE_LONG + // - CTLTYPE_QUAD -> CTLTYPE_S64 + // - CTLTYPE_QUAD with "*U" -> CTLTYPE_U64 + if (kind) { + switch (*kind & CTLTYPE) { + case 0: + case CTLTYPE_INT: + if (buf[sizeof(u_int)] == 'S') { + *kind = (*kind & ~CTLTYPE) | CTLTYPE_STRUCT; + } else if (buf[sizeof(u_int)] == 'I') { + *kind = (*kind & ~CTLTYPE) | CTLTYPE_INT; + if (buf[sizeof(u_int)+1] == 'U') { + *kind = (*kind & ~CTLTYPE) | CTLTYPE_UINT; + } + } else if (buf[sizeof(u_int)] == 'L') { + *kind = (*kind & ~CTLTYPE) | CTLTYPE_LONG; + if (buf[sizeof(u_int)+1] == 'U') { + *kind = (*kind & ~CTLTYPE) | CTLTYPE_ULONG; + } + } + break; + case CTLTYPE_QUAD: + *kind = (*kind & ~CTLTYPE); + if (fmt && strchr(fmt, 'U')) { + *kind |= CTLTYPE_U64; + } else { + *kind |= CTLTYPE_S64; + } + break; + } + } +#endif + + return (0); +} + +static int ctl_sign[CTLTYPE+1] = { + [CTLTYPE_INT] = 1, + [CTLTYPE_LONG] = 1, + [CTLTYPE_S64] = 1, +}; + +static int ctl_size[CTLTYPE+1] = { + [CTLTYPE_INT] = sizeof(int), + [CTLTYPE_UINT] = sizeof(u_int), + [CTLTYPE_LONG] = sizeof(long), + [CTLTYPE_ULONG] = sizeof(u_long), + [CTLTYPE_S64] = sizeof(int64_t), + [CTLTYPE_U64] = sizeof(int64_t), +}; + +/* + * This formats and outputs the value of one variable + * + * Returns zero if anything was actually output. + * Returns one if didn't know what to do with this. + * Return minus one if we had errors. + */ +static int +#ifdef __APPLE__ +show_var(int *oid, int nlen, int show_masked) +#else +show_var(int *oid, int nlen) +#endif +{ + u_char buf[BUFSIZ], *val, *oval, *p; + char name[BUFSIZ], *fmt; + const char *sep, *sep1; + int qoid[CTL_MAXNAME+2]; + uintmax_t umv; + intmax_t mv; + int i, hexlen, sign, ctltype; + size_t intlen; + size_t j, len; + u_int kind; + int (*func)(int, void *); + + /* Silence GCC. */ + umv = mv = intlen = 0; + + bzero(buf, BUFSIZ); + bzero(name, BUFSIZ); + qoid[0] = 0; + memcpy(qoid + 2, oid, nlen * sizeof(int)); + fmt = (char *)buf; + oidfmt(oid, nlen, fmt, &kind); + +#ifdef __APPLE__ + if (!show_masked && (kind & CTLFLAG_MASKED)) { + return (1); + } +#endif + +#ifdef __APPLE__ + // Support for CTL_USER + if (nlen >= 1 && oid[0] == CTL_USER) { + const char *user_name = ""; + sep = ""; + i = oid[1]; + if (nlen == 2 && i > 0 && i < user_names_count) { + user_name = user_names[i].ctl_name; + sep = "."; + } + j = snprintf(name, sizeof(name), "%s%s%s", + names[CTL_USER].ctl_name, sep, user_name); + i = 0; + } else { +#endif + qoid[1] = 1; + j = sizeof(name); + i = sysctl(qoid, nlen + 2, name, &j, 0, 0); + if (i || !j) + err(1, "sysctl name %d %zu %d", i, j, errno); +#ifdef __APPLE__ + } +#endif + + if (Nflag) { + printf("%s", name); + return (0); + } + + if (eflag) + sep = "="; + else + sep = ": "; + + if (dflag) { /* just print description */ + qoid[1] = 5; + j = sizeof(buf); + i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); + if (!nflag) + printf("%s%s", name, sep); + printf("%s", buf); + return (0); + } + /* find an estimate of how much we need for this var */ + j = 0; + i = sysctl(oid, nlen, 0, &j, 0, 0); + j += j; /* we want to be sure :-) */ + + val = oval = malloc(j + 1); + if (val == NULL) { + warnx("malloc failed"); + return (1); + } + len = j; + i = sysctl(oid, nlen, val, &len, 0, 0); + if (i || !len) { + free(oval); + return (1); + } + + if (bflag) { + fwrite(val, 1, len, stdout); + free(oval); + return (0); + } + val[len] = '\0'; + p = val; + ctltype = (kind & CTLTYPE); + sign = ctl_sign[ctltype]; + intlen = ctl_size[ctltype]; + + switch (ctltype) { + case CTLTYPE_STRING: + if (!nflag) + printf("%s%s", name, sep); + printf("%.*s", (int)len, p); + free(oval); + return (0); + + case CTLTYPE_INT: + case CTLTYPE_UINT: + case CTLTYPE_LONG: + case CTLTYPE_ULONG: + case CTLTYPE_S64: + case CTLTYPE_U64: + if (!nflag) + printf("%s%s", name, sep); + hexlen = (int)(2 + (intlen * CHAR_BIT + 3) / 4); + sep1 = ""; + while (len >= intlen) { + switch (kind & CTLTYPE) { + case CTLTYPE_INT: + case CTLTYPE_UINT: + umv = *(u_int *)(void *)p; + mv = *(int *)(void *)p; + break; + case CTLTYPE_LONG: + case CTLTYPE_ULONG: + umv = *(u_long *)(void *)p; + mv = *(long *)(void *)p; + break; + case CTLTYPE_S64: + case CTLTYPE_U64: + umv = *(uint64_t *)(void *)p; + mv = *(int64_t *)(void *)p; + break; + } + fputs(sep1, stdout); + if (xflag) + printf("%#0*jx", hexlen, umv); + else if (!sign) + printf(hflag ? "%'ju" : "%ju", umv); + else if (fmt[1] == 'K') { + if (mv < 0) + printf("%jd", mv); + else + printf("%.1fC", (mv - 2732.0) / 10); + } else + printf(hflag ? "%'jd" : "%jd", mv); + sep1 = " "; + len -= intlen; + p += intlen; + } + free(oval); + return (0); + + case CTLTYPE_OPAQUE: + i = 0; + if (strcmp(fmt, "S,clockinfo") == 0) + func = S_clockinfo; + else if (strcmp(fmt, "S,timeval") == 0) + func = S_timeval; + else if (strcmp(fmt, "S,loadavg") == 0) + func = S_loadavg; +#ifdef __APPLE__ + else if (!strcmp(fmt, "S,xsw_usage")) + func = S_xswusage; + else if (!strcmp(fmt, "T,dev_t")) + func = T_dev_t; + else if (!strcmp(fmt, "Q")) + func = S_quads; +#else // !__APPLE__ + else if (strcmp(fmt, "S,vmtotal") == 0) + func = S_vmtotal; +#endif // !__APPLE__ + else + func = NULL; + if (func) { + if (!nflag) + printf("%s%s", name, sep); + i = (*func)((int)len, p); + free(oval); + return (i); + } + /* FALLTHROUGH */ + default: + if (!oflag && !xflag) { + free(oval); + return (1); + } + if (!nflag) + printf("%s%s", name, sep); + printf("Format:%s Length:%zu Dump:0x", fmt, len); + while (len-- && (xflag || p < val + 16)) + printf("%02x", *p++); + if (!xflag && len > 16) + printf("..."); + free(oval); + return (0); + } + free(oval); + return (1); +} + +#ifdef __APPLE__ +// Support for CTL_USER +static void +sysctl_all_user(int *oid, int len) +{ + int i, j; + if (len > 1 || (len == 1 && oid[0] != CTL_USER)) { + return; + } + for (i = 0; i < user_names_count; ++i) { + int oid[2] = { CTL_USER, i }; + j = show_var(oid, 2, 0); + if (!j && !bflag) { + putchar('\n'); + } + } +} +#endif + +static int +sysctl_all(int *oid, int len) +{ +#ifdef __APPLE__ +#endif + + int name1[22], name2[22]; + int i, j; + size_t l1, l2; + +#ifdef __APPLE__ + sysctl_all_user(oid, len); +#endif + + name1[0] = 0; + name1[1] = 2; + l1 = 2; + if (len) { + memcpy(name1+2, oid, len * sizeof(int)); + l1 += len; + } else { + name1[2] = 1; + l1++; + } + for (;;) { + l2 = sizeof(name2); + j = sysctl(name1, (u_int)l1, name2, &l2, 0, 0); + if (j < 0) { + if (errno == ENOENT) + return (0); + else + err(1, "sysctl(getnext) %d %zu", j, l2); + } + + l2 /= sizeof(int); + + if (len < 0 || l2 < (unsigned int)len) + return (0); + + for (i = 0; i < len; i++) + if (name2[i] != oid[i]) + return (0); + +#ifdef __APPLE__ + i = show_var(name2, (u_int)l2, 0); +#else + i = show_var(name2, (u_int)l2); +#endif + if (!i && !bflag) + putchar('\n'); + + memcpy(name1+2, name2, l2 * sizeof(int)); + l1 = 2 + l2; + } +} diff --git a/system_cmds/sysctl.tproj/sysctl.conf.5 b/system_cmds/sysctl.tproj/sysctl.conf.5 new file mode 100644 index 0000000..709c601 --- /dev/null +++ b/system_cmds/sysctl.tproj/sysctl.conf.5 @@ -0,0 +1,75 @@ +.\" Modified August 3, 2007 +.\" Portions Copyright (c) 2007 Apple Inc. +.\" Copyright (c) 1999 Chris Costello <chris@FreeBSD.org> +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/share/man/man5/sysctl.conf.5,v 1.16 2004/07/03 18:29:23 ru Exp $ +.\" +.Dd August 3, 2007 +.Dt SYSCTL.CONF 5 +.Os +.Sh NAME +.Nm sysctl.conf +.Nd kernel state defaults +.Sh DESCRIPTION +The +.Pa /etc/sysctl.conf +file is read in when the system goes into multi-user mode to set default +settings for the kernel. +The +.Pa /etc/sysctl.conf +is in the format of the +.Xr sysctl 8 +command, i.e.\& +.Bd -literal -offset indent +sysctl_mib=value +.Ed +.Pp +Comments are denoted by a +.Dq # +at the beginning of a line. +.Sh FILES +.Bl -tag -width /etc/sysctl.conf -compact +.It Pa /etc/sysctl.conf +Initial settings for +.Xr sysctl 8 . +.El +.Sh EXAMPLES +To disable coredumps, you may use a configuration like: +.Bd -literal -offset indent +# Disable coredumps. +kern.coredump=0 +.Ed +.Sh SEE ALSO +.Xr sysctl 8 +.Sh HISTORY +The +.Nm +file appeared in +.Fx 4.0 . +.Sh BUGS +If loadable kernel modules are used to introduce additional kernel +functionality and sysctls to manage that functionality, +.Nm +may be processed too early in the boot process to set those sysctls. |