1*2402a19bSkn /* $OpenBSD: sysctl.c,v 1.262 2024/09/09 05:36:17 kn Exp $ */ 2df930be7Sderaadt /* $NetBSD: sysctl.c,v 1.9 1995/09/30 07:12:50 thorpej Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /* 5df930be7Sderaadt * Copyright (c) 1993 6df930be7Sderaadt * The Regents of the University of California. All rights reserved. 7df930be7Sderaadt * 8df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 9df930be7Sderaadt * modification, are permitted provided that the following conditions 10df930be7Sderaadt * are met: 11df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 12df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 13df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 14df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 15df930be7Sderaadt * documentation and/or other materials provided with the distribution. 161ef0d710Smillert * 3. Neither the name of the University nor the names of its contributors 17df930be7Sderaadt * may be used to endorse or promote products derived from this software 18df930be7Sderaadt * without specific prior written permission. 19df930be7Sderaadt * 20df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30df930be7Sderaadt * SUCH DAMAGE. 31df930be7Sderaadt */ 32df930be7Sderaadt 33b9fc9a72Sderaadt #include <sys/types.h> 34df930be7Sderaadt #include <sys/gmon.h> 3564582ec6Smillert #include <sys/mount.h> 36cbdb86d9Smillert #include <sys/sem.h> 37cbdb86d9Smillert #include <sys/shm.h> 38df930be7Sderaadt #include <sys/sysctl.h> 39df930be7Sderaadt #include <sys/socket.h> 40ae0936ccSguenther #include <sys/time.h> 4190a6e042Sangelos #include <sys/malloc.h> 427a2c17d9Sangelos #include <sys/uio.h> 43994bae0eSangelos #include <sys/tty.h> 447a2c17d9Sangelos #include <sys/namei.h> 45b7cf9720Smiod #include <sys/sched.h> 4668e359b9Sgrange #include <sys/sensors.h> 4777fb67b8Smpi #include <sys/vmmeter.h> 484a304dbaSmillert #include <net/route.h> 4910c1d3acSmarkus #include <net/if.h> 504a304dbaSmillert 51df930be7Sderaadt #include <netinet/in.h> 52df930be7Sderaadt #include <netinet/ip.h> 534a304dbaSmillert #include <netinet/in_pcb.h> 54df930be7Sderaadt #include <netinet/ip_icmp.h> 555e1bc867Sangelos #include <netinet/ip_ipip.h> 56c23fec31Sangelos #include <netinet/ip_ether.h> 57253ba047Sniklas #include <netinet/ip_ah.h> 58253ba047Sniklas #include <netinet/ip_esp.h> 59df930be7Sderaadt #include <netinet/icmp_var.h> 607f1136baSderaadt #include <netinet/igmp_var.h> 61df930be7Sderaadt #include <netinet/ip_var.h> 62df930be7Sderaadt #include <netinet/udp.h> 63df930be7Sderaadt #include <netinet/udp_var.h> 64df930be7Sderaadt #include <netinet/tcp.h> 65df930be7Sderaadt #include <netinet/tcp_timer.h> 66df930be7Sderaadt #include <netinet/tcp_var.h> 6733e468d6Sangelos #include <netinet/ip_gre.h> 68d39fbd3cSjjbg #include <netinet/ip_ipcomp.h> 69c05683a6Smcbride #include <netinet/ip_carp.h> 70d85f7bc1Smichele #include <netinet/ip_divert.h> 71f712e2a0Smickey 727f1136baSderaadt #include <net/pfvar.h> 737f1136baSderaadt #include <net/if_pfsync.h> 7490b03482Syasuoka #include <net/pipex.h> 757f1136baSderaadt 767d6e6547Sitojun #include <netinet/ip6.h> 777d6e6547Sitojun #include <netinet/icmp6.h> 78af7905a8Smichele #include <netinet6/ip6_divert.h> 79090f9bdcSitojun 80f786a0baSnorby #include <netmpls/mpls.h> 81f786a0baSnorby 82eb111d98Sprovos #include <uvm/uvm_swap_encrypt.h> 83eb111d98Sprovos 844594122bSmickey #include <ufs/ufs/quota.h> 854594122bSmickey #include <ufs/ufs/inode.h> 864594122bSmickey #include <ufs/ffs/ffs_extern.h> 874594122bSmickey 88e3b64b9bStedu #include <miscfs/fuse/fusefs.h> 89e3b64b9bStedu 904594122bSmickey #include <nfs/nfsproto.h> 914594122bSmickey #include <nfs/nfs.h> 924594122bSmickey 937025ac5dSmickey #include <ddb/db_var.h> 94df930be7Sderaadt 95c753220dSmestre #include <ctype.h> 96c5956181Smillert #include <err.h> 97df930be7Sderaadt #include <errno.h> 98c753220dSmestre #include <limits.h> 99c753220dSmestre #include <paths.h> 100df930be7Sderaadt #include <stdio.h> 101df930be7Sderaadt #include <stdlib.h> 102df930be7Sderaadt #include <string.h> 1038929f197Smillert #include <unistd.h> 104df930be7Sderaadt 105510a6efbStedu #include <machine/cpu.h> 106510a6efbStedu 10708f602a1Smickey #ifdef CPU_BIOS 1082f315e2dSmickey #include <machine/biosvar.h> 1092f315e2dSmickey #endif 1102f315e2dSmickey 111df930be7Sderaadt struct ctlname topname[] = CTL_NAMES; 112df930be7Sderaadt struct ctlname kernname[] = CTL_KERN_NAMES; 113df930be7Sderaadt struct ctlname vmname[] = CTL_VM_NAMES; 11486d967dbStholo struct ctlname fsname[] = CTL_FS_NAMES; 115df930be7Sderaadt struct ctlname netname[] = CTL_NET_NAMES; 116df930be7Sderaadt struct ctlname hwname[] = CTL_HW_NAMES; 117df930be7Sderaadt struct ctlname debugname[CTL_DEBUG_MAXID]; 11890a6e042Sangelos struct ctlname kernmallocname[] = CTL_KERN_MALLOC_NAMES; 1197a2c17d9Sangelos struct ctlname forkstatname[] = CTL_KERN_FORKSTAT_NAMES; 1207a2c17d9Sangelos struct ctlname nchstatsname[] = CTL_KERN_NCHSTATS_NAMES; 1210a0a96e6Sderaadt struct ctlname ttysname[] = CTL_KERN_TTY_NAMES; 122cbdb86d9Smillert struct ctlname semname[] = CTL_KERN_SEMINFO_NAMES; 123cbdb86d9Smillert struct ctlname shmname[] = CTL_KERN_SHMINFO_NAMES; 124f206784aSmarkus struct ctlname watchdogname[] = CTL_KERN_WATCHDOG_NAMES; 1253751347eStholo struct ctlname tcname[] = CTL_KERN_TIMECOUNTER_NAMES; 12664582ec6Smillert struct ctlname *vfsname; 127df930be7Sderaadt #ifdef CTL_MACHDEP_NAMES 128df930be7Sderaadt struct ctlname machdepname[] = CTL_MACHDEP_NAMES; 129df930be7Sderaadt #endif 1307025ac5dSmickey struct ctlname ddbname[] = CTL_DDB_NAMES; 131bb548dc4Sratchov struct ctlname audioname[] = CTL_KERN_AUDIO_NAMES; 1321b800d6dSmglocker struct ctlname videoname[] = CTL_KERN_VIDEO_NAMES; 1330f480091Svisa struct ctlname witnessname[] = CTL_KERN_WITNESS_NAMES; 13422acc011Skettenis struct ctlname batteryname[] = CTL_HW_BATTERY_NAMES; 135df930be7Sderaadt char names[BUFSIZ]; 13664582ec6Smillert int lastused; 137df930be7Sderaadt 13894043e77Smglocker /* Maximum size object to expect from sysctl(2) */ 139c8a0bd93Sdjm #define SYSCTL_BUFSIZ 8192 140c8a0bd93Sdjm 141df930be7Sderaadt struct list { 142df930be7Sderaadt struct ctlname *list; 143df930be7Sderaadt int size; 144df930be7Sderaadt }; 145df930be7Sderaadt struct list toplist = { topname, CTL_MAXID }; 146df930be7Sderaadt struct list secondlevel[] = { 147df930be7Sderaadt { 0, 0 }, /* CTL_UNSPEC */ 148df930be7Sderaadt { kernname, KERN_MAXID }, /* CTL_KERN */ 149df930be7Sderaadt { vmname, VM_MAXID }, /* CTL_VM */ 15086d967dbStholo { fsname, FS_MAXID }, /* CTL_FS */ 151df930be7Sderaadt { netname, NET_MAXID }, /* CTL_NET */ 152df930be7Sderaadt { 0, CTL_DEBUG_MAXID }, /* CTL_DEBUG */ 153df930be7Sderaadt { hwname, HW_MAXID }, /* CTL_HW */ 154df930be7Sderaadt #ifdef CTL_MACHDEP_NAMES 155df930be7Sderaadt { machdepname, CPU_MAXID }, /* CTL_MACHDEP */ 156df930be7Sderaadt #else 157df930be7Sderaadt { 0, 0 }, /* CTL_MACHDEP */ 158df930be7Sderaadt #endif 15976f6ae9aSguenther { 0, 0 }, /* was CTL_USER */ 1607025ac5dSmickey { ddbname, DBCTL_MAXID }, /* CTL_DDB_NAMES */ 16164582ec6Smillert { 0, 0 }, /* CTL_VFS */ 162df930be7Sderaadt }; 163df930be7Sderaadt 16485316beeSderaadt int Aflag, aflag, nflag, qflag; 165df930be7Sderaadt 166c753220dSmestre time_t boottime; 167c753220dSmestre 168df930be7Sderaadt /* 169df930be7Sderaadt * Variables requiring special processing. 170df930be7Sderaadt */ 171df930be7Sderaadt #define CLOCK 0x00000001 172df930be7Sderaadt #define BOOTTIME 0x00000002 17334dbcd1cSmickey #define CHRDEV 0x00000004 17434dbcd1cSmickey #define BLKDEV 0x00000008 17534dbcd1cSmickey #define BADDYNAMIC 0x00000020 17634dbcd1cSmickey #define BIOSGEO 0x00000040 17734dbcd1cSmickey #define BIOSDEV 0x00000080 17834dbcd1cSmickey #define MAJ2DEV 0x00000100 179dcaace67Sderaadt #define UNSIGNED 0x00000200 180ccc806e8Sangelos #define KMEMBUCKETS 0x00000400 181a882a322Smickey #define LONGARRAY 0x00000800 1827a2c17d9Sangelos #define KMEMSTATS 0x00001000 18368e359b9Sgrange #define SENSORS 0x00002000 184a64d153cSderaadt #define SMALLBUF 0x00004000 185feec8fe6Sderaadt #define HEX 0x00008000 18631e91f6bScheloha #define TIMEOUT 0x00010000 187df930be7Sderaadt 188f712e2a0Smickey /* prototypes */ 189c72b5b24Smillert void debuginit(void); 190c72b5b24Smillert void listall(char *, struct list *); 191a85810aaSflorian int parse_hex_char(char); 192a85810aaSflorian ssize_t parse_hex_string(unsigned char *, size_t, const char *); 193c72b5b24Smillert void parse(char *, int); 194c72b5b24Smillert void parse_baddynamic(int *, size_t, char *, void **, size_t *, int, int); 195c72b5b24Smillert void usage(void); 196c72b5b24Smillert int findname(char *, char *, char **, struct list *); 197c72b5b24Smillert int sysctl_inet(char *, char **, int *, int, int *); 198c72b5b24Smillert int sysctl_inet6(char *, char **, int *, int, int *); 199f092c5e8Sclaudio int sysctl_unix(char *, char **, int *, int, int *); 2005243d0adSdlg int sysctl_link(char *, char **, int *, int, int *); 20116cc1d58Stedu int sysctl_bpf(char *, char **, int *, int, int *); 202f786a0baSnorby int sysctl_mpls(char *, char **, int *, int, int *); 2032b4e548bSdhill int sysctl_pipex(char *, char **, int *, int, int *); 204c72b5b24Smillert int sysctl_fs(char *, char **, int *, int, int *); 205aff9f912Svisa static int sysctl_vfs(char *, char **, int[], int, int *); 206aff9f912Svisa static int sysctl_vfsgen(char *, char **, int[], int, int *); 207c72b5b24Smillert int sysctl_bios(char *, char **, int *, int, int *); 208c72b5b24Smillert int sysctl_swpenc(char *, char **, int *, int, int *); 209c72b5b24Smillert int sysctl_forkstat(char *, char **, int *, int, int *); 210c72b5b24Smillert int sysctl_tty(char *, char **, int *, int, int *); 211c72b5b24Smillert int sysctl_nchstats(char *, char **, int *, int, int *); 212c72b5b24Smillert int sysctl_malloc(char *, char **, int *, int, int *); 213cbdb86d9Smillert int sysctl_seminfo(char *, char **, int *, int, int *); 214cbdb86d9Smillert int sysctl_shminfo(char *, char **, int *, int, int *); 215f206784aSmarkus int sysctl_watchdog(char *, char **, int *, int, int *); 2163751347eStholo int sysctl_tc(char *, char **, int *, int, int *); 21768e359b9Sgrange int sysctl_sensors(char *, char **, int *, int, int *); 21896fb8c11Sderaadt void print_sensordev(char *, int *, u_int, struct sensordev *); 219a4b82fa4Sdlg void print_sensor(struct sensor *); 220c783c1d9Smatthieu #ifdef CPU_CHIPSET 221c783c1d9Smatthieu int sysctl_chipset(char *, char **, int *, int, int *); 222c783c1d9Smatthieu #endif 223bb548dc4Sratchov int sysctl_audio(char *, char **, int *, int, int *); 2241b800d6dSmglocker int sysctl_video(char *, char **, int *, int, int *); 2250f480091Svisa int sysctl_witness(char *, char **, int *, int, int *); 22622acc011Skettenis int sysctl_battery(char *, char **, int *, int, int *); 227c72b5b24Smillert void vfsinit(void); 228f712e2a0Smickey 22985316beeSderaadt char *equ = "="; 23085316beeSderaadt 231df930be7Sderaadt int 232bc52e260Sderaadt main(int argc, char *argv[]) 233df930be7Sderaadt { 234df930be7Sderaadt int ch, lvl1; 235df930be7Sderaadt 23625840008Sderaadt while ((ch = getopt(argc, argv, "Aanqw")) != -1) { 237df930be7Sderaadt switch (ch) { 238df930be7Sderaadt 239df930be7Sderaadt case 'A': 240df930be7Sderaadt Aflag = 1; 241df930be7Sderaadt break; 242df930be7Sderaadt 243df930be7Sderaadt case 'a': 244df930be7Sderaadt aflag = 1; 245df930be7Sderaadt break; 246df930be7Sderaadt 247df930be7Sderaadt case 'n': 248df930be7Sderaadt nflag = 1; 249df930be7Sderaadt break; 250df930be7Sderaadt 251802b26d6Sjfb case 'q': 252802b26d6Sjfb qflag = 1; 253802b26d6Sjfb break; 254802b26d6Sjfb 255df930be7Sderaadt case 'w': 25685316beeSderaadt /* flag no longer needed; var=value implies write */ 257df930be7Sderaadt break; 258df930be7Sderaadt 259df930be7Sderaadt default: 260df930be7Sderaadt usage(); 261df930be7Sderaadt } 262df930be7Sderaadt } 263df930be7Sderaadt argc -= optind; 264df930be7Sderaadt argv += optind; 265df930be7Sderaadt 266c753220dSmestre ctime(&boottime); /* satisfy potential $TZ expansion before unveil() */ 267c753220dSmestre 26868b06bbaSkrw if (unveil(_PATH_DEVDB, "r") == -1 && errno != ENOENT) 269bc5a8259Sbeck err(1,"unveil %s", _PATH_DEVDB); 27068b06bbaSkrw if (unveil("/dev", "r") == -1 && errno != ENOENT) 271bc5a8259Sbeck err(1, "unveil /dev"); 272c753220dSmestre if (unveil(NULL, NULL) == -1) 273c753220dSmestre err(1, "unveil"); 274c753220dSmestre 275fdae1d23Sderaadt if (argc == 0 || (Aflag || aflag)) { 276df930be7Sderaadt debuginit(); 27764582ec6Smillert vfsinit(); 278df930be7Sderaadt for (lvl1 = 1; lvl1 < CTL_MAXID; lvl1++) 279df930be7Sderaadt listall(topname[lvl1].ctl_name, &secondlevel[lvl1]); 280cb579bd8Smickey return (0); 281df930be7Sderaadt } 28264582ec6Smillert for (; *argv != NULL; ++argv) 28364582ec6Smillert parse(*argv, 1); 284cb579bd8Smickey return (0); 285df930be7Sderaadt } 286df930be7Sderaadt 287df930be7Sderaadt /* 288df930be7Sderaadt * List all variables known to the system. 289df930be7Sderaadt */ 290f712e2a0Smickey void 291bc52e260Sderaadt listall(char *prefix, struct list *lp) 292df930be7Sderaadt { 293df930be7Sderaadt char *cp, name[BUFSIZ]; 294b65beef0Smickey int lvl2, len; 295df930be7Sderaadt 296cf9dcd4eSkstailey if (lp->list == NULL) 297df930be7Sderaadt return; 298b65beef0Smickey if ((len = strlcpy(name, prefix, sizeof(name))) >= sizeof(name)) 299add6b9a1Sbeck errx(1, "%s: name too long", prefix); 300b65beef0Smickey cp = name + len++; 301df930be7Sderaadt *cp++ = '.'; 302df930be7Sderaadt for (lvl2 = 0; lvl2 < lp->size; lvl2++) { 303cf9dcd4eSkstailey if (lp->list[lvl2].ctl_name == NULL) 304df930be7Sderaadt continue; 305b65beef0Smickey if (strlcpy(cp, lp->list[lvl2].ctl_name, 306b65beef0Smickey sizeof(name) - len) >= sizeof(name) - len) 307b65beef0Smickey warn("%s: name too long", lp->list[lvl2].ctl_name); 308df930be7Sderaadt parse(name, Aflag); 309df930be7Sderaadt } 310df930be7Sderaadt } 311df930be7Sderaadt 312a85810aaSflorian int 313a85810aaSflorian parse_hex_char(char ch) 314a85810aaSflorian { 315a85810aaSflorian if (ch >= '0' && ch <= '9') 316a85810aaSflorian return (ch - '0'); 317a85810aaSflorian 318a85810aaSflorian ch = tolower((unsigned char)ch); 319a85810aaSflorian if (ch >= 'a' && ch <= 'f') 320a85810aaSflorian return (ch - 'a' + 10); 321a85810aaSflorian 322a85810aaSflorian return (-1); 323a85810aaSflorian } 324a85810aaSflorian 325a85810aaSflorian ssize_t 326a85810aaSflorian parse_hex_string(unsigned char *dst, size_t dstlen, const char *src) 327a85810aaSflorian { 328a85810aaSflorian ssize_t len = 0; 329a85810aaSflorian int digit; 330a85810aaSflorian 331a85810aaSflorian while (len < dstlen) { 332a85810aaSflorian if (*src == '\0') 333a85810aaSflorian return (len); 334a85810aaSflorian 335a85810aaSflorian digit = parse_hex_char(*src++); 336a85810aaSflorian if (digit == -1) 337a85810aaSflorian return (-1); 338a85810aaSflorian dst[len] = digit << 4; 339a85810aaSflorian 340a85810aaSflorian digit = parse_hex_char(*src++); 341a85810aaSflorian if (digit == -1) 342a85810aaSflorian return (-1); 343a85810aaSflorian 344a85810aaSflorian dst[len] |= digit; 345a85810aaSflorian len++; 346a85810aaSflorian } 347a85810aaSflorian 348a85810aaSflorian while (*src != '\0') { 349a85810aaSflorian if (parse_hex_char(*src++) == -1 || 350a85810aaSflorian parse_hex_char(*src++) == -1) 351a85810aaSflorian return (-1); 352a85810aaSflorian 353a85810aaSflorian len++; 354a85810aaSflorian } 355a85810aaSflorian 356a85810aaSflorian return (len); 357a85810aaSflorian } 358a85810aaSflorian 359df930be7Sderaadt /* 360df930be7Sderaadt * Parse a name into a MIB entry. 361df930be7Sderaadt * Lookup and print out the MIB entry if it exists. 362df930be7Sderaadt * Set a new value if requested. 363df930be7Sderaadt */ 364f712e2a0Smickey void 365bc52e260Sderaadt parse(char *string, int flags) 366df930be7Sderaadt { 3674594122bSmickey int indx, type, state, intval, len; 3684594122bSmickey size_t size, newsize = 0; 369a882a322Smickey int lal = 0, special = 0; 3708e69f93cScnst void *newval = NULL; 3716ba981e1Sart int64_t quadval; 372df930be7Sderaadt struct list *lp; 373df930be7Sderaadt int mib[CTL_MAXNAME]; 374c8a0bd93Sdjm char *cp, *bufp, buf[SYSCTL_BUFSIZ]; 375a85810aaSflorian unsigned char hex[SYSCTL_BUFSIZ]; 376df930be7Sderaadt 3777eb33680Sderaadt (void)strlcpy(buf, string, sizeof(buf)); 378df930be7Sderaadt bufp = buf; 379df930be7Sderaadt if ((cp = strchr(string, '=')) != NULL) { 380df930be7Sderaadt *strchr(buf, '=') = '\0'; 381df930be7Sderaadt *cp++ = '\0'; 382025f5691Sderaadt while (isspace((unsigned char)*cp)) 383df930be7Sderaadt cp++; 384df930be7Sderaadt newval = cp; 385df930be7Sderaadt newsize = strlen(cp); 386df930be7Sderaadt } 387df930be7Sderaadt if ((indx = findname(string, "top", &bufp, &toplist)) == -1) 388df930be7Sderaadt return; 389df930be7Sderaadt mib[0] = indx; 39064582ec6Smillert if (indx == CTL_VFS) 39164582ec6Smillert vfsinit(); 392df930be7Sderaadt if (indx == CTL_DEBUG) 393df930be7Sderaadt debuginit(); 394df930be7Sderaadt lp = &secondlevel[indx]; 395df930be7Sderaadt if (lp->list == 0) { 396c5956181Smillert warnx("%s: class is not implemented", topname[indx].ctl_name); 397df930be7Sderaadt return; 398df930be7Sderaadt } 399df930be7Sderaadt if (bufp == NULL) { 400df930be7Sderaadt listall(topname[indx].ctl_name, lp); 401df930be7Sderaadt return; 402df930be7Sderaadt } 403df930be7Sderaadt if ((indx = findname(string, "second", &bufp, lp)) == -1) 404df930be7Sderaadt return; 405df930be7Sderaadt mib[1] = indx; 406df930be7Sderaadt type = lp->list[indx].ctl_type; 407df930be7Sderaadt len = 2; 408df930be7Sderaadt switch (mib[0]) { 409df930be7Sderaadt 410df930be7Sderaadt case CTL_KERN: 411df930be7Sderaadt switch (mib[1]) { 412df930be7Sderaadt case KERN_PROF: 413df930be7Sderaadt mib[2] = GPROF_STATE; 41478fe9647Smpi mib[3] = 0; /* Assume CPU ID 0 is always valid. */ 415c5956181Smillert size = sizeof(state); 41678fe9647Smpi if (sysctl(mib, 4, &state, &size, NULL, 0) == -1) { 417df930be7Sderaadt if (flags == 0) 418df930be7Sderaadt return; 419df930be7Sderaadt if (!nflag) 420c5956181Smillert (void)printf("%s: ", string); 421c5956181Smillert (void)puts("kernel is not compiled for profiling"); 422df930be7Sderaadt return; 423df930be7Sderaadt } 424df930be7Sderaadt if (!nflag) 425c5956181Smillert (void)printf("%s = %s\n", string, 426df930be7Sderaadt state == GMON_PROF_OFF ? "off" : "running"); 427df930be7Sderaadt return; 4287a2c17d9Sangelos case KERN_FORKSTAT: 4297a2c17d9Sangelos sysctl_forkstat(string, &bufp, mib, flags, &type); 4307a2c17d9Sangelos return; 431994bae0eSangelos case KERN_TTY: 432994bae0eSangelos len = sysctl_tty(string, &bufp, mib, flags, &type); 433994bae0eSangelos if (len < 0) 434994bae0eSangelos return; 435994bae0eSangelos break; 4367a2c17d9Sangelos case KERN_NCHSTATS: 4377a2c17d9Sangelos sysctl_nchstats(string, &bufp, mib, flags, &type); 4387a2c17d9Sangelos return; 43990a6e042Sangelos case KERN_MALLOCSTATS: 44090a6e042Sangelos len = sysctl_malloc(string, &bufp, mib, flags, &type); 44190a6e042Sangelos if (len < 0) 44290a6e042Sangelos return; 443ccc806e8Sangelos if (mib[2] == KERN_MALLOC_BUCKET) 444ccc806e8Sangelos special |= KMEMBUCKETS; 4457a2c17d9Sangelos if (mib[2] == KERN_MALLOC_KMEMSTATS) 4467a2c17d9Sangelos special |= KMEMSTATS; 44790a6e042Sangelos newsize = 0; 44890a6e042Sangelos break; 449202930beSangelos case KERN_MBSTAT: 450202930beSangelos if (flags == 0) 451202930beSangelos return; 452202930beSangelos warnx("use netstat to view %s", string); 453202930beSangelos return; 454a0079f19Smickey case KERN_MSGBUF: 455f565b0c3Smickey if (flags == 0) 456f565b0c3Smickey return; 457a0079f19Smickey warnx("use dmesg to view %s", string); 458a0079f19Smickey return; 459df930be7Sderaadt case KERN_PROC: 460df930be7Sderaadt if (flags == 0) 461df930be7Sderaadt return; 462c5956181Smillert warnx("use ps to view %s information", string); 463df930be7Sderaadt return; 464df930be7Sderaadt case KERN_CLOCKRATE: 465df930be7Sderaadt special |= CLOCK; 466df930be7Sderaadt break; 467df930be7Sderaadt case KERN_BOOTTIME: 468df930be7Sderaadt special |= BOOTTIME; 469df930be7Sderaadt break; 4702961b500Spjanzen case KERN_HOSTID: 471dcaace67Sderaadt special |= UNSIGNED; 472a64d153cSderaadt special |= SMALLBUF; 473dcaace67Sderaadt break; 474a882a322Smickey case KERN_CPTIME: 475a882a322Smickey special |= LONGARRAY; 476a882a322Smickey lal = CPUSTATES; 477a882a322Smickey break; 478cbdb86d9Smillert case KERN_SEMINFO: 479cbdb86d9Smillert len = sysctl_seminfo(string, &bufp, mib, flags, &type); 480cbdb86d9Smillert if (len < 0) 481cbdb86d9Smillert return; 482cbdb86d9Smillert break; 483cbdb86d9Smillert case KERN_SHMINFO: 484cbdb86d9Smillert len = sysctl_shminfo(string, &bufp, mib, flags, &type); 485cbdb86d9Smillert if (len < 0) 486cbdb86d9Smillert return; 487cbdb86d9Smillert break; 488c5b27dabSguenther case KERN_INTRCNT: 489c5b27dabSguenther if (flags == 0) 490c5b27dabSguenther return; 491c5b27dabSguenther warnx("use vmstat or systat to view %s information", 492c5b27dabSguenther string); 493c5b27dabSguenther return; 494f206784aSmarkus case KERN_WATCHDOG: 495f206784aSmarkus len = sysctl_watchdog(string, &bufp, mib, flags, 496f206784aSmarkus &type); 497f206784aSmarkus if (len < 0) 498f206784aSmarkus return; 499f206784aSmarkus break; 5003751347eStholo case KERN_TIMECOUNTER: 5013751347eStholo len = sysctl_tc(string, &bufp, mib, flags, 5023751347eStholo &type); 5033751347eStholo if (len < 0) 5043751347eStholo return; 5053751347eStholo break; 506cef0bbe1Sguenther case KERN_FILE: 507d4842af3Smillert if (flags == 0) 508d4842af3Smillert return; 509d4842af3Smillert warnx("use fstat to view %s information", string); 510d4842af3Smillert return; 5110187bdeeSkettenis case KERN_CONSDEV: 5120187bdeeSkettenis special |= CHRDEV; 5130187bdeeSkettenis break; 5145b19a9acSdlg case KERN_NETLIVELOCKS: 515ebe44704Stb case KERN_SOMAXCONN: 516ebe44704Stb case KERN_SOMINCONN: 5175b19a9acSdlg special |= UNSIGNED; 5185b19a9acSdlg break; 519bb548dc4Sratchov case KERN_AUDIO: 520bb548dc4Sratchov len = sysctl_audio(string, &bufp, mib, flags, &type); 521bb548dc4Sratchov if (len < 0) 522bb548dc4Sratchov return; 523bb548dc4Sratchov break; 5241b800d6dSmglocker case KERN_VIDEO: 5251b800d6dSmglocker len = sysctl_video(string, &bufp, mib, flags, &type); 5261b800d6dSmglocker if (len < 0) 5271b800d6dSmglocker return; 5281b800d6dSmglocker break; 5290f480091Svisa case KERN_WITNESS: 5300f480091Svisa len = sysctl_witness(string, &bufp, mib, flags, &type); 5310f480091Svisa if (len < 0) 5320f480091Svisa return; 5330f480091Svisa break; 5344696cb9bSclaudio case KERN_PFSTATUS: 5354696cb9bSclaudio if (flags == 0) 5364696cb9bSclaudio return; 5374696cb9bSclaudio warnx("use pfctl to view %s information", string); 5384696cb9bSclaudio return; 53931e91f6bScheloha case KERN_TIMEOUT_STATS: 54031e91f6bScheloha special |= TIMEOUT; 54131e91f6bScheloha break; 542df930be7Sderaadt } 543df930be7Sderaadt break; 544df930be7Sderaadt 545df930be7Sderaadt case CTL_HW: 546994bae0eSangelos switch (mib[1]) { 547994bae0eSangelos case HW_DISKSTATS: 548994bae0eSangelos /* 549994bae0eSangelos * Only complain if someone asks explicitly for this, 550994bae0eSangelos * otherwise "fail" silently. 551994bae0eSangelos */ 552994bae0eSangelos if (flags) 553994bae0eSangelos warnx("use vmstat to view %s information", 554994bae0eSangelos string); 555994bae0eSangelos return; 55668e359b9Sgrange case HW_SENSORS: 55768e359b9Sgrange special |= SENSORS; 55868e359b9Sgrange len = sysctl_sensors(string, &bufp, mib, flags, &type); 55968e359b9Sgrange if (len < 0) 56068e359b9Sgrange return; 56168e359b9Sgrange break; 56222acc011Skettenis case HW_BATTERY: 56322acc011Skettenis len = sysctl_battery(string, &bufp, mib, flags, &type); 56422acc011Skettenis if (len < 0) 56522acc011Skettenis return; 56622acc011Skettenis break; 5670bf9cfc2Sderaadt case HW_PHYSMEM: 5680bf9cfc2Sderaadt case HW_USERMEM: 5690a09d9d7Skettenis /* 5700a09d9d7Skettenis * Don't print these; we'll print the 64-bit 5710a09d9d7Skettenis * variants instead. 5720a09d9d7Skettenis */ 5730a09d9d7Skettenis return; 574994bae0eSangelos } 575df930be7Sderaadt break; 576df930be7Sderaadt 577df930be7Sderaadt case CTL_VM: 578df930be7Sderaadt if (mib[1] == VM_LOADAVG) { 579df930be7Sderaadt double loads[3]; 580df930be7Sderaadt 581df930be7Sderaadt getloadavg(loads, 3); 582df930be7Sderaadt if (!nflag) 58385316beeSderaadt (void)printf("%s%s", string, equ); 584c5956181Smillert (void)printf("%.2f %.2f %.2f\n", loads[0], 585c5956181Smillert loads[1], loads[2]); 586df930be7Sderaadt return; 587bfe1150aSmillert } else if (mib[1] == VM_PSSTRINGS) { 588bfe1150aSmillert struct _ps_strings _ps; 589bfe1150aSmillert 590633ab10aSmillert size = sizeof(_ps); 591633ab10aSmillert if (sysctl(mib, 2, &_ps, &size, NULL, 0) == -1) { 592c5956181Smillert if (flags == 0) 593c5956181Smillert return; 594bfe1150aSmillert if (!nflag) 595c5956181Smillert (void)printf("%s: ", string); 596c5956181Smillert (void)puts("can't find ps strings"); 597c5956181Smillert return; 598c5956181Smillert } 599c5956181Smillert if (!nflag) 60085316beeSderaadt (void)printf("%s%s", string, equ); 601c5956181Smillert (void)printf("%p\n", _ps.val); 602bfe1150aSmillert return; 6035f83b1d9Sart } else if (mib[1] == VM_SWAPENCRYPT) { 604eb111d98Sprovos len = sysctl_swpenc(string, &bufp, mib, flags, &type); 605eb111d98Sprovos if (len < 0) 606eb111d98Sprovos return; 607eb111d98Sprovos 608eb111d98Sprovos break; 60931a27f78Sart } else if (mib[1] == VM_NKMEMPAGES || 61031a27f78Sart mib[1] == VM_ANONMIN || 61131a27f78Sart mib[1] == VM_VTEXTMIN || 61243c9f476Sotto mib[1] == VM_VNODEMIN || 61343c9f476Sotto mib[1] == VM_MALLOC_CONF) { 6145f83b1d9Sart break; 615eb111d98Sprovos } 616df930be7Sderaadt if (flags == 0) 617df930be7Sderaadt return; 618c5956181Smillert warnx("use vmstat or systat to view %s information", string); 619df930be7Sderaadt return; 620eb111d98Sprovos 6218fe7eaeeSprovos break; 622df930be7Sderaadt 623df930be7Sderaadt case CTL_NET: 624df930be7Sderaadt if (mib[1] == PF_INET) { 625df930be7Sderaadt len = sysctl_inet(string, &bufp, mib, flags, &type); 6264a304dbaSmillert if (len < 0) 627df930be7Sderaadt return; 6282d3d8b66Smillert 6297f1136baSderaadt if ((mib[2] == IPPROTO_IP && mib[3] == IPCTL_MRTSTATS) || 6307f1136baSderaadt (mib[2] == IPPROTO_IP && mib[3] == IPCTL_STATS) || 631e0286c74Sguenther (mib[2] == IPPROTO_IP && mib[3] == IPCTL_MRTMFC) || 632e0286c74Sguenther (mib[2] == IPPROTO_IP && mib[3] == IPCTL_MRTVIF) || 6337a8c2027Sreyk (mib[2] == IPPROTO_TCP && mib[3] == TCPCTL_STATS) || 6347a8c2027Sreyk (mib[2] == IPPROTO_UDP && mib[3] == UDPCTL_STATS) || 6357f1136baSderaadt (mib[2] == IPPROTO_ESP && mib[3] == ESPCTL_STATS) || 6367f1136baSderaadt (mib[2] == IPPROTO_AH && mib[3] == AHCTL_STATS) || 6377f1136baSderaadt (mib[2] == IPPROTO_IGMP && mib[3] == IGMPCTL_STATS) || 6387f1136baSderaadt (mib[2] == IPPROTO_ETHERIP && mib[3] == ETHERIPCTL_STATS) || 6397f1136baSderaadt (mib[2] == IPPROTO_IPIP && mib[3] == IPIPCTL_STATS) || 6407f1136baSderaadt (mib[2] == IPPROTO_IPCOMP && mib[3] == IPCOMPCTL_STATS) || 6417f1136baSderaadt (mib[2] == IPPROTO_ICMP && mib[3] == ICMPCTL_STATS) || 6427f1136baSderaadt (mib[2] == IPPROTO_CARP && mib[3] == CARPCTL_STATS) || 643d85f7bc1Smichele (mib[2] == IPPROTO_PFSYNC && mib[3] == PFSYNCCTL_STATS) || 644d85f7bc1Smichele (mib[2] == IPPROTO_DIVERT && mib[3] == DIVERTCTL_STATS)) { 6457a8c2027Sreyk if (flags == 0) 6467a8c2027Sreyk return; 6477a8c2027Sreyk warnx("use netstat to view %s information", 6487a8c2027Sreyk string); 6497a8c2027Sreyk return; 6507a8c2027Sreyk } else if ((mib[2] == IPPROTO_TCP && 65105a599d3Svgross (mib[3] == TCPCTL_BADDYNAMIC || 65205a599d3Svgross mib[3] == TCPCTL_ROOTONLY)) || 65360681514Smillert (mib[2] == IPPROTO_UDP && 65405a599d3Svgross (mib[3] == UDPCTL_BADDYNAMIC || 65505a599d3Svgross mib[3] == UDPCTL_ROOTONLY))) { 6564a304dbaSmillert 6574a304dbaSmillert special |= BADDYNAMIC; 658e4c92f9eSmillert 6592d3d8b66Smillert if (newval != NULL) 6602d3d8b66Smillert parse_baddynamic(mib, len, string, 6612d3d8b66Smillert &newval, &newsize, flags, nflag); 6624a304dbaSmillert } 6634a304dbaSmillert break; 664df930be7Sderaadt } 665090f9bdcSitojun if (mib[1] == PF_INET6) { 666090f9bdcSitojun len = sysctl_inet6(string, &bufp, mib, flags, &type); 667090f9bdcSitojun if (len < 0) 668090f9bdcSitojun return; 669090f9bdcSitojun 670a85810aaSflorian if (mib[2] == IPPROTO_IPV6 && 671a85810aaSflorian mib[3] == IPV6CTL_SOIIKEY) 672a85810aaSflorian special |= HEX; 673a85810aaSflorian 674d1dc8a2bSrzalamena if ((mib[2] == IPPROTO_IPV6 && mib[3] == IPV6CTL_MRTMFC) || 675e0286c74Sguenther (mib[2] == IPPROTO_IPV6 && mib[3] == IPV6CTL_MRTMIF) || 676af7905a8Smichele (mib[2] == IPPROTO_DIVERT && mib[3] == DIVERT6CTL_STATS)) { 6777f1136baSderaadt if (flags == 0) 6787f1136baSderaadt return; 6797f1136baSderaadt warnx("use netstat to view %s information", 6807f1136baSderaadt string); 6817f1136baSderaadt return; 6827f1136baSderaadt } 683090f9bdcSitojun break; 684090f9bdcSitojun } 685f092c5e8Sclaudio if (mib[1] == PF_UNIX) { 686f092c5e8Sclaudio len = sysctl_unix(string, &bufp, mib, flags, &type); 687f092c5e8Sclaudio if (len < 0) 688f092c5e8Sclaudio return; 689f092c5e8Sclaudio break; 690f092c5e8Sclaudio } 6915243d0adSdlg if (mib[1] == PF_LINK) { 6925243d0adSdlg len = sysctl_link(string, &bufp, mib, flags, &type); 6935243d0adSdlg if (len < 0) 6945243d0adSdlg return; 6955243d0adSdlg break; 6965243d0adSdlg } 69716cc1d58Stedu if (mib[1] == PF_BPF) { 69816cc1d58Stedu len = sysctl_bpf(string, &bufp, mib, flags, &type); 69916cc1d58Stedu if (len < 0) 70016cc1d58Stedu return; 70116cc1d58Stedu break; 70216cc1d58Stedu } 703f786a0baSnorby if (mib[1] == PF_MPLS) { 704f786a0baSnorby len = sysctl_mpls(string, &bufp, mib, flags, &type); 705f786a0baSnorby if (len < 0) 706f786a0baSnorby return; 707f786a0baSnorby break; 708f786a0baSnorby } 70990b03482Syasuoka if (mib[1] == PF_PIPEX) { 71090b03482Syasuoka len = sysctl_pipex(string, &bufp, mib, flags, &type); 71190b03482Syasuoka if (len < 0) 71290b03482Syasuoka return; 71390b03482Syasuoka break; 71490b03482Syasuoka } 715df930be7Sderaadt if (flags == 0) 716df930be7Sderaadt return; 717c5956181Smillert warnx("use netstat to view %s information", string); 718df930be7Sderaadt return; 719df930be7Sderaadt 720df930be7Sderaadt case CTL_DEBUG: 721df930be7Sderaadt mib[2] = CTL_DEBUG_VALUE; 722df930be7Sderaadt len = 3; 723df930be7Sderaadt break; 724df930be7Sderaadt 725df930be7Sderaadt case CTL_MACHDEP: 726df930be7Sderaadt #ifdef CPU_CONSDEV 727df930be7Sderaadt if (mib[1] == CPU_CONSDEV) 72834dbcd1cSmickey special |= CHRDEV; 72934dbcd1cSmickey #endif 730162072e7Sjsg #ifdef CPU_CPUID 731162072e7Sjsg if (mib[1] == CPU_CPUID) 732162072e7Sjsg special |= HEX; 733162072e7Sjsg #endif 734feec8fe6Sderaadt #ifdef CPU_CPUFEATURE 735feec8fe6Sderaadt if (mib[1] == CPU_CPUFEATURE) 736feec8fe6Sderaadt special |= HEX; 737feec8fe6Sderaadt #endif 73834dbcd1cSmickey #ifdef CPU_BLK2CHR 73934dbcd1cSmickey if (mib[1] == CPU_BLK2CHR) { 74034dbcd1cSmickey if (bufp == NULL) 74134dbcd1cSmickey return; 74234dbcd1cSmickey mib[2] = makedev(atoi(bufp),0); 74334dbcd1cSmickey bufp = NULL; 74434dbcd1cSmickey len = 3; 74534dbcd1cSmickey special |= CHRDEV; 74634dbcd1cSmickey break; 74734dbcd1cSmickey } 74834dbcd1cSmickey #endif 74934dbcd1cSmickey #ifdef CPU_CHR2BLK 75034dbcd1cSmickey if (mib[1] == CPU_CHR2BLK) { 75134dbcd1cSmickey if (bufp == NULL) 75234dbcd1cSmickey return; 75334dbcd1cSmickey mib[2] = makedev(atoi(bufp),0); 75434dbcd1cSmickey bufp = NULL; 75534dbcd1cSmickey len = 3; 75634dbcd1cSmickey special |= BLKDEV; 75734dbcd1cSmickey break; 75834dbcd1cSmickey } 759df930be7Sderaadt #endif 76008f602a1Smickey #ifdef CPU_BIOS 76108f602a1Smickey if (mib[1] == CPU_BIOS) { 76208f602a1Smickey len = sysctl_bios(string, &bufp, mib, flags, &type); 763573fe405Smickey if (len < 0) 764573fe405Smickey return; 76508f602a1Smickey if (mib[2] == BIOS_DEV) 76665534d8cSmickey special |= BIOSDEV; 767573fe405Smickey if (mib[2] == BIOS_DISKINFO) 768573fe405Smickey special |= BIOSGEO; 76908f602a1Smickey break; 77008f602a1Smickey } 77165534d8cSmickey #endif 772c783c1d9Smatthieu #ifdef CPU_CHIPSET 773c783c1d9Smatthieu if (mib[1] == CPU_CHIPSET) { 774c783c1d9Smatthieu len = sysctl_chipset(string, &bufp, mib, flags, &type); 775c783c1d9Smatthieu if (len < 0) 776c783c1d9Smatthieu return; 777c783c1d9Smatthieu break; 778c783c1d9Smatthieu } 779c783c1d9Smatthieu #endif 780df930be7Sderaadt break; 781df930be7Sderaadt 782df930be7Sderaadt case CTL_FS: 78386d967dbStholo len = sysctl_fs(string, &bufp, mib, flags, &type); 78486d967dbStholo if (len >= 0) 78586d967dbStholo break; 78686d967dbStholo return; 78786d967dbStholo 78864582ec6Smillert case CTL_VFS: 789aff9f912Svisa if (mib[1]) 7904594122bSmickey len = sysctl_vfs(string, &bufp, mib, flags, &type); 791aff9f912Svisa else 792aff9f912Svisa len = sysctl_vfsgen(string, &bufp, mib, flags, &type); 7934594122bSmickey if (len >= 0) { 7944594122bSmickey if (type == CTLTYPE_STRUCT) { 7954594122bSmickey if (flags) 7964594122bSmickey warnx("use nfsstat to view %s information", 7974594122bSmickey MOUNT_NFS); 7984594122bSmickey return; 7994594122bSmickey } else 8004594122bSmickey break; 8014594122bSmickey } 80264582ec6Smillert return; 80364582ec6Smillert 8047025ac5dSmickey case CTL_DDB: 805df930be7Sderaadt break; 806df930be7Sderaadt 807df930be7Sderaadt default: 808c5956181Smillert warnx("illegal top level value: %d", mib[0]); 809df930be7Sderaadt return; 810df930be7Sderaadt 811df930be7Sderaadt } 812df930be7Sderaadt if (bufp) { 813c5956181Smillert warnx("name %s in %s is unknown", bufp, string); 814df930be7Sderaadt return; 815df930be7Sderaadt } 816df930be7Sderaadt if (newsize > 0) { 817ebe44704Stb const char *errstr; 818ebe44704Stb 819df930be7Sderaadt switch (type) { 820df930be7Sderaadt case CTLTYPE_INT: 8212961b500Spjanzen if (special & UNSIGNED) 822ebe44704Stb intval = strtonum(newval, 0, UINT_MAX, &errstr); 8232961b500Spjanzen else 824ebe44704Stb intval = strtonum(newval, INT_MIN, INT_MAX, 825ebe44704Stb &errstr); 826ebe44704Stb if (errstr != NULL) { 827ebe44704Stb warnx("%s: value is %s: %s", string, errstr, 8282961b500Spjanzen (char *)newval); 8292961b500Spjanzen return; 8302961b500Spjanzen } 831df930be7Sderaadt newval = &intval; 832c5956181Smillert newsize = sizeof(intval); 833df930be7Sderaadt break; 834df930be7Sderaadt 835df930be7Sderaadt case CTLTYPE_QUAD: 836ece71943Sguenther (void)sscanf(newval, "%lld", &quadval); 837df930be7Sderaadt newval = &quadval; 838c5956181Smillert newsize = sizeof(quadval); 839df930be7Sderaadt break; 840a85810aaSflorian case CTLTYPE_STRING: 841a85810aaSflorian if (special & HEX) { 842a85810aaSflorian ssize_t len; 843a85810aaSflorian 844a85810aaSflorian len = parse_hex_string(hex, sizeof(hex), 845a85810aaSflorian newval); 846a85810aaSflorian if (len == -1) { 847a85810aaSflorian warnx("%s: hex string %s: invalid", 8482766a6ffSdv string, (char *)newval); 849a85810aaSflorian return; 850a85810aaSflorian } 851a85810aaSflorian if (len > sizeof(hex)) { 852a85810aaSflorian warnx("%s: hex string %s: too long", 8532766a6ffSdv string, (char *)newval); 854a85810aaSflorian return; 855a85810aaSflorian } 856a85810aaSflorian 857a85810aaSflorian newval = hex; 858a85810aaSflorian newsize = len; 859a85810aaSflorian } 860a85810aaSflorian break; 861df930be7Sderaadt } 862df930be7Sderaadt } 863a64d153cSderaadt size = (special & SMALLBUF) ? 512 : SYSCTL_BUFSIZ; 864a1795836Sderaadt if (sysctl(mib, len, buf, &size, newval, newsize) == -1) { 865df930be7Sderaadt if (flags == 0) 866df930be7Sderaadt return; 867df930be7Sderaadt switch (errno) { 868df930be7Sderaadt case EOPNOTSUPP: 869c5956181Smillert warnx("%s: value is not available", string); 870df930be7Sderaadt return; 871df930be7Sderaadt case ENOTDIR: 872c5956181Smillert warnx("%s: specification is incomplete", string); 873df930be7Sderaadt return; 874df930be7Sderaadt case ENOMEM: 875c5956181Smillert warnx("%s: type is unknown to this program", string); 876df930be7Sderaadt return; 877573fe405Smickey case ENXIO: 878573fe405Smickey if (special & BIOSGEO) 879573fe405Smickey return; 880df930be7Sderaadt default: 881b638aa94Smillert warn("%s", string); 882df930be7Sderaadt return; 883df930be7Sderaadt } 884df930be7Sderaadt } 885ccc806e8Sangelos if (special & KMEMBUCKETS) { 886ccc806e8Sangelos struct kmembuckets *kb = (struct kmembuckets *)buf; 887ccc806e8Sangelos if (!nflag) 88885316beeSderaadt (void)printf("%s%s", string, equ); 8892680392bSart printf("("); 8902680392bSart printf("calls = %llu ", (long long)kb->kb_calls); 8912680392bSart printf("total_allocated = %llu ", (long long)kb->kb_total); 8922680392bSart printf("total_free = %lld ", (long long)kb->kb_totalfree); 8932680392bSart printf("elements = %lld ", (long long)kb->kb_elmpercl); 8946ba981e1Sart printf("high watermark = %lld ", (long long)kb->kb_highwat); 8956ba981e1Sart printf("could_free = %lld", (long long)kb->kb_couldfree); 8962680392bSart printf(")\n"); 8977a2c17d9Sangelos return; 8987a2c17d9Sangelos } 8997a2c17d9Sangelos if (special & KMEMSTATS) { 9007a2c17d9Sangelos struct kmemstats *km = (struct kmemstats *)buf; 9017a2c17d9Sangelos int j, first = 1; 9027a2c17d9Sangelos 9037a2c17d9Sangelos if (!nflag) 90485316beeSderaadt (void)printf("%s%s", string, equ); 905bc52e260Sderaadt (void)printf("(inuse = %ld, calls = %ld, memuse = %ldK, " 90668acdce2Sguenther "limblocks = %d, maxused = %ldK, " 907bc52e260Sderaadt "limit = %ldK, spare = %ld, sizes = (", 908bc52e260Sderaadt km->ks_inuse, km->ks_calls, 909bc52e260Sderaadt (km->ks_memuse + 1023) / 1024, km->ks_limblocks, 91068acdce2Sguenther (km->ks_maxused + 1023) / 1024, 911bc52e260Sderaadt (km->ks_limit + 1023) / 1024, km->ks_spare); 9127a2c17d9Sangelos for (j = 1 << MINBUCKET; j < 1 << (MINBUCKET + 16); j <<= 1) { 9137a2c17d9Sangelos if ((km->ks_size & j ) == 0) 9147a2c17d9Sangelos continue; 9157a2c17d9Sangelos if (first) 9167a2c17d9Sangelos (void)printf("%d", j); 9177a2c17d9Sangelos else 9187a2c17d9Sangelos (void)printf(",%d", j); 9197a2c17d9Sangelos first = 0; 9207a2c17d9Sangelos } 9217a2c17d9Sangelos if (first) 9227a2c17d9Sangelos (void)printf("none"); 9237a2c17d9Sangelos (void)printf("))\n"); 924ccc806e8Sangelos return; 925ccc806e8Sangelos } 926df930be7Sderaadt if (special & CLOCK) { 927df930be7Sderaadt struct clockinfo *clkp = (struct clockinfo *)buf; 928df930be7Sderaadt 929df930be7Sderaadt if (!nflag) 93085316beeSderaadt (void)printf("%s%s", string, equ); 931c5956181Smillert (void)printf( 9329589ba9dScheloha "tick = %d, hz = %d, profhz = %d, stathz = %d\n", 9339589ba9dScheloha clkp->tick, clkp->hz, clkp->profhz, clkp->stathz); 934df930be7Sderaadt return; 935df930be7Sderaadt } 936df930be7Sderaadt if (special & BOOTTIME) { 937df930be7Sderaadt struct timeval *btp = (struct timeval *)buf; 938df930be7Sderaadt 939df930be7Sderaadt if (!nflag) { 940a7b9eedcSflorian char *ct; 941df930be7Sderaadt boottime = btp->tv_sec; 942a7b9eedcSflorian ct = ctime(&boottime); 943a7b9eedcSflorian if (ct) 944a7b9eedcSflorian (void)printf("%s%s%s", string, equ, ct); 945a7b9eedcSflorian else 946a7b9eedcSflorian (void)printf("%s%s%lld\n", string, equ, 947a7b9eedcSflorian boottime); 948df930be7Sderaadt } else 949afc9b73eSderaadt (void)printf("%lld\n", (long long)btp->tv_sec); 950df930be7Sderaadt return; 951df930be7Sderaadt } 95234dbcd1cSmickey if (special & BLKDEV) { 95334dbcd1cSmickey dev_t dev = *(dev_t *)buf; 95434dbcd1cSmickey 95534dbcd1cSmickey if (!nflag) 95685316beeSderaadt (void)printf("%s%s%s\n", string, equ, 95734dbcd1cSmickey devname(dev, S_IFBLK)); 95834dbcd1cSmickey else 95934dbcd1cSmickey (void)printf("0x%x\n", dev); 96034dbcd1cSmickey return; 96134dbcd1cSmickey } 96234dbcd1cSmickey if (special & CHRDEV) { 963df930be7Sderaadt dev_t dev = *(dev_t *)buf; 964df930be7Sderaadt 965df930be7Sderaadt if (!nflag) 96685316beeSderaadt (void)printf("%s%s%s\n", string, equ, 967df930be7Sderaadt devname(dev, S_IFCHR)); 968df930be7Sderaadt else 969c5956181Smillert (void)printf("0x%x\n", dev); 970df930be7Sderaadt return; 971df930be7Sderaadt } 97208f602a1Smickey #ifdef CPU_BIOS 9732f315e2dSmickey if (special & BIOSGEO) { 974573fe405Smickey bios_diskinfo_t *pdi = (bios_diskinfo_t *)buf; 9752f315e2dSmickey 9762f315e2dSmickey if (!nflag) 97785316beeSderaadt (void)printf("%s%s", string, equ); 978573fe405Smickey (void)printf("bootdev = 0x%x, " 979573fe405Smickey "cylinders = %u, heads = %u, sectors = %u\n", 9807a2c17d9Sangelos pdi->bsd_dev, pdi->bios_cylinders, 9817a2c17d9Sangelos pdi->bios_heads, pdi->bios_sectors); 9822f315e2dSmickey return; 9832f315e2dSmickey } 98465534d8cSmickey if (special & BIOSDEV) { 98565534d8cSmickey int dev = *(int*)buf; 98665534d8cSmickey 98765534d8cSmickey if (!nflag) 98885316beeSderaadt (void)printf("%s%s", string, equ); 989573fe405Smickey (void) printf("0x%02x\n", dev); 99065534d8cSmickey return; 99165534d8cSmickey } 99208f602a1Smickey #endif 993dcaace67Sderaadt if (special & UNSIGNED) { 994dcaace67Sderaadt if (newsize == 0) { 995dcaace67Sderaadt if (!nflag) 99685316beeSderaadt (void)printf("%s%s", string, equ); 997dcaace67Sderaadt (void)printf("%u\n", *(u_int *)buf); 998dcaace67Sderaadt } else { 999802b26d6Sjfb if (!qflag) { 1000dcaace67Sderaadt if (!nflag) 1001dcaace67Sderaadt (void)printf("%s: %u -> ", string, 1002dcaace67Sderaadt *(u_int *)buf); 1003dcaace67Sderaadt (void)printf("%u\n", *(u_int *)newval); 1004dcaace67Sderaadt } 1005802b26d6Sjfb } 1006dcaace67Sderaadt return; 1007dcaace67Sderaadt } 10084a304dbaSmillert if (special & BADDYNAMIC) { 1009c8a0bd93Sdjm u_int port, lastport; 10104a304dbaSmillert u_int32_t *baddynamic = (u_int32_t *)buf; 10114a304dbaSmillert 1012802b26d6Sjfb if (!qflag) { 10134a304dbaSmillert if (!nflag) 1014802b26d6Sjfb (void)printf("%s%s", string, 101585316beeSderaadt newsize ? ": " : equ); 1016e4c92f9eSmillert lastport = 0; 1017c8a0bd93Sdjm for (port = 0; port < 65536; port++) 1018e4c92f9eSmillert if (DP_ISSET(baddynamic, port)) { 1019c8a0bd93Sdjm (void)printf("%s%u", 1020c5956181Smillert lastport ? "," : "", port); 1021e4c92f9eSmillert lastport = port; 1022e4c92f9eSmillert } 1023802b26d6Sjfb if (newsize != 0) { 1024802b26d6Sjfb if (!nflag) 1025802b26d6Sjfb fputs(" -> ", stdout); 1026802b26d6Sjfb baddynamic = (u_int32_t *)newval; 1027802b26d6Sjfb lastport = 0; 1028c8a0bd93Sdjm for (port = 0; port < 65536; port++) 1029802b26d6Sjfb if (DP_ISSET(baddynamic, port)) { 1030c8a0bd93Sdjm (void)printf("%s%u", 1031802b26d6Sjfb lastport ? "," : "", port); 1032802b26d6Sjfb lastport = port; 1033802b26d6Sjfb } 10344a304dbaSmillert } 1035c5956181Smillert (void)putchar('\n'); 1036802b26d6Sjfb } 10374a304dbaSmillert return; 10384a304dbaSmillert } 1039a882a322Smickey if (special & LONGARRAY) { 1040a882a322Smickey long *la = (long *)buf; 1041a882a322Smickey if (!nflag) 104285316beeSderaadt printf("%s%s", string, equ); 1043a882a322Smickey while (lal--) 1044a882a322Smickey printf("%ld%s", *la++, lal? ",":""); 1045a882a322Smickey putchar('\n'); 1046a882a322Smickey return; 1047a882a322Smickey } 104868e359b9Sgrange if (special & SENSORS) { 104968e359b9Sgrange struct sensor *s = (struct sensor *)buf; 105068e359b9Sgrange 10511890f709Sgrange if (size > 0 && (s->flags & SENSOR_FINVALID) == 0) { 105268e359b9Sgrange if (!nflag) 105385316beeSderaadt printf("%s%s", string, equ); 1054a4b82fa4Sdlg print_sensor(s); 1055cf8f7643Shenning printf("\n"); 105668e359b9Sgrange } 105768e359b9Sgrange return; 105868e359b9Sgrange } 105931e91f6bScheloha if (special & TIMEOUT) { 106031e91f6bScheloha struct timeoutstat *tstat = (struct timeoutstat *)buf; 106131e91f6bScheloha 106231e91f6bScheloha if (!nflag) 106331e91f6bScheloha printf("%s%s", string, equ); 106431e91f6bScheloha printf("added = %llu, cancelled = %llu, deleted = %llu, " 106531e91f6bScheloha "late = %llu, pending = %llu, readded = %llu, " 1066b4dcb8daScheloha "scheduled = %llu, rescheduled = %llu, " 1067b4dcb8daScheloha "run_softclock = %llu, run_thread = %llu, " 1068b4dcb8daScheloha "softclocks = %llu, thread_wakeups = %llu\n", 106931e91f6bScheloha tstat->tos_added, tstat->tos_cancelled, tstat->tos_deleted, 107031e91f6bScheloha tstat->tos_late, tstat->tos_pending, tstat->tos_readded, 1071b4dcb8daScheloha tstat->tos_scheduled, tstat->tos_rescheduled, 1072b4dcb8daScheloha tstat->tos_run_softclock, tstat->tos_run_thread, 1073b4dcb8daScheloha tstat->tos_softclocks, tstat->tos_thread_wakeups); 107431e91f6bScheloha return; 107531e91f6bScheloha } 1076df930be7Sderaadt switch (type) { 1077df930be7Sderaadt case CTLTYPE_INT: 1078df930be7Sderaadt if (newsize == 0) { 1079df930be7Sderaadt if (!nflag) 108085316beeSderaadt (void)printf("%s%s", string, equ); 1081feec8fe6Sderaadt if (special & HEX) 1082feec8fe6Sderaadt (void)printf("0x%x\n", *(int *)buf); 1083feec8fe6Sderaadt else 1084c5956181Smillert (void)printf("%d\n", *(int *)buf); 1085df930be7Sderaadt } else { 1086802b26d6Sjfb if (!qflag) { 1087df930be7Sderaadt if (!nflag) 1088c5956181Smillert (void)printf("%s: %d -> ", string, 1089df930be7Sderaadt *(int *)buf); 1090feec8fe6Sderaadt if (special & HEX) 1091feec8fe6Sderaadt (void)printf("0x%x\n", *(int *)newval); 1092f0face18Sderaadt else 1093f0face18Sderaadt (void)printf("%d\n", *(int *)newval); 1094df930be7Sderaadt } 1095802b26d6Sjfb } 1096df930be7Sderaadt return; 1097df930be7Sderaadt 1098df930be7Sderaadt case CTLTYPE_STRING: 1099a1795836Sderaadt if (newval == NULL) { 1100df930be7Sderaadt if (!nflag) 110185316beeSderaadt (void)printf("%s%s", string, equ); 1102a85810aaSflorian if (special & HEX) { 1103a85810aaSflorian size_t i; 1104a85810aaSflorian for (i = 0; i < size; i++) { 1105a85810aaSflorian (void)printf("%02x", 1106a85810aaSflorian (unsigned char)buf[i]); 110738a8dfe4Sdlg } 1108a85810aaSflorian (void)printf("\n"); 1109a85810aaSflorian } else 1110a85810aaSflorian (void)puts(buf); 1111a85810aaSflorian } else if (!qflag) { 1112a85810aaSflorian if (!nflag) { 1113a85810aaSflorian (void)printf("%s: ", string); 1114a85810aaSflorian if (special & HEX) { 1115a85810aaSflorian size_t i; 1116a85810aaSflorian for (i = 0; i < size; i++) { 1117a85810aaSflorian (void)printf("%02x", 1118a85810aaSflorian (unsigned char)buf[i]); 1119a85810aaSflorian } 1120a85810aaSflorian } else 1121eb7ca718Stim (void)printf("%s", buf); 1122a85810aaSflorian 1123a85810aaSflorian (void)printf(" -> "); 1124a85810aaSflorian } 1125a85810aaSflorian (void)puts(cp); 1126802b26d6Sjfb } 1127df930be7Sderaadt return; 1128df930be7Sderaadt 1129df930be7Sderaadt case CTLTYPE_QUAD: 1130df930be7Sderaadt if (newsize == 0) { 1131ece71943Sguenther int64_t tmp; 11326ba981e1Sart 1133ece71943Sguenther memcpy(&tmp, buf, sizeof tmp); 1134df930be7Sderaadt if (!nflag) 113585316beeSderaadt (void)printf("%s%s", string, equ); 11366ba981e1Sart (void)printf("%lld\n", tmp); 1137df930be7Sderaadt } else { 1138ece71943Sguenther int64_t tmp; 11396ba981e1Sart 1140ece71943Sguenther memcpy(&tmp, buf, sizeof tmp); 1141802b26d6Sjfb if (!qflag) { 1142df930be7Sderaadt if (!nflag) 1143802b26d6Sjfb (void)printf("%s: %lld -> ", 1144802b26d6Sjfb string, tmp); 1145ece71943Sguenther memcpy(&tmp, newval, sizeof tmp); 1146ece71943Sguenther (void)printf("%lld\n", tmp); 1147df930be7Sderaadt } 1148802b26d6Sjfb } 1149df930be7Sderaadt return; 1150df930be7Sderaadt 1151df930be7Sderaadt case CTLTYPE_STRUCT: 1152c5956181Smillert warnx("%s: unknown structure returned", string); 1153df930be7Sderaadt return; 1154df930be7Sderaadt 1155df930be7Sderaadt default: 1156df930be7Sderaadt case CTLTYPE_NODE: 1157c5956181Smillert warnx("%s: unknown type returned", string); 1158df930be7Sderaadt return; 1159df930be7Sderaadt } 1160df930be7Sderaadt } 1161df930be7Sderaadt 1162e8af5517Sdjm static void 1163e8af5517Sdjm parse_ports(char *portspec, int *port, int *high_port) 1164e8af5517Sdjm { 1165e8af5517Sdjm char *dash; 1166e8af5517Sdjm const char *errstr; 1167e8af5517Sdjm 1168e8af5517Sdjm if ((dash = strchr(portspec, '-')) != NULL) 1169e8af5517Sdjm *dash++ = '\0'; 1170e8af5517Sdjm *port = strtonum(portspec, 0, 65535, &errstr); 1171e8af5517Sdjm if (errstr != NULL) 1172e8af5517Sdjm errx(1, "port is %s: %s", errstr, portspec); 1173e8af5517Sdjm if (dash != NULL) { 1174e8af5517Sdjm *high_port = strtonum(dash, 0, 65535, &errstr); 1175e8af5517Sdjm if (errstr != NULL) 1176e8af5517Sdjm errx(1, "high port is %s: %s", errstr, dash); 1177e8af5517Sdjm if (*high_port < *port) 1178e8af5517Sdjm errx(1, "high port %d is lower than %d", 1179e8af5517Sdjm *high_port, *port); 1180e8af5517Sdjm } else 1181e8af5517Sdjm *high_port = *port; 1182e8af5517Sdjm } 1183e8af5517Sdjm 11842d3d8b66Smillert void 1185bc52e260Sderaadt parse_baddynamic(int mib[], size_t len, char *string, void **newvalp, 1186bc52e260Sderaadt size_t *newsizep, int flags, int nflag) 11872d3d8b66Smillert { 11882d3d8b66Smillert static u_int32_t newbaddynamic[DP_MAPSIZE]; 1189e8af5517Sdjm int port, high_port, baddynamic_loaded = 0, full_list_set = 0; 11902d3d8b66Smillert size_t size; 11912d3d8b66Smillert char action, *cp; 11922d3d8b66Smillert 1193e8af5517Sdjm while (*newvalp && (cp = strsep((char **)newvalp, ", \t")) && *cp) { 1194e8af5517Sdjm if (*cp == '+' || *cp == '-') { 1195e8af5517Sdjm if (full_list_set) 1196e8af5517Sdjm errx(1, "cannot mix +/- with full list"); 1197e8af5517Sdjm action = *cp++; 1198e8af5517Sdjm if (!baddynamic_loaded) { 11992d3d8b66Smillert size = sizeof(newbaddynamic); 1200e8af5517Sdjm if (sysctl(mib, len, newbaddynamic, 1201e8af5517Sdjm &size, 0, 0) == -1) { 12022d3d8b66Smillert if (flags == 0) 12032d3d8b66Smillert return; 12042d3d8b66Smillert if (!nflag) 1205e8af5517Sdjm printf("%s: ", string); 12068b8b0329Stedu puts("kernel does not contain bad " 12078b8b0329Stedu "dynamic port tables"); 12082d3d8b66Smillert return; 12092d3d8b66Smillert } 1210e8af5517Sdjm baddynamic_loaded = 1; 1211e8af5517Sdjm } 1212e8af5517Sdjm parse_ports(cp, &port, &high_port); 1213e8af5517Sdjm for (; port <= high_port; port++) { 12142d3d8b66Smillert if (action == '+') 12152d3d8b66Smillert DP_SET(newbaddynamic, port); 12162d3d8b66Smillert else 12172d3d8b66Smillert DP_CLR(newbaddynamic, port); 12182d3d8b66Smillert } 12192d3d8b66Smillert } else { 1220e8af5517Sdjm if (baddynamic_loaded) 1221e8af5517Sdjm errx(1, "cannot mix +/- with full list"); 1222e8af5517Sdjm if (!full_list_set) { 1223e8af5517Sdjm bzero(newbaddynamic, sizeof(newbaddynamic)); 1224e8af5517Sdjm full_list_set = 1; 1225e8af5517Sdjm } 1226e8af5517Sdjm parse_ports(cp, &port, &high_port); 1227e8af5517Sdjm for (; port <= high_port; port++) 12282d3d8b66Smillert DP_SET(newbaddynamic, port); 12292d3d8b66Smillert } 12302d3d8b66Smillert } 12312d3d8b66Smillert *newvalp = (void *)newbaddynamic; 12322d3d8b66Smillert *newsizep = sizeof(newbaddynamic); 12332d3d8b66Smillert } 12342d3d8b66Smillert 1235df930be7Sderaadt /* 1236df930be7Sderaadt * Initialize the set of debugging names 1237df930be7Sderaadt */ 1238f712e2a0Smickey void 1239bc52e260Sderaadt debuginit(void) 1240df930be7Sderaadt { 1241df930be7Sderaadt int mib[3], loc, i; 1242df930be7Sderaadt size_t size; 1243df930be7Sderaadt 1244df930be7Sderaadt if (secondlevel[CTL_DEBUG].list != 0) 1245df930be7Sderaadt return; 1246df930be7Sderaadt secondlevel[CTL_DEBUG].list = debugname; 1247df930be7Sderaadt mib[0] = CTL_DEBUG; 1248df930be7Sderaadt mib[2] = CTL_DEBUG_NAME; 124964582ec6Smillert for (loc = lastused, i = 0; i < CTL_DEBUG_MAXID; i++) { 1250df930be7Sderaadt mib[1] = i; 1251df930be7Sderaadt size = BUFSIZ - loc; 1252df930be7Sderaadt if (sysctl(mib, 3, &names[loc], &size, NULL, 0) == -1) 1253df930be7Sderaadt continue; 1254df930be7Sderaadt debugname[i].ctl_name = &names[loc]; 1255df930be7Sderaadt debugname[i].ctl_type = CTLTYPE_INT; 1256df930be7Sderaadt loc += size; 1257df930be7Sderaadt } 125864582ec6Smillert lastused = loc; 125964582ec6Smillert } 126064582ec6Smillert 12614594122bSmickey struct ctlname vfsgennames[] = CTL_VFSGENCTL_NAMES; 12624594122bSmickey struct ctlname ffsname[] = FFS_NAMES; 12634594122bSmickey struct ctlname nfsname[] = FS_NFS_NAMES; 1264e3b64b9bStedu struct ctlname fusefsname[] = FUSEFS_NAMES; 12654594122bSmickey struct list *vfsvars; 1266aff9f912Svisa int *vfs_typenums; 12674594122bSmickey 126864582ec6Smillert /* 126964582ec6Smillert * Initialize the set of filesystem names 127064582ec6Smillert */ 127164582ec6Smillert void 1272bc52e260Sderaadt vfsinit(void) 127364582ec6Smillert { 127464582ec6Smillert int mib[4], maxtypenum, cnt, loc, size; 127564582ec6Smillert struct vfsconf vfc; 127664582ec6Smillert size_t buflen; 127764582ec6Smillert 127864582ec6Smillert if (secondlevel[CTL_VFS].list != 0) 127964582ec6Smillert return; 128064582ec6Smillert mib[0] = CTL_VFS; 128164582ec6Smillert mib[1] = VFS_GENERIC; 128264582ec6Smillert mib[2] = VFS_MAXTYPENUM; 128364582ec6Smillert buflen = 4; 1284df69c215Sderaadt if (sysctl(mib, 3, &maxtypenum, &buflen, NULL, 0) == -1) 128564582ec6Smillert return; 1286aff9f912Svisa /* 1287aff9f912Svisa * We need to do 0..maxtypenum so add one, and then we offset them 1288aff9f912Svisa * all by (another) one by inserting VFS_GENERIC entries at zero 1289aff9f912Svisa */ 1290aff9f912Svisa maxtypenum += 2; 1291aff9f912Svisa if ((vfs_typenums = calloc(maxtypenum, sizeof(int))) == NULL) 129264582ec6Smillert return; 1293aff9f912Svisa if ((vfsvars = calloc(maxtypenum, sizeof(*vfsvars))) == NULL) { 1294aff9f912Svisa free(vfs_typenums); 1295aff9f912Svisa return; 1296aff9f912Svisa } 1297ad4287e4Sdjm if ((vfsname = calloc(maxtypenum, sizeof(*vfsname))) == NULL) { 1298aff9f912Svisa free(vfs_typenums); 12994594122bSmickey free(vfsvars); 13004594122bSmickey return; 13014594122bSmickey } 130264582ec6Smillert mib[2] = VFS_CONF; 130364582ec6Smillert buflen = sizeof vfc; 1304aff9f912Svisa for (loc = lastused, cnt = 1; cnt < maxtypenum; cnt++) { 1305aff9f912Svisa mib[3] = cnt - 1; 1306df69c215Sderaadt if (sysctl(mib, 4, &vfc, &buflen, NULL, 0) == -1) { 130764582ec6Smillert if (errno == EOPNOTSUPP) 130864582ec6Smillert continue; 13094594122bSmickey warn("vfsinit"); 131064582ec6Smillert free(vfsname); 131193022208Sderaadt free(vfsvars); 1312aff9f912Svisa free(vfs_typenums); 131364582ec6Smillert return; 131464582ec6Smillert } 13154594122bSmickey if (!strcmp(vfc.vfc_name, MOUNT_FFS)) { 13164594122bSmickey vfsvars[cnt].list = ffsname; 13174594122bSmickey vfsvars[cnt].size = FFS_MAXID; 13184594122bSmickey } 13194594122bSmickey if (!strcmp(vfc.vfc_name, MOUNT_NFS)) { 13204594122bSmickey vfsvars[cnt].list = nfsname; 13214594122bSmickey vfsvars[cnt].size = NFS_MAXID; 13224594122bSmickey } 1323e3b64b9bStedu if (!strcmp(vfc.vfc_name, MOUNT_FUSEFS)) { 1324e3b64b9bStedu vfsvars[cnt].list = fusefsname; 1325e3b64b9bStedu vfsvars[cnt].size = FUSEFS_MAXID; 1326e3b64b9bStedu } 1327aff9f912Svisa vfs_typenums[cnt] = vfc.vfc_typenum; 1328b6760428Sderaadt strlcat(&names[loc], vfc.vfc_name, sizeof names - loc); 132964582ec6Smillert vfsname[cnt].ctl_name = &names[loc]; 13304594122bSmickey vfsname[cnt].ctl_type = CTLTYPE_NODE; 133164582ec6Smillert size = strlen(vfc.vfc_name) + 1; 133264582ec6Smillert loc += size; 133364582ec6Smillert } 133464582ec6Smillert lastused = loc; 13354594122bSmickey 1336aff9f912Svisa vfsname[0].ctl_name = "mounts"; 1337aff9f912Svisa vfsname[0].ctl_type = CTLTYPE_NODE; 1338aff9f912Svisa vfsvars[0].list = vfsname + 1; 1339aff9f912Svisa vfsvars[0].size = maxtypenum - 1; 1340aff9f912Svisa 134164582ec6Smillert secondlevel[CTL_VFS].list = vfsname; 134264582ec6Smillert secondlevel[CTL_VFS].size = maxtypenum; 134364582ec6Smillert return; 1344df930be7Sderaadt } 1345df930be7Sderaadt 13464594122bSmickey int 1347aff9f912Svisa sysctl_vfsgen(char *string, char **bufpp, int mib[], int flags, int *typep) 1348aff9f912Svisa { 1349aff9f912Svisa int indx; 1350aff9f912Svisa size_t size; 1351aff9f912Svisa struct vfsconf vfc; 1352aff9f912Svisa 1353aff9f912Svisa if (*bufpp == NULL) { 1354aff9f912Svisa listall(string, vfsvars); 1355aff9f912Svisa return (-1); 1356aff9f912Svisa } 1357aff9f912Svisa 1358aff9f912Svisa if ((indx = findname(string, "third", bufpp, vfsvars)) == -1) 1359aff9f912Svisa return (-1); 1360aff9f912Svisa 1361aff9f912Svisa mib[1] = VFS_GENERIC; 1362aff9f912Svisa mib[2] = VFS_CONF; 1363aff9f912Svisa mib[3] = indx; 1364aff9f912Svisa size = sizeof vfc; 1365df69c215Sderaadt if (sysctl(mib, 4, &vfc, &size, NULL, 0) == -1) { 1366aff9f912Svisa if (errno != EOPNOTSUPP) 1367aff9f912Svisa warn("vfs print"); 1368aff9f912Svisa return -1; 1369aff9f912Svisa } 1370aff9f912Svisa if (flags == 0 && vfc.vfc_refcount == 0) 1371aff9f912Svisa return -1; 1372aff9f912Svisa if (!nflag) 1373caca41d2Svisa fprintf(stdout, "%s has %u mounted instance%s\n", 1374aff9f912Svisa string, vfc.vfc_refcount, 1375aff9f912Svisa vfc.vfc_refcount != 1 ? "s" : ""); 1376aff9f912Svisa else 1377caca41d2Svisa fprintf(stdout, "%u\n", vfc.vfc_refcount); 1378aff9f912Svisa 1379aff9f912Svisa return -1; 1380aff9f912Svisa } 1381aff9f912Svisa 1382aff9f912Svisa int 1383bc52e260Sderaadt sysctl_vfs(char *string, char **bufpp, int mib[], int flags, int *typep) 13844594122bSmickey { 13854594122bSmickey struct list *lp = &vfsvars[mib[1]]; 13864594122bSmickey int indx; 13874594122bSmickey 13884594122bSmickey if (lp->list == NULL) { 13894594122bSmickey if (flags) 13904594122bSmickey warnx("No variables defined for file system %s", string); 13914594122bSmickey return (-1); 13924594122bSmickey } 13934594122bSmickey if (*bufpp == NULL) { 13944594122bSmickey listall(string, lp); 13954594122bSmickey return (-1); 13964594122bSmickey } 13974594122bSmickey if ((indx = findname(string, "third", bufpp, lp)) == -1) 13984594122bSmickey return (-1); 13994594122bSmickey 1400aff9f912Svisa mib[1] = vfs_typenums[mib[1]]; 14014594122bSmickey mib[2] = indx; 14024594122bSmickey *typep = lp->list[indx].ctl_type; 14034594122bSmickey return (3); 14044594122bSmickey } 14054594122bSmickey 140686d967dbStholo struct ctlname posixname[] = CTL_FS_POSIX_NAMES; 140786d967dbStholo struct list fslist = { posixname, FS_POSIX_MAXID }; 140886d967dbStholo 140986d967dbStholo /* 141086d967dbStholo * handle file system requests 141186d967dbStholo */ 1412f712e2a0Smickey int 1413bc52e260Sderaadt sysctl_fs(char *string, char **bufpp, int mib[], int flags, int *typep) 141486d967dbStholo { 141586d967dbStholo int indx; 141686d967dbStholo 141786d967dbStholo if (*bufpp == NULL) { 141886d967dbStholo listall(string, &fslist); 141986d967dbStholo return (-1); 142086d967dbStholo } 142186d967dbStholo if ((indx = findname(string, "third", bufpp, &fslist)) == -1) 142286d967dbStholo return (-1); 142386d967dbStholo mib[2] = indx; 142486d967dbStholo *typep = fslist.list[indx].ctl_type; 142586d967dbStholo return (3); 142686d967dbStholo } 142786d967dbStholo 142808f602a1Smickey #ifdef CPU_BIOS 142908f602a1Smickey struct ctlname biosname[] = CTL_BIOS_NAMES; 143008f602a1Smickey struct list bioslist = { biosname, BIOS_MAXID }; 143108f602a1Smickey 143208f602a1Smickey /* 143308f602a1Smickey * handle BIOS requests 143408f602a1Smickey */ 143508f602a1Smickey int 1436bc52e260Sderaadt sysctl_bios(char *string, char **bufpp, int mib[], int flags, int *typep) 143708f602a1Smickey { 1438573fe405Smickey char *name; 143908f602a1Smickey int indx; 144008f602a1Smickey 144108f602a1Smickey if (*bufpp == NULL) { 144208f602a1Smickey listall(string, &bioslist); 144308f602a1Smickey return (-1); 144408f602a1Smickey } 144508f602a1Smickey if ((indx = findname(string, "third", bufpp, &bioslist)) == -1) 144608f602a1Smickey return (-1); 144708f602a1Smickey mib[2] = indx; 1448573fe405Smickey if (indx == BIOS_DISKINFO) { 1449a47b6461Sderaadt const char *errstr; 1450a47b6461Sderaadt 1451573fe405Smickey if (*bufpp == NULL) { 1452573fe405Smickey char name[BUFSIZ]; 1453573fe405Smickey 1454573fe405Smickey /* scan all the bios devices */ 1455573fe405Smickey for (indx = 0; indx < 256; indx++) { 1456573fe405Smickey snprintf(name, sizeof(name), "%s.%u", 1457573fe405Smickey string, indx); 1458573fe405Smickey parse(name, 1); 1459573fe405Smickey } 1460573fe405Smickey return (-1); 1461573fe405Smickey } 1462573fe405Smickey if ((name = strsep(bufpp, ".")) == NULL) { 1463573fe405Smickey warnx("%s: incomplete specification", string); 1464573fe405Smickey return (-1); 1465573fe405Smickey } 1466a47b6461Sderaadt mib[3] = strtonum(name, 0, INT_MAX, &errstr); 1467a47b6461Sderaadt if (errstr) { 1468a47b6461Sderaadt warnx("%s: %s", string, errstr); 1469a47b6461Sderaadt return (-1); 1470a47b6461Sderaadt } 1471573fe405Smickey *typep = CTLTYPE_STRUCT; 147290a6e042Sangelos return (4); 1473573fe405Smickey } else { 147408f602a1Smickey *typep = bioslist.list[indx].ctl_type; 147508f602a1Smickey return (3); 147608f602a1Smickey } 1477573fe405Smickey } 147808f602a1Smickey #endif 147908f602a1Smickey 1480eb111d98Sprovos struct ctlname swpencname[] = CTL_SWPENC_NAMES; 1481eb111d98Sprovos struct list swpenclist = { swpencname, SWPENC_MAXID }; 1482eb111d98Sprovos 1483eb111d98Sprovos /* 1484eb111d98Sprovos * handle swap encrypt requests 1485eb111d98Sprovos */ 1486eb111d98Sprovos int 1487bc52e260Sderaadt sysctl_swpenc(char *string, char **bufpp, int mib[], int flags, int *typep) 1488eb111d98Sprovos { 1489eb111d98Sprovos int indx; 1490eb111d98Sprovos 1491eb111d98Sprovos if (*bufpp == NULL) { 1492eb111d98Sprovos listall(string, &swpenclist); 1493eb111d98Sprovos return (-1); 1494eb111d98Sprovos } 1495eb111d98Sprovos if ((indx = findname(string, "third", bufpp, &swpenclist)) == -1) 1496eb111d98Sprovos return (-1); 1497eb111d98Sprovos mib[2] = indx; 1498eb111d98Sprovos *typep = swpenclist.list[indx].ctl_type; 1499eb111d98Sprovos return (3); 1500eb111d98Sprovos } 1501eb111d98Sprovos 1502df930be7Sderaadt struct ctlname inetname[] = CTL_IPPROTO_NAMES; 1503df930be7Sderaadt struct ctlname ipname[] = IPCTL_NAMES; 1504df930be7Sderaadt struct ctlname icmpname[] = ICMPCTL_NAMES; 15057f1136baSderaadt struct ctlname igmpname[] = IGMPCTL_NAMES; 15065e1bc867Sangelos struct ctlname ipipname[] = IPIPCTL_NAMES; 1507df930be7Sderaadt struct ctlname tcpname[] = TCPCTL_NAMES; 1508df930be7Sderaadt struct ctlname udpname[] = UDPCTL_NAMES; 1509253ba047Sniklas struct ctlname espname[] = ESPCTL_NAMES; 1510253ba047Sniklas struct ctlname ahname[] = AHCTL_NAMES; 1511c23fec31Sangelos struct ctlname etheripname[] = ETHERIPCTL_NAMES; 151233e468d6Sangelos struct ctlname grename[] = GRECTL_NAMES; 1513d39fbd3cSjjbg struct ctlname ipcompname[] = IPCOMPCTL_NAMES; 1514c05683a6Smcbride struct ctlname carpname[] = CARPCTL_NAMES; 15157f1136baSderaadt struct ctlname pfsyncname[] = PFSYNCCTL_NAMES; 1516d85f7bc1Smichele struct ctlname divertname[] = DIVERTCTL_NAMES; 151716cc1d58Stedu struct ctlname bpfname[] = CTL_NET_BPF_NAMES; 151810c1d3acSmarkus struct ctlname ifqname[] = CTL_IFQ_NAMES; 151990b03482Syasuoka struct ctlname pipexname[] = PIPEXCTL_NAMES; 1520df930be7Sderaadt struct list inetlist = { inetname, IPPROTO_MAXID }; 1521df930be7Sderaadt struct list inetvars[] = { 1522df930be7Sderaadt { ipname, IPCTL_MAXID }, /* ip */ 1523df930be7Sderaadt { icmpname, ICMPCTL_MAXID }, /* icmp */ 15247f1136baSderaadt { igmpname, IGMPCTL_MAXID }, /* igmp */ 1525df930be7Sderaadt { 0, 0 }, /* ggmp */ 15265e1bc867Sangelos { ipipname, IPIPCTL_MAXID }, /* ipencap */ 1527df930be7Sderaadt { 0, 0 }, 1528df930be7Sderaadt { tcpname, TCPCTL_MAXID }, /* tcp */ 1529df930be7Sderaadt { 0, 0 }, 1530df930be7Sderaadt { 0, 0 }, /* egp */ 1531df930be7Sderaadt { 0, 0 }, 1532df930be7Sderaadt { 0, 0 }, 1533df930be7Sderaadt { 0, 0 }, 1534df930be7Sderaadt { 0, 0 }, /* pup */ 1535df930be7Sderaadt { 0, 0 }, 1536df930be7Sderaadt { 0, 0 }, 1537df930be7Sderaadt { 0, 0 }, 1538df930be7Sderaadt { 0, 0 }, 1539df930be7Sderaadt { udpname, UDPCTL_MAXID }, /* udp */ 1540253ba047Sniklas { 0, 0 }, 1541253ba047Sniklas { 0, 0 }, 1542253ba047Sniklas { 0, 0 }, 1543253ba047Sniklas { 0, 0 }, 1544253ba047Sniklas { 0, 0 }, 1545253ba047Sniklas { 0, 0 }, 1546253ba047Sniklas { 0, 0 }, 1547253ba047Sniklas { 0, 0 }, 1548253ba047Sniklas { 0, 0 }, 1549253ba047Sniklas { 0, 0 }, 1550253ba047Sniklas { 0, 0 }, 1551253ba047Sniklas { 0, 0 }, 1552253ba047Sniklas { 0, 0 }, 1553253ba047Sniklas { 0, 0 }, 1554253ba047Sniklas { 0, 0 }, 1555253ba047Sniklas { 0, 0 }, 1556253ba047Sniklas { 0, 0 }, 1557253ba047Sniklas { 0, 0 }, 1558253ba047Sniklas { 0, 0 }, 1559253ba047Sniklas { 0, 0 }, 1560253ba047Sniklas { 0, 0 }, 1561253ba047Sniklas { 0, 0 }, 1562253ba047Sniklas { 0, 0 }, 1563253ba047Sniklas { 0, 0 }, 1564253ba047Sniklas { 0, 0 }, 1565253ba047Sniklas { 0, 0 }, 1566253ba047Sniklas { 0, 0 }, 1567253ba047Sniklas { 0, 0 }, 1568253ba047Sniklas { 0, 0 }, 15697f1136baSderaadt { grename, GRECTL_MAXID }, /* gre */ 1570253ba047Sniklas { 0, 0 }, 1571253ba047Sniklas { 0, 0 }, 1572253ba047Sniklas { espname, ESPCTL_MAXID }, /* esp */ 1573253ba047Sniklas { ahname, AHCTL_MAXID }, /* ah */ 1574c23fec31Sangelos { 0, 0 }, 1575c23fec31Sangelos { 0, 0 }, 1576c23fec31Sangelos { 0, 0 }, 15779ce244b6Sdlg { 0, 0 }, 1578c23fec31Sangelos { 0, 0 }, 1579c23fec31Sangelos { 0, 0 }, 1580c23fec31Sangelos { 0, 0 }, 1581c23fec31Sangelos { 0, 0 }, 1582c23fec31Sangelos { 0, 0 }, 1583c23fec31Sangelos { 0, 0 }, 1584c23fec31Sangelos { 0, 0 }, 1585c23fec31Sangelos { 0, 0 }, 1586c23fec31Sangelos { 0, 0 }, 1587c23fec31Sangelos { 0, 0 }, 1588c23fec31Sangelos { 0, 0 }, 1589c23fec31Sangelos { 0, 0 }, 1590c23fec31Sangelos { 0, 0 }, 1591c23fec31Sangelos { 0, 0 }, 1592c23fec31Sangelos { 0, 0 }, 1593c23fec31Sangelos { 0, 0 }, 1594c23fec31Sangelos { 0, 0 }, 1595c23fec31Sangelos { 0, 0 }, 1596c23fec31Sangelos { 0, 0 }, 1597c23fec31Sangelos { 0, 0 }, 1598c23fec31Sangelos { 0, 0 }, 1599c23fec31Sangelos { 0, 0 }, 1600c23fec31Sangelos { 0, 0 }, 1601c23fec31Sangelos { 0, 0 }, 1602c23fec31Sangelos { 0, 0 }, 1603c23fec31Sangelos { 0, 0 }, 1604c23fec31Sangelos { 0, 0 }, 1605c23fec31Sangelos { 0, 0 }, 1606c23fec31Sangelos { 0, 0 }, 1607c23fec31Sangelos { 0, 0 }, 1608c23fec31Sangelos { 0, 0 }, 1609c23fec31Sangelos { 0, 0 }, 1610c23fec31Sangelos { 0, 0 }, 1611c23fec31Sangelos { 0, 0 }, 1612c23fec31Sangelos { 0, 0 }, 1613c23fec31Sangelos { 0, 0 }, 1614c23fec31Sangelos { 0, 0 }, 1615c23fec31Sangelos { 0, 0 }, 1616c23fec31Sangelos { 0, 0 }, 1617c23fec31Sangelos { 0, 0 }, 1618c23fec31Sangelos { 0, 0 }, 1619c23fec31Sangelos { etheripname, ETHERIPCTL_MAXID }, 1620d39fbd3cSjjbg { 0, 0 }, 1621d39fbd3cSjjbg { 0, 0 }, 1622d39fbd3cSjjbg { 0, 0 }, 1623d39fbd3cSjjbg { 0, 0 }, 1624d39fbd3cSjjbg { 0, 0 }, 1625d39fbd3cSjjbg { 0, 0 }, 1626d39fbd3cSjjbg { 0, 0 }, 1627d39fbd3cSjjbg { 0, 0 }, 1628d39fbd3cSjjbg { 0, 0 }, 1629d39fbd3cSjjbg { 0, 0 }, 1630d39fbd3cSjjbg { ipcompname, IPCOMPCTL_MAXID }, 1631c05683a6Smcbride { 0, 0 }, 1632c05683a6Smcbride { 0, 0 }, 1633c05683a6Smcbride { 0, 0 }, 1634c05683a6Smcbride { carpname, CARPCTL_MAXID }, 16357f1136baSderaadt { 0, 0 }, 16367f1136baSderaadt { 0, 0 }, 16377f1136baSderaadt { 0, 0 }, 16387f1136baSderaadt { 0, 0 }, 16397f1136baSderaadt { 0, 0 }, 16407f1136baSderaadt { 0, 0 }, 16417f1136baSderaadt { 0, 0 }, 16427f1136baSderaadt { 0, 0 }, 16437f1136baSderaadt { 0, 0 }, 16447f1136baSderaadt { 0, 0 }, 16457f1136baSderaadt { 0, 0 }, 16467f1136baSderaadt { 0, 0 }, 16477f1136baSderaadt { 0, 0 }, 16487f1136baSderaadt { 0, 0 }, 16497f1136baSderaadt { 0, 0 }, 16507f1136baSderaadt { 0, 0 }, 16517f1136baSderaadt { 0, 0 }, 16527f1136baSderaadt { 0, 0 }, 16537f1136baSderaadt { 0, 0 }, 16547f1136baSderaadt { 0, 0 }, 16557f1136baSderaadt { 0, 0 }, 16567f1136baSderaadt { 0, 0 }, 16577f1136baSderaadt { 0, 0 }, 16587f1136baSderaadt { 0, 0 }, 16597f1136baSderaadt { 0, 0 }, 16607f1136baSderaadt { 0, 0 }, 16617f1136baSderaadt { 0, 0 }, 16627f1136baSderaadt { 0, 0 }, 16637f1136baSderaadt { 0, 0 }, 16647f1136baSderaadt { 0, 0 }, 16657f1136baSderaadt { 0, 0 }, 16667f1136baSderaadt { 0, 0 }, 16677f1136baSderaadt { 0, 0 }, 16687f1136baSderaadt { 0, 0 }, 16697f1136baSderaadt { 0, 0 }, 16707f1136baSderaadt { 0, 0 }, 16717f1136baSderaadt { 0, 0 }, 16727f1136baSderaadt { 0, 0 }, 16737f1136baSderaadt { 0, 0 }, 16747f1136baSderaadt { 0, 0 }, 16757f1136baSderaadt { 0, 0 }, 16767f1136baSderaadt { 0, 0 }, 16777f1136baSderaadt { 0, 0 }, 16787f1136baSderaadt { 0, 0 }, 16797f1136baSderaadt { 0, 0 }, 16807f1136baSderaadt { 0, 0 }, 16817f1136baSderaadt { 0, 0 }, 16827f1136baSderaadt { 0, 0 }, 16837f1136baSderaadt { 0, 0 }, 16847f1136baSderaadt { 0, 0 }, 16857f1136baSderaadt { 0, 0 }, 16867f1136baSderaadt { 0, 0 }, 16877f1136baSderaadt { 0, 0 }, 16887f1136baSderaadt { 0, 0 }, 16897f1136baSderaadt { 0, 0 }, 16907f1136baSderaadt { 0, 0 }, 16917f1136baSderaadt { 0, 0 }, 16927f1136baSderaadt { 0, 0 }, 16937f1136baSderaadt { 0, 0 }, 16947f1136baSderaadt { 0, 0 }, 16957f1136baSderaadt { 0, 0 }, 16967f1136baSderaadt { 0, 0 }, 16977f1136baSderaadt { 0, 0 }, 16987f1136baSderaadt { 0, 0 }, 16997f1136baSderaadt { 0, 0 }, 17007f1136baSderaadt { 0, 0 }, 17017f1136baSderaadt { 0, 0 }, 17027f1136baSderaadt { 0, 0 }, 17037f1136baSderaadt { 0, 0 }, 17047f1136baSderaadt { 0, 0 }, 17057f1136baSderaadt { 0, 0 }, 17067f1136baSderaadt { 0, 0 }, 17077f1136baSderaadt { 0, 0 }, 17087f1136baSderaadt { 0, 0 }, 17097f1136baSderaadt { 0, 0 }, 17107f1136baSderaadt { 0, 0 }, 17117f1136baSderaadt { 0, 0 }, 17127f1136baSderaadt { 0, 0 }, 17137f1136baSderaadt { 0, 0 }, 17147f1136baSderaadt { 0, 0 }, 17157f1136baSderaadt { 0, 0 }, 17167f1136baSderaadt { 0, 0 }, 17177f1136baSderaadt { 0, 0 }, 17187f1136baSderaadt { 0, 0 }, 17197f1136baSderaadt { 0, 0 }, 17207f1136baSderaadt { 0, 0 }, 17217f1136baSderaadt { 0, 0 }, 17227f1136baSderaadt { 0, 0 }, 17237f1136baSderaadt { 0, 0 }, 17247f1136baSderaadt { 0, 0 }, 17257f1136baSderaadt { 0, 0 }, 17267f1136baSderaadt { 0, 0 }, 17277f1136baSderaadt { 0, 0 }, 17287f1136baSderaadt { 0, 0 }, 17297f1136baSderaadt { 0, 0 }, 17307f1136baSderaadt { 0, 0 }, 17317f1136baSderaadt { 0, 0 }, 17327f1136baSderaadt { 0, 0 }, 17337f1136baSderaadt { 0, 0 }, 17347f1136baSderaadt { 0, 0 }, 17357f1136baSderaadt { 0, 0 }, 17367f1136baSderaadt { 0, 0 }, 17377f1136baSderaadt { 0, 0 }, 17387f1136baSderaadt { 0, 0 }, 17397f1136baSderaadt { 0, 0 }, 17407f1136baSderaadt { 0, 0 }, 17417f1136baSderaadt { 0, 0 }, 17427f1136baSderaadt { 0, 0 }, 17437f1136baSderaadt { 0, 0 }, 17447f1136baSderaadt { 0, 0 }, 17457f1136baSderaadt { 0, 0 }, 17467f1136baSderaadt { 0, 0 }, 17477f1136baSderaadt { 0, 0 }, 17487f1136baSderaadt { 0, 0 }, 17497f1136baSderaadt { 0, 0 }, 17507f1136baSderaadt { 0, 0 }, 17517f1136baSderaadt { 0, 0 }, 17527f1136baSderaadt { 0, 0 }, 17537f1136baSderaadt { 0, 0 }, 17547f1136baSderaadt { 0, 0 }, 17557f1136baSderaadt { 0, 0 }, 17567f1136baSderaadt { 0, 0 }, 17577f1136baSderaadt { 0, 0 }, 17587f1136baSderaadt { 0, 0 }, 17597f1136baSderaadt { 0, 0 }, 17607f1136baSderaadt { 0, 0 }, 17617f1136baSderaadt { 0, 0 }, 17627f1136baSderaadt { 0, 0 }, 17637cbbb26bSmichele { 0, 0 }, 17647f1136baSderaadt { 0, 0 }, 17657f1136baSderaadt { 0, 0 }, 17667f1136baSderaadt { 0, 0 }, 17677f1136baSderaadt { 0, 0 }, 17687f1136baSderaadt { 0, 0 }, 17697f1136baSderaadt { 0, 0 }, 17707f1136baSderaadt { 0, 0 }, 17717f1136baSderaadt { pfsyncname, PFSYNCCTL_MAXID }, 1772d85f7bc1Smichele { 0, 0 }, 1773d85f7bc1Smichele { 0, 0 }, 1774d85f7bc1Smichele { 0, 0 }, 1775d85f7bc1Smichele { 0, 0 }, 1776d85f7bc1Smichele { 0, 0 }, 1777d85f7bc1Smichele { 0, 0 }, 1778d85f7bc1Smichele { 0, 0 }, 1779d85f7bc1Smichele { 0, 0 }, 1780d85f7bc1Smichele { divertname, DIVERTCTL_MAXID }, 1781df930be7Sderaadt }; 178216cc1d58Stedu struct list bpflist = { bpfname, NET_BPF_MAXID }; 178310c1d3acSmarkus struct list ifqlist = { ifqname, IFQCTL_MAXID }; 178490b03482Syasuoka struct list pipexlist = { pipexname, PIPEXCTL_MAXID }; 1785df930be7Sderaadt 178690a6e042Sangelos struct list kernmalloclist = { kernmallocname, KERN_MALLOC_MAXID }; 17877a2c17d9Sangelos struct list forkstatlist = { forkstatname, KERN_FORKSTAT_MAXID }; 17887a2c17d9Sangelos struct list nchstatslist = { nchstatsname, KERN_NCHSTATS_MAXID }; 17890a0a96e6Sderaadt struct list ttylist = { ttysname, KERN_TTY_MAXID }; 1790cbdb86d9Smillert struct list semlist = { semname, KERN_SEMINFO_MAXID }; 1791cbdb86d9Smillert struct list shmlist = { shmname, KERN_SHMINFO_MAXID }; 1792f206784aSmarkus struct list watchdoglist = { watchdogname, KERN_WATCHDOG_MAXID }; 17933751347eStholo struct list tclist = { tcname, KERN_TIMECOUNTER_MAXID }; 1794bb548dc4Sratchov struct list audiolist = { audioname, KERN_AUDIO_MAXID }; 17951b800d6dSmglocker struct list videolist = { videoname, KERN_VIDEO_MAXID }; 17960f480091Svisa struct list witnesslist = { witnessname, KERN_WITNESS_MAXID }; 179722acc011Skettenis struct list batterylist = { batteryname, HW_BATTERY_MAXID }; 17987a2c17d9Sangelos 17997a2c17d9Sangelos /* 18007a2c17d9Sangelos * handle vfs namei cache statistics 18017a2c17d9Sangelos */ 18027a2c17d9Sangelos int 1803bc52e260Sderaadt sysctl_nchstats(char *string, char **bufpp, int mib[], int flags, int *typep) 18047a2c17d9Sangelos { 18057a2c17d9Sangelos static struct nchstats nch; 18067a2c17d9Sangelos int indx; 18077a2c17d9Sangelos size_t size; 18087a2c17d9Sangelos static int keepvalue = 0; 18097a2c17d9Sangelos 18107a2c17d9Sangelos if (*bufpp == NULL) { 18117a2c17d9Sangelos bzero(&nch, sizeof(struct nchstats)); 18127a2c17d9Sangelos listall(string, &nchstatslist); 18137a2c17d9Sangelos return (-1); 18147a2c17d9Sangelos } 18157a2c17d9Sangelos if ((indx = findname(string, "third", bufpp, &nchstatslist)) == -1) 18167a2c17d9Sangelos return (-1); 18177a2c17d9Sangelos mib[2] = indx; 18187a2c17d9Sangelos if (*bufpp != NULL) { 18197a2c17d9Sangelos warnx("fourth level name in %s is invalid", string); 18207a2c17d9Sangelos return (-1); 18217a2c17d9Sangelos } 18227a2c17d9Sangelos if (keepvalue == 0) { 18237a2c17d9Sangelos size = sizeof(struct nchstats); 1824df69c215Sderaadt if (sysctl(mib, 2, &nch, &size, NULL, 0) == -1) 18257a2c17d9Sangelos return (-1); 18267a2c17d9Sangelos keepvalue = 1; 18277a2c17d9Sangelos } 18287a2c17d9Sangelos if (!nflag) 182985316beeSderaadt (void)printf("%s%s", string, equ); 18307a2c17d9Sangelos switch (indx) { 18317a2c17d9Sangelos case KERN_NCHSTATS_GOODHITS: 183279f964e7Sthib (void)printf("%llu\n", nch.ncs_goodhits); 18337a2c17d9Sangelos break; 18347a2c17d9Sangelos case KERN_NCHSTATS_NEGHITS: 183579f964e7Sthib (void)printf("%llu\n", nch.ncs_neghits); 18367a2c17d9Sangelos break; 18377a2c17d9Sangelos case KERN_NCHSTATS_BADHITS: 183879f964e7Sthib (void)printf("%llu\n", nch.ncs_badhits); 18397a2c17d9Sangelos break; 18407a2c17d9Sangelos case KERN_NCHSTATS_FALSEHITS: 184179f964e7Sthib (void)printf("%llu\n", nch.ncs_falsehits); 18427a2c17d9Sangelos break; 18437a2c17d9Sangelos case KERN_NCHSTATS_MISS: 184479f964e7Sthib (void)printf("%llu\n", nch.ncs_miss); 18457a2c17d9Sangelos break; 18467a2c17d9Sangelos case KERN_NCHSTATS_LONG: 184779f964e7Sthib (void)printf("%llu\n", nch.ncs_long); 18487a2c17d9Sangelos break; 18497a2c17d9Sangelos case KERN_NCHSTATS_PASS2: 185079f964e7Sthib (void)printf("%llu\n", nch.ncs_pass2); 18517a2c17d9Sangelos break; 18527a2c17d9Sangelos case KERN_NCHSTATS_2PASSES: 185379f964e7Sthib (void)printf("%llu\n", nch.ncs_2passes); 18547a2c17d9Sangelos break; 1855337c26f4Smiod case KERN_NCHSTATS_REVHITS: 185679f964e7Sthib (void)printf("%llu\n", nch.ncs_revhits); 1857337c26f4Smiod break; 1858337c26f4Smiod case KERN_NCHSTATS_REVMISS: 185979f964e7Sthib (void)printf("%llu\n", nch.ncs_revmiss); 186079f964e7Sthib break; 186179f964e7Sthib case KERN_NCHSTATS_DOTHITS: 186279f964e7Sthib (void)printf("%llu\n", nch.ncs_dothits); 186379f964e7Sthib break; 186479f964e7Sthib case KERN_NCHSTATS_DOTDOTHITS: 186579f964e7Sthib (void)printf("%llu\n", nch.ncs_dotdothits); 1866337c26f4Smiod break; 18677a2c17d9Sangelos } 18687a2c17d9Sangelos return (-1); 18697a2c17d9Sangelos } 18707a2c17d9Sangelos 18717a2c17d9Sangelos /* 1872994bae0eSangelos * handle tty statistics 1873994bae0eSangelos */ 1874994bae0eSangelos int 1875bc52e260Sderaadt sysctl_tty(char *string, char **bufpp, int mib[], int flags, int *typep) 1876994bae0eSangelos { 1877994bae0eSangelos int indx; 1878994bae0eSangelos 1879994bae0eSangelos if (*bufpp == NULL) { 1880994bae0eSangelos listall(string, &ttylist); 1881994bae0eSangelos return (-1); 1882994bae0eSangelos } 1883994bae0eSangelos if ((indx = findname(string, "third", bufpp, &ttylist)) == -1) 1884994bae0eSangelos return (-1); 1885994bae0eSangelos mib[2] = indx; 1886f3d9c296Smillert 1887f3d9c296Smillert if ((*typep = ttylist.list[indx].ctl_type) == CTLTYPE_STRUCT) { 1888f3d9c296Smillert if (flags) 1889f3d9c296Smillert warnx("use pstat -t to view %s information", 1890f3d9c296Smillert string); 1891f3d9c296Smillert return (-1); 1892f3d9c296Smillert } 1893994bae0eSangelos return (3); 1894994bae0eSangelos } 1895994bae0eSangelos 1896994bae0eSangelos /* 18977a2c17d9Sangelos * handle fork statistics 18987a2c17d9Sangelos */ 18997a2c17d9Sangelos int 1900bc52e260Sderaadt sysctl_forkstat(char *string, char **bufpp, int mib[], int flags, int *typep) 19017a2c17d9Sangelos { 19027a2c17d9Sangelos static struct forkstat fks; 19037a2c17d9Sangelos static int keepvalue = 0; 19047a2c17d9Sangelos int indx; 19057a2c17d9Sangelos size_t size; 19067a2c17d9Sangelos 19077a2c17d9Sangelos if (*bufpp == NULL) { 19087a2c17d9Sangelos bzero(&fks, sizeof(struct forkstat)); 19097a2c17d9Sangelos listall(string, &forkstatlist); 19107a2c17d9Sangelos return (-1); 19117a2c17d9Sangelos } 19127a2c17d9Sangelos if ((indx = findname(string, "third", bufpp, &forkstatlist)) == -1) 19137a2c17d9Sangelos return (-1); 19147a2c17d9Sangelos if (*bufpp != NULL) { 19157a2c17d9Sangelos warnx("fourth level name in %s is invalid", string); 19167a2c17d9Sangelos return (-1); 19177a2c17d9Sangelos } 19187a2c17d9Sangelos if (keepvalue == 0) { 19197a2c17d9Sangelos size = sizeof(struct forkstat); 1920df69c215Sderaadt if (sysctl(mib, 2, &fks, &size, NULL, 0) == -1) 19217a2c17d9Sangelos return (-1); 19227a2c17d9Sangelos keepvalue = 1; 19237a2c17d9Sangelos } 19247a2c17d9Sangelos if (!nflag) 192585316beeSderaadt (void)printf("%s%s", string, equ); 19267a2c17d9Sangelos switch (indx) { 19277a2c17d9Sangelos case KERN_FORKSTAT_FORK: 1928760c98b7Stedu (void)printf("%u\n", fks.cntfork); 19297a2c17d9Sangelos break; 19307a2c17d9Sangelos case KERN_FORKSTAT_VFORK: 1931760c98b7Stedu (void)printf("%u\n", fks.cntvfork); 19327a2c17d9Sangelos break; 193378f78c26Sderaadt case KERN_FORKSTAT_TFORK: 1934760c98b7Stedu (void)printf("%u\n", fks.cnttfork); 19357a2c17d9Sangelos break; 19367a2c17d9Sangelos case KERN_FORKSTAT_KTHREAD: 1937760c98b7Stedu (void)printf("%u\n", fks.cntkthread); 19387a2c17d9Sangelos break; 19397a2c17d9Sangelos case KERN_FORKSTAT_SIZFORK: 1940760c98b7Stedu (void)printf("%llu\n", fks.sizfork); 19417a2c17d9Sangelos break; 19427a2c17d9Sangelos case KERN_FORKSTAT_SIZVFORK: 1943760c98b7Stedu (void)printf("%llu\n", fks.sizvfork); 19447a2c17d9Sangelos break; 194578f78c26Sderaadt case KERN_FORKSTAT_SIZTFORK: 1946760c98b7Stedu (void)printf("%llu\n", fks.siztfork); 19477a2c17d9Sangelos break; 19487a2c17d9Sangelos case KERN_FORKSTAT_SIZKTHREAD: 1949760c98b7Stedu (void)printf("%llu\n", fks.sizkthread); 19507a2c17d9Sangelos break; 19517a2c17d9Sangelos } 19527a2c17d9Sangelos return (-1); 19537a2c17d9Sangelos } 195490a6e042Sangelos 195590a6e042Sangelos /* 195690a6e042Sangelos * handle malloc statistics 195790a6e042Sangelos */ 195890a6e042Sangelos int 1959bc52e260Sderaadt sysctl_malloc(char *string, char **bufpp, int mib[], int flags, int *typep) 196090a6e042Sangelos { 19617a2c17d9Sangelos int indx, stor, i; 1962c8a0bd93Sdjm char *name, bufp[SYSCTL_BUFSIZ], *buf, *ptr; 1963a47b6461Sderaadt const char *errstr; 196490a6e042Sangelos struct list lp; 19657a2c17d9Sangelos size_t size; 196690a6e042Sangelos 196790a6e042Sangelos if (*bufpp == NULL) { 196890a6e042Sangelos listall(string, &kernmalloclist); 196990a6e042Sangelos return (-1); 197090a6e042Sangelos } 197190a6e042Sangelos if ((indx = findname(string, "third", bufpp, &kernmalloclist)) == -1) 197290a6e042Sangelos return (-1); 197390a6e042Sangelos mib[2] = indx; 197490a6e042Sangelos if (mib[2] == KERN_MALLOC_BUCKET) { 197590a6e042Sangelos if ((name = strsep(bufpp, ".")) == NULL) { 1976c8a0bd93Sdjm size = SYSCTL_BUFSIZ; 197790a6e042Sangelos stor = mib[2]; 197890a6e042Sangelos mib[2] = KERN_MALLOC_BUCKETS; 197990a6e042Sangelos buf = bufp; 1980df69c215Sderaadt if (sysctl(mib, 3, buf, &size, NULL, 0) == -1) 198190a6e042Sangelos return (-1); 198290a6e042Sangelos mib[2] = stor; 198390a6e042Sangelos for (stor = 0, i = 0; i < size; i++) 198490a6e042Sangelos if (buf[i] == ',') 198590a6e042Sangelos stor++; 198690a6e042Sangelos lp.list = calloc(stor + 2, sizeof(struct ctlname)); 198790a6e042Sangelos if (lp.list == NULL) 198890a6e042Sangelos return (-1); 198990a6e042Sangelos lp.size = stor + 2; 1990216ea12aSotto for (i = 1; (ptr = strsep(&buf, ",")) != NULL; i++) { 1991216ea12aSotto lp.list[i].ctl_name = ptr; 1992ccc806e8Sangelos lp.list[i].ctl_type = CTLTYPE_STRUCT; 199390a6e042Sangelos } 199490a6e042Sangelos listall(string, &lp); 199590a6e042Sangelos free(lp.list); 199690a6e042Sangelos return (-1); 199790a6e042Sangelos } 1998a47b6461Sderaadt mib[3] = strtonum(name, 0, INT_MAX, &errstr); 1999a47b6461Sderaadt if (errstr) 2000a47b6461Sderaadt return -1; 2001ccc806e8Sangelos return (4); 20027a2c17d9Sangelos } else if (mib[2] == KERN_MALLOC_BUCKETS) { 20037a2c17d9Sangelos *typep = CTLTYPE_STRING; 20047a2c17d9Sangelos return (3); 20057a2c17d9Sangelos } else if (mib[2] == KERN_MALLOC_KMEMSTATS) { 2006c8a0bd93Sdjm size = SYSCTL_BUFSIZ; 20077a2c17d9Sangelos stor = mib[2]; 20087a2c17d9Sangelos mib[2] = KERN_MALLOC_KMEMNAMES; 20097a2c17d9Sangelos buf = bufp; 2010df69c215Sderaadt if (sysctl(mib, 3, buf, &size, NULL, 0) == -1) 20117a2c17d9Sangelos return (-1); 20127a2c17d9Sangelos mib[2] = stor; 20137a2c17d9Sangelos if ((name = strsep(bufpp, ".")) == NULL) { 20147a2c17d9Sangelos for (stor = 0, i = 0; i < size; i++) 20157a2c17d9Sangelos if (buf[i] == ',') 20167a2c17d9Sangelos stor++; 20177a2c17d9Sangelos lp.list = calloc(stor + 2, sizeof(struct ctlname)); 20187a2c17d9Sangelos if (lp.list == NULL) 20197a2c17d9Sangelos return (-1); 20207a2c17d9Sangelos lp.size = stor + 2; 20210a1a46faSotto for (i = 1; (ptr = strsep(&buf, ",")) != NULL; i++) { 20220a1a46faSotto if (ptr[0] == '\0') { 2023994bae0eSangelos i--; 2024994bae0eSangelos continue; 2025994bae0eSangelos } 20260a1a46faSotto lp.list[i].ctl_name = ptr; 20277a2c17d9Sangelos lp.list[i].ctl_type = CTLTYPE_STRUCT; 20287a2c17d9Sangelos } 20297a2c17d9Sangelos listall(string, &lp); 20307a2c17d9Sangelos free(lp.list); 20317a2c17d9Sangelos return (-1); 20327a2c17d9Sangelos } 20337a2c17d9Sangelos ptr = strstr(buf, name); 2034f1b24139Sangelos tryagain: 2035f1b24139Sangelos if (ptr == NULL) { 2036f1b24139Sangelos warnx("fourth level name %s in %s is invalid", name, 2037f1b24139Sangelos string); 20387a2c17d9Sangelos return (-1); 2039f1b24139Sangelos } 20407a2c17d9Sangelos if ((*(ptr + strlen(name)) != ',') && 2041f1b24139Sangelos (*(ptr + strlen(name)) != '\0')) { 2042f1b24139Sangelos ptr = strstr(ptr + 1, name); /* retry */ 2043f1b24139Sangelos goto tryagain; 2044f1b24139Sangelos } 2045f1b24139Sangelos if ((ptr != buf) && (*(ptr - 1) != ',')) { 2046f1b24139Sangelos ptr = strstr(ptr + 1, name); /* retry */ 2047f1b24139Sangelos goto tryagain; 2048f1b24139Sangelos } 20497a2c17d9Sangelos for (i = 0, stor = 0; buf + i < ptr; i++) 20507a2c17d9Sangelos if (buf[i] == ',') 20517a2c17d9Sangelos stor++; 20527a2c17d9Sangelos mib[3] = stor; 20537a2c17d9Sangelos return (4); 20547a2c17d9Sangelos } else if (mib[2] == KERN_MALLOC_KMEMNAMES) { 205590a6e042Sangelos *typep = CTLTYPE_STRING; 205690a6e042Sangelos return (3); 205790a6e042Sangelos } 20587a2c17d9Sangelos return (-1); 205990a6e042Sangelos } 206090a6e042Sangelos 2061c783c1d9Smatthieu #ifdef CPU_CHIPSET 2062c783c1d9Smatthieu /* 2063c783c1d9Smatthieu * handle machdep.chipset requests 2064c783c1d9Smatthieu */ 2065c783c1d9Smatthieu struct ctlname chipsetname[] = CTL_CHIPSET_NAMES; 2066c783c1d9Smatthieu struct list chipsetlist = { chipsetname, CPU_CHIPSET_MAXID }; 2067c783c1d9Smatthieu 2068c783c1d9Smatthieu int 2069bc52e260Sderaadt sysctl_chipset(char *string, char **bufpp, int mib[], int flags, int *typep) 2070c783c1d9Smatthieu { 2071c783c1d9Smatthieu int indx, bwx; 2072c783c1d9Smatthieu static void *q; 2073c783c1d9Smatthieu size_t len; 2074c783c1d9Smatthieu char *p; 2075c783c1d9Smatthieu 2076c783c1d9Smatthieu if (*bufpp == NULL) { 2077c783c1d9Smatthieu listall(string, &chipsetlist); 2078c783c1d9Smatthieu return (-1); 2079c783c1d9Smatthieu } 2080c783c1d9Smatthieu if ((indx = findname(string, "third", bufpp, &chipsetlist)) == -1) 2081c783c1d9Smatthieu return (-1); 2082c783c1d9Smatthieu mib[2] = indx; 2083c783c1d9Smatthieu if (!nflag) 208485316beeSderaadt printf("%s%s", string, equ); 2085c783c1d9Smatthieu switch(mib[2]) { 2086c783c1d9Smatthieu case CPU_CHIPSET_MEM: 2087c783c1d9Smatthieu case CPU_CHIPSET_DENSE: 2088c783c1d9Smatthieu case CPU_CHIPSET_PORTS: 2089c783c1d9Smatthieu case CPU_CHIPSET_HAE_MASK: 2090c783c1d9Smatthieu len = sizeof(void *); 2091df69c215Sderaadt if (sysctl(mib, 3, &q, &len, NULL, 0) == -1) 2092ab3d64f6Smiod goto done; 2093ab3d64f6Smiod printf("%p", q); 2094c783c1d9Smatthieu break; 2095c783c1d9Smatthieu case CPU_CHIPSET_BWX: 2096c783c1d9Smatthieu len = sizeof(int); 2097df69c215Sderaadt if (sysctl(mib, 3, &bwx, &len, NULL, 0) == -1) 2098ab3d64f6Smiod goto done; 2099ab3d64f6Smiod printf("%d", bwx); 2100c783c1d9Smatthieu break; 2101c783c1d9Smatthieu case CPU_CHIPSET_TYPE: 2102df69c215Sderaadt if (sysctl(mib, 3, NULL, &len, NULL, 0) == -1) 2103ab3d64f6Smiod goto done; 2104c783c1d9Smatthieu p = malloc(len + 1); 2105c783c1d9Smatthieu if (p == NULL) 2106ab3d64f6Smiod goto done; 2107df69c215Sderaadt if (sysctl(mib, 3, p, &len, NULL, 0) == -1) { 210893022208Sderaadt free(p); 2109ab3d64f6Smiod goto done; 211093022208Sderaadt } 2111c783c1d9Smatthieu p[len] = '\0'; 2112ab3d64f6Smiod printf("%s", p); 21133f7c904cSderaadt free(p); 2114c783c1d9Smatthieu break; 2115c783c1d9Smatthieu } 2116ab3d64f6Smiod done: 2117ab3d64f6Smiod printf("\n"); 2118c783c1d9Smatthieu return (-1); 2119c783c1d9Smatthieu } 2120c783c1d9Smatthieu #endif 2121df930be7Sderaadt /* 2122df930be7Sderaadt * handle internet requests 2123df930be7Sderaadt */ 2124f712e2a0Smickey int 2125bc52e260Sderaadt sysctl_inet(char *string, char **bufpp, int mib[], int flags, int *typep) 2126df930be7Sderaadt { 2127df930be7Sderaadt struct list *lp; 2128df930be7Sderaadt int indx; 2129df930be7Sderaadt 2130df930be7Sderaadt if (*bufpp == NULL) { 2131df930be7Sderaadt listall(string, &inetlist); 2132df930be7Sderaadt return (-1); 2133df930be7Sderaadt } 2134df930be7Sderaadt if ((indx = findname(string, "third", bufpp, &inetlist)) == -1) 2135df930be7Sderaadt return (-1); 2136df930be7Sderaadt mib[2] = indx; 2137253ba047Sniklas if (indx < IPPROTO_MAXID && inetvars[indx].list != NULL) 2138df930be7Sderaadt lp = &inetvars[indx]; 2139df930be7Sderaadt else if (!flags) 2140df930be7Sderaadt return (-1); 2141df930be7Sderaadt else { 2142c5956181Smillert warnx("%s: no variables defined for this protocol", string); 2143df930be7Sderaadt return (-1); 2144df930be7Sderaadt } 2145df930be7Sderaadt if (*bufpp == NULL) { 2146df930be7Sderaadt listall(string, lp); 2147df930be7Sderaadt return (-1); 2148df930be7Sderaadt } 2149df930be7Sderaadt if ((indx = findname(string, "fourth", bufpp, lp)) == -1) 2150df930be7Sderaadt return (-1); 2151df930be7Sderaadt mib[3] = indx; 2152df930be7Sderaadt *typep = lp->list[indx].ctl_type; 215310c1d3acSmarkus if (*typep == CTLTYPE_NODE) { 215410c1d3acSmarkus int tindx; 215510c1d3acSmarkus 21568e69f93cScnst if (*bufpp == NULL) { 215710c1d3acSmarkus listall(string, &ifqlist); 215810c1d3acSmarkus return(-1); 215910c1d3acSmarkus } 216010c1d3acSmarkus lp = &ifqlist; 216110c1d3acSmarkus if ((tindx = findname(string, "fifth", bufpp, lp)) == -1) 216210c1d3acSmarkus return (-1); 216310c1d3acSmarkus mib[4] = tindx; 216410c1d3acSmarkus *typep = lp->list[tindx].ctl_type; 216510c1d3acSmarkus return(5); 216610c1d3acSmarkus } 2167df930be7Sderaadt return (4); 2168df930be7Sderaadt } 2169df930be7Sderaadt 2170090f9bdcSitojun struct ctlname inet6name[] = CTL_IPV6PROTO_NAMES; 2171090f9bdcSitojun struct ctlname ip6name[] = IPV6CTL_NAMES; 2172090f9bdcSitojun struct ctlname icmp6name[] = ICMPV6CTL_NAMES; 2173af7905a8Smichele struct ctlname divert6name[] = DIVERT6CTL_NAMES; 2174090f9bdcSitojun struct list inet6list = { inet6name, IPV6PROTO_MAXID }; 2175090f9bdcSitojun struct list inet6vars[] = { 2176090f9bdcSitojun /*0*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2177090f9bdcSitojun { 0, 0 }, 2178090f9bdcSitojun { 0, 0 }, 2179090f9bdcSitojun { 0, 0 }, 2180090f9bdcSitojun { 0, 0 }, 2181090f9bdcSitojun { 0, 0 }, 2182090f9bdcSitojun /*10*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2183090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2184090f9bdcSitojun /*20*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2185090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2186090f9bdcSitojun /*30*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2187090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2188090f9bdcSitojun /*40*/ { 0, 0 }, 2189090f9bdcSitojun { ip6name, IPV6CTL_MAXID }, /* ipv6 */ 2190090f9bdcSitojun { 0, 0 }, 2191090f9bdcSitojun { 0, 0 }, 2192090f9bdcSitojun { 0, 0 }, 2193090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2194090f9bdcSitojun /*50*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2195090f9bdcSitojun { 0, 0 }, 2196090f9bdcSitojun { 0, 0 }, 2197090f9bdcSitojun { 0, 0 }, 2198090f9bdcSitojun { icmp6name, ICMPV6CTL_MAXID }, /* icmp6 */ 2199090f9bdcSitojun { 0, 0 }, 2200090f9bdcSitojun /*60*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2201090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2202090f9bdcSitojun /*70*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2203090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2204090f9bdcSitojun /*80*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2205090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2206090f9bdcSitojun /*90*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2207090f9bdcSitojun { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2208090f9bdcSitojun /*100*/ { 0, 0 }, 2209090f9bdcSitojun { 0, 0 }, 2210090f9bdcSitojun { 0, 0 }, 2211d1dc8a2bSrzalamena { 0, 0 }, /* pim6 */ 2212af7905a8Smichele { 0, 0 }, 2213af7905a8Smichele { 0, 0 }, 2214af7905a8Smichele { 0, 0 }, 2215af7905a8Smichele { 0, 0 }, 2216af7905a8Smichele { 0, 0 }, 2217af7905a8Smichele { 0, 0 }, 2218af7905a8Smichele /*110*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2219af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2220af7905a8Smichele /*120*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2221af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2222af7905a8Smichele /*130*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2223af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2224af7905a8Smichele /*140*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2225af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2226af7905a8Smichele /*150*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2227af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2228af7905a8Smichele /*160*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2229af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2230af7905a8Smichele /*170*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2231af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2232af7905a8Smichele /*180*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2233af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2234af7905a8Smichele /*190*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2235af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2236af7905a8Smichele /*200*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2237af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2238af7905a8Smichele /*210*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2239af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2240af7905a8Smichele /*220*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2241af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2242af7905a8Smichele /*230*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2243af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2244af7905a8Smichele /*240*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2245af7905a8Smichele { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, 2246af7905a8Smichele /*250*/ { 0, 0 }, 2247af7905a8Smichele { 0, 0 }, 2248af7905a8Smichele { 0, 0 }, 2249af7905a8Smichele { 0, 0 }, 2250af7905a8Smichele { 0, 0 }, 2251af7905a8Smichele { 0, 0 }, 2252af7905a8Smichele { 0, 0 }, 2253af7905a8Smichele { 0, 0 }, 2254af7905a8Smichele { divert6name, DIVERT6CTL_MAXID }, 2255090f9bdcSitojun }; 2256090f9bdcSitojun 2257090f9bdcSitojun /* 2258090f9bdcSitojun * handle internet6 requests 2259090f9bdcSitojun */ 2260090f9bdcSitojun int 2261bc52e260Sderaadt sysctl_inet6(char *string, char **bufpp, int mib[], int flags, int *typep) 2262090f9bdcSitojun { 2263090f9bdcSitojun struct list *lp; 2264090f9bdcSitojun int indx; 2265090f9bdcSitojun 2266090f9bdcSitojun if (*bufpp == NULL) { 2267090f9bdcSitojun listall(string, &inet6list); 2268090f9bdcSitojun return (-1); 2269090f9bdcSitojun } 2270090f9bdcSitojun if ((indx = findname(string, "third", bufpp, &inet6list)) == -1) 2271090f9bdcSitojun return (-1); 2272090f9bdcSitojun mib[2] = indx; 2273090f9bdcSitojun if (indx < IPV6PROTO_MAXID && inet6vars[indx].list != NULL) 2274090f9bdcSitojun lp = &inet6vars[indx]; 2275090f9bdcSitojun else if (!flags) 2276090f9bdcSitojun return (-1); 2277090f9bdcSitojun else { 2278090f9bdcSitojun warnx("%s: no variables defined for this protocol", string); 2279090f9bdcSitojun return (-1); 2280090f9bdcSitojun } 2281090f9bdcSitojun if (*bufpp == NULL) { 2282090f9bdcSitojun listall(string, lp); 2283090f9bdcSitojun return (-1); 2284090f9bdcSitojun } 2285090f9bdcSitojun if ((indx = findname(string, "fourth", bufpp, lp)) == -1) 2286090f9bdcSitojun return (-1); 2287090f9bdcSitojun mib[3] = indx; 2288090f9bdcSitojun *typep = lp->list[indx].ctl_type; 228967451457Sdlg if (*typep == CTLTYPE_NODE) { 229067451457Sdlg int tindx; 229167451457Sdlg 229267451457Sdlg if (*bufpp == NULL) { 229367451457Sdlg listall(string, &ifqlist); 229467451457Sdlg return(-1); 229567451457Sdlg } 229667451457Sdlg lp = &ifqlist; 229767451457Sdlg if ((tindx = findname(string, "fifth", bufpp, lp)) == -1) 229867451457Sdlg return (-1); 229967451457Sdlg mib[4] = tindx; 230067451457Sdlg *typep = lp->list[tindx].ctl_type; 230167451457Sdlg return(5); 230267451457Sdlg } 2303090f9bdcSitojun return (4); 2304090f9bdcSitojun } 2305090f9bdcSitojun 2306f092c5e8Sclaudio /* handle net.unix requests */ 2307f092c5e8Sclaudio struct ctlname netunixname[] = CTL_NET_UNIX_NAMES; 2308f092c5e8Sclaudio struct ctlname netunixprotoname[] = CTL_NET_UNIX_PROTO_NAMES; 2309f092c5e8Sclaudio struct list netunixlist = { netunixname, NET_UNIX_MAXID }; 2310f092c5e8Sclaudio struct list netunixvars[] = { 2311f092c5e8Sclaudio [SOCK_STREAM] = { netunixprotoname, NET_UNIX_PROTO_MAXID }, 2312f092c5e8Sclaudio [SOCK_DGRAM] = { netunixprotoname, NET_UNIX_PROTO_MAXID }, 2313f092c5e8Sclaudio [SOCK_SEQPACKET] = { netunixprotoname, NET_UNIX_PROTO_MAXID }, 2314f092c5e8Sclaudio [NET_UNIX_MAXID] = { 0, 0 }, 2315f092c5e8Sclaudio }; 2316f092c5e8Sclaudio 2317f092c5e8Sclaudio int 2318f092c5e8Sclaudio sysctl_unix(char *string, char **bufpp, int mib[], int flags, int *typep) 2319f092c5e8Sclaudio { 2320f092c5e8Sclaudio struct list *lp; 2321f092c5e8Sclaudio int indx; 2322f092c5e8Sclaudio 2323f092c5e8Sclaudio if (*bufpp == NULL) { 2324f092c5e8Sclaudio listall(string, &netunixlist); 2325f092c5e8Sclaudio return (-1); 2326f092c5e8Sclaudio } 2327f092c5e8Sclaudio if ((indx = findname(string, "third", bufpp, &netunixlist)) == -1) 2328f092c5e8Sclaudio return (-1); 2329f092c5e8Sclaudio mib[2] = indx; 2330f092c5e8Sclaudio *typep = netunixname[indx].ctl_type; 2331f092c5e8Sclaudio 2332f092c5e8Sclaudio if (indx < NET_UNIX_MAXID && netunixvars[indx].list != NULL) 2333f092c5e8Sclaudio lp = &netunixvars[indx]; 2334f092c5e8Sclaudio else 2335f092c5e8Sclaudio return (3); 2336f092c5e8Sclaudio 2337f092c5e8Sclaudio if (*bufpp == NULL) { 2338f092c5e8Sclaudio listall(string, lp); 2339f092c5e8Sclaudio return (-1); 2340f092c5e8Sclaudio } 2341f092c5e8Sclaudio if ((indx = findname(string, "fourth", bufpp, lp)) == -1) 2342f092c5e8Sclaudio return (-1); 2343f092c5e8Sclaudio mib[3] = indx; 2344f092c5e8Sclaudio *typep = lp->list[indx].ctl_type; 2345f092c5e8Sclaudio return (4); 2346f092c5e8Sclaudio } 2347f092c5e8Sclaudio 23485243d0adSdlg /* handle net.link requests */ 23495243d0adSdlg struct ctlname netlinkname[] = CTL_NET_LINK_NAMES; 23505243d0adSdlg struct ctlname ifrxqname[] = CTL_NET_LINK_IFRXQ_NAMES; 23515243d0adSdlg struct list netlinklist = { netlinkname, NET_LINK_MAXID }; 23525243d0adSdlg struct list netlinkvars[] = { 23535243d0adSdlg [NET_LINK_IFRXQ] = { ifrxqname, NET_LINK_IFRXQ_MAXID }, 23545243d0adSdlg }; 23555243d0adSdlg 23565243d0adSdlg int 23575243d0adSdlg sysctl_link(char *string, char **bufpp, int mib[], int flags, int *typep) 23585243d0adSdlg { 23595243d0adSdlg struct list *lp; 23605243d0adSdlg int indx; 23615243d0adSdlg 23625243d0adSdlg if (*bufpp == NULL) { 23635243d0adSdlg listall(string, &netlinklist); 23645243d0adSdlg return (-1); 23655243d0adSdlg } 23665243d0adSdlg if ((indx = findname(string, "third", bufpp, &netlinklist)) == -1) 23675243d0adSdlg return (-1); 23685243d0adSdlg mib[2] = indx; 23695243d0adSdlg if (indx < NET_LINK_MAXID && netlinkvars[indx].list != NULL) 23705243d0adSdlg lp = &netlinkvars[indx]; 23715243d0adSdlg else if (!flags) 23725243d0adSdlg return (-1); 23735243d0adSdlg else { 23745243d0adSdlg warnx("%s: no variables defined for this protocol", string); 23755243d0adSdlg return (-1); 23765243d0adSdlg } 23775243d0adSdlg if (*bufpp == NULL) { 23785243d0adSdlg listall(string, lp); 23795243d0adSdlg return (-1); 23805243d0adSdlg } 23815243d0adSdlg if ((indx = findname(string, "fourth", bufpp, lp)) == -1) 23825243d0adSdlg return (-1); 23835243d0adSdlg mib[3] = indx; 23845243d0adSdlg *typep = lp->list[indx].ctl_type; 23855243d0adSdlg return (4); 23865243d0adSdlg } 23875243d0adSdlg 238816cc1d58Stedu /* handle bpf requests */ 238916cc1d58Stedu int 239016cc1d58Stedu sysctl_bpf(char *string, char **bufpp, int mib[], int flags, int *typep) 239116cc1d58Stedu { 239216cc1d58Stedu int indx; 239316cc1d58Stedu 239416cc1d58Stedu if (*bufpp == NULL) { 239516cc1d58Stedu listall(string, &bpflist); 239616cc1d58Stedu return (-1); 239716cc1d58Stedu } 239816cc1d58Stedu if ((indx = findname(string, "third", bufpp, &bpflist)) == -1) 239916cc1d58Stedu return (-1); 240016cc1d58Stedu mib[2] = indx; 240116cc1d58Stedu *typep = CTLTYPE_INT; 240216cc1d58Stedu return (3); 240316cc1d58Stedu } 240416cc1d58Stedu 2405f786a0baSnorby struct ctlname mplsname[] = MPLSCTL_NAMES; 2406f786a0baSnorby struct list mplslist = { mplsname, MPLSCTL_MAXID }; 2407f786a0baSnorby 2408f786a0baSnorby /* handle MPLS requests */ 2409f786a0baSnorby int 2410f786a0baSnorby sysctl_mpls(char *string, char **bufpp, int mib[], int flags, int *typep) 2411f786a0baSnorby { 2412f786a0baSnorby struct list *lp; 2413f786a0baSnorby int indx; 2414f786a0baSnorby 2415f786a0baSnorby if (*bufpp == NULL) { 2416f786a0baSnorby listall(string, &mplslist); 2417f786a0baSnorby return (-1); 2418f786a0baSnorby } 2419f786a0baSnorby if ((indx = findname(string, "third", bufpp, &mplslist)) == -1) 2420f786a0baSnorby return (-1); 2421f786a0baSnorby mib[2] = indx; 2422f786a0baSnorby *typep = mplslist.list[indx].ctl_type; 2423f786a0baSnorby if (*typep == CTLTYPE_NODE) { 2424f786a0baSnorby int tindx; 2425f786a0baSnorby 2426f786a0baSnorby if (*bufpp == NULL) { 2427f786a0baSnorby listall(string, &ifqlist); 2428f786a0baSnorby return(-1); 2429f786a0baSnorby } 2430f786a0baSnorby lp = &ifqlist; 2431f786a0baSnorby if ((tindx = findname(string, "fourth", bufpp, lp)) == -1) 2432f786a0baSnorby return (-1); 2433f786a0baSnorby mib[3] = tindx; 2434f786a0baSnorby *typep = lp->list[tindx].ctl_type; 2435f786a0baSnorby return(4); 2436f786a0baSnorby } 2437f786a0baSnorby return (3); 2438f786a0baSnorby } 2439f786a0baSnorby 244090b03482Syasuoka /* handle PIPEX requests */ 244190b03482Syasuoka int 244290b03482Syasuoka sysctl_pipex(char *string, char **bufpp, int mib[], int flags, int *typep) 244390b03482Syasuoka { 24449326fce4Syasuoka struct list *lp; 244590b03482Syasuoka int indx; 244690b03482Syasuoka 244790b03482Syasuoka if (*bufpp == NULL) { 244890b03482Syasuoka listall(string, &pipexlist); 244990b03482Syasuoka return (-1); 245090b03482Syasuoka } 245190b03482Syasuoka if ((indx = findname(string, "third", bufpp, &pipexlist)) == -1) 245290b03482Syasuoka return (-1); 245390b03482Syasuoka mib[2] = indx; 245490b03482Syasuoka *typep = pipexlist.list[indx].ctl_type; 24559326fce4Syasuoka if (*typep == CTLTYPE_NODE) { 24569326fce4Syasuoka int tindx; 24579326fce4Syasuoka 24589326fce4Syasuoka if (*bufpp == NULL) { 24599326fce4Syasuoka listall(string, &ifqlist); 24609326fce4Syasuoka return(-1); 24619326fce4Syasuoka } 24629326fce4Syasuoka lp = &ifqlist; 24639326fce4Syasuoka if ((tindx = findname(string, "fourth", bufpp, lp)) == -1) 24649326fce4Syasuoka return (-1); 24659326fce4Syasuoka mib[3] = tindx; 24669326fce4Syasuoka *typep = lp->list[tindx].ctl_type; 24679326fce4Syasuoka return(4); 24689326fce4Syasuoka } 246990b03482Syasuoka return (3); 247090b03482Syasuoka } 247190b03482Syasuoka 2472df930be7Sderaadt /* 2473cbdb86d9Smillert * Handle SysV semaphore info requests 2474cbdb86d9Smillert */ 2475cbdb86d9Smillert int 2476f9f39e69Sjasper sysctl_seminfo(char *string, char **bufpp, int mib[], int flags, int *typep) 2477cbdb86d9Smillert { 2478cbdb86d9Smillert int indx; 2479cbdb86d9Smillert 2480cbdb86d9Smillert if (*bufpp == NULL) { 2481cbdb86d9Smillert listall(string, &semlist); 2482cbdb86d9Smillert return (-1); 2483cbdb86d9Smillert } 2484cbdb86d9Smillert if ((indx = findname(string, "third", bufpp, &semlist)) == -1) 2485cbdb86d9Smillert return (-1); 2486cbdb86d9Smillert mib[2] = indx; 2487cbdb86d9Smillert *typep = CTLTYPE_INT; 2488cbdb86d9Smillert return (3); 2489cbdb86d9Smillert } 2490cbdb86d9Smillert 2491cbdb86d9Smillert /* 2492cbdb86d9Smillert * Handle SysV shared memory info requests 2493cbdb86d9Smillert */ 2494cbdb86d9Smillert int 2495f9f39e69Sjasper sysctl_shminfo(char *string, char **bufpp, int mib[], int flags, int *typep) 2496cbdb86d9Smillert { 2497cbdb86d9Smillert int indx; 2498cbdb86d9Smillert 2499cbdb86d9Smillert if (*bufpp == NULL) { 2500cbdb86d9Smillert listall(string, &shmlist); 2501cbdb86d9Smillert return (-1); 2502cbdb86d9Smillert } 2503cbdb86d9Smillert if ((indx = findname(string, "third", bufpp, &shmlist)) == -1) 2504cbdb86d9Smillert return (-1); 2505cbdb86d9Smillert mib[2] = indx; 2506cbdb86d9Smillert *typep = CTLTYPE_INT; 2507cbdb86d9Smillert return (3); 2508cbdb86d9Smillert } 2509cbdb86d9Smillert 2510cbdb86d9Smillert /* 2511f206784aSmarkus * Handle watchdog support 2512f206784aSmarkus */ 2513f206784aSmarkus int 2514f206784aSmarkus sysctl_watchdog(char *string, char **bufpp, int mib[], int flags, 2515f206784aSmarkus int *typep) 2516f206784aSmarkus { 2517f206784aSmarkus int indx; 2518f206784aSmarkus 2519f206784aSmarkus if (*bufpp == NULL) { 2520f206784aSmarkus listall(string, &watchdoglist); 2521f206784aSmarkus return (-1); 2522f206784aSmarkus } 2523f206784aSmarkus if ((indx = findname(string, "third", bufpp, &watchdoglist)) == -1) 2524f206784aSmarkus return (-1); 2525f206784aSmarkus mib[2] = indx; 2526f206784aSmarkus *typep = watchdoglist.list[indx].ctl_type; 2527f206784aSmarkus return (3); 2528f206784aSmarkus } 2529f206784aSmarkus 2530f206784aSmarkus /* 25313751347eStholo * Handle timecounter support 25323751347eStholo */ 25333751347eStholo int 25343751347eStholo sysctl_tc(char *string, char **bufpp, int mib[], int flags, 25353751347eStholo int *typep) 25363751347eStholo { 25373751347eStholo int indx; 25383751347eStholo 25393751347eStholo if (*bufpp == NULL) { 25403751347eStholo listall(string, &tclist); 25413751347eStholo return (-1); 25423751347eStholo } 25433751347eStholo if ((indx = findname(string, "third", bufpp, &tclist)) == -1) 25443751347eStholo return (-1); 25453751347eStholo mib[2] = indx; 25463751347eStholo *typep = tclist.list[indx].ctl_type; 25473751347eStholo return (3); 25483751347eStholo } 25493751347eStholo 25503751347eStholo /* 255168e359b9Sgrange * Handle hardware monitoring sensors support 255268e359b9Sgrange */ 255368e359b9Sgrange int 255468e359b9Sgrange sysctl_sensors(char *string, char **bufpp, int mib[], int flags, int *typep) 255568e359b9Sgrange { 255696fb8c11Sderaadt char *devname, *typename; 255796fb8c11Sderaadt int dev, numt, i; 255896fb8c11Sderaadt enum sensor_type type; 255996fb8c11Sderaadt struct sensordev snsrdev; 256096fb8c11Sderaadt size_t sdlen = sizeof(snsrdev); 256168e359b9Sgrange 256268e359b9Sgrange if (*bufpp == NULL) { 2563c8a0bd93Sdjm char buf[SYSCTL_BUFSIZ]; 256468e359b9Sgrange 256596fb8c11Sderaadt /* scan all sensor devices */ 2566f7811f45Sderaadt for (dev = 0; ; dev++) { 256796fb8c11Sderaadt mib[2] = dev; 2568f7811f45Sderaadt if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1) { 2569f7811f45Sderaadt if (errno == ENXIO) 257096fb8c11Sderaadt continue; 2571f7811f45Sderaadt if (errno == ENOENT) 2572f7811f45Sderaadt break; 2573fd08f7a5Sbluhm warn("sensors dev %d", dev); 2574fd08f7a5Sbluhm return (-1); 2575f7811f45Sderaadt } 257696fb8c11Sderaadt snprintf(buf, sizeof(buf), "%s.%s", 257796fb8c11Sderaadt string, snsrdev.xname); 257896fb8c11Sderaadt print_sensordev(buf, mib, 3, &snsrdev); 257968e359b9Sgrange } 258068e359b9Sgrange return (-1); 258168e359b9Sgrange } 258296fb8c11Sderaadt 258396fb8c11Sderaadt /* 258496fb8c11Sderaadt * If we get this far, it means that some arguments were 258596fb8c11Sderaadt * provided below hw.sensors tree. 258696fb8c11Sderaadt * The first branch of hw.sensors tree is the device name. 258796fb8c11Sderaadt */ 258896fb8c11Sderaadt if ((devname = strsep(bufpp, ".")) == NULL) { 258968e359b9Sgrange warnx("%s: incomplete specification", string); 259068e359b9Sgrange return (-1); 259168e359b9Sgrange } 259296fb8c11Sderaadt /* convert sensor device string to an integer */ 2593f7811f45Sderaadt for (dev = 0; ; dev++) { 259496fb8c11Sderaadt mib[2] = dev; 2595f7811f45Sderaadt if (sysctl(mib, 3, &snsrdev, &sdlen, NULL, 0) == -1) { 2596f7811f45Sderaadt if (errno == ENXIO) 259796fb8c11Sderaadt continue; 2598f7811f45Sderaadt if (errno == ENOENT) 2599f7811f45Sderaadt break; 2600fd08f7a5Sbluhm warn("sensors dev %d", dev); 2601fd08f7a5Sbluhm return (-1); 2602f7811f45Sderaadt } 260396fb8c11Sderaadt if (strcmp(devname, snsrdev.xname) == 0) 260496fb8c11Sderaadt break; 260596fb8c11Sderaadt } 260696fb8c11Sderaadt if (strcmp(devname, snsrdev.xname) != 0) { 260796fb8c11Sderaadt warnx("%s: sensor device not found: %s", string, devname); 260896fb8c11Sderaadt return (-1); 260996fb8c11Sderaadt } 261096fb8c11Sderaadt if (*bufpp == NULL) { 261196fb8c11Sderaadt /* only device name was provided -- let's print all sensors 261296fb8c11Sderaadt * that are attached to the specified device 261396fb8c11Sderaadt */ 261496fb8c11Sderaadt print_sensordev(string, mib, 3, &snsrdev); 261596fb8c11Sderaadt return (-1); 261696fb8c11Sderaadt } 261796fb8c11Sderaadt 261896fb8c11Sderaadt /* 261996fb8c11Sderaadt * At this point we have identified the sensor device, 262096fb8c11Sderaadt * now let's go further and identify sensor type. 262196fb8c11Sderaadt */ 262296fb8c11Sderaadt if ((typename = strsep(bufpp, ".")) == NULL) { 262396fb8c11Sderaadt warnx("%s: incomplete specification", string); 262496fb8c11Sderaadt return (-1); 262596fb8c11Sderaadt } 262696fb8c11Sderaadt numt = -1; 262796fb8c11Sderaadt for (i = 0; typename[i] != '\0'; i++) 2628025f5691Sderaadt if (isdigit((unsigned char)typename[i])) { 2629a47b6461Sderaadt const char *errstr; 2630a47b6461Sderaadt 2631a47b6461Sderaadt numt = strtonum(&typename[i], 0, INT_MAX, &errstr); 2632a47b6461Sderaadt if (errstr) { 2633a47b6461Sderaadt warnx("%s: %s", string, errstr); 2634a47b6461Sderaadt return (-1); 2635a47b6461Sderaadt } 263696fb8c11Sderaadt typename[i] = '\0'; 263796fb8c11Sderaadt break; 263896fb8c11Sderaadt } 263996fb8c11Sderaadt for (type = 0; type < SENSOR_MAX_TYPES; type++) 264096fb8c11Sderaadt if (strcmp(typename, sensor_type_s[type]) == 0) 264196fb8c11Sderaadt break; 264296fb8c11Sderaadt if (type == SENSOR_MAX_TYPES) { 264396fb8c11Sderaadt warnx("%s: sensor type not recognised: %s", string, typename); 264496fb8c11Sderaadt return (-1); 264596fb8c11Sderaadt } 264696fb8c11Sderaadt mib[3] = type; 264796fb8c11Sderaadt 264896fb8c11Sderaadt /* 264996fb8c11Sderaadt * If no integer was provided after sensor_type, let's 265096fb8c11Sderaadt * print all sensors of the specified type. 265196fb8c11Sderaadt */ 265296fb8c11Sderaadt if (numt == -1) { 265396fb8c11Sderaadt print_sensordev(string, mib, 4, &snsrdev); 265496fb8c11Sderaadt return (-1); 265596fb8c11Sderaadt } 265696fb8c11Sderaadt 265796fb8c11Sderaadt /* 265896fb8c11Sderaadt * At this point we know that we have received a direct request 265996fb8c11Sderaadt * via command-line for a specific sensor. Let's have the parse() 266096fb8c11Sderaadt * function deal with it further, and report any errors if such 266196fb8c11Sderaadt * sensor node does not exist. 266296fb8c11Sderaadt */ 266396fb8c11Sderaadt mib[4] = numt; 266468e359b9Sgrange *typep = CTLTYPE_STRUCT; 266596fb8c11Sderaadt return (5); 266696fb8c11Sderaadt } 266796fb8c11Sderaadt 266896fb8c11Sderaadt /* 266996fb8c11Sderaadt * Print sensors from the specified device. 267096fb8c11Sderaadt */ 267196fb8c11Sderaadt 267296fb8c11Sderaadt void 267396fb8c11Sderaadt print_sensordev(char *string, int mib[], u_int mlen, struct sensordev *snsrdev) 267496fb8c11Sderaadt { 2675c8a0bd93Sdjm char buf[SYSCTL_BUFSIZ]; 267696fb8c11Sderaadt enum sensor_type type; 267796fb8c11Sderaadt 267896fb8c11Sderaadt if (mlen == 3) { 267996fb8c11Sderaadt for (type = 0; type < SENSOR_MAX_TYPES; type++) { 268096fb8c11Sderaadt mib[3] = type; 268196fb8c11Sderaadt snprintf(buf, sizeof(buf), "%s.%s", 268296fb8c11Sderaadt string, sensor_type_s[type]); 268396fb8c11Sderaadt print_sensordev(buf, mib, mlen+1, snsrdev); 268496fb8c11Sderaadt } 268596fb8c11Sderaadt return; 268696fb8c11Sderaadt } 268796fb8c11Sderaadt 268896fb8c11Sderaadt if (mlen == 4) { 268996fb8c11Sderaadt int numt; 269096fb8c11Sderaadt 269196fb8c11Sderaadt type = mib[3]; 269296fb8c11Sderaadt for (numt = 0; numt < snsrdev->maxnumt[type]; numt++) { 269396fb8c11Sderaadt mib[4] = numt; 269496fb8c11Sderaadt snprintf(buf, sizeof(buf), "%s%u", string, numt); 269596fb8c11Sderaadt print_sensordev(buf, mib, mlen+1, snsrdev); 269696fb8c11Sderaadt } 269796fb8c11Sderaadt return; 269896fb8c11Sderaadt } 269996fb8c11Sderaadt 270096fb8c11Sderaadt if (mlen == 5) { 270196fb8c11Sderaadt struct sensor snsr; 270296fb8c11Sderaadt size_t slen = sizeof(snsr); 270396fb8c11Sderaadt 270496fb8c11Sderaadt /* this function is only printing sensors in bulk, so we 270596fb8c11Sderaadt * do not return any error messages if the requested sensor 270696fb8c11Sderaadt * is not found by sysctl(3) 270796fb8c11Sderaadt */ 270896fb8c11Sderaadt if (sysctl(mib, 5, &snsr, &slen, NULL, 0) == -1) 270996fb8c11Sderaadt return; 271096fb8c11Sderaadt 271196fb8c11Sderaadt if (slen > 0 && (snsr.flags & SENSOR_FINVALID) == 0) { 271296fb8c11Sderaadt if (!nflag) 271396fb8c11Sderaadt printf("%s%s", string, equ); 271496fb8c11Sderaadt print_sensor(&snsr); 271596fb8c11Sderaadt printf("\n"); 271696fb8c11Sderaadt } 271796fb8c11Sderaadt return; 271896fb8c11Sderaadt } 271968e359b9Sgrange } 272068e359b9Sgrange 2721a4b82fa4Sdlg void 2722a4b82fa4Sdlg print_sensor(struct sensor *s) 2723a4b82fa4Sdlg { 2724e4b18a86Sdlg const char *name; 2725e4b18a86Sdlg 2726a4b82fa4Sdlg if (s->flags & SENSOR_FUNKNOWN) 2727a4b82fa4Sdlg printf("unknown"); 2728a4b82fa4Sdlg else { 2729a4b82fa4Sdlg switch (s->type) { 2730a4b82fa4Sdlg case SENSOR_TEMP: 273163d0409cSderaadt printf("%.2f degC", 273263d0409cSderaadt (s->value - 273150000) / 1000000.0); 2733a4b82fa4Sdlg break; 2734a4b82fa4Sdlg case SENSOR_FANRPM: 273563d0409cSderaadt printf("%lld RPM", s->value); 2736a4b82fa4Sdlg break; 27371c5be208Syuo case SENSOR_VOLTS_DC: 27381c5be208Syuo printf("%.2f VDC", s->value / 1000000.0); 27391c5be208Syuo break; 2740ea99e918Syuo case SENSOR_VOLTS_AC: 27418dd981bcSyuo printf("%.2f VAC", s->value / 1000000.0); 2742ea99e918Syuo break; 27431c5be208Syuo case SENSOR_OHMS: 27441c5be208Syuo printf("%lld ohm", s->value); 2745a4b82fa4Sdlg break; 2746ec58a575Skettenis case SENSOR_WATTS: 2747ec58a575Skettenis printf("%.2f W", s->value / 1000000.0); 2748ec58a575Skettenis break; 274929423301Skettenis case SENSOR_AMPS: 275063d0409cSderaadt printf("%.2f A", s->value / 1000000.0); 275129423301Skettenis break; 27527ef8d7b3Smarco case SENSOR_WATTHOUR: 27537ef8d7b3Smarco printf("%.2f Wh", s->value / 1000000.0); 27547ef8d7b3Smarco break; 27557ef8d7b3Smarco case SENSOR_AMPHOUR: 27567ef8d7b3Smarco printf("%.2f Ah", s->value / 1000000.0); 27577ef8d7b3Smarco break; 2758521b8511Sdlg case SENSOR_INDICATOR: 275963d0409cSderaadt printf("%s", s->value ? "On" : "Off"); 2760521b8511Sdlg break; 2761ec58e062Sjsg case SENSOR_INTEGER: 276296fb8c11Sderaadt printf("%lld", s->value); 2763ec58e062Sjsg break; 276413c25a40Sdlg case SENSOR_PERCENT: 276563d0409cSderaadt printf("%.2f%%", s->value / 1000.0); 276613c25a40Sdlg break; 2767fb0db32aSkettenis case SENSOR_LUX: 276863d0409cSderaadt printf("%.2f lx", s->value / 1000000.0); 2769fb0db32aSkettenis break; 2770e4b18a86Sdlg case SENSOR_DRIVE: 2771e4b18a86Sdlg switch (s->value) { 2772e4b18a86Sdlg case SENSOR_DRIVE_EMPTY: 2773e4b18a86Sdlg name = "empty"; 2774e4b18a86Sdlg break; 2775e4b18a86Sdlg case SENSOR_DRIVE_READY: 2776e4b18a86Sdlg name = "ready"; 2777e4b18a86Sdlg break; 2778e4b18a86Sdlg case SENSOR_DRIVE_POWERUP: 2779e4b18a86Sdlg name = "powering up"; 2780e4b18a86Sdlg break; 2781e4b18a86Sdlg case SENSOR_DRIVE_ONLINE: 2782e4b18a86Sdlg name = "online"; 2783e4b18a86Sdlg break; 2784e4b18a86Sdlg case SENSOR_DRIVE_IDLE: 2785e4b18a86Sdlg name = "idle"; 2786e4b18a86Sdlg break; 2787e4b18a86Sdlg case SENSOR_DRIVE_ACTIVE: 2788e4b18a86Sdlg name = "active"; 2789e4b18a86Sdlg break; 2790e4b18a86Sdlg case SENSOR_DRIVE_REBUILD: 2791e4b18a86Sdlg name = "rebuilding"; 2792e4b18a86Sdlg break; 2793e4b18a86Sdlg case SENSOR_DRIVE_POWERDOWN: 2794e4b18a86Sdlg name = "powering down"; 2795e4b18a86Sdlg break; 2796e4b18a86Sdlg case SENSOR_DRIVE_FAIL: 2797e4b18a86Sdlg name = "failed"; 2798e4b18a86Sdlg break; 2799e4b18a86Sdlg case SENSOR_DRIVE_PFAIL: 2800c5970d46Smarco name = "degraded"; 2801e4b18a86Sdlg break; 2802e4b18a86Sdlg default: 2803e4b18a86Sdlg name = "unknown"; 2804e4b18a86Sdlg break; 2805e4b18a86Sdlg } 28064b3de5f1Sbrad printf("%s", name); 2807e4b18a86Sdlg break; 2808eed0ad4cSderaadt case SENSOR_TIMEDELTA: 2809841d1633Smbalmer printf("%.6f secs", s->value / 1000000000.0); 2810eed0ad4cSderaadt break; 28119a3cef4fSyuo case SENSOR_HUMIDITY: 28129a3cef4fSyuo printf("%.2f%%", s->value / 1000.0); 28139a3cef4fSyuo break; 28140bb7dfbaSoga case SENSOR_FREQ: 2815ea99e918Syuo printf("%.2f Hz", s->value / 1000000.0); 28160bb7dfbaSoga break; 28178e60fd2aSderaadt case SENSOR_ANGLE: 2818028e7ea2Sderaadt printf("%3.4f degrees", s->value / 1000000.0); 28198e60fd2aSderaadt break; 2820d95200b8Syuo case SENSOR_DISTANCE: 282131d62911Slandry printf("%.3f m", s->value / 1000000.0); 2822d95200b8Syuo break; 2823d95200b8Syuo case SENSOR_PRESSURE: 2824d95200b8Syuo printf("%.2f Pa", s->value / 1000.0); 2825d95200b8Syuo break; 2826d95200b8Syuo case SENSOR_ACCEL: 2827d95200b8Syuo printf("%2.4f m/s^2", s->value / 1000000.0); 2828d95200b8Syuo break; 282931d62911Slandry case SENSOR_VELOCITY: 283031d62911Slandry printf("%4.3f m/s", s->value / 1000000.0); 283131d62911Slandry break; 2832e8afce5bSkettenis case SENSOR_ENERGY: 2833e8afce5bSkettenis printf("%.2f J", s->value / 1000000.0); 2834e8afce5bSkettenis break; 2835a4b82fa4Sdlg default: 2836a4b82fa4Sdlg printf("unknown"); 2837a4b82fa4Sdlg } 2838a4b82fa4Sdlg } 283963d0409cSderaadt 284096fb8c11Sderaadt if (s->desc[0] != '\0') 28415dbf1cc2Sderaadt printf(" (%s)", s->desc); 284296fb8c11Sderaadt 284363d0409cSderaadt switch (s->status) { 28448e69f93cScnst case SENSOR_S_UNSPEC: 28458e69f93cScnst break; 284663d0409cSderaadt case SENSOR_S_OK: 284763d0409cSderaadt printf(", OK"); 284863d0409cSderaadt break; 284963d0409cSderaadt case SENSOR_S_WARN: 285063d0409cSderaadt printf(", WARNING"); 285163d0409cSderaadt break; 285263d0409cSderaadt case SENSOR_S_CRIT: 285363d0409cSderaadt printf(", CRITICAL"); 285463d0409cSderaadt break; 285563d0409cSderaadt case SENSOR_S_UNKNOWN: 285663d0409cSderaadt printf(", UNKNOWN"); 285763d0409cSderaadt break; 285863d0409cSderaadt } 285960a69411Sderaadt 286060a69411Sderaadt if (s->tv.tv_sec) { 286160a69411Sderaadt time_t t = s->tv.tv_sec; 2862e5282352Sotto char ct[26]; 286360a69411Sderaadt 2864a7b9eedcSflorian if (ctime_r(&t, ct)) { 286560a69411Sderaadt ct[19] = '\0'; 2866e5282352Sotto printf(", %s.%03ld", ct, s->tv.tv_usec / 1000); 2867a7b9eedcSflorian } else 2868a7b9eedcSflorian printf(", %lld.%03ld", t, s->tv.tv_usec / 1000); 286960a69411Sderaadt } 2870a4b82fa4Sdlg } 2871a4b82fa4Sdlg 287268e359b9Sgrange /* 2873bb548dc4Sratchov * Handle audio support 2874bb548dc4Sratchov */ 2875bb548dc4Sratchov int 2876bb548dc4Sratchov sysctl_audio(char *string, char **bufpp, int mib[], int flags, int *typep) 2877bb548dc4Sratchov { 2878bb548dc4Sratchov int indx; 2879bb548dc4Sratchov 2880bb548dc4Sratchov if (*bufpp == NULL) { 2881bb548dc4Sratchov listall(string, &audiolist); 2882bb548dc4Sratchov return (-1); 2883bb548dc4Sratchov } 2884bb548dc4Sratchov if ((indx = findname(string, "third", bufpp, &audiolist)) == -1) 2885bb548dc4Sratchov return (-1); 2886bb548dc4Sratchov mib[2] = indx; 2887bb548dc4Sratchov *typep = audiolist.list[indx].ctl_type; 2888bb548dc4Sratchov return (3); 2889bb548dc4Sratchov } 2890bb548dc4Sratchov 2891bb548dc4Sratchov /* 28921b800d6dSmglocker * Handle video support 28931b800d6dSmglocker */ 28941b800d6dSmglocker int 28951b800d6dSmglocker sysctl_video(char *string, char **bufpp, int mib[], int flags, int *typep) 28961b800d6dSmglocker { 28971b800d6dSmglocker int indx; 28981b800d6dSmglocker 28991b800d6dSmglocker if (*bufpp == NULL) { 29001b800d6dSmglocker listall(string, &videolist); 29011b800d6dSmglocker return (-1); 29021b800d6dSmglocker } 29031b800d6dSmglocker if ((indx = findname(string, "third", bufpp, &videolist)) == -1) 29041b800d6dSmglocker return (-1); 29051b800d6dSmglocker mib[2] = indx; 29061b800d6dSmglocker *typep = videolist.list[indx].ctl_type; 29071b800d6dSmglocker return (3); 29081b800d6dSmglocker } 29091b800d6dSmglocker 29101b800d6dSmglocker /* 29110f480091Svisa * Handle witness support 29120f480091Svisa */ 29130f480091Svisa int 29140f480091Svisa sysctl_witness(char *string, char **bufpp, int mib[], int flags, int *typep) 29150f480091Svisa { 29160f480091Svisa int indx; 29170f480091Svisa 29180f480091Svisa if (*bufpp == NULL) { 29190f480091Svisa listall(string, &witnesslist); 29200f480091Svisa return (-1); 29210f480091Svisa } 29220f480091Svisa if ((indx = findname(string, "third", bufpp, &witnesslist)) == -1) 29230f480091Svisa return (-1); 29240f480091Svisa mib[2] = indx; 29250f480091Svisa *typep = witnesslist.list[indx].ctl_type; 29260f480091Svisa return (3); 29270f480091Svisa } 29280f480091Svisa 29290f480091Svisa /* 293022acc011Skettenis * Handle battery support 293122acc011Skettenis */ 293222acc011Skettenis int 293322acc011Skettenis sysctl_battery(char *string, char **bufpp, int mib[], int flags, 293422acc011Skettenis int *typep) 293522acc011Skettenis { 293622acc011Skettenis int indx; 293722acc011Skettenis 293822acc011Skettenis if (*bufpp == NULL) { 293922acc011Skettenis listall(string, &batterylist); 294022acc011Skettenis return (-1); 294122acc011Skettenis } 294222acc011Skettenis if ((indx = findname(string, "third", bufpp, &batterylist)) == -1) 294322acc011Skettenis return (-1); 294422acc011Skettenis mib[2] = indx; 294522acc011Skettenis *typep = batterylist.list[indx].ctl_type; 294622acc011Skettenis return (3); 294722acc011Skettenis } 294822acc011Skettenis 294922acc011Skettenis /* 2950df930be7Sderaadt * Scan a list of names searching for a particular name. 2951df930be7Sderaadt */ 2952f712e2a0Smickey int 2953bc52e260Sderaadt findname(char *string, char *level, char **bufp, struct list *namelist) 2954df930be7Sderaadt { 2955df930be7Sderaadt char *name; 2956df930be7Sderaadt int i; 2957df930be7Sderaadt 2958df930be7Sderaadt if (namelist->list == 0 || (name = strsep(bufp, ".")) == NULL) { 2959c5956181Smillert warnx("%s: incomplete specification", string); 2960df930be7Sderaadt return (-1); 2961df930be7Sderaadt } 2962df930be7Sderaadt for (i = 0; i < namelist->size; i++) 2963df930be7Sderaadt if (namelist->list[i].ctl_name != NULL && 2964df930be7Sderaadt strcmp(name, namelist->list[i].ctl_name) == 0) 2965df930be7Sderaadt break; 2966df930be7Sderaadt if (i == namelist->size) { 2967c5956181Smillert warnx("%s level name %s in %s is invalid", level, name, string); 2968df930be7Sderaadt return (-1); 2969df930be7Sderaadt } 2970df930be7Sderaadt return (i); 2971df930be7Sderaadt } 2972df930be7Sderaadt 2973f712e2a0Smickey void 2974bc52e260Sderaadt usage(void) 2975df930be7Sderaadt { 29764aea644aSsobrado (void)fprintf(stderr, 2977*2402a19bSkn "usage: sysctl [-Aanq] [name[=value] ...]\n"); 2978df930be7Sderaadt exit(1); 2979df930be7Sderaadt } 2980