#include <sys/sysctl.h>
sys/sysctl.h
structctlname
Each subsystem defined by sysctl defines a list of variables
for that subsystem. Each name is either a node with further
levels defined below it, or it is a leaf of some particular
type given below. Each sysctl level defines a set of name/type
pairs to be used by sysctl(1) in manipulating the subsystem.
When declaring new sysctl names, use the CTLFLAG_LOCKED flag in the
type to indicate that all necessary locking will be handled
within the sysctl.
Any sysctl defined without CTLFLAG_LOCKED is considered legacy
and will be protected by a global mutex.
Note: This is not optimal, so it is best to handle locking
yourself, if you are able to do so. A simple design
pattern for use to avoid in a single function known
to potentially be in the paging path ot doing a DMA
to physical memory in a user space process is:
lock
perform operation vs. local buffer
unlock
SYSCTL_OUT(rey, local buffer, length)
...this assumes you are not using a deep call graph
or are unable to pass a local buffer address as a
parameter into your deep call graph.
Note that very large user buffers can fail the wire
if to do so would require more physical pages than
are available (the caller will get an ENOMEM error,
see sysctl_mem_hold() for details).
| char * | ctl_name | subsystem name |
| int | ctl_type | type of name |
macroCTLFLAG_RW
#define CTLFLAG_RW (CTLFLAG_RD|CTLFLAG_WR)
macroCTLFLAG_EXPERIMENT
#define CTLFLAG_EXPERIMENT 0x00100000
Allows read/write w/ the trial experiment entitlement.
macroCTLFLAG_LEGACY_EXPERIMENT
#define CTLFLAG_LEGACY_EXPERIMENT 0x00080000
Allows writing w/ the legacy trial experiment entitlement.
macroCTLFLAG_OID_AUTO
#define CTLFLAG_OID_AUTO 0x00040000
Remembers OID_AUTO to restore oid_number on unregister
macroCTLFLAG_KERNEL_PRIVATE_MASK
mask of flags which are kernel private and will be masked for user space
#define CTLFLAG_KERNEL_PRIVATE_MASK (CTLFLAG_OID_AUTO)
macroOID_AUTO
USE THIS instead of a hardwired number from the categories below
to get dynamically assigned sysctl entries using the linker-set
technology. This is the way nearly all new sysctl variables should
be implemented.
e.g. SYSCTL_INT(_parent, OID_AUTO, name, CTLFLAG_RW, &variable, 0, "");
Note that linker set technology will automatically register all nodes
declared like this on kernel initialization, UNLESS they are defined
in I/O-Kit. In this case, you have to call sysctl_register_oid()
manually - just like in a KEXT.
#define OID_AUTO (-1)
macroSYSCTL_DEF_ENABLED
#define SYSCTL_DEF_ENABLED
macroCTL_NAMES
#define CTL_NAMES {
{ 0, 0 },
{ "kern", CTLTYPE_NODE },
{ "vm", CTLTYPE_NODE },
{ "vfs", CTLTYPE_NODE },
{ "net", CTLTYPE_NODE },
{ "debug", CTLTYPE_NODE },
{ "hw", CTLTYPE_NODE },
{ "machdep", CTLTYPE_NODE },
{ "user", CTLTYPE_NODE },
}macroKERN_DOMAINNAME
#define KERN_DOMAINNAME KERN_NISDOMAINNAME
macroKERN_PROCARGS
#define KERN_PROCARGS 38
macroKERN_NETBOOT
39 was KERN_PCSAMPLES... now obsolete
#define KERN_NETBOOT 40
int: are we netbooted? 1=yes,0=no
macroKERN_SYSV
41 was KERN_PANICINFO : panic UI information (deprecated)
#define KERN_SYSV 42
node: System V IPC information
macroKERN_PROCARGS2
#define KERN_PROCARGS2 49
macroKERN_PROCDELAYTERM
#define KERN_PROCDELAYTERM 53
int: set/reset current proc for delayed termination during shutdown
macroKERN_SHREG_PRIVATIZABLE
#define KERN_SHREG_PRIVATIZABLE 54
int: can shared regions be privatized ?
macroKERN_LOW_PRI_WINDOW
55 was KERN_PROC_LOW_PRI_IO... now deprecated
#define KERN_LOW_PRI_WINDOW 56
int: set/reset throttle window - milliseconds
macroKERN_SPECULATIVE_READS
#define KERN_SPECULATIVE_READS 64
int: whether speculative reads are disabled
macroKERN_CHECKOPENEVT
#define KERN_CHECKOPENEVT 70
spi: check the VOPENEVT flag on vnodes at open time
macroKERN_USRSTACK
#define KERN_USRSTACK KERN_USRSTACK64
macroKERN_RAGE_THREAD
#define KERN_RAGE_THREAD 2
macroKERN_UNRAGE_PROC
#define KERN_UNRAGE_PROC 3
macroKERN_UNRAGE_THREAD
#define KERN_UNRAGE_THREAD 4
macroKERN_UNOPENEVT_PROC
#define KERN_UNOPENEVT_PROC 2
macroKERN_TFP_POLICY_DENY
KERN_TFP_POLICY values . All policies allow task port for self
#define KERN_TFP_POLICY_DENY 0
Deny Mode: None allowed except privileged
macroKERN_TFP_POLICY_DEFAULT
#define KERN_TFP_POLICY_DEFAULT 2
Default Mode: related ones allowed and upcall authentication
macroKERN_KDDFLAGS
#define KERN_KDDFLAGS 2
macroKERN_KDENABLE
#define KERN_KDENABLE 3
macroKERN_KDSETBUF
#define KERN_KDSETBUF 4
macroKERN_KDGETBUF
#define KERN_KDGETBUF 5
macroKERN_KDSETUP
#define KERN_KDSETUP 6
macroKERN_KDREMOVE
#define KERN_KDREMOVE 7
macroKERN_KDSETREG
#define KERN_KDSETREG 8
macroKERN_KDGETREG
#define KERN_KDGETREG 9
macroKERN_KDREADTR
#define KERN_KDREADTR 10
macroKERN_KDPIDTR
#define KERN_KDPIDTR 11
macroKERN_KDTHRMAP
#define KERN_KDTHRMAP 12
macroKERN_KDWRITETR
#define KERN_KDWRITETR 17
macroKERN_KDWRITEMAP
#define KERN_KDWRITEMAP 18
macroKERN_KDTEST
#define KERN_KDTEST 19
macroKERN_KDSET_TYPEFILTER
#define KERN_KDSET_TYPEFILTER 22
macroKERN_KDBUFWAIT
#define KERN_KDBUFWAIT 23
macroKERN_KDCPUMAP
#define KERN_KDCPUMAP 24
macroKERN_KDCPUMAP_EXT
#define KERN_KDCPUMAP_EXT 25
macroKERN_KDSET_EDM
#define KERN_KDSET_EDM 26
macroKERN_KDGET_EDM
#define KERN_KDGET_EDM 27
macroKERN_KDWRITETR_V3
#define KERN_KDWRITETR_V3 28
macroCTL_KERN_NAMES
#define CTL_KERN_NAMES {
{ 0, 0 },
{ "ostype", CTLTYPE_STRING },
{ "osrelease", CTLTYPE_STRING },
{ "osrevision", CTLTYPE_INT },
{ "version", CTLTYPE_STRING },
{ "maxvnodes", CTLTYPE_INT },
{ "maxproc", CTLTYPE_INT },
{ "maxfiles", CTLTYPE_INT },
{ "argmax", CTLTYPE_INT },
{ "securelevel", CTLTYPE_INT },
{ "hostname", CTLTYPE_STRING },
{ "hostid", CTLTYPE_INT },
{ "clockrate", CTLTYPE_STRUCT },
{ "vnode", CTLTYPE_STRUCT },
{ "proc", CTLTYPE_STRUCT },
{ "file", CTLTYPE_STRUCT },
{ "profiling", CTLTYPE_NODE },
{ "posix1version", CTLTYPE_INT },
{ "ngroups", CTLTYPE_INT },
{ "job_control", CTLTYPE_INT },
{ "saved_ids", CTLTYPE_INT },
{ "boottime", CTLTYPE_STRUCT },
{ "nisdomainname", CTLTYPE_STRING },
{ "maxpartitions", CTLTYPE_INT },
{ "kdebug", CTLTYPE_INT },
{ "update", CTLTYPE_INT },
{ "osreldate", CTLTYPE_INT },
{ "ntp_pll", CTLTYPE_NODE },
{ "bootfile", CTLTYPE_STRING },
{ "maxfilesperproc", CTLTYPE_INT },
{ "maxprocperuid", CTLTYPE_INT },
{ "dumpdev", CTLTYPE_STRUCT }, /* we lie; don't print as int */
{ "ipc", CTLTYPE_NODE },
{ "dummy", CTLTYPE_INT },
{ "dummy", CTLTYPE_INT },
{ "usrstack", CTLTYPE_INT },
{ "logsigexit", CTLTYPE_INT },
{ "symfile",CTLTYPE_STRING },
{ "procargs",CTLTYPE_STRUCT },
{ "dummy", CTLTYPE_INT }, /* deprecated pcsamples */
{ "netboot", CTLTYPE_INT },
{ "dummy", CTLTYPE_INT }, /* deprecated: panicinfo */
{ "sysv", CTLTYPE_NODE },
{ "dummy", CTLTYPE_INT },
{ "dummy", CTLTYPE_INT },
{ "exec", CTLTYPE_NODE },
{ "aiomax", CTLTYPE_INT },
{ "aioprocmax", CTLTYPE_INT },
{ "aiothreads", CTLTYPE_INT },
{ "procargs2",CTLTYPE_STRUCT },
{ "corefile",CTLTYPE_STRING },
{ "coredump", CTLTYPE_INT },
{ "sugid_coredump", CTLTYPE_INT },
{ "delayterm", CTLTYPE_INT },
{ "shreg_private", CTLTYPE_INT },
{ "proc_low_pri_io", CTLTYPE_INT },
{ "low_pri_window", CTLTYPE_INT },
{ "low_pri_delay", CTLTYPE_INT },
{ "posix", CTLTYPE_NODE },
{ "usrstack64", CTLTYPE_QUAD },
{ "nx", CTLTYPE_INT },
{ "tfp", CTLTYPE_NODE },
{ "procname", CTLTYPE_STRING },
{ "threadsigaltstack", CTLTYPE_INT },
{ "speculative_reads_disabled", CTLTYPE_INT },
{ "osversion", CTLTYPE_STRING },
{ "safeboot", CTLTYPE_INT },
{ "dummy", CTLTYPE_INT }, /* deprecated: lctx */
{ "rage_vnode", CTLTYPE_INT },
{ "tty", CTLTYPE_NODE },
{ "check_openevt", CTLTYPE_INT },
{ "thread_name", CTLTYPE_STRING }
}macroKERN_VFSNSPACE_UNHANDLE_PROC
#define KERN_VFSNSPACE_UNHANDLE_PROC 2
struct_pcred
| char[72] | pc_lock | opaque content |
| struct ucred * | pc_ucred | Current credentials. |
| uid_t | p_ruid | Real user id. |
| uid_t | p_svuid | Saved effective user id. |
| gid_t | p_rgid | Real group id. |
| gid_t | p_svgid | Saved effective group id. |
| int | p_refcnt | Number of references. |
struct_ucred
| int32_t | cr_ref | reference count |
| uid_t | cr_uid | effective user id |
| short | cr_ngroups | number of groups |
| gid_t[16] | cr_groups | groups |
structkinfo_proc
| struct extern_proc | kp_proc | proc structure |
| struct eproc | kp_eproc |
macroWMESGLEN
#define WMESGLEN 7
macroCOMAPT_MAXLOGNAME
#define COMAPT_MAXLOGNAME 12
macroVM_MACHFACTOR
Note: "3" was skipped sometime ago and should probably remain unused
to avoid any new entry from being accepted by older kernels...
#define VM_MACHFACTOR 4
struct loadavg with mach factor
macroCTL_VM_NAMES
#define CTL_VM_NAMES {
{ 0, 0 },
{ "vmmeter", CTLTYPE_STRUCT },
{ "loadavg", CTLTYPE_STRUCT },
{ 0, 0 }, /* placeholder for "3" (see comment above) */
{ "dummy", CTLTYPE_INT },
{ "swapusage", CTLTYPE_STRUCT }
}structxsw_usage
| u_int64_t | xsu_total | |
| u_int64_t | xsu_avail | |
| u_int64_t | xsu_used | |
| u_int32_t | xsu_pagesize | |
| boolean_t | xsu_encrypted |
structloadavg
Load average structure. Use of fixpt_t assume <sys/types.h> in scope.
XXX perhaps we should protect fixpt_t, and define it here (or discard it)
| fixpt_t[3] | ldavg | |
| long | fscale |
variableaverunnable
extern struct loadavg averunnable
macroHW_MACHINE
CTL_HW identifiers
#define HW_MACHINE 1
string: machine class (deprecated: use HW_PRODUCT)
macroCTL_HW_NAMES
#define CTL_HW_NAMES {
{ 0, 0 },
{ "machine", CTLTYPE_STRING }, /* Deprecated: use hw.product */
{ "model", CTLTYPE_STRING }, /* Deprecated: use hw.target */
{ "ncpu", CTLTYPE_INT },
{ "byteorder", CTLTYPE_INT },
{ "physmem", CTLTYPE_INT },
{ "usermem", CTLTYPE_INT },
{ "pagesize", CTLTYPE_INT },
{ "disknames", CTLTYPE_STRUCT },
{ "diskstats", CTLTYPE_STRUCT },
{ "epoch", CTLTYPE_INT },
{ "floatingpoint", CTLTYPE_INT },
{ "machinearch", CTLTYPE_STRING },
{ "vectorunit", CTLTYPE_INT },
{ "busfrequency", CTLTYPE_INT },
{ "cpufrequency", CTLTYPE_INT },
{ "cachelinesize", CTLTYPE_INT },
{ "l1icachesize", CTLTYPE_INT },
{ "l1dcachesize", CTLTYPE_INT },
{ "l2settings", CTLTYPE_INT },
{ "l2cachesize", CTLTYPE_INT },
{ "l3settings", CTLTYPE_INT },
{ "l3cachesize", CTLTYPE_INT },
{ "tbfrequency", CTLTYPE_INT },
{ "memsize", CTLTYPE_QUAD },
{ "availcpu", CTLTYPE_INT },
{ "target", CTLTYPE_STRING },
{ "product", CTLTYPE_STRING },
}macroCTL_USER_NAMES
#define CTL_USER_NAMES {
{ 0, 0 },
{ "cs_path", CTLTYPE_STRING },
{ "bc_base_max", CTLTYPE_INT },
{ "bc_dim_max", CTLTYPE_INT },
{ "bc_scale_max", CTLTYPE_INT },
{ "bc_string_max", CTLTYPE_INT },
{ "coll_weights_max", CTLTYPE_INT },
{ "expr_nest_max", CTLTYPE_INT },
{ "line_max", CTLTYPE_INT },
{ "re_dup_max", CTLTYPE_INT },
{ "posix2_version", CTLTYPE_INT },
{ "posix2_c_bind", CTLTYPE_INT },
{ "posix2_c_dev", CTLTYPE_INT },
{ "posix2_char_term", CTLTYPE_INT },
{ "posix2_fort_dev", CTLTYPE_INT },
{ "posix2_fort_run", CTLTYPE_INT },
{ "posix2_localedef", CTLTYPE_INT },
{ "posix2_sw_dev", CTLTYPE_INT },
{ "posix2_upe", CTLTYPE_INT },
{ "stream_max", CTLTYPE_INT },
{ "tzname_max", CTLTYPE_INT }
}macroCTL_DEBUG_NAME
CTL_DEBUG definitions
Second level identifier specifies which debug variable.
Third level identifier specifies which stucture component.
#define CTL_DEBUG_NAME 0
string: variable name
macroCTL_DEBUG_MAXID
#define CTL_DEBUG_MAXID 20
functionsysctl
int sysctl( int *, u_int, void *__sized_by(*oldlenp), size_t *oldlenp, void *__sized_by(newlen), size_t newlen )
man page · May 17, 2013
sysctl(3) — get or set system informationfunctionsysctlbyname
int sysctlbyname( const char *, void *__sized_by(*oldlenp), size_t *oldlenp, void *__sized_by(newlen), size_t newlen )
man page · May 17, 2013
sysctlbyname(3) — get or set system informationfunctionsysctlnametomib
int sysctlnametomib(const char *, int *__counted_by(*sizep), size_t *sizep)
man page · May 17, 2013
sysctlnametomib(3) — get or set system information