xref: /openbsd-src/sbin/sysctl/sysctl.c (revision 2402a19bf8525145150f9a650f22203f3182cd12)
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