xref: /freebsd/sbin/sysctl/sysctl.c (revision 8a16b7a18f5d0b031f09832fd7752fba717e2a97)
1*8a16b7a1SPedro F. Giffuni /*-
2*8a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro 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>
68dea673e9SRodney W. Grimes #include <stdio.h>
69dea673e9SRodney W. Grimes #include <stdlib.h>
70dea673e9SRodney W. Grimes #include <string.h>
71da178c77SXin LI #include <sysexits.h>
72d9b1bc77SPhilippe Charnier #include <unistd.h>
73dea673e9SRodney W. Grimes 
74da178c77SXin LI static const char *conffile;
75da178c77SXin LI 
7675820005SJohn-Mark Gurney static int	aflag, bflag, Bflag, dflag, eflag, hflag, iflag;
778020192dSMarcelo Araujo static int	Nflag, nflag, oflag, qflag, tflag, Tflag, Wflag, xflag;
78dea673e9SRodney W. Grimes 
791d86b91cSPoul-Henning Kamp static int	oidfmt(int *, int, char *, u_int *);
80da178c77SXin LI static int	parsefile(const char *);
81da178c77SXin LI static int	parse(const char *, int);
821d86b91cSPoul-Henning Kamp static int	show_var(int *, int);
831d86b91cSPoul-Henning Kamp static int	sysctl_all(int *oid, int len);
84c58f8df6SXin LI static int	name2oid(const char *, int *);
85dea673e9SRodney W. Grimes 
86aa255ef6SWarner Losh static int	strIKtoi(const char *, char **, const char *);
87e267e00eSXin LI 
88e267e00eSXin LI static int ctl_sign[CTLTYPE+1] = {
89e267e00eSXin LI 	[CTLTYPE_INT] = 1,
90e267e00eSXin LI 	[CTLTYPE_LONG] = 1,
912a71f1edSConrad Meyer 	[CTLTYPE_S8] = 1,
922a71f1edSConrad Meyer 	[CTLTYPE_S16] = 1,
932a71f1edSConrad Meyer 	[CTLTYPE_S32] = 1,
94e267e00eSXin LI 	[CTLTYPE_S64] = 1,
95e267e00eSXin LI };
96e267e00eSXin LI 
97e267e00eSXin LI static int ctl_size[CTLTYPE+1] = {
98e267e00eSXin LI 	[CTLTYPE_INT] = sizeof(int),
99e267e00eSXin LI 	[CTLTYPE_UINT] = sizeof(u_int),
100e267e00eSXin LI 	[CTLTYPE_LONG] = sizeof(long),
101e267e00eSXin LI 	[CTLTYPE_ULONG] = sizeof(u_long),
1022a71f1edSConrad Meyer 	[CTLTYPE_S8] = sizeof(int8_t),
1032a71f1edSConrad Meyer 	[CTLTYPE_S16] = sizeof(int16_t),
1042a71f1edSConrad Meyer 	[CTLTYPE_S32] = sizeof(int32_t),
105e267e00eSXin LI 	[CTLTYPE_S64] = sizeof(int64_t),
1062a71f1edSConrad Meyer 	[CTLTYPE_U8] = sizeof(uint8_t),
1072a71f1edSConrad Meyer 	[CTLTYPE_U16] = sizeof(uint16_t),
1082a71f1edSConrad Meyer 	[CTLTYPE_U32] = sizeof(uint32_t),
109e267e00eSXin LI 	[CTLTYPE_U64] = sizeof(uint64_t),
110e267e00eSXin LI };
111e267e00eSXin LI 
112e267e00eSXin LI static const char *ctl_typename[CTLTYPE+1] = {
113e267e00eSXin LI 	[CTLTYPE_INT] = "integer",
114e267e00eSXin LI 	[CTLTYPE_UINT] = "unsigned integer",
115e267e00eSXin LI 	[CTLTYPE_LONG] = "long integer",
116e267e00eSXin LI 	[CTLTYPE_ULONG] = "unsigned long",
1172a71f1edSConrad Meyer 	[CTLTYPE_U8] = "uint8_t",
1182a71f1edSConrad Meyer 	[CTLTYPE_U16] = "uint16_t",
1193ddb14a5SAndriy Voskoboinyk 	[CTLTYPE_U32] = "uint32_t",
120e267e00eSXin LI 	[CTLTYPE_U64] = "uint64_t",
1212a71f1edSConrad Meyer 	[CTLTYPE_S8] = "int8_t",
1222a71f1edSConrad Meyer 	[CTLTYPE_S16] = "int16_t",
1232a71f1edSConrad Meyer 	[CTLTYPE_S32] = "int32_t",
1242a71f1edSConrad Meyer 	[CTLTYPE_S64] = "int64_t",
1258020192dSMarcelo Araujo 	[CTLTYPE_NODE] = "node",
1268020192dSMarcelo Araujo 	[CTLTYPE_STRING] = "string",
1278020192dSMarcelo Araujo 	[CTLTYPE_OPAQUE] = "opaque",
128e267e00eSXin LI };
129d58f0054SPoul-Henning Kamp 
1301d86b91cSPoul-Henning Kamp static void
1311d86b91cSPoul-Henning Kamp usage(void)
1321d86b91cSPoul-Henning Kamp {
133dea673e9SRodney W. Grimes 
1349a2402bcSDag-Erling Smørgrav 	(void)fprintf(stderr, "%s\n%s\n",
1358020192dSMarcelo Araujo 	    "usage: sysctl [-bdehiNnoqTtWx] [ -B <bufsize> ] [-f filename] name[=value] ...",
1368020192dSMarcelo Araujo 	    "       sysctl [-bdehNnoqTtWx] [ -B <bufsize> ] -a");
1371d86b91cSPoul-Henning Kamp 	exit(1);
1381d86b91cSPoul-Henning Kamp }
139dea673e9SRodney W. Grimes 
140dea673e9SRodney W. Grimes int
1411d86b91cSPoul-Henning Kamp main(int argc, char **argv)
142dea673e9SRodney W. Grimes {
1431d86b91cSPoul-Henning Kamp 	int ch;
144da178c77SXin LI 	int warncount = 0;
14545817aaaSDag-Erling Smørgrav 
14645817aaaSDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "");
1471d86b91cSPoul-Henning Kamp 	setbuf(stdout,0);
1481d86b91cSPoul-Henning Kamp 	setbuf(stderr,0);
149dea673e9SRodney W. Grimes 
1508020192dSMarcelo Araujo 	while ((ch = getopt(argc, argv, "AabB:def:hiNnoqtTwWxX")) != -1) {
151dea673e9SRodney W. Grimes 		switch (ch) {
152ca5fac55SDag-Erling Smørgrav 		case 'A':
1539a2402bcSDag-Erling Smørgrav 			/* compatibility */
1549a2402bcSDag-Erling Smørgrav 			aflag = oflag = 1;
155ca5fac55SDag-Erling Smørgrav 			break;
156ca5fac55SDag-Erling Smørgrav 		case 'a':
157ca5fac55SDag-Erling Smørgrav 			aflag = 1;
158ca5fac55SDag-Erling Smørgrav 			break;
159ca5fac55SDag-Erling Smørgrav 		case 'b':
160ca5fac55SDag-Erling Smørgrav 			bflag = 1;
161ca5fac55SDag-Erling Smørgrav 			break;
16275820005SJohn-Mark Gurney 		case 'B':
16375820005SJohn-Mark Gurney 			Bflag = strtol(optarg, NULL, 0);
16475820005SJohn-Mark Gurney 			break;
1656105f815SLuigi Rizzo 		case 'd':
1666105f815SLuigi Rizzo 			dflag = 1;
1676105f815SLuigi Rizzo 			break;
168d0b8aabbSAnton Berezin 		case 'e':
169d0b8aabbSAnton Berezin 			eflag = 1;
170d0b8aabbSAnton Berezin 			break;
171da178c77SXin LI 		case 'f':
172da178c77SXin LI 			conffile = optarg;
173da178c77SXin LI 			break;
17445817aaaSDag-Erling Smørgrav 		case 'h':
17545817aaaSDag-Erling Smørgrav 			hflag = 1;
17645817aaaSDag-Erling Smørgrav 			break;
17724b2aa32SGavin Atkinson 		case 'i':
17824b2aa32SGavin Atkinson 			iflag = 1;
17924b2aa32SGavin Atkinson 			break;
180ca5fac55SDag-Erling Smørgrav 		case 'N':
181ca5fac55SDag-Erling Smørgrav 			Nflag = 1;
182ca5fac55SDag-Erling Smørgrav 			break;
183ca5fac55SDag-Erling Smørgrav 		case 'n':
184ca5fac55SDag-Erling Smørgrav 			nflag = 1;
185ca5fac55SDag-Erling Smørgrav 			break;
1869a2402bcSDag-Erling Smørgrav 		case 'o':
1879a2402bcSDag-Erling Smørgrav 			oflag = 1;
1889a2402bcSDag-Erling Smørgrav 			break;
189f93d36fdSRobert Watson 		case 'q':
190f93d36fdSRobert Watson 			qflag = 1;
191f93d36fdSRobert Watson 			break;
1928020192dSMarcelo Araujo 		case 't':
1938020192dSMarcelo Araujo 			tflag = 1;
1948020192dSMarcelo Araujo 			break;
1959ecd2e32SAlfred Perlstein 		case 'T':
1969ecd2e32SAlfred Perlstein 			Tflag = 1;
1979ecd2e32SAlfred Perlstein 			break;
198ca5fac55SDag-Erling Smørgrav 		case 'w':
1999a2402bcSDag-Erling Smørgrav 			/* compatibility */
2009a2402bcSDag-Erling Smørgrav 			/* ignored */
201ca5fac55SDag-Erling Smørgrav 			break;
2029ecd2e32SAlfred Perlstein 		case 'W':
2039ecd2e32SAlfred Perlstein 			Wflag = 1;
2049ecd2e32SAlfred Perlstein 			break;
205ca5fac55SDag-Erling Smørgrav 		case 'X':
2069a2402bcSDag-Erling Smørgrav 			/* compatibility */
2079a2402bcSDag-Erling Smørgrav 			aflag = xflag = 1;
2089a2402bcSDag-Erling Smørgrav 			break;
2099a2402bcSDag-Erling Smørgrav 		case 'x':
2109a2402bcSDag-Erling Smørgrav 			xflag = 1;
211ca5fac55SDag-Erling Smørgrav 			break;
212ca5fac55SDag-Erling Smørgrav 		default:
213ca5fac55SDag-Erling Smørgrav 			usage();
214dea673e9SRodney W. Grimes 		}
215dea673e9SRodney W. Grimes 	}
216dea673e9SRodney W. Grimes 	argc -= optind;
217dea673e9SRodney W. Grimes 	argv += optind;
218dea673e9SRodney W. Grimes 
2199a2402bcSDag-Erling Smørgrav 	if (Nflag && nflag)
22081e7454aSDag-Erling Smørgrav 		usage();
2219a2402bcSDag-Erling Smørgrav 	if (aflag && argc == 0)
2221d86b91cSPoul-Henning Kamp 		exit(sysctl_all(0, 0));
223da178c77SXin LI 	if (argc == 0 && conffile == NULL)
224dea673e9SRodney W. Grimes 		usage();
225d9fcd86cSMike Makonnen 
226d9fcd86cSMike Makonnen 	warncount = 0;
227da178c77SXin LI 	if (conffile != NULL)
228da178c77SXin LI 		warncount += parsefile(conffile);
229da178c77SXin LI 
230dea673e9SRodney W. Grimes 	while (argc-- > 0)
231da178c77SXin LI 		warncount += parse(*argv++, 0);
232da178c77SXin LI 
233da178c77SXin LI 	return (warncount);
234dea673e9SRodney W. Grimes }
235dea673e9SRodney W. Grimes 
236dea673e9SRodney W. Grimes /*
237dea673e9SRodney W. Grimes  * Parse a name into a MIB entry.
238dea673e9SRodney W. Grimes  * Lookup and print out the MIB entry if it exists.
239dea673e9SRodney W. Grimes  * Set a new value if requested.
240dea673e9SRodney W. Grimes  */
241da178c77SXin LI static int
242da178c77SXin LI parse(const char *string, int lineno)
243dea673e9SRodney W. Grimes {
2441d86b91cSPoul-Henning Kamp 	int len, i, j;
245e267e00eSXin LI 	const void *newval;
246e267e00eSXin LI 	const char *newvalstr = NULL;
2472a71f1edSConrad Meyer 	int8_t i8val;
248c3220d0bSConrad Meyer 	uint8_t u8val;
2492a71f1edSConrad Meyer 	int16_t i16val;
250c3220d0bSConrad Meyer 	uint16_t u16val;
2512a71f1edSConrad Meyer 	int32_t i32val;
2522a71f1edSConrad Meyer 	uint32_t u32val;
2531ce1a53dSJim Pirzyk 	int intval;
2541ce1a53dSJim Pirzyk 	unsigned int uintval;
2551ce1a53dSJim Pirzyk 	long longval;
2561ce1a53dSJim Pirzyk 	unsigned long ulongval;
25775820005SJohn-Mark Gurney 	size_t newsize = Bflag;
258cbc134adSMatthew D Fleming 	int64_t i64val;
259cbc134adSMatthew D Fleming 	uint64_t u64val;
260dea673e9SRodney W. Grimes 	int mib[CTL_MAXNAME];
261e267e00eSXin LI 	char *cp, *bufp, buf[BUFSIZ], *endptr = NULL, fmt[BUFSIZ], line[BUFSIZ];
2621d86b91cSPoul-Henning Kamp 	u_int kind;
263dea673e9SRodney W. Grimes 
264da178c77SXin LI 	if (lineno)
265da178c77SXin LI 		snprintf(line, sizeof(line), " at line %d", lineno);
266da178c77SXin LI 	else
267da178c77SXin LI 		line[0] = '\0';
268da178c77SXin LI 
269aae75101SXin LI 	cp = buf;
270da178c77SXin LI 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
271c6919e7fSEdward Tomasz Napierala 		warnx("oid too long: '%s'%s", string, line);
272da178c77SXin LI 		return (1);
273da178c77SXin LI 	}
274da178c77SXin LI 	bufp = strsep(&cp, "=:");
275aae75101SXin LI 	if (cp != NULL) {
2769ecd2e32SAlfred Perlstein 		/* Tflag just lists tunables, do not allow assignment */
2779ecd2e32SAlfred Perlstein 		if (Tflag || Wflag) {
2789ecd2e32SAlfred Perlstein 			warnx("Can't set variables when using -T or -W");
2799ecd2e32SAlfred Perlstein 			usage();
2809ecd2e32SAlfred Perlstein 		}
281dea673e9SRodney W. Grimes 		while (isspace(*cp))
282dea673e9SRodney W. Grimes 			cp++;
283da178c77SXin LI 		/* Strip a pair of " or ' if any. */
284da178c77SXin LI 		switch (*cp) {
285da178c77SXin LI 		case '\"':
286da178c77SXin LI 		case '\'':
287da178c77SXin LI 			if (cp[strlen(cp) - 1] == *cp)
288da178c77SXin LI 				cp[strlen(cp) - 1] = '\0';
289da178c77SXin LI 			cp++;
290da178c77SXin LI 		}
291e267e00eSXin LI 		newvalstr = cp;
292dea673e9SRodney W. Grimes 		newsize = strlen(cp);
293dea673e9SRodney W. Grimes 	}
294ca587fdaSBaptiste Daroussin 	/* Trim spaces */
295ca587fdaSBaptiste Daroussin 	cp = bufp + strlen(bufp) - 1;
296ca587fdaSBaptiste Daroussin 	while (cp >= bufp && isspace((int)*cp)) {
297ca587fdaSBaptiste Daroussin 		*cp = '\0';
298ca587fdaSBaptiste Daroussin 		cp--;
299ca587fdaSBaptiste Daroussin 	}
3001d86b91cSPoul-Henning Kamp 	len = name2oid(bufp, mib);
3011d86b91cSPoul-Henning Kamp 
302f93d36fdSRobert Watson 	if (len < 0) {
30324b2aa32SGavin Atkinson 		if (iflag)
304da178c77SXin LI 			return (0);
305f93d36fdSRobert Watson 		if (qflag)
306da178c77SXin LI 			return (1);
307da178c77SXin LI 		else {
308e1619d12SBaptiste Daroussin 			if (errno == ENOENT) {
309e1619d12SBaptiste Daroussin 				warnx("unknown oid '%s'%s", bufp, line);
310e1619d12SBaptiste Daroussin 			} else {
311da178c77SXin LI 				warn("unknown oid '%s'%s", bufp, line);
312e1619d12SBaptiste Daroussin 			}
313da178c77SXin LI 			return (1);
314da178c77SXin LI 		}
315f93d36fdSRobert Watson 	}
3161d86b91cSPoul-Henning Kamp 
317da178c77SXin LI 	if (oidfmt(mib, len, fmt, &kind)) {
318da178c77SXin LI 		warn("couldn't find format of oid '%s'%s", bufp, line);
319da178c77SXin LI 		if (iflag)
320da178c77SXin LI 			return (1);
321da178c77SXin LI 		else
322da178c77SXin LI 			exit(1);
323da178c77SXin LI 	}
3241d86b91cSPoul-Henning Kamp 
325e267e00eSXin LI 	if (newvalstr == NULL || dflag) {
3261d86b91cSPoul-Henning Kamp 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
327b2680e20SMatthew N. Dodd 			if (dflag) {
328b2680e20SMatthew N. Dodd 				i = show_var(mib, len);
329b2680e20SMatthew N. Dodd 				if (!i && !bflag)
330b2680e20SMatthew N. Dodd 					putchar('\n');
331b2680e20SMatthew N. Dodd 			}
3321d86b91cSPoul-Henning Kamp 			sysctl_all(mib, len);
3331d86b91cSPoul-Henning Kamp 		} else {
3341d86b91cSPoul-Henning Kamp 			i = show_var(mib, len);
3351d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
3361d86b91cSPoul-Henning Kamp 				putchar('\n');
337dea673e9SRodney W. Grimes 		}
3381d86b91cSPoul-Henning Kamp 	} else {
339da178c77SXin LI 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
340c6919e7fSEdward Tomasz Napierala 			warnx("oid '%s' isn't a leaf node%s", bufp, line);
341da178c77SXin LI 			return (1);
342da178c77SXin LI 		}
343dea673e9SRodney W. Grimes 
344ac8711d2SMike Silbersack 		if (!(kind & CTLFLAG_WR)) {
3459b4b73b7SMike Silbersack 			if (kind & CTLFLAG_TUN) {
3466f361351SXin LI 				warnx("oid '%s' is a read only tunable%s", bufp, line);
347da178c77SXin LI 				warnx("Tunable values are set in /boot/loader.conf");
348da178c77SXin LI 			} else
349da178c77SXin LI 				warnx("oid '%s' is read only%s", bufp, line);
350da178c77SXin LI 			return (1);
351ac8711d2SMike Silbersack 		}
352dea673e9SRodney W. Grimes 
353e267e00eSXin LI 		switch (kind & CTLTYPE) {
354e267e00eSXin LI 		case CTLTYPE_INT:
355e267e00eSXin LI 		case CTLTYPE_UINT:
356e267e00eSXin LI 		case CTLTYPE_LONG:
357e267e00eSXin LI 		case CTLTYPE_ULONG:
3582a71f1edSConrad Meyer 		case CTLTYPE_S8:
3592a71f1edSConrad Meyer 		case CTLTYPE_S16:
3602a71f1edSConrad Meyer 		case CTLTYPE_S32:
361e267e00eSXin LI 		case CTLTYPE_S64:
3622a71f1edSConrad Meyer 		case CTLTYPE_U8:
3632a71f1edSConrad Meyer 		case CTLTYPE_U16:
3642a71f1edSConrad Meyer 		case CTLTYPE_U32:
365e267e00eSXin LI 		case CTLTYPE_U64:
366e267e00eSXin LI 			if (strlen(newvalstr) == 0) {
367da178c77SXin LI 				warnx("empty numeric value");
368da178c77SXin LI 				return (1);
369da178c77SXin LI 			}
370e267e00eSXin LI 			/* FALLTHROUGH */
371e267e00eSXin LI 		case CTLTYPE_STRING:
372e267e00eSXin LI 			break;
373e267e00eSXin LI 		default:
374e267e00eSXin LI 			warnx("oid '%s' is type %d,"
375e267e00eSXin LI 				" cannot set that%s", bufp,
376e267e00eSXin LI 				kind & CTLTYPE, line);
377e267e00eSXin LI 			return (1);
378a78d3eafSRobert Watson 		}
379a78d3eafSRobert Watson 
3804b8740cdSXin LI 		errno = 0;
3814b8740cdSXin LI 
3821d86b91cSPoul-Henning Kamp 		switch (kind & CTLTYPE) {
383dea673e9SRodney W. Grimes 			case CTLTYPE_INT:
384aa255ef6SWarner Losh 				if (strncmp(fmt, "IK", 2) == 0)
385aa255ef6SWarner Losh 					intval = strIKtoi(newvalstr, &endptr, fmt);
386e267e00eSXin LI 				else
387e267e00eSXin LI 					intval = (int)strtol(newvalstr, &endptr,
388d45564dcSHajimu UMEMOTO 					    0);
389dea673e9SRodney W. Grimes 				newval = &intval;
39031fb4661SDima Dorfman 				newsize = sizeof(intval);
391dea673e9SRodney W. Grimes 				break;
3921ce1a53dSJim Pirzyk 			case CTLTYPE_UINT:
393e267e00eSXin LI 				uintval = (int) strtoul(newvalstr, &endptr, 0);
3941ce1a53dSJim Pirzyk 				newval = &uintval;
39521e1f596SDavid Malone 				newsize = sizeof(uintval);
3961ce1a53dSJim Pirzyk 				break;
3971ce1a53dSJim Pirzyk 			case CTLTYPE_LONG:
398e267e00eSXin LI 				longval = strtol(newvalstr, &endptr, 0);
3991ce1a53dSJim Pirzyk 				newval = &longval;
40021e1f596SDavid Malone 				newsize = sizeof(longval);
4011ce1a53dSJim Pirzyk 				break;
4021ce1a53dSJim Pirzyk 			case CTLTYPE_ULONG:
403e267e00eSXin LI 				ulongval = strtoul(newvalstr, &endptr, 0);
4041ce1a53dSJim Pirzyk 				newval = &ulongval;
40521e1f596SDavid Malone 				newsize = sizeof(ulongval);
4061d86b91cSPoul-Henning Kamp 				break;
4071d86b91cSPoul-Henning Kamp 			case CTLTYPE_STRING:
408e267e00eSXin LI 				newval = newvalstr;
4091d86b91cSPoul-Henning Kamp 				break;
4102a71f1edSConrad Meyer 			case CTLTYPE_S8:
4112a71f1edSConrad Meyer 				i8val = (int8_t)strtol(newvalstr, &endptr, 0);
4122a71f1edSConrad Meyer 				newval = &i8val;
4132a71f1edSConrad Meyer 				newsize = sizeof(i8val);
4142a71f1edSConrad Meyer 				break;
4152a71f1edSConrad Meyer 			case CTLTYPE_S16:
4162a71f1edSConrad Meyer 				i16val = (int16_t)strtol(newvalstr, &endptr,
4172a71f1edSConrad Meyer 				    0);
4182a71f1edSConrad Meyer 				newval = &i16val;
4192a71f1edSConrad Meyer 				newsize = sizeof(i16val);
4202a71f1edSConrad Meyer 				break;
4212a71f1edSConrad Meyer 			case CTLTYPE_S32:
4222a71f1edSConrad Meyer 				i32val = (int32_t)strtol(newvalstr, &endptr,
4232a71f1edSConrad Meyer 				    0);
4242a71f1edSConrad Meyer 				newval = &i32val;
4252a71f1edSConrad Meyer 				newsize = sizeof(i32val);
4262a71f1edSConrad Meyer 				break;
427cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
428e267e00eSXin LI 				i64val = strtoimax(newvalstr, &endptr, 0);
429cbc134adSMatthew D Fleming 				newval = &i64val;
430cbc134adSMatthew D Fleming 				newsize = sizeof(i64val);
431cbc134adSMatthew D Fleming 				break;
4322a71f1edSConrad Meyer 			case CTLTYPE_U8:
4332a71f1edSConrad Meyer 				u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
4342a71f1edSConrad Meyer 				newval = &u8val;
4352a71f1edSConrad Meyer 				newsize = sizeof(u8val);
4362a71f1edSConrad Meyer 				break;
4372a71f1edSConrad Meyer 			case CTLTYPE_U16:
4382a71f1edSConrad Meyer 				u16val = (uint16_t)strtoul(newvalstr, &endptr,
4392a71f1edSConrad Meyer 				    0);
4402a71f1edSConrad Meyer 				newval = &u16val;
4412a71f1edSConrad Meyer 				newsize = sizeof(u16val);
4422a71f1edSConrad Meyer 				break;
4432a71f1edSConrad Meyer 			case CTLTYPE_U32:
4442a71f1edSConrad Meyer 				u32val = (uint32_t)strtoul(newvalstr, &endptr,
4452a71f1edSConrad Meyer 				    0);
4462a71f1edSConrad Meyer 				newval = &u32val;
4472a71f1edSConrad Meyer 				newsize = sizeof(u32val);
4482a71f1edSConrad Meyer 				break;
449cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
450e267e00eSXin LI 				u64val = strtoumax(newvalstr, &endptr, 0);
451cbc134adSMatthew D Fleming 				newval = &u64val;
452cbc134adSMatthew D Fleming 				newsize = sizeof(u64val);
453dea673e9SRodney W. Grimes 				break;
4541d86b91cSPoul-Henning Kamp 			default:
455e267e00eSXin LI 				/* NOTREACHED */
456e267e00eSXin LI 				abort();
457e267e00eSXin LI 		}
458e267e00eSXin LI 
459e267e00eSXin LI 		if (errno != 0 || endptr == newvalstr ||
460e267e00eSXin LI 		    (endptr != NULL && *endptr != '\0')) {
461e267e00eSXin LI 			warnx("invalid %s '%s'%s", ctl_typename[kind & CTLTYPE],
462e267e00eSXin LI 			    newvalstr, line);
463da178c77SXin LI 			return (1);
464dea673e9SRodney W. Grimes 		}
4651d86b91cSPoul-Henning Kamp 
4661d86b91cSPoul-Henning Kamp 		i = show_var(mib, len);
4671d86b91cSPoul-Henning Kamp 		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
4681d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
4691d86b91cSPoul-Henning Kamp 				putchar('\n');
470dea673e9SRodney W. Grimes 			switch (errno) {
471dea673e9SRodney W. Grimes 			case EOPNOTSUPP:
472da178c77SXin LI 				warnx("%s: value is not available%s",
473da178c77SXin LI 					string, line);
474da178c77SXin LI 				return (1);
475dea673e9SRodney W. Grimes 			case ENOTDIR:
476da178c77SXin LI 				warnx("%s: specification is incomplete%s",
477da178c77SXin LI 					string, line);
478da178c77SXin LI 				return (1);
479dea673e9SRodney W. Grimes 			case ENOMEM:
480da178c77SXin LI 				warnx("%s: type is unknown to this program%s",
481da178c77SXin LI 					string, line);
482da178c77SXin LI 				return (1);
483dea673e9SRodney W. Grimes 			default:
484da178c77SXin LI 				warn("%s%s", string, line);
485da178c77SXin LI 				return (1);
486dea673e9SRodney W. Grimes 			}
487dea673e9SRodney W. Grimes 		}
4881d86b91cSPoul-Henning Kamp 		if (!bflag)
4891d86b91cSPoul-Henning Kamp 			printf(" -> ");
4901d86b91cSPoul-Henning Kamp 		i = nflag;
4911d86b91cSPoul-Henning Kamp 		nflag = 1;
4921d86b91cSPoul-Henning Kamp 		j = show_var(mib, len);
4931d86b91cSPoul-Henning Kamp 		if (!j && !bflag)
4941d86b91cSPoul-Henning Kamp 			putchar('\n');
4951d86b91cSPoul-Henning Kamp 		nflag = i;
496dea673e9SRodney W. Grimes 	}
497da178c77SXin LI 
498da178c77SXin LI 	return (0);
499da178c77SXin LI }
500da178c77SXin LI 
501da178c77SXin LI static int
502da178c77SXin LI parsefile(const char *filename)
503da178c77SXin LI {
504da178c77SXin LI 	FILE *file;
505da178c77SXin LI 	char line[BUFSIZ], *p, *pq, *pdq;
506da178c77SXin LI 	int warncount = 0, lineno = 0;
507da178c77SXin LI 
508da178c77SXin LI 	file = fopen(filename, "r");
509da178c77SXin LI 	if (file == NULL)
510da178c77SXin LI 		err(EX_NOINPUT, "%s", filename);
511da178c77SXin LI 	while (fgets(line, sizeof(line), file) != NULL) {
512da178c77SXin LI 		lineno++;
513da178c77SXin LI 		p = line;
514da178c77SXin LI 		pq = strchr(line, '\'');
515da178c77SXin LI 		pdq = strchr(line, '\"');
516da178c77SXin LI 		/* Replace the first # with \0. */
517da178c77SXin LI 		while((p = strchr(p, '#')) != NULL) {
518da178c77SXin LI 			if (pq != NULL && p > pq) {
519da178c77SXin LI 				if ((p = strchr(pq+1, '\'')) != NULL)
520da178c77SXin LI 					*(++p) = '\0';
521da178c77SXin LI 				break;
522da178c77SXin LI 			} else if (pdq != NULL && p > pdq) {
523da178c77SXin LI 				if ((p = strchr(pdq+1, '\"')) != NULL)
524da178c77SXin LI 					*(++p) = '\0';
525da178c77SXin LI 				break;
526da178c77SXin LI 			} else if (p == line || *(p-1) != '\\') {
527da178c77SXin LI 				*p = '\0';
528da178c77SXin LI 				break;
529da178c77SXin LI 			}
530da178c77SXin LI 			p++;
531da178c77SXin LI 		}
532da178c77SXin LI 		/* Trim spaces */
533da178c77SXin LI 		p = line + strlen(line) - 1;
534da178c77SXin LI 		while (p >= line && isspace((int)*p)) {
535da178c77SXin LI 			*p = '\0';
536da178c77SXin LI 			p--;
537da178c77SXin LI 		}
538da178c77SXin LI 		p = line;
539da178c77SXin LI 		while (isspace((int)*p))
540da178c77SXin LI 			p++;
541da178c77SXin LI 		if (*p == '\0')
542da178c77SXin LI 			continue;
543da178c77SXin LI 		else
544da178c77SXin LI 			warncount += parse(p, lineno);
545da178c77SXin LI 	}
546da178c77SXin LI 	fclose(file);
547da178c77SXin LI 
548da178c77SXin LI 	return (warncount);
549dea673e9SRodney W. Grimes }
550dea673e9SRodney W. Grimes 
5511d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */
552dea673e9SRodney W. Grimes 
5531d86b91cSPoul-Henning Kamp static int
55459101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p)
5551d86b91cSPoul-Henning Kamp {
5561d86b91cSPoul-Henning Kamp 	struct clockinfo *ci = (struct clockinfo*)p;
55721e1f596SDavid Malone 
558996076bbSAlfred Perlstein 	if (l2 != sizeof(*ci)) {
55959101c5dSJohn Baldwin 		warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci));
5606b6b665bSBruce Evans 		return (1);
561996076bbSAlfred Perlstein 	}
56245817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
56345817aaaSDag-Erling Smørgrav 		"{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
564b35c8f28SPoul-Henning Kamp 		ci->hz, ci->tick, ci->profhz, ci->stathz);
5651d86b91cSPoul-Henning Kamp 	return (0);
566dea673e9SRodney W. Grimes }
567dea673e9SRodney W. Grimes 
5681d86b91cSPoul-Henning Kamp static int
56959101c5dSJohn Baldwin S_loadavg(size_t l2, void *p)
5701d86b91cSPoul-Henning Kamp {
5711d86b91cSPoul-Henning Kamp 	struct loadavg *tv = (struct loadavg*)p;
5721d86b91cSPoul-Henning Kamp 
573996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
57459101c5dSJohn Baldwin 		warnx("S_loadavg %zu != %zu", l2, sizeof(*tv));
5756b6b665bSBruce Evans 		return (1);
576996076bbSAlfred Perlstein 	}
57745817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
5781d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[0]/(double)tv->fscale,
5791d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[1]/(double)tv->fscale,
5801d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[2]/(double)tv->fscale);
5811d86b91cSPoul-Henning Kamp 	return (0);
582dea673e9SRodney W. Grimes }
583dea673e9SRodney W. Grimes 
5841d86b91cSPoul-Henning Kamp static int
58559101c5dSJohn Baldwin S_timeval(size_t l2, void *p)
5861d86b91cSPoul-Henning Kamp {
5871d86b91cSPoul-Henning Kamp 	struct timeval *tv = (struct timeval*)p;
588c2deb608SBruce Evans 	time_t tv_sec;
5891d86b91cSPoul-Henning Kamp 	char *p1, *p2;
590dea673e9SRodney W. Grimes 
591996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
59259101c5dSJohn Baldwin 		warnx("S_timeval %zu != %zu", l2, sizeof(*tv));
5936b6b665bSBruce Evans 		return (1);
594996076bbSAlfred Perlstein 	}
595db87e2dcSJohn Hay 	printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
596db87e2dcSJohn Hay 		"{ sec = %jd, usec = %ld } ",
597db87e2dcSJohn Hay 		(intmax_t)tv->tv_sec, tv->tv_usec);
598c2deb608SBruce Evans 	tv_sec = tv->tv_sec;
599c2deb608SBruce Evans 	p1 = strdup(ctime(&tv_sec));
6001d86b91cSPoul-Henning Kamp 	for (p2=p1; *p2 ; p2++)
6011d86b91cSPoul-Henning Kamp 		if (*p2 == '\n')
6021d86b91cSPoul-Henning Kamp 			*p2 = '\0';
6031d86b91cSPoul-Henning Kamp 	fputs(p1, stdout);
604f2359a24SRebecca Cran 	free(p1);
6051d86b91cSPoul-Henning Kamp 	return (0);
6061d86b91cSPoul-Henning Kamp }
6071d86b91cSPoul-Henning Kamp 
6081d86b91cSPoul-Henning Kamp static int
60959101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p)
610f7550ecfSMatthew Dillon {
611f7550ecfSMatthew Dillon 	struct vmtotal *v = (struct vmtotal *)p;
612654e22e7SMatthew Dillon 	int pageKilo = getpagesize() / 1024;
613f7550ecfSMatthew Dillon 
614f7550ecfSMatthew Dillon 	if (l2 != sizeof(*v)) {
61559101c5dSJohn Baldwin 		warnx("S_vmtotal %zu != %zu", l2, sizeof(*v));
6166b6b665bSBruce Evans 		return (1);
617f7550ecfSMatthew Dillon 	}
618f7550ecfSMatthew Dillon 
619654e22e7SMatthew Dillon 	printf(
620654e22e7SMatthew Dillon 	    "\nSystem wide totals computed every five seconds:"
621654e22e7SMatthew Dillon 	    " (values in kilobytes)\n");
622f7550ecfSMatthew Dillon 	printf("===============================================\n");
623654e22e7SMatthew Dillon 	printf(
624bad4d172SRuslan Ermilov 	    "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
625bad4d172SRuslan Ermilov 	    "%hd Sleep: %hd)\n",
626f7550ecfSMatthew Dillon 	    v->t_rq, v->t_dw, v->t_pw, v->t_sl);
627654e22e7SMatthew Dillon 	printf(
6284dad99bfSAlan Somers 	    "Virtual Memory:\t\t(Total: %jdK Active: %jdK)\n",
6294dad99bfSAlan Somers 	    (intmax_t)v->t_vm * pageKilo, (intmax_t)v->t_avm * pageKilo);
6304dad99bfSAlan Somers 	printf("Real Memory:\t\t(Total: %jdK Active: %jdK)\n",
6314dad99bfSAlan Somers 	    (intmax_t)v->t_rm * pageKilo, (intmax_t)v->t_arm * pageKilo);
6324dad99bfSAlan Somers 	printf("Shared Virtual Memory:\t(Total: %jdK Active: %jdK)\n",
6334dad99bfSAlan Somers 	    (intmax_t)v->t_vmshr * pageKilo, (intmax_t)v->t_avmshr * pageKilo);
6344dad99bfSAlan Somers 	printf("Shared Real Memory:\t(Total: %jdK Active: %jdK)\n",
6354dad99bfSAlan Somers 	    (intmax_t)v->t_rmshr * pageKilo, (intmax_t)v->t_armshr * pageKilo);
6364dad99bfSAlan Somers 	printf("Free Memory:\t%jdK", (intmax_t)v->t_free * pageKilo);
637f7550ecfSMatthew Dillon 
638f7550ecfSMatthew Dillon 	return (0);
639f7550ecfSMatthew Dillon }
640f7550ecfSMatthew Dillon 
6417d8312ccSJohn Baldwin #ifdef __amd64__
6427d8312ccSJohn Baldwin static int
6437d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p)
6447d8312ccSJohn Baldwin {
6457d8312ccSJohn Baldwin 	struct efi_map_header *efihdr;
6467d8312ccSJohn Baldwin 	struct efi_md *map;
6477d8312ccSJohn Baldwin 	const char *type;
6487d8312ccSJohn Baldwin 	size_t efisz;
6497d8312ccSJohn Baldwin 	int ndesc, i;
6507d8312ccSJohn Baldwin 
6517d8312ccSJohn Baldwin 	static const char *types[] = {
6527d8312ccSJohn Baldwin 		"Reserved",
6537d8312ccSJohn Baldwin 		"LoaderCode",
6547d8312ccSJohn Baldwin 		"LoaderData",
6557d8312ccSJohn Baldwin 		"BootServicesCode",
6567d8312ccSJohn Baldwin 		"BootServicesData",
6577d8312ccSJohn Baldwin 		"RuntimeServicesCode",
6587d8312ccSJohn Baldwin 		"RuntimeServicesData",
6597d8312ccSJohn Baldwin 		"ConventionalMemory",
6607d8312ccSJohn Baldwin 		"UnusableMemory",
6617d8312ccSJohn Baldwin 		"ACPIReclaimMemory",
6627d8312ccSJohn Baldwin 		"ACPIMemoryNVS",
6637d8312ccSJohn Baldwin 		"MemoryMappedIO",
6647d8312ccSJohn Baldwin 		"MemoryMappedIOPortSpace",
6657d8312ccSJohn Baldwin 		"PalCode"
6667d8312ccSJohn Baldwin 	};
6677d8312ccSJohn Baldwin 
6687d8312ccSJohn Baldwin 	/*
6697d8312ccSJohn Baldwin 	 * Memory map data provided by UEFI via the GetMemoryMap
6707d8312ccSJohn Baldwin 	 * Boot Services API.
6717d8312ccSJohn Baldwin 	 */
6727d8312ccSJohn Baldwin 	if (l2 < sizeof(*efihdr)) {
6737d8312ccSJohn Baldwin 		warnx("S_efi_map length less than header");
6747d8312ccSJohn Baldwin 		return (1);
6757d8312ccSJohn Baldwin 	}
6767d8312ccSJohn Baldwin 	efihdr = p;
6777d8312ccSJohn Baldwin 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
6787d8312ccSJohn Baldwin 	map = (struct efi_md *)((uint8_t *)efihdr + efisz);
6797d8312ccSJohn Baldwin 
6807d8312ccSJohn Baldwin 	if (efihdr->descriptor_size == 0)
6817d8312ccSJohn Baldwin 		return (0);
6827d8312ccSJohn Baldwin 	if (l2 != efisz + efihdr->memory_size) {
6837d8312ccSJohn Baldwin 		warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz +
6847d8312ccSJohn Baldwin 		    efihdr->memory_size);
6857d8312ccSJohn Baldwin 		return (1);
6867d8312ccSJohn Baldwin 	}
6877d8312ccSJohn Baldwin 	ndesc = efihdr->memory_size / efihdr->descriptor_size;
6887d8312ccSJohn Baldwin 
6897d8312ccSJohn Baldwin 	printf("\n%23s %12s %12s %8s %4s",
6907d8312ccSJohn Baldwin 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
6917d8312ccSJohn Baldwin 
6927d8312ccSJohn Baldwin 	for (i = 0; i < ndesc; i++,
6937d8312ccSJohn Baldwin 	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
6947d8312ccSJohn Baldwin 		if (map->md_type <= EFI_MD_TYPE_PALCODE)
6957d8312ccSJohn Baldwin 			type = types[map->md_type];
6967d8312ccSJohn Baldwin 		else
6977d8312ccSJohn Baldwin 			type = "<INVALID>";
6987d8312ccSJohn Baldwin 		printf("\n%23s %012lx %12p %08lx ", type, map->md_phys,
6997d8312ccSJohn Baldwin 		    map->md_virt, map->md_pages);
7007d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UC)
7017d8312ccSJohn Baldwin 			printf("UC ");
7027d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WC)
7037d8312ccSJohn Baldwin 			printf("WC ");
7047d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WT)
7057d8312ccSJohn Baldwin 			printf("WT ");
7067d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WB)
7077d8312ccSJohn Baldwin 			printf("WB ");
7087d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UCE)
7097d8312ccSJohn Baldwin 			printf("UCE ");
7107d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WP)
7117d8312ccSJohn Baldwin 			printf("WP ");
7127d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RP)
7137d8312ccSJohn Baldwin 			printf("RP ");
7147d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_XP)
7157d8312ccSJohn Baldwin 			printf("XP ");
7167d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RT)
7177d8312ccSJohn Baldwin 			printf("RUNTIME");
7187d8312ccSJohn Baldwin 	}
7197d8312ccSJohn Baldwin 	return (0);
7207d8312ccSJohn Baldwin }
7217d8312ccSJohn Baldwin #endif
7227d8312ccSJohn Baldwin 
72389871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
72489871cdeSJohn Baldwin static int
72559101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p)
72689871cdeSJohn Baldwin {
72789871cdeSJohn Baldwin 	struct bios_smap_xattr *smap, *end;
72889871cdeSJohn Baldwin 
72989871cdeSJohn Baldwin 	if (l2 % sizeof(*smap) != 0) {
73059101c5dSJohn Baldwin 		warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2,
73189871cdeSJohn Baldwin 		    sizeof(*smap));
73289871cdeSJohn Baldwin 		return (1);
73389871cdeSJohn Baldwin 	}
73489871cdeSJohn Baldwin 
73589871cdeSJohn Baldwin 	end = (struct bios_smap_xattr *)((char *)p + l2);
73689871cdeSJohn Baldwin 	for (smap = p; smap < end; smap++)
73789871cdeSJohn Baldwin 		printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx",
73889871cdeSJohn Baldwin 		    smap->type, smap->xattr, (uintmax_t)smap->base,
73989871cdeSJohn Baldwin 		    (uintmax_t)smap->length);
74089871cdeSJohn Baldwin 	return (0);
74189871cdeSJohn Baldwin }
74289871cdeSJohn Baldwin #endif
74389871cdeSJohn Baldwin 
744f7550ecfSMatthew Dillon static int
745aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt)
746d45564dcSHajimu UMEMOTO {
747e267e00eSXin LI 	int kelv;
748d45564dcSHajimu UMEMOTO 	float temp;
749e267e00eSXin LI 	size_t len;
750a7b5ad27SEd Schouten 	const char *p;
751aa255ef6SWarner Losh 	int prec, i;
752d45564dcSHajimu UMEMOTO 
753e267e00eSXin LI 	assert(errno == 0);
754e267e00eSXin LI 
755e267e00eSXin LI 	len = strlen(str);
756e267e00eSXin LI 	/* caller already checked this */
757e267e00eSXin LI 	assert(len > 0);
758e267e00eSXin LI 
759aa255ef6SWarner Losh 	/*
760aa255ef6SWarner Losh 	 * A format of "IK" is in deciKelvin. A format of "IK3" is in
761aa255ef6SWarner Losh 	 * milliKelvin. The single digit following IK is log10 of the
762aa255ef6SWarner Losh 	 * multiplying factor to convert Kelvin into the untis of this sysctl,
763aa255ef6SWarner Losh 	 * or the dividing factor to convert the sysctl value to Kelvin. Numbers
764aa255ef6SWarner Losh 	 * larger than 6 will run into precision issues with 32-bit integers.
765aa255ef6SWarner Losh 	 * Characters that aren't ASCII digits after the 'K' are ignored. No
766aa255ef6SWarner Losh 	 * localization is present because this is an interface from the kernel
767aa255ef6SWarner Losh 	 * to this program (eg not an end-user interface), so isdigit() isn't
768aa255ef6SWarner Losh 	 * used here.
769aa255ef6SWarner Losh 	 */
770aa255ef6SWarner Losh 	if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9')
771aa255ef6SWarner Losh 		prec = fmt[2] - '0';
772aa255ef6SWarner Losh 	else
773aa255ef6SWarner Losh 		prec = 1;
774d45564dcSHajimu UMEMOTO 	p = &str[len - 1];
775aa255ef6SWarner Losh 	if (*p == 'C' || *p == 'F' || *p == 'K') {
776e267e00eSXin LI 		temp = strtof(str, endptrp);
777689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
778d45564dcSHajimu UMEMOTO 			if (*p == 'F')
779d45564dcSHajimu UMEMOTO 				temp = (temp - 32) * 5 / 9;
780689c8e8bSXin LI 			*endptrp = NULL;
781aa255ef6SWarner Losh 			if (*p != 'K')
782aa255ef6SWarner Losh 				temp += 273.15;
783aa255ef6SWarner Losh 			for (i = 0; i < prec; i++)
784aa255ef6SWarner Losh 				temp *= 10.0;
785aa255ef6SWarner Losh 			return ((int)(temp + 0.5));
786d45564dcSHajimu UMEMOTO 		}
787e267e00eSXin LI 	} else {
788aa255ef6SWarner Losh 		/* No unit specified -> treat it as a raw number */
789e267e00eSXin LI 		kelv = (int)strtol(str, endptrp, 10);
790689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
791689c8e8bSXin LI 			*endptrp = NULL;
792e267e00eSXin LI 			return (kelv);
793e267e00eSXin LI 		}
794689c8e8bSXin LI 	}
795e267e00eSXin LI 
796e267e00eSXin LI 	errno = ERANGE;
797e267e00eSXin LI 	return (0);
798d45564dcSHajimu UMEMOTO }
799d45564dcSHajimu UMEMOTO 
8001d86b91cSPoul-Henning Kamp /*
8011d86b91cSPoul-Henning Kamp  * These functions uses a presently undocumented interface to the kernel
8021d86b91cSPoul-Henning Kamp  * to walk the tree and get the type so it can print the value.
8031d86b91cSPoul-Henning Kamp  * This interface is under work and consideration, and should probably
8041d86b91cSPoul-Henning Kamp  * be killed with a big axe by the first person who can find the time.
8051d86b91cSPoul-Henning Kamp  * (be aware though, that the proper interface isn't as obvious as it
8061d86b91cSPoul-Henning Kamp  * may seem, there are various conflicting requirements.
8071d86b91cSPoul-Henning Kamp  */
8081d86b91cSPoul-Henning Kamp 
8091d86b91cSPoul-Henning Kamp static int
810c58f8df6SXin LI name2oid(const char *name, int *oidp)
8111d86b91cSPoul-Henning Kamp {
8121d86b91cSPoul-Henning Kamp 	int oid[2];
813dbf9b92fSDoug Rabson 	int i;
814dbf9b92fSDoug Rabson 	size_t j;
8151d86b91cSPoul-Henning Kamp 
8161d86b91cSPoul-Henning Kamp 	oid[0] = 0;
8171d86b91cSPoul-Henning Kamp 	oid[1] = 3;
8181d86b91cSPoul-Henning Kamp 
8191d86b91cSPoul-Henning Kamp 	j = CTL_MAXNAME * sizeof(int);
8201d86b91cSPoul-Henning Kamp 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
8211d86b91cSPoul-Henning Kamp 	if (i < 0)
82221e1f596SDavid Malone 		return (i);
8231d86b91cSPoul-Henning Kamp 	j /= sizeof(int);
8241d86b91cSPoul-Henning Kamp 	return (j);
8251d86b91cSPoul-Henning Kamp }
8261d86b91cSPoul-Henning Kamp 
8271d86b91cSPoul-Henning Kamp static int
8281d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind)
8291d86b91cSPoul-Henning Kamp {
8301d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
8311d86b91cSPoul-Henning Kamp 	u_char buf[BUFSIZ];
832dbf9b92fSDoug Rabson 	int i;
833dbf9b92fSDoug Rabson 	size_t j;
8341d86b91cSPoul-Henning Kamp 
8351d86b91cSPoul-Henning Kamp 	qoid[0] = 0;
8361d86b91cSPoul-Henning Kamp 	qoid[1] = 4;
8371d86b91cSPoul-Henning Kamp 	memcpy(qoid + 2, oid, len * sizeof(int));
8381d86b91cSPoul-Henning Kamp 
83931fb4661SDima Dorfman 	j = sizeof(buf);
8401d86b91cSPoul-Henning Kamp 	i = sysctl(qoid, len + 2, buf, &j, 0, 0);
8411d86b91cSPoul-Henning Kamp 	if (i)
8426d7a8f6cSUlrich Spörlein 		err(1, "sysctl fmt %d %zu %d", i, j, errno);
8431d86b91cSPoul-Henning Kamp 
8441d86b91cSPoul-Henning Kamp 	if (kind)
8451d86b91cSPoul-Henning Kamp 		*kind = *(u_int *)buf;
8461d86b91cSPoul-Henning Kamp 
8471d86b91cSPoul-Henning Kamp 	if (fmt)
8481d86b91cSPoul-Henning Kamp 		strcpy(fmt, (char *)(buf + sizeof(u_int)));
84921e1f596SDavid Malone 	return (0);
8501d86b91cSPoul-Henning Kamp }
8511d86b91cSPoul-Henning Kamp 
85260cf2c12SLuigi Rizzo /*
8531d86b91cSPoul-Henning Kamp  * This formats and outputs the value of one variable
8541d86b91cSPoul-Henning Kamp  *
8551d86b91cSPoul-Henning Kamp  * Returns zero if anything was actually output.
8561d86b91cSPoul-Henning Kamp  * Returns one if didn't know what to do with this.
8571d86b91cSPoul-Henning Kamp  * Return minus one if we had errors.
8581d86b91cSPoul-Henning Kamp  */
8591d86b91cSPoul-Henning Kamp static int
8601d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen)
8611d86b91cSPoul-Henning Kamp {
862ccf25977SRuslan Ermilov 	u_char buf[BUFSIZ], *val, *oval, *p;
863403c7f59SAlfred Perlstein 	char name[BUFSIZ], fmt[BUFSIZ];
8648020192dSMarcelo Araujo 	const char *sep, *sep1, *prntype;
8651d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
86621e1f596SDavid Malone 	uintmax_t umv;
86721e1f596SDavid Malone 	intmax_t mv;
868f8e4b4efSMatthew D Fleming 	int i, hexlen, sign, ctltype;
86941e419cbSDavid Malone 	size_t intlen;
870dbf9b92fSDoug Rabson 	size_t j, len;
8711d86b91cSPoul-Henning Kamp 	u_int kind;
872aa255ef6SWarner Losh 	float base;
87359101c5dSJohn Baldwin 	int (*func)(size_t, void *);
874aa255ef6SWarner Losh 	int prec;
8751d86b91cSPoul-Henning Kamp 
8766d7a8f6cSUlrich Spörlein 	/* Silence GCC. */
8776d7a8f6cSUlrich Spörlein 	umv = mv = intlen = 0;
8786d7a8f6cSUlrich Spörlein 
8799f98e452SMatthew N. Dodd 	bzero(buf, BUFSIZ);
880403c7f59SAlfred Perlstein 	bzero(fmt, BUFSIZ);
8819f98e452SMatthew N. Dodd 	bzero(name, BUFSIZ);
88281e7454aSDag-Erling Smørgrav 	qoid[0] = 0;
88381e7454aSDag-Erling Smørgrav 	memcpy(qoid + 2, oid, nlen * sizeof(int));
88481e7454aSDag-Erling Smørgrav 
88581e7454aSDag-Erling Smørgrav 	qoid[1] = 1;
88631fb4661SDima Dorfman 	j = sizeof(name);
88781e7454aSDag-Erling Smørgrav 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
88881e7454aSDag-Erling Smørgrav 	if (i || !j)
8896d7a8f6cSUlrich Spörlein 		err(1, "sysctl name %d %zu %d", i, j, errno);
89081e7454aSDag-Erling Smørgrav 
891403c7f59SAlfred Perlstein 	oidfmt(oid, nlen, fmt, &kind);
892403c7f59SAlfred Perlstein 	/* if Wflag then only list sysctls that are writeable and not stats. */
893403c7f59SAlfred Perlstein 	if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
894403c7f59SAlfred Perlstein 		return 1;
895403c7f59SAlfred Perlstein 
896403c7f59SAlfred Perlstein 	/* if Tflag then only list sysctls that are tuneables. */
897403c7f59SAlfred Perlstein 	if (Tflag && (kind & CTLFLAG_TUN) == 0)
898403c7f59SAlfred Perlstein 		return 1;
899403c7f59SAlfred Perlstein 
900ca5fac55SDag-Erling Smørgrav 	if (Nflag) {
901ca5fac55SDag-Erling Smørgrav 		printf("%s", name);
902ca5fac55SDag-Erling Smørgrav 		return (0);
903ca5fac55SDag-Erling Smørgrav 	}
904ca5fac55SDag-Erling Smørgrav 
905d0b8aabbSAnton Berezin 	if (eflag)
906d0b8aabbSAnton Berezin 		sep = "=";
907d0b8aabbSAnton Berezin 	else
908d0b8aabbSAnton Berezin 		sep = ": ";
909d0b8aabbSAnton Berezin 
9108020192dSMarcelo Araujo 	ctltype = (kind & CTLTYPE);
9118020192dSMarcelo Araujo 	if (tflag || dflag) {
9128020192dSMarcelo Araujo 		if (!nflag)
9138020192dSMarcelo Araujo 			printf("%s%s", name, sep);
9148020192dSMarcelo Araujo         	if (ctl_typename[ctltype] != NULL)
9158020192dSMarcelo Araujo             		prntype = ctl_typename[ctltype];
9168020192dSMarcelo Araujo         	else
9178020192dSMarcelo Araujo             		prntype = "unknown";
9188020192dSMarcelo Araujo 		if (tflag && dflag)
9198020192dSMarcelo Araujo 			printf("%s%s", prntype, sep);
9208020192dSMarcelo Araujo 		else if (tflag) {
9218020192dSMarcelo Araujo 			printf("%s", prntype);
9228020192dSMarcelo Araujo 			return (0);
9238020192dSMarcelo Araujo 		}
9246105f815SLuigi Rizzo 		qoid[1] = 5;
9256105f815SLuigi Rizzo 		j = sizeof(buf);
9266105f815SLuigi Rizzo 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
9276105f815SLuigi Rizzo 		printf("%s", buf);
9286105f815SLuigi Rizzo 		return (0);
9296105f815SLuigi Rizzo 	}
930a18f34feSAndrew Gallatin 
931a18f34feSAndrew Gallatin 	/* don't fetch opaques that we don't know how to print */
932a18f34feSAndrew Gallatin 	if (ctltype == CTLTYPE_OPAQUE) {
933a18f34feSAndrew Gallatin 		if (strcmp(fmt, "S,clockinfo") == 0)
934a18f34feSAndrew Gallatin 			func = S_clockinfo;
935a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,timeval") == 0)
936a18f34feSAndrew Gallatin 			func = S_timeval;
937a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,loadavg") == 0)
938a18f34feSAndrew Gallatin 			func = S_loadavg;
939a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,vmtotal") == 0)
940a18f34feSAndrew Gallatin 			func = S_vmtotal;
941a18f34feSAndrew Gallatin #ifdef __amd64__
942a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,efi_map_header") == 0)
943a18f34feSAndrew Gallatin 			func = S_efi_map;
944a18f34feSAndrew Gallatin #endif
945a18f34feSAndrew Gallatin #if defined(__amd64__) || defined(__i386__)
946a18f34feSAndrew Gallatin 		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
947a18f34feSAndrew Gallatin 			func = S_bios_smap_xattr;
948a18f34feSAndrew Gallatin #endif
949a18f34feSAndrew Gallatin 		else {
950a18f34feSAndrew Gallatin 			func = NULL;
951a18f34feSAndrew Gallatin 			if (!bflag && !oflag && !xflag)
952a18f34feSAndrew Gallatin 				return (1);
953a18f34feSAndrew Gallatin 		}
954a18f34feSAndrew Gallatin 	}
955a18f34feSAndrew Gallatin 
9561d86b91cSPoul-Henning Kamp 	/* find an estimate of how much we need for this var */
95775820005SJohn-Mark Gurney 	if (Bflag)
95875820005SJohn-Mark Gurney 		j = Bflag;
95975820005SJohn-Mark Gurney 	else {
9601d86b91cSPoul-Henning Kamp 		j = 0;
9611d86b91cSPoul-Henning Kamp 		i = sysctl(oid, nlen, 0, &j, 0, 0);
9621d86b91cSPoul-Henning Kamp 		j += j; /* we want to be sure :-) */
96375820005SJohn-Mark Gurney 	}
9641d86b91cSPoul-Henning Kamp 
965ccf25977SRuslan Ermilov 	val = oval = malloc(j + 1);
966ccf25977SRuslan Ermilov 	if (val == NULL) {
967ccf25977SRuslan Ermilov 		warnx("malloc failed");
9686b6b665bSBruce Evans 		return (1);
969ccf25977SRuslan Ermilov 	}
9701d86b91cSPoul-Henning Kamp 	len = j;
9711d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, val, &len, 0, 0);
97204006eabSHans Petter Selasky 	if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) {
973ccf25977SRuslan Ermilov 		free(oval);
9741d86b91cSPoul-Henning Kamp 		return (1);
975ccf25977SRuslan Ermilov 	}
9761d86b91cSPoul-Henning Kamp 
9771d86b91cSPoul-Henning Kamp 	if (bflag) {
9781d86b91cSPoul-Henning Kamp 		fwrite(val, 1, len, stdout);
979ccf25977SRuslan Ermilov 		free(oval);
9801d86b91cSPoul-Henning Kamp 		return (0);
9811d86b91cSPoul-Henning Kamp 	}
98276d3dc52SAndrey A. Chernov 	val[len] = '\0';
9831d86b91cSPoul-Henning Kamp 	p = val;
984cbc134adSMatthew D Fleming 	sign = ctl_sign[ctltype];
985cbc134adSMatthew D Fleming 	intlen = ctl_size[ctltype];
986cbc134adSMatthew D Fleming 
987f8e4b4efSMatthew D Fleming 	switch (ctltype) {
988f8e4b4efSMatthew D Fleming 	case CTLTYPE_STRING:
9891d86b91cSPoul-Henning Kamp 		if (!nflag)
990d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
9916d7a8f6cSUlrich Spörlein 		printf("%.*s", (int)len, p);
992ccf25977SRuslan Ermilov 		free(oval);
9931d86b91cSPoul-Henning Kamp 		return (0);
9941d86b91cSPoul-Henning Kamp 
995f8e4b4efSMatthew D Fleming 	case CTLTYPE_INT:
996f8e4b4efSMatthew D Fleming 	case CTLTYPE_UINT:
997f8e4b4efSMatthew D Fleming 	case CTLTYPE_LONG:
998f8e4b4efSMatthew D Fleming 	case CTLTYPE_ULONG:
9992a71f1edSConrad Meyer 	case CTLTYPE_S8:
10002a71f1edSConrad Meyer 	case CTLTYPE_S16:
10012a71f1edSConrad Meyer 	case CTLTYPE_S32:
1002cbc134adSMatthew D Fleming 	case CTLTYPE_S64:
10032a71f1edSConrad Meyer 	case CTLTYPE_U8:
10042a71f1edSConrad Meyer 	case CTLTYPE_U16:
10052a71f1edSConrad Meyer 	case CTLTYPE_U32:
1006cbc134adSMatthew D Fleming 	case CTLTYPE_U64:
1007dbf9b92fSDoug Rabson 		if (!nflag)
1008d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
1009e37d2b30SDavid Malone 		hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
1010fd8c668aSDavid Malone 		sep1 = "";
101141e419cbSDavid Malone 		while (len >= intlen) {
1012f8e4b4efSMatthew D Fleming 			switch (kind & CTLTYPE) {
1013f8e4b4efSMatthew D Fleming 			case CTLTYPE_INT:
1014f8e4b4efSMatthew D Fleming 			case CTLTYPE_UINT:
1015e37d2b30SDavid Malone 				umv = *(u_int *)p;
1016e37d2b30SDavid Malone 				mv = *(int *)p;
101741e419cbSDavid Malone 				break;
1018f8e4b4efSMatthew D Fleming 			case CTLTYPE_LONG:
1019f8e4b4efSMatthew D Fleming 			case CTLTYPE_ULONG:
1020e37d2b30SDavid Malone 				umv = *(u_long *)p;
1021e37d2b30SDavid Malone 				mv = *(long *)p;
102241e419cbSDavid Malone 				break;
10232a71f1edSConrad Meyer 			case CTLTYPE_S8:
10242a71f1edSConrad Meyer 			case CTLTYPE_U8:
10252a71f1edSConrad Meyer 				umv = *(uint8_t *)p;
10262a71f1edSConrad Meyer 				mv = *(int8_t *)p;
10272a71f1edSConrad Meyer 				break;
10282a71f1edSConrad Meyer 			case CTLTYPE_S16:
10292a71f1edSConrad Meyer 			case CTLTYPE_U16:
10302a71f1edSConrad Meyer 				umv = *(uint16_t *)p;
10312a71f1edSConrad Meyer 				mv = *(int16_t *)p;
10322a71f1edSConrad Meyer 				break;
10332a71f1edSConrad Meyer 			case CTLTYPE_S32:
10342a71f1edSConrad Meyer 			case CTLTYPE_U32:
10352a71f1edSConrad Meyer 				umv = *(uint32_t *)p;
10362a71f1edSConrad Meyer 				mv = *(int32_t *)p;
10372a71f1edSConrad Meyer 				break;
1038cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
1039cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
1040cbc134adSMatthew D Fleming 				umv = *(uint64_t *)p;
1041cbc134adSMatthew D Fleming 				mv = *(int64_t *)p;
104241e419cbSDavid Malone 				break;
104341e419cbSDavid Malone 			}
1044fd8c668aSDavid Malone 			fputs(sep1, stdout);
1045f8e4b4efSMatthew D Fleming 			if (xflag)
1046e37d2b30SDavid Malone 				printf("%#0*jx", hexlen, umv);
1047f8e4b4efSMatthew D Fleming 			else if (!sign)
1048f8e4b4efSMatthew D Fleming 				printf(hflag ? "%'ju" : "%ju", umv);
104941e419cbSDavid Malone 			else if (fmt[1] == 'K') {
1050e37d2b30SDavid Malone 				if (mv < 0)
105121e1f596SDavid Malone 					printf("%jd", mv);
1052aa255ef6SWarner Losh 				else {
1053aa255ef6SWarner Losh 					/*
1054aa255ef6SWarner Losh 					 * See strIKtoi for details on fmt.
1055aa255ef6SWarner Losh 					 */
1056aa255ef6SWarner Losh 					prec = 1;
1057aa255ef6SWarner Losh 					if (fmt[2] != '\0')
1058aa255ef6SWarner Losh 						prec = fmt[2] - '0';
1059aa255ef6SWarner Losh 					base = 1.0;
1060aa255ef6SWarner Losh 					for (int i = 0; i < prec; i++)
1061aa255ef6SWarner Losh 						base *= 10.0;
1062aa255ef6SWarner Losh 					printf("%.*fC", prec,
1063aa255ef6SWarner Losh 					    (float)mv / base - 273.15);
1064aa255ef6SWarner Losh 				}
1065c591d41fSPeter Wemm 			} else
1066fd8c668aSDavid Malone 				printf(hflag ? "%'jd" : "%jd", mv);
1067fd8c668aSDavid Malone 			sep1 = " ";
106841e419cbSDavid Malone 			len -= intlen;
106941e419cbSDavid Malone 			p += intlen;
1070aa02fb57SPoul-Henning Kamp 		}
1071ccf25977SRuslan Ermilov 		free(oval);
1072dbf9b92fSDoug Rabson 		return (0);
1073dbf9b92fSDoug Rabson 
1074f8e4b4efSMatthew D Fleming 	case CTLTYPE_OPAQUE:
10751d86b91cSPoul-Henning Kamp 		i = 0;
10761d86b91cSPoul-Henning Kamp 		if (func) {
10771d86b91cSPoul-Henning Kamp 			if (!nflag)
1078d0b8aabbSAnton Berezin 				printf("%s%s", name, sep);
107948cd487aSHartmut Brandt 			i = (*func)(len, p);
1080ccf25977SRuslan Ermilov 			free(oval);
108148cd487aSHartmut Brandt 			return (i);
10821d86b91cSPoul-Henning Kamp 		}
10831d86b91cSPoul-Henning Kamp 		/* FALLTHROUGH */
1084dea673e9SRodney W. Grimes 	default:
1085ccf25977SRuslan Ermilov 		if (!oflag && !xflag) {
1086ccf25977SRuslan Ermilov 			free(oval);
10871d86b91cSPoul-Henning Kamp 			return (1);
1088ccf25977SRuslan Ermilov 		}
10891d86b91cSPoul-Henning Kamp 		if (!nflag)
1090d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
10916d7a8f6cSUlrich Spörlein 		printf("Format:%s Length:%zu Dump:0x", fmt, len);
1092a89ab9bbSDag-Erling Smørgrav 		while (len-- && (xflag || p < val + 16))
10931d86b91cSPoul-Henning Kamp 			printf("%02x", *p++);
1094a89ab9bbSDag-Erling Smørgrav 		if (!xflag && len > 16)
10951d86b91cSPoul-Henning Kamp 			printf("...");
1096ccf25977SRuslan Ermilov 		free(oval);
10971d86b91cSPoul-Henning Kamp 		return (0);
10981d86b91cSPoul-Henning Kamp 	}
1099ccf25977SRuslan Ermilov 	free(oval);
11001d86b91cSPoul-Henning Kamp 	return (1);
1101dea673e9SRodney W. Grimes }
1102dea673e9SRodney W. Grimes 
11031d86b91cSPoul-Henning Kamp static int
11041d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len)
1105dea673e9SRodney W. Grimes {
11061d86b91cSPoul-Henning Kamp 	int name1[22], name2[22];
1107dbf9b92fSDoug Rabson 	int i, j;
1108dbf9b92fSDoug Rabson 	size_t l1, l2;
1109dea673e9SRodney W. Grimes 
11101d86b91cSPoul-Henning Kamp 	name1[0] = 0;
11111d86b91cSPoul-Henning Kamp 	name1[1] = 2;
11121d86b91cSPoul-Henning Kamp 	l1 = 2;
11131d86b91cSPoul-Henning Kamp 	if (len) {
11141d86b91cSPoul-Henning Kamp 		memcpy(name1+2, oid, len * sizeof(int));
11151d86b91cSPoul-Henning Kamp 		l1 += len;
11161d86b91cSPoul-Henning Kamp 	} else {
11171d86b91cSPoul-Henning Kamp 		name1[2] = 1;
11181d86b91cSPoul-Henning Kamp 		l1++;
11191d86b91cSPoul-Henning Kamp 	}
1120a89ab9bbSDag-Erling Smørgrav 	for (;;) {
112131fb4661SDima Dorfman 		l2 = sizeof(name2);
11221d86b91cSPoul-Henning Kamp 		j = sysctl(name1, l1, name2, &l2, 0, 0);
1123c1160fe4SBill Fumerola 		if (j < 0) {
11241d86b91cSPoul-Henning Kamp 			if (errno == ENOENT)
112521e1f596SDavid Malone 				return (0);
11261d86b91cSPoul-Henning Kamp 			else
11276d7a8f6cSUlrich Spörlein 				err(1, "sysctl(getnext) %d %zu", j, l2);
1128c1160fe4SBill Fumerola 		}
11291d86b91cSPoul-Henning Kamp 
11301d86b91cSPoul-Henning Kamp 		l2 /= sizeof(int);
11311d86b91cSPoul-Henning Kamp 
1132fd8c668aSDavid Malone 		if (len < 0 || l2 < (unsigned int)len)
113321e1f596SDavid Malone 			return (0);
11341d86b91cSPoul-Henning Kamp 
11351d86b91cSPoul-Henning Kamp 		for (i = 0; i < len; i++)
11361d86b91cSPoul-Henning Kamp 			if (name2[i] != oid[i])
113721e1f596SDavid Malone 				return (0);
11381d86b91cSPoul-Henning Kamp 
11391d86b91cSPoul-Henning Kamp 		i = show_var(name2, l2);
11401d86b91cSPoul-Henning Kamp 		if (!i && !bflag)
11411d86b91cSPoul-Henning Kamp 			putchar('\n');
11421d86b91cSPoul-Henning Kamp 
11431d86b91cSPoul-Henning Kamp 		memcpy(name1+2, name2, l2 * sizeof(int));
11441d86b91cSPoul-Henning Kamp 		l1 = 2 + l2;
11451d86b91cSPoul-Henning Kamp 	}
1146dea673e9SRodney W. Grimes }
1147