xref: /freebsd/sbin/sysctl/sysctl.c (revision 3ddb14a5df24d3000a8988bc79f99f84ab8b0b61)
1dea673e9SRodney W. Grimes /*
2dea673e9SRodney W. Grimes  * Copyright (c) 1993
3dea673e9SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
4dea673e9SRodney W. Grimes  *
5dea673e9SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
6dea673e9SRodney W. Grimes  * modification, are permitted provided that the following conditions
7dea673e9SRodney W. Grimes  * are met:
8dea673e9SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
9dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
10dea673e9SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
11dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
12dea673e9SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
13dea673e9SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
14dea673e9SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
15dea673e9SRodney W. Grimes  *    without specific prior written permission.
16dea673e9SRodney W. Grimes  *
17dea673e9SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18dea673e9SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19dea673e9SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20dea673e9SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21dea673e9SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22dea673e9SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23dea673e9SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24dea673e9SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25dea673e9SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26dea673e9SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27dea673e9SRodney W. Grimes  * SUCH DAMAGE.
28dea673e9SRodney W. Grimes  */
29dea673e9SRodney W. Grimes 
30dea673e9SRodney W. Grimes #ifndef lint
31d9b1bc77SPhilippe Charnier static const char copyright[] =
32dea673e9SRodney W. Grimes "@(#) Copyright (c) 1993\n\
33dea673e9SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
34dea673e9SRodney W. Grimes #endif /* not lint */
35dea673e9SRodney W. Grimes 
36dea673e9SRodney W. Grimes #ifndef lint
37d9b1bc77SPhilippe Charnier #if 0
38d9b1bc77SPhilippe Charnier static char sccsid[] = "@(#)from: sysctl.c	8.1 (Berkeley) 6/6/93";
39d9b1bc77SPhilippe Charnier #endif
4035c13fa0SGarrett Wollman static const char rcsid[] =
417f3dea24SPeter Wemm   "$FreeBSD$";
42dea673e9SRodney W. Grimes #endif /* not lint */
43dea673e9SRodney W. Grimes 
44ce685842SBruce Evans #include <sys/param.h>
45ce685842SBruce Evans #include <sys/time.h>
46ce685842SBruce Evans #include <sys/resource.h>
47dea673e9SRodney W. Grimes #include <sys/stat.h>
48dea673e9SRodney W. Grimes #include <sys/sysctl.h>
49f7550ecfSMatthew Dillon #include <sys/vmmeter.h>
50dea673e9SRodney W. Grimes 
517d8312ccSJohn Baldwin #ifdef __amd64__
527d8312ccSJohn Baldwin #include <sys/efi.h>
537d8312ccSJohn Baldwin #include <machine/metadata.h>
547d8312ccSJohn Baldwin #endif
557d8312ccSJohn Baldwin 
5689871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
5789871cdeSJohn Baldwin #include <machine/pc/bios.h>
5889871cdeSJohn Baldwin #endif
5989871cdeSJohn Baldwin 
60e267e00eSXin LI #include <assert.h>
61d9b1bc77SPhilippe Charnier #include <ctype.h>
62d9b1bc77SPhilippe Charnier #include <err.h>
63dea673e9SRodney W. Grimes #include <errno.h>
6441e419cbSDavid Malone #include <inttypes.h>
6545817aaaSDag-Erling Smørgrav #include <locale.h>
66dea673e9SRodney W. Grimes #include <stdio.h>
67dea673e9SRodney W. Grimes #include <stdlib.h>
68dea673e9SRodney W. Grimes #include <string.h>
69da178c77SXin LI #include <sysexits.h>
70d9b1bc77SPhilippe Charnier #include <unistd.h>
71dea673e9SRodney W. Grimes 
72da178c77SXin LI static const char *conffile;
73da178c77SXin LI 
7475820005SJohn-Mark Gurney static int	aflag, bflag, Bflag, dflag, eflag, hflag, iflag;
758020192dSMarcelo Araujo static int	Nflag, nflag, oflag, qflag, tflag, Tflag, Wflag, xflag;
76dea673e9SRodney W. Grimes 
771d86b91cSPoul-Henning Kamp static int	oidfmt(int *, int, char *, u_int *);
78da178c77SXin LI static int	parsefile(const char *);
79da178c77SXin LI static int	parse(const char *, int);
801d86b91cSPoul-Henning Kamp static int	show_var(int *, int);
811d86b91cSPoul-Henning Kamp static int	sysctl_all(int *oid, int len);
82c58f8df6SXin LI static int	name2oid(const char *, int *);
83dea673e9SRodney W. Grimes 
84aa255ef6SWarner Losh static int	strIKtoi(const char *, char **, const char *);
85e267e00eSXin LI 
86e267e00eSXin LI static int ctl_sign[CTLTYPE+1] = {
87e267e00eSXin LI 	[CTLTYPE_INT] = 1,
88e267e00eSXin LI 	[CTLTYPE_LONG] = 1,
892a71f1edSConrad Meyer 	[CTLTYPE_S8] = 1,
902a71f1edSConrad Meyer 	[CTLTYPE_S16] = 1,
912a71f1edSConrad Meyer 	[CTLTYPE_S32] = 1,
92e267e00eSXin LI 	[CTLTYPE_S64] = 1,
93e267e00eSXin LI };
94e267e00eSXin LI 
95e267e00eSXin LI static int ctl_size[CTLTYPE+1] = {
96e267e00eSXin LI 	[CTLTYPE_INT] = sizeof(int),
97e267e00eSXin LI 	[CTLTYPE_UINT] = sizeof(u_int),
98e267e00eSXin LI 	[CTLTYPE_LONG] = sizeof(long),
99e267e00eSXin LI 	[CTLTYPE_ULONG] = sizeof(u_long),
1002a71f1edSConrad Meyer 	[CTLTYPE_S8] = sizeof(int8_t),
1012a71f1edSConrad Meyer 	[CTLTYPE_S16] = sizeof(int16_t),
1022a71f1edSConrad Meyer 	[CTLTYPE_S32] = sizeof(int32_t),
103e267e00eSXin LI 	[CTLTYPE_S64] = sizeof(int64_t),
1042a71f1edSConrad Meyer 	[CTLTYPE_U8] = sizeof(uint8_t),
1052a71f1edSConrad Meyer 	[CTLTYPE_U16] = sizeof(uint16_t),
1062a71f1edSConrad Meyer 	[CTLTYPE_U32] = sizeof(uint32_t),
107e267e00eSXin LI 	[CTLTYPE_U64] = sizeof(uint64_t),
108e267e00eSXin LI };
109e267e00eSXin LI 
110e267e00eSXin LI static const char *ctl_typename[CTLTYPE+1] = {
111e267e00eSXin LI 	[CTLTYPE_INT] = "integer",
112e267e00eSXin LI 	[CTLTYPE_UINT] = "unsigned integer",
113e267e00eSXin LI 	[CTLTYPE_LONG] = "long integer",
114e267e00eSXin LI 	[CTLTYPE_ULONG] = "unsigned long",
1152a71f1edSConrad Meyer 	[CTLTYPE_U8] = "uint8_t",
1162a71f1edSConrad Meyer 	[CTLTYPE_U16] = "uint16_t",
117*3ddb14a5SAndriy Voskoboinyk 	[CTLTYPE_U32] = "uint32_t",
118e267e00eSXin LI 	[CTLTYPE_U64] = "uint64_t",
1192a71f1edSConrad Meyer 	[CTLTYPE_S8] = "int8_t",
1202a71f1edSConrad Meyer 	[CTLTYPE_S16] = "int16_t",
1212a71f1edSConrad Meyer 	[CTLTYPE_S32] = "int32_t",
1222a71f1edSConrad Meyer 	[CTLTYPE_S64] = "int64_t",
1238020192dSMarcelo Araujo 	[CTLTYPE_NODE] = "node",
1248020192dSMarcelo Araujo 	[CTLTYPE_STRING] = "string",
1258020192dSMarcelo Araujo 	[CTLTYPE_OPAQUE] = "opaque",
126e267e00eSXin LI };
127d58f0054SPoul-Henning Kamp 
1281d86b91cSPoul-Henning Kamp static void
1291d86b91cSPoul-Henning Kamp usage(void)
1301d86b91cSPoul-Henning Kamp {
131dea673e9SRodney W. Grimes 
1329a2402bcSDag-Erling Smørgrav 	(void)fprintf(stderr, "%s\n%s\n",
1338020192dSMarcelo Araujo 	    "usage: sysctl [-bdehiNnoqTtWx] [ -B <bufsize> ] [-f filename] name[=value] ...",
1348020192dSMarcelo Araujo 	    "       sysctl [-bdehNnoqTtWx] [ -B <bufsize> ] -a");
1351d86b91cSPoul-Henning Kamp 	exit(1);
1361d86b91cSPoul-Henning Kamp }
137dea673e9SRodney W. Grimes 
138dea673e9SRodney W. Grimes int
1391d86b91cSPoul-Henning Kamp main(int argc, char **argv)
140dea673e9SRodney W. Grimes {
1411d86b91cSPoul-Henning Kamp 	int ch;
142da178c77SXin LI 	int warncount = 0;
14345817aaaSDag-Erling Smørgrav 
14445817aaaSDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "");
1451d86b91cSPoul-Henning Kamp 	setbuf(stdout,0);
1461d86b91cSPoul-Henning Kamp 	setbuf(stderr,0);
147dea673e9SRodney W. Grimes 
1488020192dSMarcelo Araujo 	while ((ch = getopt(argc, argv, "AabB:def:hiNnoqtTwWxX")) != -1) {
149dea673e9SRodney W. Grimes 		switch (ch) {
150ca5fac55SDag-Erling Smørgrav 		case 'A':
1519a2402bcSDag-Erling Smørgrav 			/* compatibility */
1529a2402bcSDag-Erling Smørgrav 			aflag = oflag = 1;
153ca5fac55SDag-Erling Smørgrav 			break;
154ca5fac55SDag-Erling Smørgrav 		case 'a':
155ca5fac55SDag-Erling Smørgrav 			aflag = 1;
156ca5fac55SDag-Erling Smørgrav 			break;
157ca5fac55SDag-Erling Smørgrav 		case 'b':
158ca5fac55SDag-Erling Smørgrav 			bflag = 1;
159ca5fac55SDag-Erling Smørgrav 			break;
16075820005SJohn-Mark Gurney 		case 'B':
16175820005SJohn-Mark Gurney 			Bflag = strtol(optarg, NULL, 0);
16275820005SJohn-Mark Gurney 			break;
1636105f815SLuigi Rizzo 		case 'd':
1646105f815SLuigi Rizzo 			dflag = 1;
1656105f815SLuigi Rizzo 			break;
166d0b8aabbSAnton Berezin 		case 'e':
167d0b8aabbSAnton Berezin 			eflag = 1;
168d0b8aabbSAnton Berezin 			break;
169da178c77SXin LI 		case 'f':
170da178c77SXin LI 			conffile = optarg;
171da178c77SXin LI 			break;
17245817aaaSDag-Erling Smørgrav 		case 'h':
17345817aaaSDag-Erling Smørgrav 			hflag = 1;
17445817aaaSDag-Erling Smørgrav 			break;
17524b2aa32SGavin Atkinson 		case 'i':
17624b2aa32SGavin Atkinson 			iflag = 1;
17724b2aa32SGavin Atkinson 			break;
178ca5fac55SDag-Erling Smørgrav 		case 'N':
179ca5fac55SDag-Erling Smørgrav 			Nflag = 1;
180ca5fac55SDag-Erling Smørgrav 			break;
181ca5fac55SDag-Erling Smørgrav 		case 'n':
182ca5fac55SDag-Erling Smørgrav 			nflag = 1;
183ca5fac55SDag-Erling Smørgrav 			break;
1849a2402bcSDag-Erling Smørgrav 		case 'o':
1859a2402bcSDag-Erling Smørgrav 			oflag = 1;
1869a2402bcSDag-Erling Smørgrav 			break;
187f93d36fdSRobert Watson 		case 'q':
188f93d36fdSRobert Watson 			qflag = 1;
189f93d36fdSRobert Watson 			break;
1908020192dSMarcelo Araujo 		case 't':
1918020192dSMarcelo Araujo 			tflag = 1;
1928020192dSMarcelo Araujo 			break;
1939ecd2e32SAlfred Perlstein 		case 'T':
1949ecd2e32SAlfred Perlstein 			Tflag = 1;
1959ecd2e32SAlfred Perlstein 			break;
196ca5fac55SDag-Erling Smørgrav 		case 'w':
1979a2402bcSDag-Erling Smørgrav 			/* compatibility */
1989a2402bcSDag-Erling Smørgrav 			/* ignored */
199ca5fac55SDag-Erling Smørgrav 			break;
2009ecd2e32SAlfred Perlstein 		case 'W':
2019ecd2e32SAlfred Perlstein 			Wflag = 1;
2029ecd2e32SAlfred Perlstein 			break;
203ca5fac55SDag-Erling Smørgrav 		case 'X':
2049a2402bcSDag-Erling Smørgrav 			/* compatibility */
2059a2402bcSDag-Erling Smørgrav 			aflag = xflag = 1;
2069a2402bcSDag-Erling Smørgrav 			break;
2079a2402bcSDag-Erling Smørgrav 		case 'x':
2089a2402bcSDag-Erling Smørgrav 			xflag = 1;
209ca5fac55SDag-Erling Smørgrav 			break;
210ca5fac55SDag-Erling Smørgrav 		default:
211ca5fac55SDag-Erling Smørgrav 			usage();
212dea673e9SRodney W. Grimes 		}
213dea673e9SRodney W. Grimes 	}
214dea673e9SRodney W. Grimes 	argc -= optind;
215dea673e9SRodney W. Grimes 	argv += optind;
216dea673e9SRodney W. Grimes 
2179a2402bcSDag-Erling Smørgrav 	if (Nflag && nflag)
21881e7454aSDag-Erling Smørgrav 		usage();
2199a2402bcSDag-Erling Smørgrav 	if (aflag && argc == 0)
2201d86b91cSPoul-Henning Kamp 		exit(sysctl_all(0, 0));
221da178c77SXin LI 	if (argc == 0 && conffile == NULL)
222dea673e9SRodney W. Grimes 		usage();
223d9fcd86cSMike Makonnen 
224d9fcd86cSMike Makonnen 	warncount = 0;
225da178c77SXin LI 	if (conffile != NULL)
226da178c77SXin LI 		warncount += parsefile(conffile);
227da178c77SXin LI 
228dea673e9SRodney W. Grimes 	while (argc-- > 0)
229da178c77SXin LI 		warncount += parse(*argv++, 0);
230da178c77SXin LI 
231da178c77SXin LI 	return (warncount);
232dea673e9SRodney W. Grimes }
233dea673e9SRodney W. Grimes 
234dea673e9SRodney W. Grimes /*
235dea673e9SRodney W. Grimes  * Parse a name into a MIB entry.
236dea673e9SRodney W. Grimes  * Lookup and print out the MIB entry if it exists.
237dea673e9SRodney W. Grimes  * Set a new value if requested.
238dea673e9SRodney W. Grimes  */
239da178c77SXin LI static int
240da178c77SXin LI parse(const char *string, int lineno)
241dea673e9SRodney W. Grimes {
2421d86b91cSPoul-Henning Kamp 	int len, i, j;
243e267e00eSXin LI 	const void *newval;
244e267e00eSXin LI 	const char *newvalstr = NULL;
2452a71f1edSConrad Meyer 	int8_t i8val;
246c3220d0bSConrad Meyer 	uint8_t u8val;
2472a71f1edSConrad Meyer 	int16_t i16val;
248c3220d0bSConrad Meyer 	uint16_t u16val;
2492a71f1edSConrad Meyer 	int32_t i32val;
2502a71f1edSConrad Meyer 	uint32_t u32val;
2511ce1a53dSJim Pirzyk 	int intval;
2521ce1a53dSJim Pirzyk 	unsigned int uintval;
2531ce1a53dSJim Pirzyk 	long longval;
2541ce1a53dSJim Pirzyk 	unsigned long ulongval;
25575820005SJohn-Mark Gurney 	size_t newsize = Bflag;
256cbc134adSMatthew D Fleming 	int64_t i64val;
257cbc134adSMatthew D Fleming 	uint64_t u64val;
258dea673e9SRodney W. Grimes 	int mib[CTL_MAXNAME];
259e267e00eSXin LI 	char *cp, *bufp, buf[BUFSIZ], *endptr = NULL, fmt[BUFSIZ], line[BUFSIZ];
2601d86b91cSPoul-Henning Kamp 	u_int kind;
261dea673e9SRodney W. Grimes 
262da178c77SXin LI 	if (lineno)
263da178c77SXin LI 		snprintf(line, sizeof(line), " at line %d", lineno);
264da178c77SXin LI 	else
265da178c77SXin LI 		line[0] = '\0';
266da178c77SXin LI 
267aae75101SXin LI 	cp = buf;
268da178c77SXin LI 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
269c6919e7fSEdward Tomasz Napierala 		warnx("oid too long: '%s'%s", string, line);
270da178c77SXin LI 		return (1);
271da178c77SXin LI 	}
272da178c77SXin LI 	bufp = strsep(&cp, "=:");
273aae75101SXin LI 	if (cp != NULL) {
2749ecd2e32SAlfred Perlstein 		/* Tflag just lists tunables, do not allow assignment */
2759ecd2e32SAlfred Perlstein 		if (Tflag || Wflag) {
2769ecd2e32SAlfred Perlstein 			warnx("Can't set variables when using -T or -W");
2779ecd2e32SAlfred Perlstein 			usage();
2789ecd2e32SAlfred Perlstein 		}
279dea673e9SRodney W. Grimes 		while (isspace(*cp))
280dea673e9SRodney W. Grimes 			cp++;
281da178c77SXin LI 		/* Strip a pair of " or ' if any. */
282da178c77SXin LI 		switch (*cp) {
283da178c77SXin LI 		case '\"':
284da178c77SXin LI 		case '\'':
285da178c77SXin LI 			if (cp[strlen(cp) - 1] == *cp)
286da178c77SXin LI 				cp[strlen(cp) - 1] = '\0';
287da178c77SXin LI 			cp++;
288da178c77SXin LI 		}
289e267e00eSXin LI 		newvalstr = cp;
290dea673e9SRodney W. Grimes 		newsize = strlen(cp);
291dea673e9SRodney W. Grimes 	}
292ca587fdaSBaptiste Daroussin 	/* Trim spaces */
293ca587fdaSBaptiste Daroussin 	cp = bufp + strlen(bufp) - 1;
294ca587fdaSBaptiste Daroussin 	while (cp >= bufp && isspace((int)*cp)) {
295ca587fdaSBaptiste Daroussin 		*cp = '\0';
296ca587fdaSBaptiste Daroussin 		cp--;
297ca587fdaSBaptiste Daroussin 	}
2981d86b91cSPoul-Henning Kamp 	len = name2oid(bufp, mib);
2991d86b91cSPoul-Henning Kamp 
300f93d36fdSRobert Watson 	if (len < 0) {
30124b2aa32SGavin Atkinson 		if (iflag)
302da178c77SXin LI 			return (0);
303f93d36fdSRobert Watson 		if (qflag)
304da178c77SXin LI 			return (1);
305da178c77SXin LI 		else {
306e1619d12SBaptiste Daroussin 			if (errno == ENOENT) {
307e1619d12SBaptiste Daroussin 				warnx("unknown oid '%s'%s", bufp, line);
308e1619d12SBaptiste Daroussin 			} else {
309da178c77SXin LI 				warn("unknown oid '%s'%s", bufp, line);
310e1619d12SBaptiste Daroussin 			}
311da178c77SXin LI 			return (1);
312da178c77SXin LI 		}
313f93d36fdSRobert Watson 	}
3141d86b91cSPoul-Henning Kamp 
315da178c77SXin LI 	if (oidfmt(mib, len, fmt, &kind)) {
316da178c77SXin LI 		warn("couldn't find format of oid '%s'%s", bufp, line);
317da178c77SXin LI 		if (iflag)
318da178c77SXin LI 			return (1);
319da178c77SXin LI 		else
320da178c77SXin LI 			exit(1);
321da178c77SXin LI 	}
3221d86b91cSPoul-Henning Kamp 
323e267e00eSXin LI 	if (newvalstr == NULL || dflag) {
3241d86b91cSPoul-Henning Kamp 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
325b2680e20SMatthew N. Dodd 			if (dflag) {
326b2680e20SMatthew N. Dodd 				i = show_var(mib, len);
327b2680e20SMatthew N. Dodd 				if (!i && !bflag)
328b2680e20SMatthew N. Dodd 					putchar('\n');
329b2680e20SMatthew N. Dodd 			}
3301d86b91cSPoul-Henning Kamp 			sysctl_all(mib, len);
3311d86b91cSPoul-Henning Kamp 		} else {
3321d86b91cSPoul-Henning Kamp 			i = show_var(mib, len);
3331d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
3341d86b91cSPoul-Henning Kamp 				putchar('\n');
335dea673e9SRodney W. Grimes 		}
3361d86b91cSPoul-Henning Kamp 	} else {
337da178c77SXin LI 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
338c6919e7fSEdward Tomasz Napierala 			warnx("oid '%s' isn't a leaf node%s", bufp, line);
339da178c77SXin LI 			return (1);
340da178c77SXin LI 		}
341dea673e9SRodney W. Grimes 
342ac8711d2SMike Silbersack 		if (!(kind & CTLFLAG_WR)) {
3439b4b73b7SMike Silbersack 			if (kind & CTLFLAG_TUN) {
3446f361351SXin LI 				warnx("oid '%s' is a read only tunable%s", bufp, line);
345da178c77SXin LI 				warnx("Tunable values are set in /boot/loader.conf");
346da178c77SXin LI 			} else
347da178c77SXin LI 				warnx("oid '%s' is read only%s", bufp, line);
348da178c77SXin LI 			return (1);
349ac8711d2SMike Silbersack 		}
350dea673e9SRodney W. Grimes 
351e267e00eSXin LI 		switch (kind & CTLTYPE) {
352e267e00eSXin LI 		case CTLTYPE_INT:
353e267e00eSXin LI 		case CTLTYPE_UINT:
354e267e00eSXin LI 		case CTLTYPE_LONG:
355e267e00eSXin LI 		case CTLTYPE_ULONG:
3562a71f1edSConrad Meyer 		case CTLTYPE_S8:
3572a71f1edSConrad Meyer 		case CTLTYPE_S16:
3582a71f1edSConrad Meyer 		case CTLTYPE_S32:
359e267e00eSXin LI 		case CTLTYPE_S64:
3602a71f1edSConrad Meyer 		case CTLTYPE_U8:
3612a71f1edSConrad Meyer 		case CTLTYPE_U16:
3622a71f1edSConrad Meyer 		case CTLTYPE_U32:
363e267e00eSXin LI 		case CTLTYPE_U64:
364e267e00eSXin LI 			if (strlen(newvalstr) == 0) {
365da178c77SXin LI 				warnx("empty numeric value");
366da178c77SXin LI 				return (1);
367da178c77SXin LI 			}
368e267e00eSXin LI 			/* FALLTHROUGH */
369e267e00eSXin LI 		case CTLTYPE_STRING:
370e267e00eSXin LI 			break;
371e267e00eSXin LI 		default:
372e267e00eSXin LI 			warnx("oid '%s' is type %d,"
373e267e00eSXin LI 				" cannot set that%s", bufp,
374e267e00eSXin LI 				kind & CTLTYPE, line);
375e267e00eSXin LI 			return (1);
376a78d3eafSRobert Watson 		}
377a78d3eafSRobert Watson 
3784b8740cdSXin LI 		errno = 0;
3794b8740cdSXin LI 
3801d86b91cSPoul-Henning Kamp 		switch (kind & CTLTYPE) {
381dea673e9SRodney W. Grimes 			case CTLTYPE_INT:
382aa255ef6SWarner Losh 				if (strncmp(fmt, "IK", 2) == 0)
383aa255ef6SWarner Losh 					intval = strIKtoi(newvalstr, &endptr, fmt);
384e267e00eSXin LI 				else
385e267e00eSXin LI 					intval = (int)strtol(newvalstr, &endptr,
386d45564dcSHajimu UMEMOTO 					    0);
387dea673e9SRodney W. Grimes 				newval = &intval;
38831fb4661SDima Dorfman 				newsize = sizeof(intval);
389dea673e9SRodney W. Grimes 				break;
3901ce1a53dSJim Pirzyk 			case CTLTYPE_UINT:
391e267e00eSXin LI 				uintval = (int) strtoul(newvalstr, &endptr, 0);
3921ce1a53dSJim Pirzyk 				newval = &uintval;
39321e1f596SDavid Malone 				newsize = sizeof(uintval);
3941ce1a53dSJim Pirzyk 				break;
3951ce1a53dSJim Pirzyk 			case CTLTYPE_LONG:
396e267e00eSXin LI 				longval = strtol(newvalstr, &endptr, 0);
3971ce1a53dSJim Pirzyk 				newval = &longval;
39821e1f596SDavid Malone 				newsize = sizeof(longval);
3991ce1a53dSJim Pirzyk 				break;
4001ce1a53dSJim Pirzyk 			case CTLTYPE_ULONG:
401e267e00eSXin LI 				ulongval = strtoul(newvalstr, &endptr, 0);
4021ce1a53dSJim Pirzyk 				newval = &ulongval;
40321e1f596SDavid Malone 				newsize = sizeof(ulongval);
4041d86b91cSPoul-Henning Kamp 				break;
4051d86b91cSPoul-Henning Kamp 			case CTLTYPE_STRING:
406e267e00eSXin LI 				newval = newvalstr;
4071d86b91cSPoul-Henning Kamp 				break;
4082a71f1edSConrad Meyer 			case CTLTYPE_S8:
4092a71f1edSConrad Meyer 				i8val = (int8_t)strtol(newvalstr, &endptr, 0);
4102a71f1edSConrad Meyer 				newval = &i8val;
4112a71f1edSConrad Meyer 				newsize = sizeof(i8val);
4122a71f1edSConrad Meyer 				break;
4132a71f1edSConrad Meyer 			case CTLTYPE_S16:
4142a71f1edSConrad Meyer 				i16val = (int16_t)strtol(newvalstr, &endptr,
4152a71f1edSConrad Meyer 				    0);
4162a71f1edSConrad Meyer 				newval = &i16val;
4172a71f1edSConrad Meyer 				newsize = sizeof(i16val);
4182a71f1edSConrad Meyer 				break;
4192a71f1edSConrad Meyer 			case CTLTYPE_S32:
4202a71f1edSConrad Meyer 				i32val = (int32_t)strtol(newvalstr, &endptr,
4212a71f1edSConrad Meyer 				    0);
4222a71f1edSConrad Meyer 				newval = &i32val;
4232a71f1edSConrad Meyer 				newsize = sizeof(i32val);
4242a71f1edSConrad Meyer 				break;
425cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
426e267e00eSXin LI 				i64val = strtoimax(newvalstr, &endptr, 0);
427cbc134adSMatthew D Fleming 				newval = &i64val;
428cbc134adSMatthew D Fleming 				newsize = sizeof(i64val);
429cbc134adSMatthew D Fleming 				break;
4302a71f1edSConrad Meyer 			case CTLTYPE_U8:
4312a71f1edSConrad Meyer 				u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
4322a71f1edSConrad Meyer 				newval = &u8val;
4332a71f1edSConrad Meyer 				newsize = sizeof(u8val);
4342a71f1edSConrad Meyer 				break;
4352a71f1edSConrad Meyer 			case CTLTYPE_U16:
4362a71f1edSConrad Meyer 				u16val = (uint16_t)strtoul(newvalstr, &endptr,
4372a71f1edSConrad Meyer 				    0);
4382a71f1edSConrad Meyer 				newval = &u16val;
4392a71f1edSConrad Meyer 				newsize = sizeof(u16val);
4402a71f1edSConrad Meyer 				break;
4412a71f1edSConrad Meyer 			case CTLTYPE_U32:
4422a71f1edSConrad Meyer 				u32val = (uint32_t)strtoul(newvalstr, &endptr,
4432a71f1edSConrad Meyer 				    0);
4442a71f1edSConrad Meyer 				newval = &u32val;
4452a71f1edSConrad Meyer 				newsize = sizeof(u32val);
4462a71f1edSConrad Meyer 				break;
447cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
448e267e00eSXin LI 				u64val = strtoumax(newvalstr, &endptr, 0);
449cbc134adSMatthew D Fleming 				newval = &u64val;
450cbc134adSMatthew D Fleming 				newsize = sizeof(u64val);
451dea673e9SRodney W. Grimes 				break;
4521d86b91cSPoul-Henning Kamp 			default:
453e267e00eSXin LI 				/* NOTREACHED */
454e267e00eSXin LI 				abort();
455e267e00eSXin LI 		}
456e267e00eSXin LI 
457e267e00eSXin LI 		if (errno != 0 || endptr == newvalstr ||
458e267e00eSXin LI 		    (endptr != NULL && *endptr != '\0')) {
459e267e00eSXin LI 			warnx("invalid %s '%s'%s", ctl_typename[kind & CTLTYPE],
460e267e00eSXin LI 			    newvalstr, line);
461da178c77SXin LI 			return (1);
462dea673e9SRodney W. Grimes 		}
4631d86b91cSPoul-Henning Kamp 
4641d86b91cSPoul-Henning Kamp 		i = show_var(mib, len);
4651d86b91cSPoul-Henning Kamp 		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
4661d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
4671d86b91cSPoul-Henning Kamp 				putchar('\n');
468dea673e9SRodney W. Grimes 			switch (errno) {
469dea673e9SRodney W. Grimes 			case EOPNOTSUPP:
470da178c77SXin LI 				warnx("%s: value is not available%s",
471da178c77SXin LI 					string, line);
472da178c77SXin LI 				return (1);
473dea673e9SRodney W. Grimes 			case ENOTDIR:
474da178c77SXin LI 				warnx("%s: specification is incomplete%s",
475da178c77SXin LI 					string, line);
476da178c77SXin LI 				return (1);
477dea673e9SRodney W. Grimes 			case ENOMEM:
478da178c77SXin LI 				warnx("%s: type is unknown to this program%s",
479da178c77SXin LI 					string, line);
480da178c77SXin LI 				return (1);
481dea673e9SRodney W. Grimes 			default:
482da178c77SXin LI 				warn("%s%s", string, line);
483da178c77SXin LI 				return (1);
484dea673e9SRodney W. Grimes 			}
485dea673e9SRodney W. Grimes 		}
4861d86b91cSPoul-Henning Kamp 		if (!bflag)
4871d86b91cSPoul-Henning Kamp 			printf(" -> ");
4881d86b91cSPoul-Henning Kamp 		i = nflag;
4891d86b91cSPoul-Henning Kamp 		nflag = 1;
4901d86b91cSPoul-Henning Kamp 		j = show_var(mib, len);
4911d86b91cSPoul-Henning Kamp 		if (!j && !bflag)
4921d86b91cSPoul-Henning Kamp 			putchar('\n');
4931d86b91cSPoul-Henning Kamp 		nflag = i;
494dea673e9SRodney W. Grimes 	}
495da178c77SXin LI 
496da178c77SXin LI 	return (0);
497da178c77SXin LI }
498da178c77SXin LI 
499da178c77SXin LI static int
500da178c77SXin LI parsefile(const char *filename)
501da178c77SXin LI {
502da178c77SXin LI 	FILE *file;
503da178c77SXin LI 	char line[BUFSIZ], *p, *pq, *pdq;
504da178c77SXin LI 	int warncount = 0, lineno = 0;
505da178c77SXin LI 
506da178c77SXin LI 	file = fopen(filename, "r");
507da178c77SXin LI 	if (file == NULL)
508da178c77SXin LI 		err(EX_NOINPUT, "%s", filename);
509da178c77SXin LI 	while (fgets(line, sizeof(line), file) != NULL) {
510da178c77SXin LI 		lineno++;
511da178c77SXin LI 		p = line;
512da178c77SXin LI 		pq = strchr(line, '\'');
513da178c77SXin LI 		pdq = strchr(line, '\"');
514da178c77SXin LI 		/* Replace the first # with \0. */
515da178c77SXin LI 		while((p = strchr(p, '#')) != NULL) {
516da178c77SXin LI 			if (pq != NULL && p > pq) {
517da178c77SXin LI 				if ((p = strchr(pq+1, '\'')) != NULL)
518da178c77SXin LI 					*(++p) = '\0';
519da178c77SXin LI 				break;
520da178c77SXin LI 			} else if (pdq != NULL && p > pdq) {
521da178c77SXin LI 				if ((p = strchr(pdq+1, '\"')) != NULL)
522da178c77SXin LI 					*(++p) = '\0';
523da178c77SXin LI 				break;
524da178c77SXin LI 			} else if (p == line || *(p-1) != '\\') {
525da178c77SXin LI 				*p = '\0';
526da178c77SXin LI 				break;
527da178c77SXin LI 			}
528da178c77SXin LI 			p++;
529da178c77SXin LI 		}
530da178c77SXin LI 		/* Trim spaces */
531da178c77SXin LI 		p = line + strlen(line) - 1;
532da178c77SXin LI 		while (p >= line && isspace((int)*p)) {
533da178c77SXin LI 			*p = '\0';
534da178c77SXin LI 			p--;
535da178c77SXin LI 		}
536da178c77SXin LI 		p = line;
537da178c77SXin LI 		while (isspace((int)*p))
538da178c77SXin LI 			p++;
539da178c77SXin LI 		if (*p == '\0')
540da178c77SXin LI 			continue;
541da178c77SXin LI 		else
542da178c77SXin LI 			warncount += parse(p, lineno);
543da178c77SXin LI 	}
544da178c77SXin LI 	fclose(file);
545da178c77SXin LI 
546da178c77SXin LI 	return (warncount);
547dea673e9SRodney W. Grimes }
548dea673e9SRodney W. Grimes 
5491d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */
550dea673e9SRodney W. Grimes 
5511d86b91cSPoul-Henning Kamp static int
55259101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p)
5531d86b91cSPoul-Henning Kamp {
5541d86b91cSPoul-Henning Kamp 	struct clockinfo *ci = (struct clockinfo*)p;
55521e1f596SDavid Malone 
556996076bbSAlfred Perlstein 	if (l2 != sizeof(*ci)) {
55759101c5dSJohn Baldwin 		warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci));
5586b6b665bSBruce Evans 		return (1);
559996076bbSAlfred Perlstein 	}
56045817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
56145817aaaSDag-Erling Smørgrav 		"{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
562b35c8f28SPoul-Henning Kamp 		ci->hz, ci->tick, ci->profhz, ci->stathz);
5631d86b91cSPoul-Henning Kamp 	return (0);
564dea673e9SRodney W. Grimes }
565dea673e9SRodney W. Grimes 
5661d86b91cSPoul-Henning Kamp static int
56759101c5dSJohn Baldwin S_loadavg(size_t l2, void *p)
5681d86b91cSPoul-Henning Kamp {
5691d86b91cSPoul-Henning Kamp 	struct loadavg *tv = (struct loadavg*)p;
5701d86b91cSPoul-Henning Kamp 
571996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
57259101c5dSJohn Baldwin 		warnx("S_loadavg %zu != %zu", l2, sizeof(*tv));
5736b6b665bSBruce Evans 		return (1);
574996076bbSAlfred Perlstein 	}
57545817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
5761d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[0]/(double)tv->fscale,
5771d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[1]/(double)tv->fscale,
5781d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[2]/(double)tv->fscale);
5791d86b91cSPoul-Henning Kamp 	return (0);
580dea673e9SRodney W. Grimes }
581dea673e9SRodney W. Grimes 
5821d86b91cSPoul-Henning Kamp static int
58359101c5dSJohn Baldwin S_timeval(size_t l2, void *p)
5841d86b91cSPoul-Henning Kamp {
5851d86b91cSPoul-Henning Kamp 	struct timeval *tv = (struct timeval*)p;
586c2deb608SBruce Evans 	time_t tv_sec;
5871d86b91cSPoul-Henning Kamp 	char *p1, *p2;
588dea673e9SRodney W. Grimes 
589996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
59059101c5dSJohn Baldwin 		warnx("S_timeval %zu != %zu", l2, sizeof(*tv));
5916b6b665bSBruce Evans 		return (1);
592996076bbSAlfred Perlstein 	}
593db87e2dcSJohn Hay 	printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
594db87e2dcSJohn Hay 		"{ sec = %jd, usec = %ld } ",
595db87e2dcSJohn Hay 		(intmax_t)tv->tv_sec, tv->tv_usec);
596c2deb608SBruce Evans 	tv_sec = tv->tv_sec;
597c2deb608SBruce Evans 	p1 = strdup(ctime(&tv_sec));
5981d86b91cSPoul-Henning Kamp 	for (p2=p1; *p2 ; p2++)
5991d86b91cSPoul-Henning Kamp 		if (*p2 == '\n')
6001d86b91cSPoul-Henning Kamp 			*p2 = '\0';
6011d86b91cSPoul-Henning Kamp 	fputs(p1, stdout);
602f2359a24SRebecca Cran 	free(p1);
6031d86b91cSPoul-Henning Kamp 	return (0);
6041d86b91cSPoul-Henning Kamp }
6051d86b91cSPoul-Henning Kamp 
6061d86b91cSPoul-Henning Kamp static int
60759101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p)
608f7550ecfSMatthew Dillon {
609f7550ecfSMatthew Dillon 	struct vmtotal *v = (struct vmtotal *)p;
610654e22e7SMatthew Dillon 	int pageKilo = getpagesize() / 1024;
611f7550ecfSMatthew Dillon 
612f7550ecfSMatthew Dillon 	if (l2 != sizeof(*v)) {
61359101c5dSJohn Baldwin 		warnx("S_vmtotal %zu != %zu", l2, sizeof(*v));
6146b6b665bSBruce Evans 		return (1);
615f7550ecfSMatthew Dillon 	}
616f7550ecfSMatthew Dillon 
617654e22e7SMatthew Dillon 	printf(
618654e22e7SMatthew Dillon 	    "\nSystem wide totals computed every five seconds:"
619654e22e7SMatthew Dillon 	    " (values in kilobytes)\n");
620f7550ecfSMatthew Dillon 	printf("===============================================\n");
621654e22e7SMatthew Dillon 	printf(
622bad4d172SRuslan Ermilov 	    "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
623bad4d172SRuslan Ermilov 	    "%hd Sleep: %hd)\n",
624f7550ecfSMatthew Dillon 	    v->t_rq, v->t_dw, v->t_pw, v->t_sl);
625654e22e7SMatthew Dillon 	printf(
6264dad99bfSAlan Somers 	    "Virtual Memory:\t\t(Total: %jdK Active: %jdK)\n",
6274dad99bfSAlan Somers 	    (intmax_t)v->t_vm * pageKilo, (intmax_t)v->t_avm * pageKilo);
6284dad99bfSAlan Somers 	printf("Real Memory:\t\t(Total: %jdK Active: %jdK)\n",
6294dad99bfSAlan Somers 	    (intmax_t)v->t_rm * pageKilo, (intmax_t)v->t_arm * pageKilo);
6304dad99bfSAlan Somers 	printf("Shared Virtual Memory:\t(Total: %jdK Active: %jdK)\n",
6314dad99bfSAlan Somers 	    (intmax_t)v->t_vmshr * pageKilo, (intmax_t)v->t_avmshr * pageKilo);
6324dad99bfSAlan Somers 	printf("Shared Real Memory:\t(Total: %jdK Active: %jdK)\n",
6334dad99bfSAlan Somers 	    (intmax_t)v->t_rmshr * pageKilo, (intmax_t)v->t_armshr * pageKilo);
6344dad99bfSAlan Somers 	printf("Free Memory:\t%jdK", (intmax_t)v->t_free * pageKilo);
635f7550ecfSMatthew Dillon 
636f7550ecfSMatthew Dillon 	return (0);
637f7550ecfSMatthew Dillon }
638f7550ecfSMatthew Dillon 
6397d8312ccSJohn Baldwin #ifdef __amd64__
6407d8312ccSJohn Baldwin static int
6417d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p)
6427d8312ccSJohn Baldwin {
6437d8312ccSJohn Baldwin 	struct efi_map_header *efihdr;
6447d8312ccSJohn Baldwin 	struct efi_md *map;
6457d8312ccSJohn Baldwin 	const char *type;
6467d8312ccSJohn Baldwin 	size_t efisz;
6477d8312ccSJohn Baldwin 	int ndesc, i;
6487d8312ccSJohn Baldwin 
6497d8312ccSJohn Baldwin 	static const char *types[] = {
6507d8312ccSJohn Baldwin 		"Reserved",
6517d8312ccSJohn Baldwin 		"LoaderCode",
6527d8312ccSJohn Baldwin 		"LoaderData",
6537d8312ccSJohn Baldwin 		"BootServicesCode",
6547d8312ccSJohn Baldwin 		"BootServicesData",
6557d8312ccSJohn Baldwin 		"RuntimeServicesCode",
6567d8312ccSJohn Baldwin 		"RuntimeServicesData",
6577d8312ccSJohn Baldwin 		"ConventionalMemory",
6587d8312ccSJohn Baldwin 		"UnusableMemory",
6597d8312ccSJohn Baldwin 		"ACPIReclaimMemory",
6607d8312ccSJohn Baldwin 		"ACPIMemoryNVS",
6617d8312ccSJohn Baldwin 		"MemoryMappedIO",
6627d8312ccSJohn Baldwin 		"MemoryMappedIOPortSpace",
6637d8312ccSJohn Baldwin 		"PalCode"
6647d8312ccSJohn Baldwin 	};
6657d8312ccSJohn Baldwin 
6667d8312ccSJohn Baldwin 	/*
6677d8312ccSJohn Baldwin 	 * Memory map data provided by UEFI via the GetMemoryMap
6687d8312ccSJohn Baldwin 	 * Boot Services API.
6697d8312ccSJohn Baldwin 	 */
6707d8312ccSJohn Baldwin 	if (l2 < sizeof(*efihdr)) {
6717d8312ccSJohn Baldwin 		warnx("S_efi_map length less than header");
6727d8312ccSJohn Baldwin 		return (1);
6737d8312ccSJohn Baldwin 	}
6747d8312ccSJohn Baldwin 	efihdr = p;
6757d8312ccSJohn Baldwin 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
6767d8312ccSJohn Baldwin 	map = (struct efi_md *)((uint8_t *)efihdr + efisz);
6777d8312ccSJohn Baldwin 
6787d8312ccSJohn Baldwin 	if (efihdr->descriptor_size == 0)
6797d8312ccSJohn Baldwin 		return (0);
6807d8312ccSJohn Baldwin 	if (l2 != efisz + efihdr->memory_size) {
6817d8312ccSJohn Baldwin 		warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz +
6827d8312ccSJohn Baldwin 		    efihdr->memory_size);
6837d8312ccSJohn Baldwin 		return (1);
6847d8312ccSJohn Baldwin 	}
6857d8312ccSJohn Baldwin 	ndesc = efihdr->memory_size / efihdr->descriptor_size;
6867d8312ccSJohn Baldwin 
6877d8312ccSJohn Baldwin 	printf("\n%23s %12s %12s %8s %4s",
6887d8312ccSJohn Baldwin 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
6897d8312ccSJohn Baldwin 
6907d8312ccSJohn Baldwin 	for (i = 0; i < ndesc; i++,
6917d8312ccSJohn Baldwin 	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
6927d8312ccSJohn Baldwin 		if (map->md_type <= EFI_MD_TYPE_PALCODE)
6937d8312ccSJohn Baldwin 			type = types[map->md_type];
6947d8312ccSJohn Baldwin 		else
6957d8312ccSJohn Baldwin 			type = "<INVALID>";
6967d8312ccSJohn Baldwin 		printf("\n%23s %012lx %12p %08lx ", type, map->md_phys,
6977d8312ccSJohn Baldwin 		    map->md_virt, map->md_pages);
6987d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UC)
6997d8312ccSJohn Baldwin 			printf("UC ");
7007d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WC)
7017d8312ccSJohn Baldwin 			printf("WC ");
7027d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WT)
7037d8312ccSJohn Baldwin 			printf("WT ");
7047d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WB)
7057d8312ccSJohn Baldwin 			printf("WB ");
7067d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UCE)
7077d8312ccSJohn Baldwin 			printf("UCE ");
7087d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WP)
7097d8312ccSJohn Baldwin 			printf("WP ");
7107d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RP)
7117d8312ccSJohn Baldwin 			printf("RP ");
7127d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_XP)
7137d8312ccSJohn Baldwin 			printf("XP ");
7147d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RT)
7157d8312ccSJohn Baldwin 			printf("RUNTIME");
7167d8312ccSJohn Baldwin 	}
7177d8312ccSJohn Baldwin 	return (0);
7187d8312ccSJohn Baldwin }
7197d8312ccSJohn Baldwin #endif
7207d8312ccSJohn Baldwin 
72189871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
72289871cdeSJohn Baldwin static int
72359101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p)
72489871cdeSJohn Baldwin {
72589871cdeSJohn Baldwin 	struct bios_smap_xattr *smap, *end;
72689871cdeSJohn Baldwin 
72789871cdeSJohn Baldwin 	if (l2 % sizeof(*smap) != 0) {
72859101c5dSJohn Baldwin 		warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2,
72989871cdeSJohn Baldwin 		    sizeof(*smap));
73089871cdeSJohn Baldwin 		return (1);
73189871cdeSJohn Baldwin 	}
73289871cdeSJohn Baldwin 
73389871cdeSJohn Baldwin 	end = (struct bios_smap_xattr *)((char *)p + l2);
73489871cdeSJohn Baldwin 	for (smap = p; smap < end; smap++)
73589871cdeSJohn Baldwin 		printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx",
73689871cdeSJohn Baldwin 		    smap->type, smap->xattr, (uintmax_t)smap->base,
73789871cdeSJohn Baldwin 		    (uintmax_t)smap->length);
73889871cdeSJohn Baldwin 	return (0);
73989871cdeSJohn Baldwin }
74089871cdeSJohn Baldwin #endif
74189871cdeSJohn Baldwin 
742f7550ecfSMatthew Dillon static int
743aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt)
744d45564dcSHajimu UMEMOTO {
745e267e00eSXin LI 	int kelv;
746d45564dcSHajimu UMEMOTO 	float temp;
747e267e00eSXin LI 	size_t len;
748a7b5ad27SEd Schouten 	const char *p;
749aa255ef6SWarner Losh 	int prec, i;
750d45564dcSHajimu UMEMOTO 
751e267e00eSXin LI 	assert(errno == 0);
752e267e00eSXin LI 
753e267e00eSXin LI 	len = strlen(str);
754e267e00eSXin LI 	/* caller already checked this */
755e267e00eSXin LI 	assert(len > 0);
756e267e00eSXin LI 
757aa255ef6SWarner Losh 	/*
758aa255ef6SWarner Losh 	 * A format of "IK" is in deciKelvin. A format of "IK3" is in
759aa255ef6SWarner Losh 	 * milliKelvin. The single digit following IK is log10 of the
760aa255ef6SWarner Losh 	 * multiplying factor to convert Kelvin into the untis of this sysctl,
761aa255ef6SWarner Losh 	 * or the dividing factor to convert the sysctl value to Kelvin. Numbers
762aa255ef6SWarner Losh 	 * larger than 6 will run into precision issues with 32-bit integers.
763aa255ef6SWarner Losh 	 * Characters that aren't ASCII digits after the 'K' are ignored. No
764aa255ef6SWarner Losh 	 * localization is present because this is an interface from the kernel
765aa255ef6SWarner Losh 	 * to this program (eg not an end-user interface), so isdigit() isn't
766aa255ef6SWarner Losh 	 * used here.
767aa255ef6SWarner Losh 	 */
768aa255ef6SWarner Losh 	if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9')
769aa255ef6SWarner Losh 		prec = fmt[2] - '0';
770aa255ef6SWarner Losh 	else
771aa255ef6SWarner Losh 		prec = 1;
772d45564dcSHajimu UMEMOTO 	p = &str[len - 1];
773aa255ef6SWarner Losh 	if (*p == 'C' || *p == 'F' || *p == 'K') {
774e267e00eSXin LI 		temp = strtof(str, endptrp);
775689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
776d45564dcSHajimu UMEMOTO 			if (*p == 'F')
777d45564dcSHajimu UMEMOTO 				temp = (temp - 32) * 5 / 9;
778689c8e8bSXin LI 			*endptrp = NULL;
779aa255ef6SWarner Losh 			if (*p != 'K')
780aa255ef6SWarner Losh 				temp += 273.15;
781aa255ef6SWarner Losh 			for (i = 0; i < prec; i++)
782aa255ef6SWarner Losh 				temp *= 10.0;
783aa255ef6SWarner Losh 			return ((int)(temp + 0.5));
784d45564dcSHajimu UMEMOTO 		}
785e267e00eSXin LI 	} else {
786aa255ef6SWarner Losh 		/* No unit specified -> treat it as a raw number */
787e267e00eSXin LI 		kelv = (int)strtol(str, endptrp, 10);
788689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
789689c8e8bSXin LI 			*endptrp = NULL;
790e267e00eSXin LI 			return (kelv);
791e267e00eSXin LI 		}
792689c8e8bSXin LI 	}
793e267e00eSXin LI 
794e267e00eSXin LI 	errno = ERANGE;
795e267e00eSXin LI 	return (0);
796d45564dcSHajimu UMEMOTO }
797d45564dcSHajimu UMEMOTO 
7981d86b91cSPoul-Henning Kamp /*
7991d86b91cSPoul-Henning Kamp  * These functions uses a presently undocumented interface to the kernel
8001d86b91cSPoul-Henning Kamp  * to walk the tree and get the type so it can print the value.
8011d86b91cSPoul-Henning Kamp  * This interface is under work and consideration, and should probably
8021d86b91cSPoul-Henning Kamp  * be killed with a big axe by the first person who can find the time.
8031d86b91cSPoul-Henning Kamp  * (be aware though, that the proper interface isn't as obvious as it
8041d86b91cSPoul-Henning Kamp  * may seem, there are various conflicting requirements.
8051d86b91cSPoul-Henning Kamp  */
8061d86b91cSPoul-Henning Kamp 
8071d86b91cSPoul-Henning Kamp static int
808c58f8df6SXin LI name2oid(const char *name, int *oidp)
8091d86b91cSPoul-Henning Kamp {
8101d86b91cSPoul-Henning Kamp 	int oid[2];
811dbf9b92fSDoug Rabson 	int i;
812dbf9b92fSDoug Rabson 	size_t j;
8131d86b91cSPoul-Henning Kamp 
8141d86b91cSPoul-Henning Kamp 	oid[0] = 0;
8151d86b91cSPoul-Henning Kamp 	oid[1] = 3;
8161d86b91cSPoul-Henning Kamp 
8171d86b91cSPoul-Henning Kamp 	j = CTL_MAXNAME * sizeof(int);
8181d86b91cSPoul-Henning Kamp 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
8191d86b91cSPoul-Henning Kamp 	if (i < 0)
82021e1f596SDavid Malone 		return (i);
8211d86b91cSPoul-Henning Kamp 	j /= sizeof(int);
8221d86b91cSPoul-Henning Kamp 	return (j);
8231d86b91cSPoul-Henning Kamp }
8241d86b91cSPoul-Henning Kamp 
8251d86b91cSPoul-Henning Kamp static int
8261d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind)
8271d86b91cSPoul-Henning Kamp {
8281d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
8291d86b91cSPoul-Henning Kamp 	u_char buf[BUFSIZ];
830dbf9b92fSDoug Rabson 	int i;
831dbf9b92fSDoug Rabson 	size_t j;
8321d86b91cSPoul-Henning Kamp 
8331d86b91cSPoul-Henning Kamp 	qoid[0] = 0;
8341d86b91cSPoul-Henning Kamp 	qoid[1] = 4;
8351d86b91cSPoul-Henning Kamp 	memcpy(qoid + 2, oid, len * sizeof(int));
8361d86b91cSPoul-Henning Kamp 
83731fb4661SDima Dorfman 	j = sizeof(buf);
8381d86b91cSPoul-Henning Kamp 	i = sysctl(qoid, len + 2, buf, &j, 0, 0);
8391d86b91cSPoul-Henning Kamp 	if (i)
8406d7a8f6cSUlrich Spörlein 		err(1, "sysctl fmt %d %zu %d", i, j, errno);
8411d86b91cSPoul-Henning Kamp 
8421d86b91cSPoul-Henning Kamp 	if (kind)
8431d86b91cSPoul-Henning Kamp 		*kind = *(u_int *)buf;
8441d86b91cSPoul-Henning Kamp 
8451d86b91cSPoul-Henning Kamp 	if (fmt)
8461d86b91cSPoul-Henning Kamp 		strcpy(fmt, (char *)(buf + sizeof(u_int)));
84721e1f596SDavid Malone 	return (0);
8481d86b91cSPoul-Henning Kamp }
8491d86b91cSPoul-Henning Kamp 
85060cf2c12SLuigi Rizzo /*
8511d86b91cSPoul-Henning Kamp  * This formats and outputs the value of one variable
8521d86b91cSPoul-Henning Kamp  *
8531d86b91cSPoul-Henning Kamp  * Returns zero if anything was actually output.
8541d86b91cSPoul-Henning Kamp  * Returns one if didn't know what to do with this.
8551d86b91cSPoul-Henning Kamp  * Return minus one if we had errors.
8561d86b91cSPoul-Henning Kamp  */
8571d86b91cSPoul-Henning Kamp static int
8581d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen)
8591d86b91cSPoul-Henning Kamp {
860ccf25977SRuslan Ermilov 	u_char buf[BUFSIZ], *val, *oval, *p;
861403c7f59SAlfred Perlstein 	char name[BUFSIZ], fmt[BUFSIZ];
8628020192dSMarcelo Araujo 	const char *sep, *sep1, *prntype;
8631d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
86421e1f596SDavid Malone 	uintmax_t umv;
86521e1f596SDavid Malone 	intmax_t mv;
866f8e4b4efSMatthew D Fleming 	int i, hexlen, sign, ctltype;
86741e419cbSDavid Malone 	size_t intlen;
868dbf9b92fSDoug Rabson 	size_t j, len;
8691d86b91cSPoul-Henning Kamp 	u_int kind;
870aa255ef6SWarner Losh 	float base;
87159101c5dSJohn Baldwin 	int (*func)(size_t, void *);
872aa255ef6SWarner Losh 	int prec;
8731d86b91cSPoul-Henning Kamp 
8746d7a8f6cSUlrich Spörlein 	/* Silence GCC. */
8756d7a8f6cSUlrich Spörlein 	umv = mv = intlen = 0;
8766d7a8f6cSUlrich Spörlein 
8779f98e452SMatthew N. Dodd 	bzero(buf, BUFSIZ);
878403c7f59SAlfred Perlstein 	bzero(fmt, BUFSIZ);
8799f98e452SMatthew N. Dodd 	bzero(name, BUFSIZ);
88081e7454aSDag-Erling Smørgrav 	qoid[0] = 0;
88181e7454aSDag-Erling Smørgrav 	memcpy(qoid + 2, oid, nlen * sizeof(int));
88281e7454aSDag-Erling Smørgrav 
88381e7454aSDag-Erling Smørgrav 	qoid[1] = 1;
88431fb4661SDima Dorfman 	j = sizeof(name);
88581e7454aSDag-Erling Smørgrav 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
88681e7454aSDag-Erling Smørgrav 	if (i || !j)
8876d7a8f6cSUlrich Spörlein 		err(1, "sysctl name %d %zu %d", i, j, errno);
88881e7454aSDag-Erling Smørgrav 
889403c7f59SAlfred Perlstein 	oidfmt(oid, nlen, fmt, &kind);
890403c7f59SAlfred Perlstein 	/* if Wflag then only list sysctls that are writeable and not stats. */
891403c7f59SAlfred Perlstein 	if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
892403c7f59SAlfred Perlstein 		return 1;
893403c7f59SAlfred Perlstein 
894403c7f59SAlfred Perlstein 	/* if Tflag then only list sysctls that are tuneables. */
895403c7f59SAlfred Perlstein 	if (Tflag && (kind & CTLFLAG_TUN) == 0)
896403c7f59SAlfred Perlstein 		return 1;
897403c7f59SAlfred Perlstein 
898ca5fac55SDag-Erling Smørgrav 	if (Nflag) {
899ca5fac55SDag-Erling Smørgrav 		printf("%s", name);
900ca5fac55SDag-Erling Smørgrav 		return (0);
901ca5fac55SDag-Erling Smørgrav 	}
902ca5fac55SDag-Erling Smørgrav 
903d0b8aabbSAnton Berezin 	if (eflag)
904d0b8aabbSAnton Berezin 		sep = "=";
905d0b8aabbSAnton Berezin 	else
906d0b8aabbSAnton Berezin 		sep = ": ";
907d0b8aabbSAnton Berezin 
9088020192dSMarcelo Araujo 	ctltype = (kind & CTLTYPE);
9098020192dSMarcelo Araujo 	if (tflag || dflag) {
9108020192dSMarcelo Araujo 		if (!nflag)
9118020192dSMarcelo Araujo 			printf("%s%s", name, sep);
9128020192dSMarcelo Araujo         	if (ctl_typename[ctltype] != NULL)
9138020192dSMarcelo Araujo             		prntype = ctl_typename[ctltype];
9148020192dSMarcelo Araujo         	else
9158020192dSMarcelo Araujo             		prntype = "unknown";
9168020192dSMarcelo Araujo 		if (tflag && dflag)
9178020192dSMarcelo Araujo 			printf("%s%s", prntype, sep);
9188020192dSMarcelo Araujo 		else if (tflag) {
9198020192dSMarcelo Araujo 			printf("%s", prntype);
9208020192dSMarcelo Araujo 			return (0);
9218020192dSMarcelo Araujo 		}
9226105f815SLuigi Rizzo 		qoid[1] = 5;
9236105f815SLuigi Rizzo 		j = sizeof(buf);
9246105f815SLuigi Rizzo 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
9256105f815SLuigi Rizzo 		printf("%s", buf);
9266105f815SLuigi Rizzo 		return (0);
9276105f815SLuigi Rizzo 	}
9281d86b91cSPoul-Henning Kamp 	/* find an estimate of how much we need for this var */
92975820005SJohn-Mark Gurney 	if (Bflag)
93075820005SJohn-Mark Gurney 		j = Bflag;
93175820005SJohn-Mark Gurney 	else {
9321d86b91cSPoul-Henning Kamp 		j = 0;
9331d86b91cSPoul-Henning Kamp 		i = sysctl(oid, nlen, 0, &j, 0, 0);
9341d86b91cSPoul-Henning Kamp 		j += j; /* we want to be sure :-) */
93575820005SJohn-Mark Gurney 	}
9361d86b91cSPoul-Henning Kamp 
937ccf25977SRuslan Ermilov 	val = oval = malloc(j + 1);
938ccf25977SRuslan Ermilov 	if (val == NULL) {
939ccf25977SRuslan Ermilov 		warnx("malloc failed");
9406b6b665bSBruce Evans 		return (1);
941ccf25977SRuslan Ermilov 	}
9421d86b91cSPoul-Henning Kamp 	len = j;
9431d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, val, &len, 0, 0);
94404006eabSHans Petter Selasky 	if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) {
945ccf25977SRuslan Ermilov 		free(oval);
9461d86b91cSPoul-Henning Kamp 		return (1);
947ccf25977SRuslan Ermilov 	}
9481d86b91cSPoul-Henning Kamp 
9491d86b91cSPoul-Henning Kamp 	if (bflag) {
9501d86b91cSPoul-Henning Kamp 		fwrite(val, 1, len, stdout);
951ccf25977SRuslan Ermilov 		free(oval);
9521d86b91cSPoul-Henning Kamp 		return (0);
9531d86b91cSPoul-Henning Kamp 	}
95476d3dc52SAndrey A. Chernov 	val[len] = '\0';
9551d86b91cSPoul-Henning Kamp 	p = val;
956cbc134adSMatthew D Fleming 	sign = ctl_sign[ctltype];
957cbc134adSMatthew D Fleming 	intlen = ctl_size[ctltype];
958cbc134adSMatthew D Fleming 
959f8e4b4efSMatthew D Fleming 	switch (ctltype) {
960f8e4b4efSMatthew D Fleming 	case CTLTYPE_STRING:
9611d86b91cSPoul-Henning Kamp 		if (!nflag)
962d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
9636d7a8f6cSUlrich Spörlein 		printf("%.*s", (int)len, p);
964ccf25977SRuslan Ermilov 		free(oval);
9651d86b91cSPoul-Henning Kamp 		return (0);
9661d86b91cSPoul-Henning Kamp 
967f8e4b4efSMatthew D Fleming 	case CTLTYPE_INT:
968f8e4b4efSMatthew D Fleming 	case CTLTYPE_UINT:
969f8e4b4efSMatthew D Fleming 	case CTLTYPE_LONG:
970f8e4b4efSMatthew D Fleming 	case CTLTYPE_ULONG:
9712a71f1edSConrad Meyer 	case CTLTYPE_S8:
9722a71f1edSConrad Meyer 	case CTLTYPE_S16:
9732a71f1edSConrad Meyer 	case CTLTYPE_S32:
974cbc134adSMatthew D Fleming 	case CTLTYPE_S64:
9752a71f1edSConrad Meyer 	case CTLTYPE_U8:
9762a71f1edSConrad Meyer 	case CTLTYPE_U16:
9772a71f1edSConrad Meyer 	case CTLTYPE_U32:
978cbc134adSMatthew D Fleming 	case CTLTYPE_U64:
979dbf9b92fSDoug Rabson 		if (!nflag)
980d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
981e37d2b30SDavid Malone 		hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
982fd8c668aSDavid Malone 		sep1 = "";
98341e419cbSDavid Malone 		while (len >= intlen) {
984f8e4b4efSMatthew D Fleming 			switch (kind & CTLTYPE) {
985f8e4b4efSMatthew D Fleming 			case CTLTYPE_INT:
986f8e4b4efSMatthew D Fleming 			case CTLTYPE_UINT:
987e37d2b30SDavid Malone 				umv = *(u_int *)p;
988e37d2b30SDavid Malone 				mv = *(int *)p;
98941e419cbSDavid Malone 				break;
990f8e4b4efSMatthew D Fleming 			case CTLTYPE_LONG:
991f8e4b4efSMatthew D Fleming 			case CTLTYPE_ULONG:
992e37d2b30SDavid Malone 				umv = *(u_long *)p;
993e37d2b30SDavid Malone 				mv = *(long *)p;
99441e419cbSDavid Malone 				break;
9952a71f1edSConrad Meyer 			case CTLTYPE_S8:
9962a71f1edSConrad Meyer 			case CTLTYPE_U8:
9972a71f1edSConrad Meyer 				umv = *(uint8_t *)p;
9982a71f1edSConrad Meyer 				mv = *(int8_t *)p;
9992a71f1edSConrad Meyer 				break;
10002a71f1edSConrad Meyer 			case CTLTYPE_S16:
10012a71f1edSConrad Meyer 			case CTLTYPE_U16:
10022a71f1edSConrad Meyer 				umv = *(uint16_t *)p;
10032a71f1edSConrad Meyer 				mv = *(int16_t *)p;
10042a71f1edSConrad Meyer 				break;
10052a71f1edSConrad Meyer 			case CTLTYPE_S32:
10062a71f1edSConrad Meyer 			case CTLTYPE_U32:
10072a71f1edSConrad Meyer 				umv = *(uint32_t *)p;
10082a71f1edSConrad Meyer 				mv = *(int32_t *)p;
10092a71f1edSConrad Meyer 				break;
1010cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
1011cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
1012cbc134adSMatthew D Fleming 				umv = *(uint64_t *)p;
1013cbc134adSMatthew D Fleming 				mv = *(int64_t *)p;
101441e419cbSDavid Malone 				break;
101541e419cbSDavid Malone 			}
1016fd8c668aSDavid Malone 			fputs(sep1, stdout);
1017f8e4b4efSMatthew D Fleming 			if (xflag)
1018e37d2b30SDavid Malone 				printf("%#0*jx", hexlen, umv);
1019f8e4b4efSMatthew D Fleming 			else if (!sign)
1020f8e4b4efSMatthew D Fleming 				printf(hflag ? "%'ju" : "%ju", umv);
102141e419cbSDavid Malone 			else if (fmt[1] == 'K') {
1022e37d2b30SDavid Malone 				if (mv < 0)
102321e1f596SDavid Malone 					printf("%jd", mv);
1024aa255ef6SWarner Losh 				else {
1025aa255ef6SWarner Losh 					/*
1026aa255ef6SWarner Losh 					 * See strIKtoi for details on fmt.
1027aa255ef6SWarner Losh 					 */
1028aa255ef6SWarner Losh 					prec = 1;
1029aa255ef6SWarner Losh 					if (fmt[2] != '\0')
1030aa255ef6SWarner Losh 						prec = fmt[2] - '0';
1031aa255ef6SWarner Losh 					base = 1.0;
1032aa255ef6SWarner Losh 					for (int i = 0; i < prec; i++)
1033aa255ef6SWarner Losh 						base *= 10.0;
1034aa255ef6SWarner Losh 					printf("%.*fC", prec,
1035aa255ef6SWarner Losh 					    (float)mv / base - 273.15);
1036aa255ef6SWarner Losh 				}
1037c591d41fSPeter Wemm 			} else
1038fd8c668aSDavid Malone 				printf(hflag ? "%'jd" : "%jd", mv);
1039fd8c668aSDavid Malone 			sep1 = " ";
104041e419cbSDavid Malone 			len -= intlen;
104141e419cbSDavid Malone 			p += intlen;
1042aa02fb57SPoul-Henning Kamp 		}
1043ccf25977SRuslan Ermilov 		free(oval);
1044dbf9b92fSDoug Rabson 		return (0);
1045dbf9b92fSDoug Rabson 
1046f8e4b4efSMatthew D Fleming 	case CTLTYPE_OPAQUE:
10471d86b91cSPoul-Henning Kamp 		i = 0;
1048a89ab9bbSDag-Erling Smørgrav 		if (strcmp(fmt, "S,clockinfo") == 0)
1049a89ab9bbSDag-Erling Smørgrav 			func = S_clockinfo;
1050a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,timeval") == 0)
1051a89ab9bbSDag-Erling Smørgrav 			func = S_timeval;
1052a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,loadavg") == 0)
1053a89ab9bbSDag-Erling Smørgrav 			func = S_loadavg;
1054f7550ecfSMatthew Dillon 		else if (strcmp(fmt, "S,vmtotal") == 0)
1055f7550ecfSMatthew Dillon 			func = S_vmtotal;
10567d8312ccSJohn Baldwin #ifdef __amd64__
10577d8312ccSJohn Baldwin 		else if (strcmp(fmt, "S,efi_map_header") == 0)
10587d8312ccSJohn Baldwin 			func = S_efi_map;
10597d8312ccSJohn Baldwin #endif
106089871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
106189871cdeSJohn Baldwin 		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
106289871cdeSJohn Baldwin 			func = S_bios_smap_xattr;
106389871cdeSJohn Baldwin #endif
1064a89ab9bbSDag-Erling Smørgrav 		else
1065a89ab9bbSDag-Erling Smørgrav 			func = NULL;
10661d86b91cSPoul-Henning Kamp 		if (func) {
10671d86b91cSPoul-Henning Kamp 			if (!nflag)
1068d0b8aabbSAnton Berezin 				printf("%s%s", name, sep);
106948cd487aSHartmut Brandt 			i = (*func)(len, p);
1070ccf25977SRuslan Ermilov 			free(oval);
107148cd487aSHartmut Brandt 			return (i);
10721d86b91cSPoul-Henning Kamp 		}
10731d86b91cSPoul-Henning Kamp 		/* FALLTHROUGH */
1074dea673e9SRodney W. Grimes 	default:
1075ccf25977SRuslan Ermilov 		if (!oflag && !xflag) {
1076ccf25977SRuslan Ermilov 			free(oval);
10771d86b91cSPoul-Henning Kamp 			return (1);
1078ccf25977SRuslan Ermilov 		}
10791d86b91cSPoul-Henning Kamp 		if (!nflag)
1080d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
10816d7a8f6cSUlrich Spörlein 		printf("Format:%s Length:%zu Dump:0x", fmt, len);
1082a89ab9bbSDag-Erling Smørgrav 		while (len-- && (xflag || p < val + 16))
10831d86b91cSPoul-Henning Kamp 			printf("%02x", *p++);
1084a89ab9bbSDag-Erling Smørgrav 		if (!xflag && len > 16)
10851d86b91cSPoul-Henning Kamp 			printf("...");
1086ccf25977SRuslan Ermilov 		free(oval);
10871d86b91cSPoul-Henning Kamp 		return (0);
10881d86b91cSPoul-Henning Kamp 	}
1089ccf25977SRuslan Ermilov 	free(oval);
10901d86b91cSPoul-Henning Kamp 	return (1);
1091dea673e9SRodney W. Grimes }
1092dea673e9SRodney W. Grimes 
10931d86b91cSPoul-Henning Kamp static int
10941d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len)
1095dea673e9SRodney W. Grimes {
10961d86b91cSPoul-Henning Kamp 	int name1[22], name2[22];
1097dbf9b92fSDoug Rabson 	int i, j;
1098dbf9b92fSDoug Rabson 	size_t l1, l2;
1099dea673e9SRodney W. Grimes 
11001d86b91cSPoul-Henning Kamp 	name1[0] = 0;
11011d86b91cSPoul-Henning Kamp 	name1[1] = 2;
11021d86b91cSPoul-Henning Kamp 	l1 = 2;
11031d86b91cSPoul-Henning Kamp 	if (len) {
11041d86b91cSPoul-Henning Kamp 		memcpy(name1+2, oid, len * sizeof(int));
11051d86b91cSPoul-Henning Kamp 		l1 += len;
11061d86b91cSPoul-Henning Kamp 	} else {
11071d86b91cSPoul-Henning Kamp 		name1[2] = 1;
11081d86b91cSPoul-Henning Kamp 		l1++;
11091d86b91cSPoul-Henning Kamp 	}
1110a89ab9bbSDag-Erling Smørgrav 	for (;;) {
111131fb4661SDima Dorfman 		l2 = sizeof(name2);
11121d86b91cSPoul-Henning Kamp 		j = sysctl(name1, l1, name2, &l2, 0, 0);
1113c1160fe4SBill Fumerola 		if (j < 0) {
11141d86b91cSPoul-Henning Kamp 			if (errno == ENOENT)
111521e1f596SDavid Malone 				return (0);
11161d86b91cSPoul-Henning Kamp 			else
11176d7a8f6cSUlrich Spörlein 				err(1, "sysctl(getnext) %d %zu", j, l2);
1118c1160fe4SBill Fumerola 		}
11191d86b91cSPoul-Henning Kamp 
11201d86b91cSPoul-Henning Kamp 		l2 /= sizeof(int);
11211d86b91cSPoul-Henning Kamp 
1122fd8c668aSDavid Malone 		if (len < 0 || l2 < (unsigned int)len)
112321e1f596SDavid Malone 			return (0);
11241d86b91cSPoul-Henning Kamp 
11251d86b91cSPoul-Henning Kamp 		for (i = 0; i < len; i++)
11261d86b91cSPoul-Henning Kamp 			if (name2[i] != oid[i])
112721e1f596SDavid Malone 				return (0);
11281d86b91cSPoul-Henning Kamp 
11291d86b91cSPoul-Henning Kamp 		i = show_var(name2, l2);
11301d86b91cSPoul-Henning Kamp 		if (!i && !bflag)
11311d86b91cSPoul-Henning Kamp 			putchar('\n');
11321d86b91cSPoul-Henning Kamp 
11331d86b91cSPoul-Henning Kamp 		memcpy(name1+2, name2, l2 * sizeof(int));
11341d86b91cSPoul-Henning Kamp 		l1 = 2 + l2;
11351d86b91cSPoul-Henning Kamp 	}
1136dea673e9SRodney W. Grimes }
1137