xref: /freebsd/sbin/sysctl/sysctl.c (revision 2365fe5616cfcd3cfde5fd640ef0153979205a8a)
18a16b7a1SPedro F. Giffuni /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
4dea673e9SRodney W. Grimes  * Copyright (c) 1993
5dea673e9SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
6dea673e9SRodney W. Grimes  *
7dea673e9SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
8dea673e9SRodney W. Grimes  * modification, are permitted provided that the following conditions
9dea673e9SRodney W. Grimes  * are met:
10dea673e9SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
11dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
12dea673e9SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
13dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
14dea673e9SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
16dea673e9SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
17dea673e9SRodney W. Grimes  *    without specific prior written permission.
18dea673e9SRodney W. Grimes  *
19dea673e9SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20dea673e9SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21dea673e9SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22dea673e9SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23dea673e9SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24dea673e9SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25dea673e9SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26dea673e9SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27dea673e9SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28dea673e9SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29dea673e9SRodney W. Grimes  * SUCH DAMAGE.
30dea673e9SRodney W. Grimes  */
31dea673e9SRodney W. Grimes 
32dea673e9SRodney W. Grimes #ifndef lint
33d9b1bc77SPhilippe Charnier static const char copyright[] =
34dea673e9SRodney W. Grimes "@(#) Copyright (c) 1993\n\
35dea673e9SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
36dea673e9SRodney W. Grimes #endif /* not lint */
37dea673e9SRodney W. Grimes 
38dea673e9SRodney W. Grimes #ifndef lint
39d9b1bc77SPhilippe Charnier #if 0
40d9b1bc77SPhilippe Charnier static char sccsid[] = "@(#)from: sysctl.c	8.1 (Berkeley) 6/6/93";
41d9b1bc77SPhilippe Charnier #endif
4235c13fa0SGarrett Wollman static const char rcsid[] =
437f3dea24SPeter Wemm   "$FreeBSD$";
44dea673e9SRodney W. Grimes #endif /* not lint */
45dea673e9SRodney W. Grimes 
46ce685842SBruce Evans #include <sys/param.h>
47ce685842SBruce Evans #include <sys/time.h>
48ce685842SBruce Evans #include <sys/resource.h>
49dea673e9SRodney W. Grimes #include <sys/stat.h>
50dea673e9SRodney W. Grimes #include <sys/sysctl.h>
51f7550ecfSMatthew Dillon #include <sys/vmmeter.h>
52dea673e9SRodney W. Grimes 
537d8312ccSJohn Baldwin #ifdef __amd64__
547d8312ccSJohn Baldwin #include <sys/efi.h>
557d8312ccSJohn Baldwin #include <machine/metadata.h>
567d8312ccSJohn Baldwin #endif
577d8312ccSJohn Baldwin 
5889871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
5989871cdeSJohn Baldwin #include <machine/pc/bios.h>
6089871cdeSJohn Baldwin #endif
6189871cdeSJohn Baldwin 
62e267e00eSXin LI #include <assert.h>
63d9b1bc77SPhilippe Charnier #include <ctype.h>
64d9b1bc77SPhilippe Charnier #include <err.h>
65dea673e9SRodney W. Grimes #include <errno.h>
6641e419cbSDavid Malone #include <inttypes.h>
6745817aaaSDag-Erling Smørgrav #include <locale.h>
68*2365fe56SJohn Baldwin #include <stdbool.h>
69dea673e9SRodney W. Grimes #include <stdio.h>
70dea673e9SRodney W. Grimes #include <stdlib.h>
71dea673e9SRodney W. Grimes #include <string.h>
72da178c77SXin LI #include <sysexits.h>
73d9b1bc77SPhilippe Charnier #include <unistd.h>
74dea673e9SRodney W. Grimes 
75da178c77SXin LI static const char *conffile;
76da178c77SXin LI 
7775820005SJohn-Mark Gurney static int	aflag, bflag, Bflag, dflag, eflag, hflag, iflag;
788020192dSMarcelo Araujo static int	Nflag, nflag, oflag, qflag, tflag, Tflag, Wflag, xflag;
79dea673e9SRodney W. Grimes 
801d86b91cSPoul-Henning Kamp static int	oidfmt(int *, int, char *, u_int *);
81da178c77SXin LI static int	parsefile(const char *);
82da178c77SXin LI static int	parse(const char *, int);
831d86b91cSPoul-Henning Kamp static int	show_var(int *, int);
841d86b91cSPoul-Henning Kamp static int	sysctl_all(int *oid, int len);
85c58f8df6SXin LI static int	name2oid(const char *, int *);
86dea673e9SRodney W. Grimes 
87aa255ef6SWarner Losh static int	strIKtoi(const char *, char **, const char *);
88e267e00eSXin LI 
89e267e00eSXin LI static int ctl_sign[CTLTYPE+1] = {
90e267e00eSXin LI 	[CTLTYPE_INT] = 1,
91e267e00eSXin LI 	[CTLTYPE_LONG] = 1,
922a71f1edSConrad Meyer 	[CTLTYPE_S8] = 1,
932a71f1edSConrad Meyer 	[CTLTYPE_S16] = 1,
942a71f1edSConrad Meyer 	[CTLTYPE_S32] = 1,
95e267e00eSXin LI 	[CTLTYPE_S64] = 1,
96e267e00eSXin LI };
97e267e00eSXin LI 
98e267e00eSXin LI static int ctl_size[CTLTYPE+1] = {
99e267e00eSXin LI 	[CTLTYPE_INT] = sizeof(int),
100e267e00eSXin LI 	[CTLTYPE_UINT] = sizeof(u_int),
101e267e00eSXin LI 	[CTLTYPE_LONG] = sizeof(long),
102e267e00eSXin LI 	[CTLTYPE_ULONG] = sizeof(u_long),
1032a71f1edSConrad Meyer 	[CTLTYPE_S8] = sizeof(int8_t),
1042a71f1edSConrad Meyer 	[CTLTYPE_S16] = sizeof(int16_t),
1052a71f1edSConrad Meyer 	[CTLTYPE_S32] = sizeof(int32_t),
106e267e00eSXin LI 	[CTLTYPE_S64] = sizeof(int64_t),
1072a71f1edSConrad Meyer 	[CTLTYPE_U8] = sizeof(uint8_t),
1082a71f1edSConrad Meyer 	[CTLTYPE_U16] = sizeof(uint16_t),
1092a71f1edSConrad Meyer 	[CTLTYPE_U32] = sizeof(uint32_t),
110e267e00eSXin LI 	[CTLTYPE_U64] = sizeof(uint64_t),
111e267e00eSXin LI };
112e267e00eSXin LI 
113e267e00eSXin LI static const char *ctl_typename[CTLTYPE+1] = {
114e267e00eSXin LI 	[CTLTYPE_INT] = "integer",
115e267e00eSXin LI 	[CTLTYPE_UINT] = "unsigned integer",
116e267e00eSXin LI 	[CTLTYPE_LONG] = "long integer",
117e267e00eSXin LI 	[CTLTYPE_ULONG] = "unsigned long",
1182a71f1edSConrad Meyer 	[CTLTYPE_U8] = "uint8_t",
1192a71f1edSConrad Meyer 	[CTLTYPE_U16] = "uint16_t",
1203ddb14a5SAndriy Voskoboinyk 	[CTLTYPE_U32] = "uint32_t",
121e267e00eSXin LI 	[CTLTYPE_U64] = "uint64_t",
1222a71f1edSConrad Meyer 	[CTLTYPE_S8] = "int8_t",
1232a71f1edSConrad Meyer 	[CTLTYPE_S16] = "int16_t",
1242a71f1edSConrad Meyer 	[CTLTYPE_S32] = "int32_t",
1252a71f1edSConrad Meyer 	[CTLTYPE_S64] = "int64_t",
1268020192dSMarcelo Araujo 	[CTLTYPE_NODE] = "node",
1278020192dSMarcelo Araujo 	[CTLTYPE_STRING] = "string",
1288020192dSMarcelo Araujo 	[CTLTYPE_OPAQUE] = "opaque",
129e267e00eSXin LI };
130d58f0054SPoul-Henning Kamp 
1311d86b91cSPoul-Henning Kamp static void
1321d86b91cSPoul-Henning Kamp usage(void)
1331d86b91cSPoul-Henning Kamp {
134dea673e9SRodney W. Grimes 
1359a2402bcSDag-Erling Smørgrav 	(void)fprintf(stderr, "%s\n%s\n",
1368020192dSMarcelo Araujo 	    "usage: sysctl [-bdehiNnoqTtWx] [ -B <bufsize> ] [-f filename] name[=value] ...",
1378020192dSMarcelo Araujo 	    "       sysctl [-bdehNnoqTtWx] [ -B <bufsize> ] -a");
1381d86b91cSPoul-Henning Kamp 	exit(1);
1391d86b91cSPoul-Henning Kamp }
140dea673e9SRodney W. Grimes 
141dea673e9SRodney W. Grimes int
1421d86b91cSPoul-Henning Kamp main(int argc, char **argv)
143dea673e9SRodney W. Grimes {
1441d86b91cSPoul-Henning Kamp 	int ch;
145da178c77SXin LI 	int warncount = 0;
14645817aaaSDag-Erling Smørgrav 
14745817aaaSDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "");
1481d86b91cSPoul-Henning Kamp 	setbuf(stdout,0);
1491d86b91cSPoul-Henning Kamp 	setbuf(stderr,0);
150dea673e9SRodney W. Grimes 
1518020192dSMarcelo Araujo 	while ((ch = getopt(argc, argv, "AabB:def:hiNnoqtTwWxX")) != -1) {
152dea673e9SRodney W. Grimes 		switch (ch) {
153ca5fac55SDag-Erling Smørgrav 		case 'A':
1549a2402bcSDag-Erling Smørgrav 			/* compatibility */
1559a2402bcSDag-Erling Smørgrav 			aflag = oflag = 1;
156ca5fac55SDag-Erling Smørgrav 			break;
157ca5fac55SDag-Erling Smørgrav 		case 'a':
158ca5fac55SDag-Erling Smørgrav 			aflag = 1;
159ca5fac55SDag-Erling Smørgrav 			break;
160ca5fac55SDag-Erling Smørgrav 		case 'b':
161ca5fac55SDag-Erling Smørgrav 			bflag = 1;
162ca5fac55SDag-Erling Smørgrav 			break;
16375820005SJohn-Mark Gurney 		case 'B':
16475820005SJohn-Mark Gurney 			Bflag = strtol(optarg, NULL, 0);
16575820005SJohn-Mark Gurney 			break;
1666105f815SLuigi Rizzo 		case 'd':
1676105f815SLuigi Rizzo 			dflag = 1;
1686105f815SLuigi Rizzo 			break;
169d0b8aabbSAnton Berezin 		case 'e':
170d0b8aabbSAnton Berezin 			eflag = 1;
171d0b8aabbSAnton Berezin 			break;
172da178c77SXin LI 		case 'f':
173da178c77SXin LI 			conffile = optarg;
174da178c77SXin LI 			break;
17545817aaaSDag-Erling Smørgrav 		case 'h':
17645817aaaSDag-Erling Smørgrav 			hflag = 1;
17745817aaaSDag-Erling Smørgrav 			break;
17824b2aa32SGavin Atkinson 		case 'i':
17924b2aa32SGavin Atkinson 			iflag = 1;
18024b2aa32SGavin Atkinson 			break;
181ca5fac55SDag-Erling Smørgrav 		case 'N':
182ca5fac55SDag-Erling Smørgrav 			Nflag = 1;
183ca5fac55SDag-Erling Smørgrav 			break;
184ca5fac55SDag-Erling Smørgrav 		case 'n':
185ca5fac55SDag-Erling Smørgrav 			nflag = 1;
186ca5fac55SDag-Erling Smørgrav 			break;
1879a2402bcSDag-Erling Smørgrav 		case 'o':
1889a2402bcSDag-Erling Smørgrav 			oflag = 1;
1899a2402bcSDag-Erling Smørgrav 			break;
190f93d36fdSRobert Watson 		case 'q':
191f93d36fdSRobert Watson 			qflag = 1;
192f93d36fdSRobert Watson 			break;
1938020192dSMarcelo Araujo 		case 't':
1948020192dSMarcelo Araujo 			tflag = 1;
1958020192dSMarcelo Araujo 			break;
1969ecd2e32SAlfred Perlstein 		case 'T':
1979ecd2e32SAlfred Perlstein 			Tflag = 1;
1989ecd2e32SAlfred Perlstein 			break;
199ca5fac55SDag-Erling Smørgrav 		case 'w':
2009a2402bcSDag-Erling Smørgrav 			/* compatibility */
2019a2402bcSDag-Erling Smørgrav 			/* ignored */
202ca5fac55SDag-Erling Smørgrav 			break;
2039ecd2e32SAlfred Perlstein 		case 'W':
2049ecd2e32SAlfred Perlstein 			Wflag = 1;
2059ecd2e32SAlfred Perlstein 			break;
206ca5fac55SDag-Erling Smørgrav 		case 'X':
2079a2402bcSDag-Erling Smørgrav 			/* compatibility */
2089a2402bcSDag-Erling Smørgrav 			aflag = xflag = 1;
2099a2402bcSDag-Erling Smørgrav 			break;
2109a2402bcSDag-Erling Smørgrav 		case 'x':
2119a2402bcSDag-Erling Smørgrav 			xflag = 1;
212ca5fac55SDag-Erling Smørgrav 			break;
213ca5fac55SDag-Erling Smørgrav 		default:
214ca5fac55SDag-Erling Smørgrav 			usage();
215dea673e9SRodney W. Grimes 		}
216dea673e9SRodney W. Grimes 	}
217dea673e9SRodney W. Grimes 	argc -= optind;
218dea673e9SRodney W. Grimes 	argv += optind;
219dea673e9SRodney W. Grimes 
2209a2402bcSDag-Erling Smørgrav 	if (Nflag && nflag)
22181e7454aSDag-Erling Smørgrav 		usage();
2229a2402bcSDag-Erling Smørgrav 	if (aflag && argc == 0)
2231d86b91cSPoul-Henning Kamp 		exit(sysctl_all(0, 0));
224da178c77SXin LI 	if (argc == 0 && conffile == NULL)
225dea673e9SRodney W. Grimes 		usage();
226d9fcd86cSMike Makonnen 
227d9fcd86cSMike Makonnen 	warncount = 0;
228da178c77SXin LI 	if (conffile != NULL)
229da178c77SXin LI 		warncount += parsefile(conffile);
230da178c77SXin LI 
231dea673e9SRodney W. Grimes 	while (argc-- > 0)
232da178c77SXin LI 		warncount += parse(*argv++, 0);
233da178c77SXin LI 
234da178c77SXin LI 	return (warncount);
235dea673e9SRodney W. Grimes }
236dea673e9SRodney W. Grimes 
237dea673e9SRodney W. Grimes /*
238*2365fe56SJohn Baldwin  * Parse a single numeric value, append it to 'newbuf', and update
239*2365fe56SJohn Baldwin  * 'newsize'.  Returns true if the value was parsed and false if the
240*2365fe56SJohn Baldwin  * value was invalid.  Non-numeric types (strings) are handled
241*2365fe56SJohn Baldwin  * directly in parse().
242dea673e9SRodney W. Grimes  */
243*2365fe56SJohn Baldwin static bool
244*2365fe56SJohn Baldwin parse_numeric(const char *newvalstr, const char *fmt, u_int kind,
245*2365fe56SJohn Baldwin     void **newbufp, size_t *newsizep)
246dea673e9SRodney W. Grimes {
247*2365fe56SJohn Baldwin 	void *newbuf;
248e267e00eSXin LI 	const void *newval;
2492a71f1edSConrad Meyer 	int8_t i8val;
250c3220d0bSConrad Meyer 	uint8_t u8val;
2512a71f1edSConrad Meyer 	int16_t i16val;
252c3220d0bSConrad Meyer 	uint16_t u16val;
2532a71f1edSConrad Meyer 	int32_t i32val;
2542a71f1edSConrad Meyer 	uint32_t u32val;
2551ce1a53dSJim Pirzyk 	int intval;
2561ce1a53dSJim Pirzyk 	unsigned int uintval;
2571ce1a53dSJim Pirzyk 	long longval;
2581ce1a53dSJim Pirzyk 	unsigned long ulongval;
259cbc134adSMatthew D Fleming 	int64_t i64val;
260cbc134adSMatthew D Fleming 	uint64_t u64val;
261*2365fe56SJohn Baldwin 	size_t valsize;
262*2365fe56SJohn Baldwin 	char *endptr = NULL;
263*2365fe56SJohn Baldwin 
264*2365fe56SJohn Baldwin 	errno = 0;
265*2365fe56SJohn Baldwin 
266*2365fe56SJohn Baldwin 	switch (kind & CTLTYPE) {
267*2365fe56SJohn Baldwin 	case CTLTYPE_INT:
268*2365fe56SJohn Baldwin 		if (strncmp(fmt, "IK", 2) == 0)
269*2365fe56SJohn Baldwin 			intval = strIKtoi(newvalstr, &endptr, fmt);
270*2365fe56SJohn Baldwin 		else
271*2365fe56SJohn Baldwin 			intval = (int)strtol(newvalstr, &endptr, 0);
272*2365fe56SJohn Baldwin 		newval = &intval;
273*2365fe56SJohn Baldwin 		valsize = sizeof(intval);
274*2365fe56SJohn Baldwin 		break;
275*2365fe56SJohn Baldwin 	case CTLTYPE_UINT:
276*2365fe56SJohn Baldwin 		uintval = (int) strtoul(newvalstr, &endptr, 0);
277*2365fe56SJohn Baldwin 		newval = &uintval;
278*2365fe56SJohn Baldwin 		valsize = sizeof(uintval);
279*2365fe56SJohn Baldwin 		break;
280*2365fe56SJohn Baldwin 	case CTLTYPE_LONG:
281*2365fe56SJohn Baldwin 		longval = strtol(newvalstr, &endptr, 0);
282*2365fe56SJohn Baldwin 		newval = &longval;
283*2365fe56SJohn Baldwin 		valsize = sizeof(longval);
284*2365fe56SJohn Baldwin 		break;
285*2365fe56SJohn Baldwin 	case CTLTYPE_ULONG:
286*2365fe56SJohn Baldwin 		ulongval = strtoul(newvalstr, &endptr, 0);
287*2365fe56SJohn Baldwin 		newval = &ulongval;
288*2365fe56SJohn Baldwin 		valsize = sizeof(ulongval);
289*2365fe56SJohn Baldwin 		break;
290*2365fe56SJohn Baldwin 	case CTLTYPE_S8:
291*2365fe56SJohn Baldwin 		i8val = (int8_t)strtol(newvalstr, &endptr, 0);
292*2365fe56SJohn Baldwin 		newval = &i8val;
293*2365fe56SJohn Baldwin 		valsize = sizeof(i8val);
294*2365fe56SJohn Baldwin 		break;
295*2365fe56SJohn Baldwin 	case CTLTYPE_S16:
296*2365fe56SJohn Baldwin 		i16val = (int16_t)strtol(newvalstr, &endptr, 0);
297*2365fe56SJohn Baldwin 		newval = &i16val;
298*2365fe56SJohn Baldwin 		valsize = sizeof(i16val);
299*2365fe56SJohn Baldwin 		break;
300*2365fe56SJohn Baldwin 	case CTLTYPE_S32:
301*2365fe56SJohn Baldwin 		i32val = (int32_t)strtol(newvalstr, &endptr, 0);
302*2365fe56SJohn Baldwin 		newval = &i32val;
303*2365fe56SJohn Baldwin 		valsize = sizeof(i32val);
304*2365fe56SJohn Baldwin 		break;
305*2365fe56SJohn Baldwin 	case CTLTYPE_S64:
306*2365fe56SJohn Baldwin 		i64val = strtoimax(newvalstr, &endptr, 0);
307*2365fe56SJohn Baldwin 		newval = &i64val;
308*2365fe56SJohn Baldwin 		valsize = sizeof(i64val);
309*2365fe56SJohn Baldwin 		break;
310*2365fe56SJohn Baldwin 	case CTLTYPE_U8:
311*2365fe56SJohn Baldwin 		u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
312*2365fe56SJohn Baldwin 		newval = &u8val;
313*2365fe56SJohn Baldwin 		valsize = sizeof(u8val);
314*2365fe56SJohn Baldwin 		break;
315*2365fe56SJohn Baldwin 	case CTLTYPE_U16:
316*2365fe56SJohn Baldwin 		u16val = (uint16_t)strtoul(newvalstr, &endptr, 0);
317*2365fe56SJohn Baldwin 		newval = &u16val;
318*2365fe56SJohn Baldwin 		valsize = sizeof(u16val);
319*2365fe56SJohn Baldwin 		break;
320*2365fe56SJohn Baldwin 	case CTLTYPE_U32:
321*2365fe56SJohn Baldwin 		u32val = (uint32_t)strtoul(newvalstr, &endptr, 0);
322*2365fe56SJohn Baldwin 		newval = &u32val;
323*2365fe56SJohn Baldwin 		valsize = sizeof(u32val);
324*2365fe56SJohn Baldwin 		break;
325*2365fe56SJohn Baldwin 	case CTLTYPE_U64:
326*2365fe56SJohn Baldwin 		u64val = strtoumax(newvalstr, &endptr, 0);
327*2365fe56SJohn Baldwin 		newval = &u64val;
328*2365fe56SJohn Baldwin 		valsize = sizeof(u64val);
329*2365fe56SJohn Baldwin 		break;
330*2365fe56SJohn Baldwin 	default:
331*2365fe56SJohn Baldwin 		/* NOTREACHED */
332*2365fe56SJohn Baldwin 		abort();
333*2365fe56SJohn Baldwin 	}
334*2365fe56SJohn Baldwin 
335*2365fe56SJohn Baldwin 	if (errno != 0 || endptr == newvalstr ||
336*2365fe56SJohn Baldwin 	    (endptr != NULL && *endptr != '\0'))
337*2365fe56SJohn Baldwin 		return (false);
338*2365fe56SJohn Baldwin 
339*2365fe56SJohn Baldwin 	newbuf = realloc(*newbufp, *newsizep + valsize);
340*2365fe56SJohn Baldwin 	if (newbuf == NULL)
341*2365fe56SJohn Baldwin 		err(1, "out of memory");
342*2365fe56SJohn Baldwin 	memcpy((char *)newbuf + *newsizep, newval, valsize);
343*2365fe56SJohn Baldwin 	*newbufp = newbuf;
344*2365fe56SJohn Baldwin 	*newsizep += valsize;
345*2365fe56SJohn Baldwin 
346*2365fe56SJohn Baldwin 	return (true);
347*2365fe56SJohn Baldwin }
348*2365fe56SJohn Baldwin 
349*2365fe56SJohn Baldwin /*
350*2365fe56SJohn Baldwin  * Parse a name into a MIB entry.
351*2365fe56SJohn Baldwin  * Lookup and print out the MIB entry if it exists.
352*2365fe56SJohn Baldwin  * Set a new value if requested.
353*2365fe56SJohn Baldwin  */
354*2365fe56SJohn Baldwin static int
355*2365fe56SJohn Baldwin parse(const char *string, int lineno)
356*2365fe56SJohn Baldwin {
357*2365fe56SJohn Baldwin 	int len, i, j;
358*2365fe56SJohn Baldwin 	const void *newval;
359*2365fe56SJohn Baldwin 	char *newvalstr = NULL;
360*2365fe56SJohn Baldwin 	void *newbuf;
361*2365fe56SJohn Baldwin 	size_t newsize = Bflag;
362dea673e9SRodney W. Grimes 	int mib[CTL_MAXNAME];
363*2365fe56SJohn Baldwin 	char *cp, *bufp, buf[BUFSIZ], fmt[BUFSIZ], line[BUFSIZ];
3641d86b91cSPoul-Henning Kamp 	u_int kind;
365dea673e9SRodney W. Grimes 
366da178c77SXin LI 	if (lineno)
367da178c77SXin LI 		snprintf(line, sizeof(line), " at line %d", lineno);
368da178c77SXin LI 	else
369da178c77SXin LI 		line[0] = '\0';
370da178c77SXin LI 
371aae75101SXin LI 	cp = buf;
372da178c77SXin LI 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
373c6919e7fSEdward Tomasz Napierala 		warnx("oid too long: '%s'%s", string, line);
374da178c77SXin LI 		return (1);
375da178c77SXin LI 	}
376da178c77SXin LI 	bufp = strsep(&cp, "=:");
377aae75101SXin LI 	if (cp != NULL) {
3789ecd2e32SAlfred Perlstein 		/* Tflag just lists tunables, do not allow assignment */
3799ecd2e32SAlfred Perlstein 		if (Tflag || Wflag) {
3809ecd2e32SAlfred Perlstein 			warnx("Can't set variables when using -T or -W");
3819ecd2e32SAlfred Perlstein 			usage();
3829ecd2e32SAlfred Perlstein 		}
383dea673e9SRodney W. Grimes 		while (isspace(*cp))
384dea673e9SRodney W. Grimes 			cp++;
385da178c77SXin LI 		/* Strip a pair of " or ' if any. */
386da178c77SXin LI 		switch (*cp) {
387da178c77SXin LI 		case '\"':
388da178c77SXin LI 		case '\'':
389da178c77SXin LI 			if (cp[strlen(cp) - 1] == *cp)
390da178c77SXin LI 				cp[strlen(cp) - 1] = '\0';
391da178c77SXin LI 			cp++;
392da178c77SXin LI 		}
393e267e00eSXin LI 		newvalstr = cp;
394dea673e9SRodney W. Grimes 		newsize = strlen(cp);
395dea673e9SRodney W. Grimes 	}
396ca587fdaSBaptiste Daroussin 	/* Trim spaces */
397ca587fdaSBaptiste Daroussin 	cp = bufp + strlen(bufp) - 1;
398ca587fdaSBaptiste Daroussin 	while (cp >= bufp && isspace((int)*cp)) {
399ca587fdaSBaptiste Daroussin 		*cp = '\0';
400ca587fdaSBaptiste Daroussin 		cp--;
401ca587fdaSBaptiste Daroussin 	}
4021d86b91cSPoul-Henning Kamp 	len = name2oid(bufp, mib);
4031d86b91cSPoul-Henning Kamp 
404f93d36fdSRobert Watson 	if (len < 0) {
40524b2aa32SGavin Atkinson 		if (iflag)
406da178c77SXin LI 			return (0);
407f93d36fdSRobert Watson 		if (qflag)
408da178c77SXin LI 			return (1);
409da178c77SXin LI 		else {
410e1619d12SBaptiste Daroussin 			if (errno == ENOENT) {
411e1619d12SBaptiste Daroussin 				warnx("unknown oid '%s'%s", bufp, line);
412e1619d12SBaptiste Daroussin 			} else {
413da178c77SXin LI 				warn("unknown oid '%s'%s", bufp, line);
414e1619d12SBaptiste Daroussin 			}
415da178c77SXin LI 			return (1);
416da178c77SXin LI 		}
417f93d36fdSRobert Watson 	}
4181d86b91cSPoul-Henning Kamp 
419da178c77SXin LI 	if (oidfmt(mib, len, fmt, &kind)) {
420da178c77SXin LI 		warn("couldn't find format of oid '%s'%s", bufp, line);
421da178c77SXin LI 		if (iflag)
422da178c77SXin LI 			return (1);
423da178c77SXin LI 		else
424da178c77SXin LI 			exit(1);
425da178c77SXin LI 	}
4261d86b91cSPoul-Henning Kamp 
427e267e00eSXin LI 	if (newvalstr == NULL || dflag) {
4281d86b91cSPoul-Henning Kamp 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
429b2680e20SMatthew N. Dodd 			if (dflag) {
430b2680e20SMatthew N. Dodd 				i = show_var(mib, len);
431b2680e20SMatthew N. Dodd 				if (!i && !bflag)
432b2680e20SMatthew N. Dodd 					putchar('\n');
433b2680e20SMatthew N. Dodd 			}
4341d86b91cSPoul-Henning Kamp 			sysctl_all(mib, len);
4351d86b91cSPoul-Henning Kamp 		} else {
4361d86b91cSPoul-Henning Kamp 			i = show_var(mib, len);
4371d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
4381d86b91cSPoul-Henning Kamp 				putchar('\n');
439dea673e9SRodney W. Grimes 		}
4401d86b91cSPoul-Henning Kamp 	} else {
441da178c77SXin LI 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
442c6919e7fSEdward Tomasz Napierala 			warnx("oid '%s' isn't a leaf node%s", bufp, line);
443da178c77SXin LI 			return (1);
444da178c77SXin LI 		}
445dea673e9SRodney W. Grimes 
446ac8711d2SMike Silbersack 		if (!(kind & CTLFLAG_WR)) {
4479b4b73b7SMike Silbersack 			if (kind & CTLFLAG_TUN) {
4486f361351SXin LI 				warnx("oid '%s' is a read only tunable%s", bufp, line);
449da178c77SXin LI 				warnx("Tunable values are set in /boot/loader.conf");
450da178c77SXin LI 			} else
451da178c77SXin LI 				warnx("oid '%s' is read only%s", bufp, line);
452da178c77SXin LI 			return (1);
453ac8711d2SMike Silbersack 		}
454dea673e9SRodney W. Grimes 
455e267e00eSXin LI 		switch (kind & CTLTYPE) {
456e267e00eSXin LI 		case CTLTYPE_INT:
457e267e00eSXin LI 		case CTLTYPE_UINT:
458e267e00eSXin LI 		case CTLTYPE_LONG:
459e267e00eSXin LI 		case CTLTYPE_ULONG:
4602a71f1edSConrad Meyer 		case CTLTYPE_S8:
4612a71f1edSConrad Meyer 		case CTLTYPE_S16:
4622a71f1edSConrad Meyer 		case CTLTYPE_S32:
463e267e00eSXin LI 		case CTLTYPE_S64:
4642a71f1edSConrad Meyer 		case CTLTYPE_U8:
4652a71f1edSConrad Meyer 		case CTLTYPE_U16:
4662a71f1edSConrad Meyer 		case CTLTYPE_U32:
467e267e00eSXin LI 		case CTLTYPE_U64:
468e267e00eSXin LI 			if (strlen(newvalstr) == 0) {
469da178c77SXin LI 				warnx("empty numeric value");
470da178c77SXin LI 				return (1);
471da178c77SXin LI 			}
472e267e00eSXin LI 			/* FALLTHROUGH */
473e267e00eSXin LI 		case CTLTYPE_STRING:
474e267e00eSXin LI 			break;
475e267e00eSXin LI 		default:
476e267e00eSXin LI 			warnx("oid '%s' is type %d,"
477e267e00eSXin LI 				" cannot set that%s", bufp,
478e267e00eSXin LI 				kind & CTLTYPE, line);
479e267e00eSXin LI 			return (1);
480a78d3eafSRobert Watson 		}
481a78d3eafSRobert Watson 
482*2365fe56SJohn Baldwin 		newbuf = NULL;
4834b8740cdSXin LI 
4841d86b91cSPoul-Henning Kamp 		switch (kind & CTLTYPE) {
4851d86b91cSPoul-Henning Kamp 		case CTLTYPE_STRING:
486e267e00eSXin LI 			newval = newvalstr;
4871d86b91cSPoul-Henning Kamp 			break;
4881d86b91cSPoul-Henning Kamp 		default:
489*2365fe56SJohn Baldwin 			newsize = 0;
490*2365fe56SJohn Baldwin 			while ((cp = strsep(&newvalstr, " ,")) != NULL) {
491*2365fe56SJohn Baldwin 				if (*cp == '\0')
492*2365fe56SJohn Baldwin 					continue;
493*2365fe56SJohn Baldwin 				if (!parse_numeric(cp, fmt, kind, &newbuf,
494*2365fe56SJohn Baldwin 				    &newsize)) {
495*2365fe56SJohn Baldwin 					warnx("invalid %s '%s'%s",
496*2365fe56SJohn Baldwin 					    ctl_typename[kind & CTLTYPE],
497*2365fe56SJohn Baldwin 					    cp, line);
498*2365fe56SJohn Baldwin 					free(newbuf);
499da178c77SXin LI 					return (1);
500dea673e9SRodney W. Grimes 				}
501*2365fe56SJohn Baldwin 			}
502*2365fe56SJohn Baldwin 			newval = newbuf;
503*2365fe56SJohn Baldwin 			break;
504*2365fe56SJohn Baldwin 		}
5051d86b91cSPoul-Henning Kamp 
5061d86b91cSPoul-Henning Kamp 		i = show_var(mib, len);
5071d86b91cSPoul-Henning Kamp 		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
508*2365fe56SJohn Baldwin 			free(newbuf);
5091d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
5101d86b91cSPoul-Henning Kamp 				putchar('\n');
511dea673e9SRodney W. Grimes 			switch (errno) {
512dea673e9SRodney W. Grimes 			case EOPNOTSUPP:
513da178c77SXin LI 				warnx("%s: value is not available%s",
514da178c77SXin LI 					string, line);
515da178c77SXin LI 				return (1);
516dea673e9SRodney W. Grimes 			case ENOTDIR:
517da178c77SXin LI 				warnx("%s: specification is incomplete%s",
518da178c77SXin LI 					string, line);
519da178c77SXin LI 				return (1);
520dea673e9SRodney W. Grimes 			case ENOMEM:
521da178c77SXin LI 				warnx("%s: type is unknown to this program%s",
522da178c77SXin LI 					string, line);
523da178c77SXin LI 				return (1);
524dea673e9SRodney W. Grimes 			default:
525da178c77SXin LI 				warn("%s%s", string, line);
526da178c77SXin LI 				return (1);
527dea673e9SRodney W. Grimes 			}
528dea673e9SRodney W. Grimes 		}
529*2365fe56SJohn Baldwin 		free(newbuf);
5301d86b91cSPoul-Henning Kamp 		if (!bflag)
5311d86b91cSPoul-Henning Kamp 			printf(" -> ");
5321d86b91cSPoul-Henning Kamp 		i = nflag;
5331d86b91cSPoul-Henning Kamp 		nflag = 1;
5341d86b91cSPoul-Henning Kamp 		j = show_var(mib, len);
5351d86b91cSPoul-Henning Kamp 		if (!j && !bflag)
5361d86b91cSPoul-Henning Kamp 			putchar('\n');
5371d86b91cSPoul-Henning Kamp 		nflag = i;
538dea673e9SRodney W. Grimes 	}
539da178c77SXin LI 
540da178c77SXin LI 	return (0);
541da178c77SXin LI }
542da178c77SXin LI 
543da178c77SXin LI static int
544da178c77SXin LI parsefile(const char *filename)
545da178c77SXin LI {
546da178c77SXin LI 	FILE *file;
547da178c77SXin LI 	char line[BUFSIZ], *p, *pq, *pdq;
548da178c77SXin LI 	int warncount = 0, lineno = 0;
549da178c77SXin LI 
550da178c77SXin LI 	file = fopen(filename, "r");
551da178c77SXin LI 	if (file == NULL)
552da178c77SXin LI 		err(EX_NOINPUT, "%s", filename);
553da178c77SXin LI 	while (fgets(line, sizeof(line), file) != NULL) {
554da178c77SXin LI 		lineno++;
555da178c77SXin LI 		p = line;
556da178c77SXin LI 		pq = strchr(line, '\'');
557da178c77SXin LI 		pdq = strchr(line, '\"');
558da178c77SXin LI 		/* Replace the first # with \0. */
559da178c77SXin LI 		while((p = strchr(p, '#')) != NULL) {
560da178c77SXin LI 			if (pq != NULL && p > pq) {
561da178c77SXin LI 				if ((p = strchr(pq+1, '\'')) != NULL)
562da178c77SXin LI 					*(++p) = '\0';
563da178c77SXin LI 				break;
564da178c77SXin LI 			} else if (pdq != NULL && p > pdq) {
565da178c77SXin LI 				if ((p = strchr(pdq+1, '\"')) != NULL)
566da178c77SXin LI 					*(++p) = '\0';
567da178c77SXin LI 				break;
568da178c77SXin LI 			} else if (p == line || *(p-1) != '\\') {
569da178c77SXin LI 				*p = '\0';
570da178c77SXin LI 				break;
571da178c77SXin LI 			}
572da178c77SXin LI 			p++;
573da178c77SXin LI 		}
574da178c77SXin LI 		/* Trim spaces */
575da178c77SXin LI 		p = line + strlen(line) - 1;
576da178c77SXin LI 		while (p >= line && isspace((int)*p)) {
577da178c77SXin LI 			*p = '\0';
578da178c77SXin LI 			p--;
579da178c77SXin LI 		}
580da178c77SXin LI 		p = line;
581da178c77SXin LI 		while (isspace((int)*p))
582da178c77SXin LI 			p++;
583da178c77SXin LI 		if (*p == '\0')
584da178c77SXin LI 			continue;
585da178c77SXin LI 		else
586da178c77SXin LI 			warncount += parse(p, lineno);
587da178c77SXin LI 	}
588da178c77SXin LI 	fclose(file);
589da178c77SXin LI 
590da178c77SXin LI 	return (warncount);
591dea673e9SRodney W. Grimes }
592dea673e9SRodney W. Grimes 
5931d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */
594dea673e9SRodney W. Grimes 
5951d86b91cSPoul-Henning Kamp static int
59659101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p)
5971d86b91cSPoul-Henning Kamp {
5981d86b91cSPoul-Henning Kamp 	struct clockinfo *ci = (struct clockinfo*)p;
59921e1f596SDavid Malone 
600996076bbSAlfred Perlstein 	if (l2 != sizeof(*ci)) {
60159101c5dSJohn Baldwin 		warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci));
6026b6b665bSBruce Evans 		return (1);
603996076bbSAlfred Perlstein 	}
60445817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
60545817aaaSDag-Erling Smørgrav 		"{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
606b35c8f28SPoul-Henning Kamp 		ci->hz, ci->tick, ci->profhz, ci->stathz);
6071d86b91cSPoul-Henning Kamp 	return (0);
608dea673e9SRodney W. Grimes }
609dea673e9SRodney W. Grimes 
6101d86b91cSPoul-Henning Kamp static int
61159101c5dSJohn Baldwin S_loadavg(size_t l2, void *p)
6121d86b91cSPoul-Henning Kamp {
6131d86b91cSPoul-Henning Kamp 	struct loadavg *tv = (struct loadavg*)p;
6141d86b91cSPoul-Henning Kamp 
615996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
61659101c5dSJohn Baldwin 		warnx("S_loadavg %zu != %zu", l2, sizeof(*tv));
6176b6b665bSBruce Evans 		return (1);
618996076bbSAlfred Perlstein 	}
61945817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
6201d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[0]/(double)tv->fscale,
6211d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[1]/(double)tv->fscale,
6221d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[2]/(double)tv->fscale);
6231d86b91cSPoul-Henning Kamp 	return (0);
624dea673e9SRodney W. Grimes }
625dea673e9SRodney W. Grimes 
6261d86b91cSPoul-Henning Kamp static int
62759101c5dSJohn Baldwin S_timeval(size_t l2, void *p)
6281d86b91cSPoul-Henning Kamp {
6291d86b91cSPoul-Henning Kamp 	struct timeval *tv = (struct timeval*)p;
630c2deb608SBruce Evans 	time_t tv_sec;
6311d86b91cSPoul-Henning Kamp 	char *p1, *p2;
632dea673e9SRodney W. Grimes 
633996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
63459101c5dSJohn Baldwin 		warnx("S_timeval %zu != %zu", l2, sizeof(*tv));
6356b6b665bSBruce Evans 		return (1);
636996076bbSAlfred Perlstein 	}
637db87e2dcSJohn Hay 	printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
638db87e2dcSJohn Hay 		"{ sec = %jd, usec = %ld } ",
639db87e2dcSJohn Hay 		(intmax_t)tv->tv_sec, tv->tv_usec);
640c2deb608SBruce Evans 	tv_sec = tv->tv_sec;
641c2deb608SBruce Evans 	p1 = strdup(ctime(&tv_sec));
6421d86b91cSPoul-Henning Kamp 	for (p2=p1; *p2 ; p2++)
6431d86b91cSPoul-Henning Kamp 		if (*p2 == '\n')
6441d86b91cSPoul-Henning Kamp 			*p2 = '\0';
6451d86b91cSPoul-Henning Kamp 	fputs(p1, stdout);
646f2359a24SRebecca Cran 	free(p1);
6471d86b91cSPoul-Henning Kamp 	return (0);
6481d86b91cSPoul-Henning Kamp }
6491d86b91cSPoul-Henning Kamp 
6501d86b91cSPoul-Henning Kamp static int
65159101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p)
652f7550ecfSMatthew Dillon {
65341c0f8d3SKonstantin Belousov 	struct vmtotal *v;
65441c0f8d3SKonstantin Belousov 	int pageKilo;
655f7550ecfSMatthew Dillon 
656f7550ecfSMatthew Dillon 	if (l2 != sizeof(*v)) {
65759101c5dSJohn Baldwin 		warnx("S_vmtotal %zu != %zu", l2, sizeof(*v));
6586b6b665bSBruce Evans 		return (1);
659f7550ecfSMatthew Dillon 	}
660f7550ecfSMatthew Dillon 
66141c0f8d3SKonstantin Belousov 	v = p;
66241c0f8d3SKonstantin Belousov 	pageKilo = getpagesize() / 1024;
66341c0f8d3SKonstantin Belousov 
66441c0f8d3SKonstantin Belousov #define	pg2k(a)	((uintmax_t)(a) * pageKilo)
66541c0f8d3SKonstantin Belousov 	printf("\nSystem wide totals computed every five seconds:"
666654e22e7SMatthew Dillon 	    " (values in kilobytes)\n");
667f7550ecfSMatthew Dillon 	printf("===============================================\n");
66841c0f8d3SKonstantin Belousov 	printf("Processes:\t\t(RUNQ: %d Disk Wait: %d Page Wait: "
66941c0f8d3SKonstantin Belousov 	    "%d Sleep: %d)\n",
670f7550ecfSMatthew Dillon 	    v->t_rq, v->t_dw, v->t_pw, v->t_sl);
67141c0f8d3SKonstantin Belousov 	printf("Virtual Memory:\t\t(Total: %juK Active: %juK)\n",
67241c0f8d3SKonstantin Belousov 	    pg2k(v->t_vm), pg2k(v->t_avm));
67341c0f8d3SKonstantin Belousov 	printf("Real Memory:\t\t(Total: %juK Active: %juK)\n",
67441c0f8d3SKonstantin Belousov 	    pg2k(v->t_rm), pg2k(v->t_arm));
67541c0f8d3SKonstantin Belousov 	printf("Shared Virtual Memory:\t(Total: %juK Active: %juK)\n",
67641c0f8d3SKonstantin Belousov 	    pg2k(v->t_vmshr), pg2k(v->t_avmshr));
67741c0f8d3SKonstantin Belousov 	printf("Shared Real Memory:\t(Total: %juK Active: %juK)\n",
67841c0f8d3SKonstantin Belousov 	    pg2k(v->t_rmshr), pg2k(v->t_armshr));
67941c0f8d3SKonstantin Belousov 	printf("Free Memory:\t%juK", pg2k(v->t_free));
680f7550ecfSMatthew Dillon 	return (0);
681f7550ecfSMatthew Dillon }
682f7550ecfSMatthew Dillon 
6837d8312ccSJohn Baldwin #ifdef __amd64__
6847d8312ccSJohn Baldwin static int
6857d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p)
6867d8312ccSJohn Baldwin {
6877d8312ccSJohn Baldwin 	struct efi_map_header *efihdr;
6887d8312ccSJohn Baldwin 	struct efi_md *map;
6897d8312ccSJohn Baldwin 	const char *type;
6907d8312ccSJohn Baldwin 	size_t efisz;
6917d8312ccSJohn Baldwin 	int ndesc, i;
6927d8312ccSJohn Baldwin 
6937d8312ccSJohn Baldwin 	static const char *types[] = {
6947d8312ccSJohn Baldwin 		"Reserved",
6957d8312ccSJohn Baldwin 		"LoaderCode",
6967d8312ccSJohn Baldwin 		"LoaderData",
6977d8312ccSJohn Baldwin 		"BootServicesCode",
6987d8312ccSJohn Baldwin 		"BootServicesData",
6997d8312ccSJohn Baldwin 		"RuntimeServicesCode",
7007d8312ccSJohn Baldwin 		"RuntimeServicesData",
7017d8312ccSJohn Baldwin 		"ConventionalMemory",
7027d8312ccSJohn Baldwin 		"UnusableMemory",
7037d8312ccSJohn Baldwin 		"ACPIReclaimMemory",
7047d8312ccSJohn Baldwin 		"ACPIMemoryNVS",
7057d8312ccSJohn Baldwin 		"MemoryMappedIO",
7067d8312ccSJohn Baldwin 		"MemoryMappedIOPortSpace",
7077d8312ccSJohn Baldwin 		"PalCode"
7087d8312ccSJohn Baldwin 	};
7097d8312ccSJohn Baldwin 
7107d8312ccSJohn Baldwin 	/*
7117d8312ccSJohn Baldwin 	 * Memory map data provided by UEFI via the GetMemoryMap
7127d8312ccSJohn Baldwin 	 * Boot Services API.
7137d8312ccSJohn Baldwin 	 */
7147d8312ccSJohn Baldwin 	if (l2 < sizeof(*efihdr)) {
7157d8312ccSJohn Baldwin 		warnx("S_efi_map length less than header");
7167d8312ccSJohn Baldwin 		return (1);
7177d8312ccSJohn Baldwin 	}
7187d8312ccSJohn Baldwin 	efihdr = p;
7197d8312ccSJohn Baldwin 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
7207d8312ccSJohn Baldwin 	map = (struct efi_md *)((uint8_t *)efihdr + efisz);
7217d8312ccSJohn Baldwin 
7227d8312ccSJohn Baldwin 	if (efihdr->descriptor_size == 0)
7237d8312ccSJohn Baldwin 		return (0);
7247d8312ccSJohn Baldwin 	if (l2 != efisz + efihdr->memory_size) {
7257d8312ccSJohn Baldwin 		warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz +
7267d8312ccSJohn Baldwin 		    efihdr->memory_size);
7277d8312ccSJohn Baldwin 		return (1);
7287d8312ccSJohn Baldwin 	}
7297d8312ccSJohn Baldwin 	ndesc = efihdr->memory_size / efihdr->descriptor_size;
7307d8312ccSJohn Baldwin 
7317d8312ccSJohn Baldwin 	printf("\n%23s %12s %12s %8s %4s",
7327d8312ccSJohn Baldwin 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
7337d8312ccSJohn Baldwin 
7347d8312ccSJohn Baldwin 	for (i = 0; i < ndesc; i++,
7357d8312ccSJohn Baldwin 	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
7367d8312ccSJohn Baldwin 		if (map->md_type <= EFI_MD_TYPE_PALCODE)
7377d8312ccSJohn Baldwin 			type = types[map->md_type];
7387d8312ccSJohn Baldwin 		else
7397d8312ccSJohn Baldwin 			type = "<INVALID>";
74041c0f8d3SKonstantin Belousov 		printf("\n%23s %012jx %12p %08jx ", type,
74141c0f8d3SKonstantin Belousov 		    (uintmax_t)map->md_phys, map->md_virt,
74241c0f8d3SKonstantin Belousov 		    (uintmax_t)map->md_pages);
7437d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UC)
7447d8312ccSJohn Baldwin 			printf("UC ");
7457d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WC)
7467d8312ccSJohn Baldwin 			printf("WC ");
7477d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WT)
7487d8312ccSJohn Baldwin 			printf("WT ");
7497d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WB)
7507d8312ccSJohn Baldwin 			printf("WB ");
7517d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UCE)
7527d8312ccSJohn Baldwin 			printf("UCE ");
7537d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WP)
7547d8312ccSJohn Baldwin 			printf("WP ");
7557d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RP)
7567d8312ccSJohn Baldwin 			printf("RP ");
7577d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_XP)
7587d8312ccSJohn Baldwin 			printf("XP ");
7597d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RT)
7607d8312ccSJohn Baldwin 			printf("RUNTIME");
7617d8312ccSJohn Baldwin 	}
7627d8312ccSJohn Baldwin 	return (0);
7637d8312ccSJohn Baldwin }
7647d8312ccSJohn Baldwin #endif
7657d8312ccSJohn Baldwin 
76689871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
76789871cdeSJohn Baldwin static int
76859101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p)
76989871cdeSJohn Baldwin {
77089871cdeSJohn Baldwin 	struct bios_smap_xattr *smap, *end;
77189871cdeSJohn Baldwin 
77289871cdeSJohn Baldwin 	if (l2 % sizeof(*smap) != 0) {
77359101c5dSJohn Baldwin 		warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2,
77489871cdeSJohn Baldwin 		    sizeof(*smap));
77589871cdeSJohn Baldwin 		return (1);
77689871cdeSJohn Baldwin 	}
77789871cdeSJohn Baldwin 
77889871cdeSJohn Baldwin 	end = (struct bios_smap_xattr *)((char *)p + l2);
77989871cdeSJohn Baldwin 	for (smap = p; smap < end; smap++)
78089871cdeSJohn Baldwin 		printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx",
78189871cdeSJohn Baldwin 		    smap->type, smap->xattr, (uintmax_t)smap->base,
78289871cdeSJohn Baldwin 		    (uintmax_t)smap->length);
78389871cdeSJohn Baldwin 	return (0);
78489871cdeSJohn Baldwin }
78589871cdeSJohn Baldwin #endif
78689871cdeSJohn Baldwin 
787f7550ecfSMatthew Dillon static int
788aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt)
789d45564dcSHajimu UMEMOTO {
790e267e00eSXin LI 	int kelv;
791d45564dcSHajimu UMEMOTO 	float temp;
792e267e00eSXin LI 	size_t len;
793a7b5ad27SEd Schouten 	const char *p;
794aa255ef6SWarner Losh 	int prec, i;
795d45564dcSHajimu UMEMOTO 
796e267e00eSXin LI 	assert(errno == 0);
797e267e00eSXin LI 
798e267e00eSXin LI 	len = strlen(str);
799e267e00eSXin LI 	/* caller already checked this */
800e267e00eSXin LI 	assert(len > 0);
801e267e00eSXin LI 
802aa255ef6SWarner Losh 	/*
803aa255ef6SWarner Losh 	 * A format of "IK" is in deciKelvin. A format of "IK3" is in
804aa255ef6SWarner Losh 	 * milliKelvin. The single digit following IK is log10 of the
805aa255ef6SWarner Losh 	 * multiplying factor to convert Kelvin into the untis of this sysctl,
806aa255ef6SWarner Losh 	 * or the dividing factor to convert the sysctl value to Kelvin. Numbers
807aa255ef6SWarner Losh 	 * larger than 6 will run into precision issues with 32-bit integers.
808aa255ef6SWarner Losh 	 * Characters that aren't ASCII digits after the 'K' are ignored. No
809aa255ef6SWarner Losh 	 * localization is present because this is an interface from the kernel
810aa255ef6SWarner Losh 	 * to this program (eg not an end-user interface), so isdigit() isn't
811aa255ef6SWarner Losh 	 * used here.
812aa255ef6SWarner Losh 	 */
813aa255ef6SWarner Losh 	if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9')
814aa255ef6SWarner Losh 		prec = fmt[2] - '0';
815aa255ef6SWarner Losh 	else
816aa255ef6SWarner Losh 		prec = 1;
817d45564dcSHajimu UMEMOTO 	p = &str[len - 1];
818aa255ef6SWarner Losh 	if (*p == 'C' || *p == 'F' || *p == 'K') {
819e267e00eSXin LI 		temp = strtof(str, endptrp);
820689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
821d45564dcSHajimu UMEMOTO 			if (*p == 'F')
822d45564dcSHajimu UMEMOTO 				temp = (temp - 32) * 5 / 9;
823689c8e8bSXin LI 			*endptrp = NULL;
824aa255ef6SWarner Losh 			if (*p != 'K')
825aa255ef6SWarner Losh 				temp += 273.15;
826aa255ef6SWarner Losh 			for (i = 0; i < prec; i++)
827aa255ef6SWarner Losh 				temp *= 10.0;
828aa255ef6SWarner Losh 			return ((int)(temp + 0.5));
829d45564dcSHajimu UMEMOTO 		}
830e267e00eSXin LI 	} else {
831aa255ef6SWarner Losh 		/* No unit specified -> treat it as a raw number */
832e267e00eSXin LI 		kelv = (int)strtol(str, endptrp, 10);
833689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
834689c8e8bSXin LI 			*endptrp = NULL;
835e267e00eSXin LI 			return (kelv);
836e267e00eSXin LI 		}
837689c8e8bSXin LI 	}
838e267e00eSXin LI 
839e267e00eSXin LI 	errno = ERANGE;
840e267e00eSXin LI 	return (0);
841d45564dcSHajimu UMEMOTO }
842d45564dcSHajimu UMEMOTO 
8431d86b91cSPoul-Henning Kamp /*
8441d86b91cSPoul-Henning Kamp  * These functions uses a presently undocumented interface to the kernel
8451d86b91cSPoul-Henning Kamp  * to walk the tree and get the type so it can print the value.
8461d86b91cSPoul-Henning Kamp  * This interface is under work and consideration, and should probably
8471d86b91cSPoul-Henning Kamp  * be killed with a big axe by the first person who can find the time.
8481d86b91cSPoul-Henning Kamp  * (be aware though, that the proper interface isn't as obvious as it
8491d86b91cSPoul-Henning Kamp  * may seem, there are various conflicting requirements.
8501d86b91cSPoul-Henning Kamp  */
8511d86b91cSPoul-Henning Kamp 
8521d86b91cSPoul-Henning Kamp static int
853c58f8df6SXin LI name2oid(const char *name, int *oidp)
8541d86b91cSPoul-Henning Kamp {
8551d86b91cSPoul-Henning Kamp 	int oid[2];
856dbf9b92fSDoug Rabson 	int i;
857dbf9b92fSDoug Rabson 	size_t j;
8581d86b91cSPoul-Henning Kamp 
8591d86b91cSPoul-Henning Kamp 	oid[0] = 0;
8601d86b91cSPoul-Henning Kamp 	oid[1] = 3;
8611d86b91cSPoul-Henning Kamp 
8621d86b91cSPoul-Henning Kamp 	j = CTL_MAXNAME * sizeof(int);
8631d86b91cSPoul-Henning Kamp 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
8641d86b91cSPoul-Henning Kamp 	if (i < 0)
86521e1f596SDavid Malone 		return (i);
8661d86b91cSPoul-Henning Kamp 	j /= sizeof(int);
8671d86b91cSPoul-Henning Kamp 	return (j);
8681d86b91cSPoul-Henning Kamp }
8691d86b91cSPoul-Henning Kamp 
8701d86b91cSPoul-Henning Kamp static int
8711d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind)
8721d86b91cSPoul-Henning Kamp {
8731d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
8741d86b91cSPoul-Henning Kamp 	u_char buf[BUFSIZ];
875dbf9b92fSDoug Rabson 	int i;
876dbf9b92fSDoug Rabson 	size_t j;
8771d86b91cSPoul-Henning Kamp 
8781d86b91cSPoul-Henning Kamp 	qoid[0] = 0;
8791d86b91cSPoul-Henning Kamp 	qoid[1] = 4;
8801d86b91cSPoul-Henning Kamp 	memcpy(qoid + 2, oid, len * sizeof(int));
8811d86b91cSPoul-Henning Kamp 
88231fb4661SDima Dorfman 	j = sizeof(buf);
8831d86b91cSPoul-Henning Kamp 	i = sysctl(qoid, len + 2, buf, &j, 0, 0);
8841d86b91cSPoul-Henning Kamp 	if (i)
8856d7a8f6cSUlrich Spörlein 		err(1, "sysctl fmt %d %zu %d", i, j, errno);
8861d86b91cSPoul-Henning Kamp 
8871d86b91cSPoul-Henning Kamp 	if (kind)
8881d86b91cSPoul-Henning Kamp 		*kind = *(u_int *)buf;
8891d86b91cSPoul-Henning Kamp 
8901d86b91cSPoul-Henning Kamp 	if (fmt)
8911d86b91cSPoul-Henning Kamp 		strcpy(fmt, (char *)(buf + sizeof(u_int)));
89221e1f596SDavid Malone 	return (0);
8931d86b91cSPoul-Henning Kamp }
8941d86b91cSPoul-Henning Kamp 
89560cf2c12SLuigi Rizzo /*
8961d86b91cSPoul-Henning Kamp  * This formats and outputs the value of one variable
8971d86b91cSPoul-Henning Kamp  *
8981d86b91cSPoul-Henning Kamp  * Returns zero if anything was actually output.
8991d86b91cSPoul-Henning Kamp  * Returns one if didn't know what to do with this.
9001d86b91cSPoul-Henning Kamp  * Return minus one if we had errors.
9011d86b91cSPoul-Henning Kamp  */
9021d86b91cSPoul-Henning Kamp static int
9031d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen)
9041d86b91cSPoul-Henning Kamp {
905ccf25977SRuslan Ermilov 	u_char buf[BUFSIZ], *val, *oval, *p;
906403c7f59SAlfred Perlstein 	char name[BUFSIZ], fmt[BUFSIZ];
9078020192dSMarcelo Araujo 	const char *sep, *sep1, *prntype;
9081d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
90921e1f596SDavid Malone 	uintmax_t umv;
91021e1f596SDavid Malone 	intmax_t mv;
911f8e4b4efSMatthew D Fleming 	int i, hexlen, sign, ctltype;
91241e419cbSDavid Malone 	size_t intlen;
913dbf9b92fSDoug Rabson 	size_t j, len;
9141d86b91cSPoul-Henning Kamp 	u_int kind;
915aa255ef6SWarner Losh 	float base;
91659101c5dSJohn Baldwin 	int (*func)(size_t, void *);
917aa255ef6SWarner Losh 	int prec;
9181d86b91cSPoul-Henning Kamp 
9196d7a8f6cSUlrich Spörlein 	/* Silence GCC. */
9206d7a8f6cSUlrich Spörlein 	umv = mv = intlen = 0;
9216d7a8f6cSUlrich Spörlein 
9229f98e452SMatthew N. Dodd 	bzero(buf, BUFSIZ);
923403c7f59SAlfred Perlstein 	bzero(fmt, BUFSIZ);
9249f98e452SMatthew N. Dodd 	bzero(name, BUFSIZ);
92581e7454aSDag-Erling Smørgrav 	qoid[0] = 0;
92681e7454aSDag-Erling Smørgrav 	memcpy(qoid + 2, oid, nlen * sizeof(int));
92781e7454aSDag-Erling Smørgrav 
92881e7454aSDag-Erling Smørgrav 	qoid[1] = 1;
92931fb4661SDima Dorfman 	j = sizeof(name);
93081e7454aSDag-Erling Smørgrav 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
93181e7454aSDag-Erling Smørgrav 	if (i || !j)
9326d7a8f6cSUlrich Spörlein 		err(1, "sysctl name %d %zu %d", i, j, errno);
93381e7454aSDag-Erling Smørgrav 
934403c7f59SAlfred Perlstein 	oidfmt(oid, nlen, fmt, &kind);
935403c7f59SAlfred Perlstein 	/* if Wflag then only list sysctls that are writeable and not stats. */
936403c7f59SAlfred Perlstein 	if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
937403c7f59SAlfred Perlstein 		return 1;
938403c7f59SAlfred Perlstein 
939403c7f59SAlfred Perlstein 	/* if Tflag then only list sysctls that are tuneables. */
940403c7f59SAlfred Perlstein 	if (Tflag && (kind & CTLFLAG_TUN) == 0)
941403c7f59SAlfred Perlstein 		return 1;
942403c7f59SAlfred Perlstein 
943ca5fac55SDag-Erling Smørgrav 	if (Nflag) {
944ca5fac55SDag-Erling Smørgrav 		printf("%s", name);
945ca5fac55SDag-Erling Smørgrav 		return (0);
946ca5fac55SDag-Erling Smørgrav 	}
947ca5fac55SDag-Erling Smørgrav 
948d0b8aabbSAnton Berezin 	if (eflag)
949d0b8aabbSAnton Berezin 		sep = "=";
950d0b8aabbSAnton Berezin 	else
951d0b8aabbSAnton Berezin 		sep = ": ";
952d0b8aabbSAnton Berezin 
9538020192dSMarcelo Araujo 	ctltype = (kind & CTLTYPE);
9548020192dSMarcelo Araujo 	if (tflag || dflag) {
9558020192dSMarcelo Araujo 		if (!nflag)
9568020192dSMarcelo Araujo 			printf("%s%s", name, sep);
9578020192dSMarcelo Araujo         	if (ctl_typename[ctltype] != NULL)
9588020192dSMarcelo Araujo             		prntype = ctl_typename[ctltype];
9598020192dSMarcelo Araujo         	else
9608020192dSMarcelo Araujo             		prntype = "unknown";
9618020192dSMarcelo Araujo 		if (tflag && dflag)
9628020192dSMarcelo Araujo 			printf("%s%s", prntype, sep);
9638020192dSMarcelo Araujo 		else if (tflag) {
9648020192dSMarcelo Araujo 			printf("%s", prntype);
9658020192dSMarcelo Araujo 			return (0);
9668020192dSMarcelo Araujo 		}
9676105f815SLuigi Rizzo 		qoid[1] = 5;
9686105f815SLuigi Rizzo 		j = sizeof(buf);
9696105f815SLuigi Rizzo 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
9706105f815SLuigi Rizzo 		printf("%s", buf);
9716105f815SLuigi Rizzo 		return (0);
9726105f815SLuigi Rizzo 	}
973a18f34feSAndrew Gallatin 
974a18f34feSAndrew Gallatin 	/* don't fetch opaques that we don't know how to print */
975a18f34feSAndrew Gallatin 	if (ctltype == CTLTYPE_OPAQUE) {
976a18f34feSAndrew Gallatin 		if (strcmp(fmt, "S,clockinfo") == 0)
977a18f34feSAndrew Gallatin 			func = S_clockinfo;
978a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,timeval") == 0)
979a18f34feSAndrew Gallatin 			func = S_timeval;
980a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,loadavg") == 0)
981a18f34feSAndrew Gallatin 			func = S_loadavg;
982a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,vmtotal") == 0)
983a18f34feSAndrew Gallatin 			func = S_vmtotal;
984a18f34feSAndrew Gallatin #ifdef __amd64__
985a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,efi_map_header") == 0)
986a18f34feSAndrew Gallatin 			func = S_efi_map;
987a18f34feSAndrew Gallatin #endif
988a18f34feSAndrew Gallatin #if defined(__amd64__) || defined(__i386__)
989a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
990a18f34feSAndrew Gallatin 			func = S_bios_smap_xattr;
991a18f34feSAndrew Gallatin #endif
992a18f34feSAndrew Gallatin 		else {
993a18f34feSAndrew Gallatin 			func = NULL;
994a18f34feSAndrew Gallatin 			if (!bflag && !oflag && !xflag)
995a18f34feSAndrew Gallatin 				return (1);
996a18f34feSAndrew Gallatin 		}
997a18f34feSAndrew Gallatin 	}
998a18f34feSAndrew Gallatin 
9991d86b91cSPoul-Henning Kamp 	/* find an estimate of how much we need for this var */
100075820005SJohn-Mark Gurney 	if (Bflag)
100175820005SJohn-Mark Gurney 		j = Bflag;
100275820005SJohn-Mark Gurney 	else {
10031d86b91cSPoul-Henning Kamp 		j = 0;
10041d86b91cSPoul-Henning Kamp 		i = sysctl(oid, nlen, 0, &j, 0, 0);
10051d86b91cSPoul-Henning Kamp 		j += j; /* we want to be sure :-) */
100675820005SJohn-Mark Gurney 	}
10071d86b91cSPoul-Henning Kamp 
1008ccf25977SRuslan Ermilov 	val = oval = malloc(j + 1);
1009ccf25977SRuslan Ermilov 	if (val == NULL) {
1010ccf25977SRuslan Ermilov 		warnx("malloc failed");
10116b6b665bSBruce Evans 		return (1);
1012ccf25977SRuslan Ermilov 	}
10131d86b91cSPoul-Henning Kamp 	len = j;
10141d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, val, &len, 0, 0);
101504006eabSHans Petter Selasky 	if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) {
1016ccf25977SRuslan Ermilov 		free(oval);
10171d86b91cSPoul-Henning Kamp 		return (1);
1018ccf25977SRuslan Ermilov 	}
10191d86b91cSPoul-Henning Kamp 
10201d86b91cSPoul-Henning Kamp 	if (bflag) {
10211d86b91cSPoul-Henning Kamp 		fwrite(val, 1, len, stdout);
1022ccf25977SRuslan Ermilov 		free(oval);
10231d86b91cSPoul-Henning Kamp 		return (0);
10241d86b91cSPoul-Henning Kamp 	}
102576d3dc52SAndrey A. Chernov 	val[len] = '\0';
10261d86b91cSPoul-Henning Kamp 	p = val;
1027cbc134adSMatthew D Fleming 	sign = ctl_sign[ctltype];
1028cbc134adSMatthew D Fleming 	intlen = ctl_size[ctltype];
1029cbc134adSMatthew D Fleming 
1030f8e4b4efSMatthew D Fleming 	switch (ctltype) {
1031f8e4b4efSMatthew D Fleming 	case CTLTYPE_STRING:
10321d86b91cSPoul-Henning Kamp 		if (!nflag)
1033d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
10346d7a8f6cSUlrich Spörlein 		printf("%.*s", (int)len, p);
1035ccf25977SRuslan Ermilov 		free(oval);
10361d86b91cSPoul-Henning Kamp 		return (0);
10371d86b91cSPoul-Henning Kamp 
1038f8e4b4efSMatthew D Fleming 	case CTLTYPE_INT:
1039f8e4b4efSMatthew D Fleming 	case CTLTYPE_UINT:
1040f8e4b4efSMatthew D Fleming 	case CTLTYPE_LONG:
1041f8e4b4efSMatthew D Fleming 	case CTLTYPE_ULONG:
10422a71f1edSConrad Meyer 	case CTLTYPE_S8:
10432a71f1edSConrad Meyer 	case CTLTYPE_S16:
10442a71f1edSConrad Meyer 	case CTLTYPE_S32:
1045cbc134adSMatthew D Fleming 	case CTLTYPE_S64:
10462a71f1edSConrad Meyer 	case CTLTYPE_U8:
10472a71f1edSConrad Meyer 	case CTLTYPE_U16:
10482a71f1edSConrad Meyer 	case CTLTYPE_U32:
1049cbc134adSMatthew D Fleming 	case CTLTYPE_U64:
1050dbf9b92fSDoug Rabson 		if (!nflag)
1051d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
1052e37d2b30SDavid Malone 		hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
1053fd8c668aSDavid Malone 		sep1 = "";
105441e419cbSDavid Malone 		while (len >= intlen) {
1055f8e4b4efSMatthew D Fleming 			switch (kind & CTLTYPE) {
1056f8e4b4efSMatthew D Fleming 			case CTLTYPE_INT:
1057f8e4b4efSMatthew D Fleming 			case CTLTYPE_UINT:
1058e37d2b30SDavid Malone 				umv = *(u_int *)p;
1059e37d2b30SDavid Malone 				mv = *(int *)p;
106041e419cbSDavid Malone 				break;
1061f8e4b4efSMatthew D Fleming 			case CTLTYPE_LONG:
1062f8e4b4efSMatthew D Fleming 			case CTLTYPE_ULONG:
1063e37d2b30SDavid Malone 				umv = *(u_long *)p;
1064e37d2b30SDavid Malone 				mv = *(long *)p;
106541e419cbSDavid Malone 				break;
10662a71f1edSConrad Meyer 			case CTLTYPE_S8:
10672a71f1edSConrad Meyer 			case CTLTYPE_U8:
10682a71f1edSConrad Meyer 				umv = *(uint8_t *)p;
10692a71f1edSConrad Meyer 				mv = *(int8_t *)p;
10702a71f1edSConrad Meyer 				break;
10712a71f1edSConrad Meyer 			case CTLTYPE_S16:
10722a71f1edSConrad Meyer 			case CTLTYPE_U16:
10732a71f1edSConrad Meyer 				umv = *(uint16_t *)p;
10742a71f1edSConrad Meyer 				mv = *(int16_t *)p;
10752a71f1edSConrad Meyer 				break;
10762a71f1edSConrad Meyer 			case CTLTYPE_S32:
10772a71f1edSConrad Meyer 			case CTLTYPE_U32:
10782a71f1edSConrad Meyer 				umv = *(uint32_t *)p;
10792a71f1edSConrad Meyer 				mv = *(int32_t *)p;
10802a71f1edSConrad Meyer 				break;
1081cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
1082cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
1083cbc134adSMatthew D Fleming 				umv = *(uint64_t *)p;
1084cbc134adSMatthew D Fleming 				mv = *(int64_t *)p;
108541e419cbSDavid Malone 				break;
108641e419cbSDavid Malone 			}
1087fd8c668aSDavid Malone 			fputs(sep1, stdout);
1088f8e4b4efSMatthew D Fleming 			if (xflag)
1089e37d2b30SDavid Malone 				printf("%#0*jx", hexlen, umv);
1090f8e4b4efSMatthew D Fleming 			else if (!sign)
1091f8e4b4efSMatthew D Fleming 				printf(hflag ? "%'ju" : "%ju", umv);
109241e419cbSDavid Malone 			else if (fmt[1] == 'K') {
1093e37d2b30SDavid Malone 				if (mv < 0)
109421e1f596SDavid Malone 					printf("%jd", mv);
1095aa255ef6SWarner Losh 				else {
1096aa255ef6SWarner Losh 					/*
1097aa255ef6SWarner Losh 					 * See strIKtoi for details on fmt.
1098aa255ef6SWarner Losh 					 */
1099aa255ef6SWarner Losh 					prec = 1;
1100aa255ef6SWarner Losh 					if (fmt[2] != '\0')
1101aa255ef6SWarner Losh 						prec = fmt[2] - '0';
1102aa255ef6SWarner Losh 					base = 1.0;
1103aa255ef6SWarner Losh 					for (int i = 0; i < prec; i++)
1104aa255ef6SWarner Losh 						base *= 10.0;
1105aa255ef6SWarner Losh 					printf("%.*fC", prec,
1106aa255ef6SWarner Losh 					    (float)mv / base - 273.15);
1107aa255ef6SWarner Losh 				}
1108c591d41fSPeter Wemm 			} else
1109fd8c668aSDavid Malone 				printf(hflag ? "%'jd" : "%jd", mv);
1110fd8c668aSDavid Malone 			sep1 = " ";
111141e419cbSDavid Malone 			len -= intlen;
111241e419cbSDavid Malone 			p += intlen;
1113aa02fb57SPoul-Henning Kamp 		}
1114ccf25977SRuslan Ermilov 		free(oval);
1115dbf9b92fSDoug Rabson 		return (0);
1116dbf9b92fSDoug Rabson 
1117f8e4b4efSMatthew D Fleming 	case CTLTYPE_OPAQUE:
11181d86b91cSPoul-Henning Kamp 		i = 0;
11191d86b91cSPoul-Henning Kamp 		if (func) {
11201d86b91cSPoul-Henning Kamp 			if (!nflag)
1121d0b8aabbSAnton Berezin 				printf("%s%s", name, sep);
112248cd487aSHartmut Brandt 			i = (*func)(len, p);
1123ccf25977SRuslan Ermilov 			free(oval);
112448cd487aSHartmut Brandt 			return (i);
11251d86b91cSPoul-Henning Kamp 		}
11261d86b91cSPoul-Henning Kamp 		/* FALLTHROUGH */
1127dea673e9SRodney W. Grimes 	default:
1128ccf25977SRuslan Ermilov 		if (!oflag && !xflag) {
1129ccf25977SRuslan Ermilov 			free(oval);
11301d86b91cSPoul-Henning Kamp 			return (1);
1131ccf25977SRuslan Ermilov 		}
11321d86b91cSPoul-Henning Kamp 		if (!nflag)
1133d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
11346d7a8f6cSUlrich Spörlein 		printf("Format:%s Length:%zu Dump:0x", fmt, len);
1135a89ab9bbSDag-Erling Smørgrav 		while (len-- && (xflag || p < val + 16))
11361d86b91cSPoul-Henning Kamp 			printf("%02x", *p++);
1137a89ab9bbSDag-Erling Smørgrav 		if (!xflag && len > 16)
11381d86b91cSPoul-Henning Kamp 			printf("...");
1139ccf25977SRuslan Ermilov 		free(oval);
11401d86b91cSPoul-Henning Kamp 		return (0);
11411d86b91cSPoul-Henning Kamp 	}
1142ccf25977SRuslan Ermilov 	free(oval);
11431d86b91cSPoul-Henning Kamp 	return (1);
1144dea673e9SRodney W. Grimes }
1145dea673e9SRodney W. Grimes 
11461d86b91cSPoul-Henning Kamp static int
11471d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len)
1148dea673e9SRodney W. Grimes {
11491d86b91cSPoul-Henning Kamp 	int name1[22], name2[22];
1150dbf9b92fSDoug Rabson 	int i, j;
1151dbf9b92fSDoug Rabson 	size_t l1, l2;
1152dea673e9SRodney W. Grimes 
11531d86b91cSPoul-Henning Kamp 	name1[0] = 0;
11541d86b91cSPoul-Henning Kamp 	name1[1] = 2;
11551d86b91cSPoul-Henning Kamp 	l1 = 2;
11561d86b91cSPoul-Henning Kamp 	if (len) {
11571d86b91cSPoul-Henning Kamp 		memcpy(name1+2, oid, len * sizeof(int));
11581d86b91cSPoul-Henning Kamp 		l1 += len;
11591d86b91cSPoul-Henning Kamp 	} else {
11601d86b91cSPoul-Henning Kamp 		name1[2] = 1;
11611d86b91cSPoul-Henning Kamp 		l1++;
11621d86b91cSPoul-Henning Kamp 	}
1163a89ab9bbSDag-Erling Smørgrav 	for (;;) {
116431fb4661SDima Dorfman 		l2 = sizeof(name2);
11651d86b91cSPoul-Henning Kamp 		j = sysctl(name1, l1, name2, &l2, 0, 0);
1166c1160fe4SBill Fumerola 		if (j < 0) {
11671d86b91cSPoul-Henning Kamp 			if (errno == ENOENT)
116821e1f596SDavid Malone 				return (0);
11691d86b91cSPoul-Henning Kamp 			else
11706d7a8f6cSUlrich Spörlein 				err(1, "sysctl(getnext) %d %zu", j, l2);
1171c1160fe4SBill Fumerola 		}
11721d86b91cSPoul-Henning Kamp 
11731d86b91cSPoul-Henning Kamp 		l2 /= sizeof(int);
11741d86b91cSPoul-Henning Kamp 
1175fd8c668aSDavid Malone 		if (len < 0 || l2 < (unsigned int)len)
117621e1f596SDavid Malone 			return (0);
11771d86b91cSPoul-Henning Kamp 
11781d86b91cSPoul-Henning Kamp 		for (i = 0; i < len; i++)
11791d86b91cSPoul-Henning Kamp 			if (name2[i] != oid[i])
118021e1f596SDavid Malone 				return (0);
11811d86b91cSPoul-Henning Kamp 
11821d86b91cSPoul-Henning Kamp 		i = show_var(name2, l2);
11831d86b91cSPoul-Henning Kamp 		if (!i && !bflag)
11841d86b91cSPoul-Henning Kamp 			putchar('\n');
11851d86b91cSPoul-Henning Kamp 
11861d86b91cSPoul-Henning Kamp 		memcpy(name1+2, name2, l2 * sizeof(int));
11871d86b91cSPoul-Henning Kamp 		l1 = 2 + l2;
11881d86b91cSPoul-Henning Kamp 	}
1189dea673e9SRodney W. Grimes }
1190