xref: /freebsd/sbin/sysctl/sysctl.c (revision 2a71f1ed95bdf703a439b2c9882afa9d8198f6ba)
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;
75da178c77SXin LI static int	Nflag, nflag, oflag, qflag, 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,
89*2a71f1edSConrad Meyer 	[CTLTYPE_S8] = 1,
90*2a71f1edSConrad Meyer 	[CTLTYPE_S16] = 1,
91*2a71f1edSConrad 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),
100*2a71f1edSConrad Meyer 	[CTLTYPE_S8] = sizeof(int8_t),
101*2a71f1edSConrad Meyer 	[CTLTYPE_S16] = sizeof(int16_t),
102*2a71f1edSConrad Meyer 	[CTLTYPE_S32] = sizeof(int32_t),
103e267e00eSXin LI 	[CTLTYPE_S64] = sizeof(int64_t),
104*2a71f1edSConrad Meyer 	[CTLTYPE_U8] = sizeof(uint8_t),
105*2a71f1edSConrad Meyer 	[CTLTYPE_U16] = sizeof(uint16_t),
106*2a71f1edSConrad 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",
115*2a71f1edSConrad Meyer 	[CTLTYPE_U8] = "uint8_t",
116*2a71f1edSConrad Meyer 	[CTLTYPE_U16] = "uint16_t",
117*2a71f1edSConrad Meyer 	[CTLTYPE_U32] = "uint16_t",
118e267e00eSXin LI 	[CTLTYPE_U64] = "uint64_t",
119*2a71f1edSConrad Meyer 	[CTLTYPE_S8] = "int8_t",
120*2a71f1edSConrad Meyer 	[CTLTYPE_S16] = "int16_t",
121*2a71f1edSConrad Meyer 	[CTLTYPE_S32] = "int32_t",
122*2a71f1edSConrad Meyer 	[CTLTYPE_S64] = "int64_t",
123e267e00eSXin LI };
124d58f0054SPoul-Henning Kamp 
1251d86b91cSPoul-Henning Kamp static void
1261d86b91cSPoul-Henning Kamp usage(void)
1271d86b91cSPoul-Henning Kamp {
128dea673e9SRodney W. Grimes 
1299a2402bcSDag-Erling Smørgrav 	(void)fprintf(stderr, "%s\n%s\n",
13075820005SJohn-Mark Gurney 	    "usage: sysctl [-bdehiNnoqTWx] [ -B <bufsize> ] [-f filename] name[=value] ...",
13175820005SJohn-Mark Gurney 	    "       sysctl [-bdehNnoqTWx] [ -B <bufsize> ] -a");
1321d86b91cSPoul-Henning Kamp 	exit(1);
1331d86b91cSPoul-Henning Kamp }
134dea673e9SRodney W. Grimes 
135dea673e9SRodney W. Grimes int
1361d86b91cSPoul-Henning Kamp main(int argc, char **argv)
137dea673e9SRodney W. Grimes {
1381d86b91cSPoul-Henning Kamp 	int ch;
139da178c77SXin LI 	int warncount = 0;
14045817aaaSDag-Erling Smørgrav 
14145817aaaSDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "");
1421d86b91cSPoul-Henning Kamp 	setbuf(stdout,0);
1431d86b91cSPoul-Henning Kamp 	setbuf(stderr,0);
144dea673e9SRodney W. Grimes 
14575820005SJohn-Mark Gurney 	while ((ch = getopt(argc, argv, "AabB:def:hiNnoqTwWxX")) != -1) {
146dea673e9SRodney W. Grimes 		switch (ch) {
147ca5fac55SDag-Erling Smørgrav 		case 'A':
1489a2402bcSDag-Erling Smørgrav 			/* compatibility */
1499a2402bcSDag-Erling Smørgrav 			aflag = oflag = 1;
150ca5fac55SDag-Erling Smørgrav 			break;
151ca5fac55SDag-Erling Smørgrav 		case 'a':
152ca5fac55SDag-Erling Smørgrav 			aflag = 1;
153ca5fac55SDag-Erling Smørgrav 			break;
154ca5fac55SDag-Erling Smørgrav 		case 'b':
155ca5fac55SDag-Erling Smørgrav 			bflag = 1;
156ca5fac55SDag-Erling Smørgrav 			break;
15775820005SJohn-Mark Gurney 		case 'B':
15875820005SJohn-Mark Gurney 			Bflag = strtol(optarg, NULL, 0);
15975820005SJohn-Mark Gurney 			break;
1606105f815SLuigi Rizzo 		case 'd':
1616105f815SLuigi Rizzo 			dflag = 1;
1626105f815SLuigi Rizzo 			break;
163d0b8aabbSAnton Berezin 		case 'e':
164d0b8aabbSAnton Berezin 			eflag = 1;
165d0b8aabbSAnton Berezin 			break;
166da178c77SXin LI 		case 'f':
167da178c77SXin LI 			conffile = optarg;
168da178c77SXin LI 			break;
16945817aaaSDag-Erling Smørgrav 		case 'h':
17045817aaaSDag-Erling Smørgrav 			hflag = 1;
17145817aaaSDag-Erling Smørgrav 			break;
17224b2aa32SGavin Atkinson 		case 'i':
17324b2aa32SGavin Atkinson 			iflag = 1;
17424b2aa32SGavin Atkinson 			break;
175ca5fac55SDag-Erling Smørgrav 		case 'N':
176ca5fac55SDag-Erling Smørgrav 			Nflag = 1;
177ca5fac55SDag-Erling Smørgrav 			break;
178ca5fac55SDag-Erling Smørgrav 		case 'n':
179ca5fac55SDag-Erling Smørgrav 			nflag = 1;
180ca5fac55SDag-Erling Smørgrav 			break;
1819a2402bcSDag-Erling Smørgrav 		case 'o':
1829a2402bcSDag-Erling Smørgrav 			oflag = 1;
1839a2402bcSDag-Erling Smørgrav 			break;
184f93d36fdSRobert Watson 		case 'q':
185f93d36fdSRobert Watson 			qflag = 1;
186f93d36fdSRobert Watson 			break;
1879ecd2e32SAlfred Perlstein 		case 'T':
1889ecd2e32SAlfred Perlstein 			Tflag = 1;
1899ecd2e32SAlfred Perlstein 			break;
190ca5fac55SDag-Erling Smørgrav 		case 'w':
1919a2402bcSDag-Erling Smørgrav 			/* compatibility */
1929a2402bcSDag-Erling Smørgrav 			/* ignored */
193ca5fac55SDag-Erling Smørgrav 			break;
1949ecd2e32SAlfred Perlstein 		case 'W':
1959ecd2e32SAlfred Perlstein 			Wflag = 1;
1969ecd2e32SAlfred Perlstein 			break;
197ca5fac55SDag-Erling Smørgrav 		case 'X':
1989a2402bcSDag-Erling Smørgrav 			/* compatibility */
1999a2402bcSDag-Erling Smørgrav 			aflag = xflag = 1;
2009a2402bcSDag-Erling Smørgrav 			break;
2019a2402bcSDag-Erling Smørgrav 		case 'x':
2029a2402bcSDag-Erling Smørgrav 			xflag = 1;
203ca5fac55SDag-Erling Smørgrav 			break;
204ca5fac55SDag-Erling Smørgrav 		default:
205ca5fac55SDag-Erling Smørgrav 			usage();
206dea673e9SRodney W. Grimes 		}
207dea673e9SRodney W. Grimes 	}
208dea673e9SRodney W. Grimes 	argc -= optind;
209dea673e9SRodney W. Grimes 	argv += optind;
210dea673e9SRodney W. Grimes 
2119a2402bcSDag-Erling Smørgrav 	if (Nflag && nflag)
21281e7454aSDag-Erling Smørgrav 		usage();
2139a2402bcSDag-Erling Smørgrav 	if (aflag && argc == 0)
2141d86b91cSPoul-Henning Kamp 		exit(sysctl_all(0, 0));
215da178c77SXin LI 	if (argc == 0 && conffile == NULL)
216dea673e9SRodney W. Grimes 		usage();
217d9fcd86cSMike Makonnen 
218d9fcd86cSMike Makonnen 	warncount = 0;
219da178c77SXin LI 	if (conffile != NULL)
220da178c77SXin LI 		warncount += parsefile(conffile);
221da178c77SXin LI 
222dea673e9SRodney W. Grimes 	while (argc-- > 0)
223da178c77SXin LI 		warncount += parse(*argv++, 0);
224da178c77SXin LI 
225da178c77SXin LI 	return (warncount);
226dea673e9SRodney W. Grimes }
227dea673e9SRodney W. Grimes 
228dea673e9SRodney W. Grimes /*
229dea673e9SRodney W. Grimes  * Parse a name into a MIB entry.
230dea673e9SRodney W. Grimes  * Lookup and print out the MIB entry if it exists.
231dea673e9SRodney W. Grimes  * Set a new value if requested.
232dea673e9SRodney W. Grimes  */
233da178c77SXin LI static int
234da178c77SXin LI parse(const char *string, int lineno)
235dea673e9SRodney W. Grimes {
2361d86b91cSPoul-Henning Kamp 	int len, i, j;
237e267e00eSXin LI 	const void *newval;
238e267e00eSXin LI 	const char *newvalstr = NULL;
239*2a71f1edSConrad Meyer 	int8_t i8val;
240c3220d0bSConrad Meyer 	uint8_t u8val;
241*2a71f1edSConrad Meyer 	int16_t i16val;
242c3220d0bSConrad Meyer 	uint16_t u16val;
243*2a71f1edSConrad Meyer 	int32_t i32val;
244*2a71f1edSConrad Meyer 	uint32_t u32val;
2451ce1a53dSJim Pirzyk 	int intval;
2461ce1a53dSJim Pirzyk 	unsigned int uintval;
2471ce1a53dSJim Pirzyk 	long longval;
2481ce1a53dSJim Pirzyk 	unsigned long ulongval;
24975820005SJohn-Mark Gurney 	size_t newsize = Bflag;
250cbc134adSMatthew D Fleming 	int64_t i64val;
251cbc134adSMatthew D Fleming 	uint64_t u64val;
252dea673e9SRodney W. Grimes 	int mib[CTL_MAXNAME];
253e267e00eSXin LI 	char *cp, *bufp, buf[BUFSIZ], *endptr = NULL, fmt[BUFSIZ], line[BUFSIZ];
2541d86b91cSPoul-Henning Kamp 	u_int kind;
255dea673e9SRodney W. Grimes 
256da178c77SXin LI 	if (lineno)
257da178c77SXin LI 		snprintf(line, sizeof(line), " at line %d", lineno);
258da178c77SXin LI 	else
259da178c77SXin LI 		line[0] = '\0';
260da178c77SXin LI 
261aae75101SXin LI 	cp = buf;
262da178c77SXin LI 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
263c6919e7fSEdward Tomasz Napierala 		warnx("oid too long: '%s'%s", string, line);
264da178c77SXin LI 		return (1);
265da178c77SXin LI 	}
266da178c77SXin LI 	bufp = strsep(&cp, "=:");
267aae75101SXin LI 	if (cp != NULL) {
2689ecd2e32SAlfred Perlstein 		/* Tflag just lists tunables, do not allow assignment */
2699ecd2e32SAlfred Perlstein 		if (Tflag || Wflag) {
2709ecd2e32SAlfred Perlstein 			warnx("Can't set variables when using -T or -W");
2719ecd2e32SAlfred Perlstein 			usage();
2729ecd2e32SAlfred Perlstein 		}
273dea673e9SRodney W. Grimes 		while (isspace(*cp))
274dea673e9SRodney W. Grimes 			cp++;
275da178c77SXin LI 		/* Strip a pair of " or ' if any. */
276da178c77SXin LI 		switch (*cp) {
277da178c77SXin LI 		case '\"':
278da178c77SXin LI 		case '\'':
279da178c77SXin LI 			if (cp[strlen(cp) - 1] == *cp)
280da178c77SXin LI 				cp[strlen(cp) - 1] = '\0';
281da178c77SXin LI 			cp++;
282da178c77SXin LI 		}
283e267e00eSXin LI 		newvalstr = cp;
284dea673e9SRodney W. Grimes 		newsize = strlen(cp);
285dea673e9SRodney W. Grimes 	}
286ca587fdaSBaptiste Daroussin 	/* Trim spaces */
287ca587fdaSBaptiste Daroussin 	cp = bufp + strlen(bufp) - 1;
288ca587fdaSBaptiste Daroussin 	while (cp >= bufp && isspace((int)*cp)) {
289ca587fdaSBaptiste Daroussin 		*cp = '\0';
290ca587fdaSBaptiste Daroussin 		cp--;
291ca587fdaSBaptiste Daroussin 	}
2921d86b91cSPoul-Henning Kamp 	len = name2oid(bufp, mib);
2931d86b91cSPoul-Henning Kamp 
294f93d36fdSRobert Watson 	if (len < 0) {
29524b2aa32SGavin Atkinson 		if (iflag)
296da178c77SXin LI 			return (0);
297f93d36fdSRobert Watson 		if (qflag)
298da178c77SXin LI 			return (1);
299da178c77SXin LI 		else {
300e1619d12SBaptiste Daroussin 			if (errno == ENOENT) {
301e1619d12SBaptiste Daroussin 				warnx("unknown oid '%s'%s", bufp, line);
302e1619d12SBaptiste Daroussin 			} else {
303da178c77SXin LI 				warn("unknown oid '%s'%s", bufp, line);
304e1619d12SBaptiste Daroussin 			}
305da178c77SXin LI 			return (1);
306da178c77SXin LI 		}
307f93d36fdSRobert Watson 	}
3081d86b91cSPoul-Henning Kamp 
309da178c77SXin LI 	if (oidfmt(mib, len, fmt, &kind)) {
310da178c77SXin LI 		warn("couldn't find format of oid '%s'%s", bufp, line);
311da178c77SXin LI 		if (iflag)
312da178c77SXin LI 			return (1);
313da178c77SXin LI 		else
314da178c77SXin LI 			exit(1);
315da178c77SXin LI 	}
3161d86b91cSPoul-Henning Kamp 
317e267e00eSXin LI 	if (newvalstr == NULL || dflag) {
3181d86b91cSPoul-Henning Kamp 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
319b2680e20SMatthew N. Dodd 			if (dflag) {
320b2680e20SMatthew N. Dodd 				i = show_var(mib, len);
321b2680e20SMatthew N. Dodd 				if (!i && !bflag)
322b2680e20SMatthew N. Dodd 					putchar('\n');
323b2680e20SMatthew N. Dodd 			}
3241d86b91cSPoul-Henning Kamp 			sysctl_all(mib, len);
3251d86b91cSPoul-Henning Kamp 		} else {
3261d86b91cSPoul-Henning Kamp 			i = show_var(mib, len);
3271d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
3281d86b91cSPoul-Henning Kamp 				putchar('\n');
329dea673e9SRodney W. Grimes 		}
3301d86b91cSPoul-Henning Kamp 	} else {
331da178c77SXin LI 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
332c6919e7fSEdward Tomasz Napierala 			warnx("oid '%s' isn't a leaf node%s", bufp, line);
333da178c77SXin LI 			return (1);
334da178c77SXin LI 		}
335dea673e9SRodney W. Grimes 
336ac8711d2SMike Silbersack 		if (!(kind & CTLFLAG_WR)) {
3379b4b73b7SMike Silbersack 			if (kind & CTLFLAG_TUN) {
3386f361351SXin LI 				warnx("oid '%s' is a read only tunable%s", bufp, line);
339da178c77SXin LI 				warnx("Tunable values are set in /boot/loader.conf");
340da178c77SXin LI 			} else
341da178c77SXin LI 				warnx("oid '%s' is read only%s", bufp, line);
342da178c77SXin LI 			return (1);
343ac8711d2SMike Silbersack 		}
344dea673e9SRodney W. Grimes 
345e267e00eSXin LI 		switch (kind & CTLTYPE) {
346e267e00eSXin LI 		case CTLTYPE_INT:
347e267e00eSXin LI 		case CTLTYPE_UINT:
348e267e00eSXin LI 		case CTLTYPE_LONG:
349e267e00eSXin LI 		case CTLTYPE_ULONG:
350*2a71f1edSConrad Meyer 		case CTLTYPE_S8:
351*2a71f1edSConrad Meyer 		case CTLTYPE_S16:
352*2a71f1edSConrad Meyer 		case CTLTYPE_S32:
353e267e00eSXin LI 		case CTLTYPE_S64:
354*2a71f1edSConrad Meyer 		case CTLTYPE_U8:
355*2a71f1edSConrad Meyer 		case CTLTYPE_U16:
356*2a71f1edSConrad Meyer 		case CTLTYPE_U32:
357e267e00eSXin LI 		case CTLTYPE_U64:
358e267e00eSXin LI 			if (strlen(newvalstr) == 0) {
359da178c77SXin LI 				warnx("empty numeric value");
360da178c77SXin LI 				return (1);
361da178c77SXin LI 			}
362e267e00eSXin LI 			/* FALLTHROUGH */
363e267e00eSXin LI 		case CTLTYPE_STRING:
364e267e00eSXin LI 			break;
365e267e00eSXin LI 		default:
366e267e00eSXin LI 			warnx("oid '%s' is type %d,"
367e267e00eSXin LI 				" cannot set that%s", bufp,
368e267e00eSXin LI 				kind & CTLTYPE, line);
369e267e00eSXin LI 			return (1);
370a78d3eafSRobert Watson 		}
371a78d3eafSRobert Watson 
3724b8740cdSXin LI 		errno = 0;
3734b8740cdSXin LI 
3741d86b91cSPoul-Henning Kamp 		switch (kind & CTLTYPE) {
375dea673e9SRodney W. Grimes 			case CTLTYPE_INT:
376aa255ef6SWarner Losh 				if (strncmp(fmt, "IK", 2) == 0)
377aa255ef6SWarner Losh 					intval = strIKtoi(newvalstr, &endptr, fmt);
378e267e00eSXin LI 				else
379e267e00eSXin LI 					intval = (int)strtol(newvalstr, &endptr,
380d45564dcSHajimu UMEMOTO 					    0);
381dea673e9SRodney W. Grimes 				newval = &intval;
38231fb4661SDima Dorfman 				newsize = sizeof(intval);
383dea673e9SRodney W. Grimes 				break;
3841ce1a53dSJim Pirzyk 			case CTLTYPE_UINT:
385e267e00eSXin LI 				uintval = (int) strtoul(newvalstr, &endptr, 0);
3861ce1a53dSJim Pirzyk 				newval = &uintval;
38721e1f596SDavid Malone 				newsize = sizeof(uintval);
3881ce1a53dSJim Pirzyk 				break;
3891ce1a53dSJim Pirzyk 			case CTLTYPE_LONG:
390e267e00eSXin LI 				longval = strtol(newvalstr, &endptr, 0);
3911ce1a53dSJim Pirzyk 				newval = &longval;
39221e1f596SDavid Malone 				newsize = sizeof(longval);
3931ce1a53dSJim Pirzyk 				break;
3941ce1a53dSJim Pirzyk 			case CTLTYPE_ULONG:
395e267e00eSXin LI 				ulongval = strtoul(newvalstr, &endptr, 0);
3961ce1a53dSJim Pirzyk 				newval = &ulongval;
39721e1f596SDavid Malone 				newsize = sizeof(ulongval);
3981d86b91cSPoul-Henning Kamp 				break;
3991d86b91cSPoul-Henning Kamp 			case CTLTYPE_STRING:
400e267e00eSXin LI 				newval = newvalstr;
4011d86b91cSPoul-Henning Kamp 				break;
402*2a71f1edSConrad Meyer 			case CTLTYPE_S8:
403*2a71f1edSConrad Meyer 				i8val = (int8_t)strtol(newvalstr, &endptr, 0);
404*2a71f1edSConrad Meyer 				newval = &i8val;
405*2a71f1edSConrad Meyer 				newsize = sizeof(i8val);
406*2a71f1edSConrad Meyer 				break;
407*2a71f1edSConrad Meyer 			case CTLTYPE_S16:
408*2a71f1edSConrad Meyer 				i16val = (int16_t)strtol(newvalstr, &endptr,
409*2a71f1edSConrad Meyer 				    0);
410*2a71f1edSConrad Meyer 				newval = &i16val;
411*2a71f1edSConrad Meyer 				newsize = sizeof(i16val);
412*2a71f1edSConrad Meyer 				break;
413*2a71f1edSConrad Meyer 			case CTLTYPE_S32:
414*2a71f1edSConrad Meyer 				i32val = (int32_t)strtol(newvalstr, &endptr,
415*2a71f1edSConrad Meyer 				    0);
416*2a71f1edSConrad Meyer 				newval = &i32val;
417*2a71f1edSConrad Meyer 				newsize = sizeof(i32val);
418*2a71f1edSConrad Meyer 				break;
419cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
420e267e00eSXin LI 				i64val = strtoimax(newvalstr, &endptr, 0);
421cbc134adSMatthew D Fleming 				newval = &i64val;
422cbc134adSMatthew D Fleming 				newsize = sizeof(i64val);
423cbc134adSMatthew D Fleming 				break;
424*2a71f1edSConrad Meyer 			case CTLTYPE_U8:
425*2a71f1edSConrad Meyer 				u8val = (uint8_t)strtoul(newvalstr, &endptr, 0);
426*2a71f1edSConrad Meyer 				newval = &u8val;
427*2a71f1edSConrad Meyer 				newsize = sizeof(u8val);
428*2a71f1edSConrad Meyer 				break;
429*2a71f1edSConrad Meyer 			case CTLTYPE_U16:
430*2a71f1edSConrad Meyer 				u16val = (uint16_t)strtoul(newvalstr, &endptr,
431*2a71f1edSConrad Meyer 				    0);
432*2a71f1edSConrad Meyer 				newval = &u16val;
433*2a71f1edSConrad Meyer 				newsize = sizeof(u16val);
434*2a71f1edSConrad Meyer 				break;
435*2a71f1edSConrad Meyer 			case CTLTYPE_U32:
436*2a71f1edSConrad Meyer 				u32val = (uint32_t)strtoul(newvalstr, &endptr,
437*2a71f1edSConrad Meyer 				    0);
438*2a71f1edSConrad Meyer 				newval = &u32val;
439*2a71f1edSConrad Meyer 				newsize = sizeof(u32val);
440*2a71f1edSConrad Meyer 				break;
441cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
442e267e00eSXin LI 				u64val = strtoumax(newvalstr, &endptr, 0);
443cbc134adSMatthew D Fleming 				newval = &u64val;
444cbc134adSMatthew D Fleming 				newsize = sizeof(u64val);
445dea673e9SRodney W. Grimes 				break;
4461d86b91cSPoul-Henning Kamp 			default:
447e267e00eSXin LI 				/* NOTREACHED */
448e267e00eSXin LI 				abort();
449e267e00eSXin LI 		}
450e267e00eSXin LI 
451e267e00eSXin LI 		if (errno != 0 || endptr == newvalstr ||
452e267e00eSXin LI 		    (endptr != NULL && *endptr != '\0')) {
453e267e00eSXin LI 			warnx("invalid %s '%s'%s", ctl_typename[kind & CTLTYPE],
454e267e00eSXin LI 			    newvalstr, line);
455da178c77SXin LI 			return (1);
456dea673e9SRodney W. Grimes 		}
4571d86b91cSPoul-Henning Kamp 
4581d86b91cSPoul-Henning Kamp 		i = show_var(mib, len);
4591d86b91cSPoul-Henning Kamp 		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
4601d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
4611d86b91cSPoul-Henning Kamp 				putchar('\n');
462dea673e9SRodney W. Grimes 			switch (errno) {
463dea673e9SRodney W. Grimes 			case EOPNOTSUPP:
464da178c77SXin LI 				warnx("%s: value is not available%s",
465da178c77SXin LI 					string, line);
466da178c77SXin LI 				return (1);
467dea673e9SRodney W. Grimes 			case ENOTDIR:
468da178c77SXin LI 				warnx("%s: specification is incomplete%s",
469da178c77SXin LI 					string, line);
470da178c77SXin LI 				return (1);
471dea673e9SRodney W. Grimes 			case ENOMEM:
472da178c77SXin LI 				warnx("%s: type is unknown to this program%s",
473da178c77SXin LI 					string, line);
474da178c77SXin LI 				return (1);
475dea673e9SRodney W. Grimes 			default:
476da178c77SXin LI 				warn("%s%s", string, line);
477da178c77SXin LI 				return (1);
478dea673e9SRodney W. Grimes 			}
479dea673e9SRodney W. Grimes 		}
4801d86b91cSPoul-Henning Kamp 		if (!bflag)
4811d86b91cSPoul-Henning Kamp 			printf(" -> ");
4821d86b91cSPoul-Henning Kamp 		i = nflag;
4831d86b91cSPoul-Henning Kamp 		nflag = 1;
4841d86b91cSPoul-Henning Kamp 		j = show_var(mib, len);
4851d86b91cSPoul-Henning Kamp 		if (!j && !bflag)
4861d86b91cSPoul-Henning Kamp 			putchar('\n');
4871d86b91cSPoul-Henning Kamp 		nflag = i;
488dea673e9SRodney W. Grimes 	}
489da178c77SXin LI 
490da178c77SXin LI 	return (0);
491da178c77SXin LI }
492da178c77SXin LI 
493da178c77SXin LI static int
494da178c77SXin LI parsefile(const char *filename)
495da178c77SXin LI {
496da178c77SXin LI 	FILE *file;
497da178c77SXin LI 	char line[BUFSIZ], *p, *pq, *pdq;
498da178c77SXin LI 	int warncount = 0, lineno = 0;
499da178c77SXin LI 
500da178c77SXin LI 	file = fopen(filename, "r");
501da178c77SXin LI 	if (file == NULL)
502da178c77SXin LI 		err(EX_NOINPUT, "%s", filename);
503da178c77SXin LI 	while (fgets(line, sizeof(line), file) != NULL) {
504da178c77SXin LI 		lineno++;
505da178c77SXin LI 		p = line;
506da178c77SXin LI 		pq = strchr(line, '\'');
507da178c77SXin LI 		pdq = strchr(line, '\"');
508da178c77SXin LI 		/* Replace the first # with \0. */
509da178c77SXin LI 		while((p = strchr(p, '#')) != NULL) {
510da178c77SXin LI 			if (pq != NULL && p > pq) {
511da178c77SXin LI 				if ((p = strchr(pq+1, '\'')) != NULL)
512da178c77SXin LI 					*(++p) = '\0';
513da178c77SXin LI 				break;
514da178c77SXin LI 			} else if (pdq != NULL && p > pdq) {
515da178c77SXin LI 				if ((p = strchr(pdq+1, '\"')) != NULL)
516da178c77SXin LI 					*(++p) = '\0';
517da178c77SXin LI 				break;
518da178c77SXin LI 			} else if (p == line || *(p-1) != '\\') {
519da178c77SXin LI 				*p = '\0';
520da178c77SXin LI 				break;
521da178c77SXin LI 			}
522da178c77SXin LI 			p++;
523da178c77SXin LI 		}
524da178c77SXin LI 		/* Trim spaces */
525da178c77SXin LI 		p = line + strlen(line) - 1;
526da178c77SXin LI 		while (p >= line && isspace((int)*p)) {
527da178c77SXin LI 			*p = '\0';
528da178c77SXin LI 			p--;
529da178c77SXin LI 		}
530da178c77SXin LI 		p = line;
531da178c77SXin LI 		while (isspace((int)*p))
532da178c77SXin LI 			p++;
533da178c77SXin LI 		if (*p == '\0')
534da178c77SXin LI 			continue;
535da178c77SXin LI 		else
536da178c77SXin LI 			warncount += parse(p, lineno);
537da178c77SXin LI 	}
538da178c77SXin LI 	fclose(file);
539da178c77SXin LI 
540da178c77SXin LI 	return (warncount);
541dea673e9SRodney W. Grimes }
542dea673e9SRodney W. Grimes 
5431d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */
544dea673e9SRodney W. Grimes 
5451d86b91cSPoul-Henning Kamp static int
54659101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p)
5471d86b91cSPoul-Henning Kamp {
5481d86b91cSPoul-Henning Kamp 	struct clockinfo *ci = (struct clockinfo*)p;
54921e1f596SDavid Malone 
550996076bbSAlfred Perlstein 	if (l2 != sizeof(*ci)) {
55159101c5dSJohn Baldwin 		warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci));
5526b6b665bSBruce Evans 		return (1);
553996076bbSAlfred Perlstein 	}
55445817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
55545817aaaSDag-Erling Smørgrav 		"{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
556b35c8f28SPoul-Henning Kamp 		ci->hz, ci->tick, ci->profhz, ci->stathz);
5571d86b91cSPoul-Henning Kamp 	return (0);
558dea673e9SRodney W. Grimes }
559dea673e9SRodney W. Grimes 
5601d86b91cSPoul-Henning Kamp static int
56159101c5dSJohn Baldwin S_loadavg(size_t l2, void *p)
5621d86b91cSPoul-Henning Kamp {
5631d86b91cSPoul-Henning Kamp 	struct loadavg *tv = (struct loadavg*)p;
5641d86b91cSPoul-Henning Kamp 
565996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
56659101c5dSJohn Baldwin 		warnx("S_loadavg %zu != %zu", l2, sizeof(*tv));
5676b6b665bSBruce Evans 		return (1);
568996076bbSAlfred Perlstein 	}
56945817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
5701d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[0]/(double)tv->fscale,
5711d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[1]/(double)tv->fscale,
5721d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[2]/(double)tv->fscale);
5731d86b91cSPoul-Henning Kamp 	return (0);
574dea673e9SRodney W. Grimes }
575dea673e9SRodney W. Grimes 
5761d86b91cSPoul-Henning Kamp static int
57759101c5dSJohn Baldwin S_timeval(size_t l2, void *p)
5781d86b91cSPoul-Henning Kamp {
5791d86b91cSPoul-Henning Kamp 	struct timeval *tv = (struct timeval*)p;
580c2deb608SBruce Evans 	time_t tv_sec;
5811d86b91cSPoul-Henning Kamp 	char *p1, *p2;
582dea673e9SRodney W. Grimes 
583996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
58459101c5dSJohn Baldwin 		warnx("S_timeval %zu != %zu", l2, sizeof(*tv));
5856b6b665bSBruce Evans 		return (1);
586996076bbSAlfred Perlstein 	}
587db87e2dcSJohn Hay 	printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
588db87e2dcSJohn Hay 		"{ sec = %jd, usec = %ld } ",
589db87e2dcSJohn Hay 		(intmax_t)tv->tv_sec, tv->tv_usec);
590c2deb608SBruce Evans 	tv_sec = tv->tv_sec;
591c2deb608SBruce Evans 	p1 = strdup(ctime(&tv_sec));
5921d86b91cSPoul-Henning Kamp 	for (p2=p1; *p2 ; p2++)
5931d86b91cSPoul-Henning Kamp 		if (*p2 == '\n')
5941d86b91cSPoul-Henning Kamp 			*p2 = '\0';
5951d86b91cSPoul-Henning Kamp 	fputs(p1, stdout);
596f2359a24SRebecca Cran 	free(p1);
5971d86b91cSPoul-Henning Kamp 	return (0);
5981d86b91cSPoul-Henning Kamp }
5991d86b91cSPoul-Henning Kamp 
6001d86b91cSPoul-Henning Kamp static int
60159101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p)
602f7550ecfSMatthew Dillon {
603f7550ecfSMatthew Dillon 	struct vmtotal *v = (struct vmtotal *)p;
604654e22e7SMatthew Dillon 	int pageKilo = getpagesize() / 1024;
605f7550ecfSMatthew Dillon 
606f7550ecfSMatthew Dillon 	if (l2 != sizeof(*v)) {
60759101c5dSJohn Baldwin 		warnx("S_vmtotal %zu != %zu", l2, sizeof(*v));
6086b6b665bSBruce Evans 		return (1);
609f7550ecfSMatthew Dillon 	}
610f7550ecfSMatthew Dillon 
611654e22e7SMatthew Dillon 	printf(
612654e22e7SMatthew Dillon 	    "\nSystem wide totals computed every five seconds:"
613654e22e7SMatthew Dillon 	    " (values in kilobytes)\n");
614f7550ecfSMatthew Dillon 	printf("===============================================\n");
615654e22e7SMatthew Dillon 	printf(
616bad4d172SRuslan Ermilov 	    "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
617bad4d172SRuslan Ermilov 	    "%hd Sleep: %hd)\n",
618f7550ecfSMatthew Dillon 	    v->t_rq, v->t_dw, v->t_pw, v->t_sl);
619654e22e7SMatthew Dillon 	printf(
62013e86ef7SMarko Zec 	    "Virtual Memory:\t\t(Total: %dK Active: %dK)\n",
621bad4d172SRuslan Ermilov 	    v->t_vm * pageKilo, v->t_avm * pageKilo);
62213e86ef7SMarko Zec 	printf("Real Memory:\t\t(Total: %dK Active: %dK)\n",
623bad4d172SRuslan Ermilov 	    v->t_rm * pageKilo, v->t_arm * pageKilo);
624bad4d172SRuslan Ermilov 	printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n",
625bad4d172SRuslan Ermilov 	    v->t_vmshr * pageKilo, v->t_avmshr * pageKilo);
626bad4d172SRuslan Ermilov 	printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n",
627bad4d172SRuslan Ermilov 	    v->t_rmshr * pageKilo, v->t_armshr * pageKilo);
62859101c5dSJohn Baldwin 	printf("Free Memory:\t%dK", v->t_free * pageKilo);
629f7550ecfSMatthew Dillon 
630f7550ecfSMatthew Dillon 	return (0);
631f7550ecfSMatthew Dillon }
632f7550ecfSMatthew Dillon 
6337d8312ccSJohn Baldwin #ifdef __amd64__
6347d8312ccSJohn Baldwin #define efi_next_descriptor(ptr, size) \
6357d8312ccSJohn Baldwin 	((struct efi_md *)(((uint8_t *) ptr) + size))
6367d8312ccSJohn Baldwin 
6377d8312ccSJohn Baldwin static int
6387d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p)
6397d8312ccSJohn Baldwin {
6407d8312ccSJohn Baldwin 	struct efi_map_header *efihdr;
6417d8312ccSJohn Baldwin 	struct efi_md *map;
6427d8312ccSJohn Baldwin 	const char *type;
6437d8312ccSJohn Baldwin 	size_t efisz;
6447d8312ccSJohn Baldwin 	int ndesc, i;
6457d8312ccSJohn Baldwin 
6467d8312ccSJohn Baldwin 	static const char *types[] = {
6477d8312ccSJohn Baldwin 		"Reserved",
6487d8312ccSJohn Baldwin 		"LoaderCode",
6497d8312ccSJohn Baldwin 		"LoaderData",
6507d8312ccSJohn Baldwin 		"BootServicesCode",
6517d8312ccSJohn Baldwin 		"BootServicesData",
6527d8312ccSJohn Baldwin 		"RuntimeServicesCode",
6537d8312ccSJohn Baldwin 		"RuntimeServicesData",
6547d8312ccSJohn Baldwin 		"ConventionalMemory",
6557d8312ccSJohn Baldwin 		"UnusableMemory",
6567d8312ccSJohn Baldwin 		"ACPIReclaimMemory",
6577d8312ccSJohn Baldwin 		"ACPIMemoryNVS",
6587d8312ccSJohn Baldwin 		"MemoryMappedIO",
6597d8312ccSJohn Baldwin 		"MemoryMappedIOPortSpace",
6607d8312ccSJohn Baldwin 		"PalCode"
6617d8312ccSJohn Baldwin 	};
6627d8312ccSJohn Baldwin 
6637d8312ccSJohn Baldwin 	/*
6647d8312ccSJohn Baldwin 	 * Memory map data provided by UEFI via the GetMemoryMap
6657d8312ccSJohn Baldwin 	 * Boot Services API.
6667d8312ccSJohn Baldwin 	 */
6677d8312ccSJohn Baldwin 	if (l2 < sizeof(*efihdr)) {
6687d8312ccSJohn Baldwin 		warnx("S_efi_map length less than header");
6697d8312ccSJohn Baldwin 		return (1);
6707d8312ccSJohn Baldwin 	}
6717d8312ccSJohn Baldwin 	efihdr = p;
6727d8312ccSJohn Baldwin 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
6737d8312ccSJohn Baldwin 	map = (struct efi_md *)((uint8_t *)efihdr + efisz);
6747d8312ccSJohn Baldwin 
6757d8312ccSJohn Baldwin 	if (efihdr->descriptor_size == 0)
6767d8312ccSJohn Baldwin 		return (0);
6777d8312ccSJohn Baldwin 	if (l2 != efisz + efihdr->memory_size) {
6787d8312ccSJohn Baldwin 		warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz +
6797d8312ccSJohn Baldwin 		    efihdr->memory_size);
6807d8312ccSJohn Baldwin 		return (1);
6817d8312ccSJohn Baldwin 	}
6827d8312ccSJohn Baldwin 	ndesc = efihdr->memory_size / efihdr->descriptor_size;
6837d8312ccSJohn Baldwin 
6847d8312ccSJohn Baldwin 	printf("\n%23s %12s %12s %8s %4s",
6857d8312ccSJohn Baldwin 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
6867d8312ccSJohn Baldwin 
6877d8312ccSJohn Baldwin 	for (i = 0; i < ndesc; i++,
6887d8312ccSJohn Baldwin 	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
6897d8312ccSJohn Baldwin 		if (map->md_type <= EFI_MD_TYPE_PALCODE)
6907d8312ccSJohn Baldwin 			type = types[map->md_type];
6917d8312ccSJohn Baldwin 		else
6927d8312ccSJohn Baldwin 			type = "<INVALID>";
6937d8312ccSJohn Baldwin 		printf("\n%23s %012lx %12p %08lx ", type, map->md_phys,
6947d8312ccSJohn Baldwin 		    map->md_virt, map->md_pages);
6957d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UC)
6967d8312ccSJohn Baldwin 			printf("UC ");
6977d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WC)
6987d8312ccSJohn Baldwin 			printf("WC ");
6997d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WT)
7007d8312ccSJohn Baldwin 			printf("WT ");
7017d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WB)
7027d8312ccSJohn Baldwin 			printf("WB ");
7037d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_UCE)
7047d8312ccSJohn Baldwin 			printf("UCE ");
7057d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_WP)
7067d8312ccSJohn Baldwin 			printf("WP ");
7077d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RP)
7087d8312ccSJohn Baldwin 			printf("RP ");
7097d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_XP)
7107d8312ccSJohn Baldwin 			printf("XP ");
7117d8312ccSJohn Baldwin 		if (map->md_attr & EFI_MD_ATTR_RT)
7127d8312ccSJohn Baldwin 			printf("RUNTIME");
7137d8312ccSJohn Baldwin 	}
7147d8312ccSJohn Baldwin 	return (0);
7157d8312ccSJohn Baldwin }
7167d8312ccSJohn Baldwin #endif
7177d8312ccSJohn Baldwin 
71889871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
71989871cdeSJohn Baldwin static int
72059101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p)
72189871cdeSJohn Baldwin {
72289871cdeSJohn Baldwin 	struct bios_smap_xattr *smap, *end;
72389871cdeSJohn Baldwin 
72489871cdeSJohn Baldwin 	if (l2 % sizeof(*smap) != 0) {
72559101c5dSJohn Baldwin 		warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2,
72689871cdeSJohn Baldwin 		    sizeof(*smap));
72789871cdeSJohn Baldwin 		return (1);
72889871cdeSJohn Baldwin 	}
72989871cdeSJohn Baldwin 
73089871cdeSJohn Baldwin 	end = (struct bios_smap_xattr *)((char *)p + l2);
73189871cdeSJohn Baldwin 	for (smap = p; smap < end; smap++)
73289871cdeSJohn Baldwin 		printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx",
73389871cdeSJohn Baldwin 		    smap->type, smap->xattr, (uintmax_t)smap->base,
73489871cdeSJohn Baldwin 		    (uintmax_t)smap->length);
73589871cdeSJohn Baldwin 	return (0);
73689871cdeSJohn Baldwin }
73789871cdeSJohn Baldwin #endif
73889871cdeSJohn Baldwin 
739f7550ecfSMatthew Dillon static int
740aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt)
741d45564dcSHajimu UMEMOTO {
742e267e00eSXin LI 	int kelv;
743d45564dcSHajimu UMEMOTO 	float temp;
744e267e00eSXin LI 	size_t len;
745a7b5ad27SEd Schouten 	const char *p;
746aa255ef6SWarner Losh 	int prec, i;
747d45564dcSHajimu UMEMOTO 
748e267e00eSXin LI 	assert(errno == 0);
749e267e00eSXin LI 
750e267e00eSXin LI 	len = strlen(str);
751e267e00eSXin LI 	/* caller already checked this */
752e267e00eSXin LI 	assert(len > 0);
753e267e00eSXin LI 
754aa255ef6SWarner Losh 	/*
755aa255ef6SWarner Losh 	 * A format of "IK" is in deciKelvin. A format of "IK3" is in
756aa255ef6SWarner Losh 	 * milliKelvin. The single digit following IK is log10 of the
757aa255ef6SWarner Losh 	 * multiplying factor to convert Kelvin into the untis of this sysctl,
758aa255ef6SWarner Losh 	 * or the dividing factor to convert the sysctl value to Kelvin. Numbers
759aa255ef6SWarner Losh 	 * larger than 6 will run into precision issues with 32-bit integers.
760aa255ef6SWarner Losh 	 * Characters that aren't ASCII digits after the 'K' are ignored. No
761aa255ef6SWarner Losh 	 * localization is present because this is an interface from the kernel
762aa255ef6SWarner Losh 	 * to this program (eg not an end-user interface), so isdigit() isn't
763aa255ef6SWarner Losh 	 * used here.
764aa255ef6SWarner Losh 	 */
765aa255ef6SWarner Losh 	if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9')
766aa255ef6SWarner Losh 		prec = fmt[2] - '0';
767aa255ef6SWarner Losh 	else
768aa255ef6SWarner Losh 		prec = 1;
769d45564dcSHajimu UMEMOTO 	p = &str[len - 1];
770aa255ef6SWarner Losh 	if (*p == 'C' || *p == 'F' || *p == 'K') {
771e267e00eSXin LI 		temp = strtof(str, endptrp);
772689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
773d45564dcSHajimu UMEMOTO 			if (*p == 'F')
774d45564dcSHajimu UMEMOTO 				temp = (temp - 32) * 5 / 9;
775689c8e8bSXin LI 			*endptrp = NULL;
776aa255ef6SWarner Losh 			if (*p != 'K')
777aa255ef6SWarner Losh 				temp += 273.15;
778aa255ef6SWarner Losh 			for (i = 0; i < prec; i++)
779aa255ef6SWarner Losh 				temp *= 10.0;
780aa255ef6SWarner Losh 			return ((int)(temp + 0.5));
781d45564dcSHajimu UMEMOTO 		}
782e267e00eSXin LI 	} else {
783aa255ef6SWarner Losh 		/* No unit specified -> treat it as a raw number */
784e267e00eSXin LI 		kelv = (int)strtol(str, endptrp, 10);
785689c8e8bSXin LI 		if (*endptrp != str && *endptrp == p && errno == 0) {
786689c8e8bSXin LI 			*endptrp = NULL;
787e267e00eSXin LI 			return (kelv);
788e267e00eSXin LI 		}
789689c8e8bSXin LI 	}
790e267e00eSXin LI 
791e267e00eSXin LI 	errno = ERANGE;
792e267e00eSXin LI 	return (0);
793d45564dcSHajimu UMEMOTO }
794d45564dcSHajimu UMEMOTO 
7951d86b91cSPoul-Henning Kamp /*
7961d86b91cSPoul-Henning Kamp  * These functions uses a presently undocumented interface to the kernel
7971d86b91cSPoul-Henning Kamp  * to walk the tree and get the type so it can print the value.
7981d86b91cSPoul-Henning Kamp  * This interface is under work and consideration, and should probably
7991d86b91cSPoul-Henning Kamp  * be killed with a big axe by the first person who can find the time.
8001d86b91cSPoul-Henning Kamp  * (be aware though, that the proper interface isn't as obvious as it
8011d86b91cSPoul-Henning Kamp  * may seem, there are various conflicting requirements.
8021d86b91cSPoul-Henning Kamp  */
8031d86b91cSPoul-Henning Kamp 
8041d86b91cSPoul-Henning Kamp static int
805c58f8df6SXin LI name2oid(const char *name, int *oidp)
8061d86b91cSPoul-Henning Kamp {
8071d86b91cSPoul-Henning Kamp 	int oid[2];
808dbf9b92fSDoug Rabson 	int i;
809dbf9b92fSDoug Rabson 	size_t j;
8101d86b91cSPoul-Henning Kamp 
8111d86b91cSPoul-Henning Kamp 	oid[0] = 0;
8121d86b91cSPoul-Henning Kamp 	oid[1] = 3;
8131d86b91cSPoul-Henning Kamp 
8141d86b91cSPoul-Henning Kamp 	j = CTL_MAXNAME * sizeof(int);
8151d86b91cSPoul-Henning Kamp 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
8161d86b91cSPoul-Henning Kamp 	if (i < 0)
81721e1f596SDavid Malone 		return (i);
8181d86b91cSPoul-Henning Kamp 	j /= sizeof(int);
8191d86b91cSPoul-Henning Kamp 	return (j);
8201d86b91cSPoul-Henning Kamp }
8211d86b91cSPoul-Henning Kamp 
8221d86b91cSPoul-Henning Kamp static int
8231d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind)
8241d86b91cSPoul-Henning Kamp {
8251d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
8261d86b91cSPoul-Henning Kamp 	u_char buf[BUFSIZ];
827dbf9b92fSDoug Rabson 	int i;
828dbf9b92fSDoug Rabson 	size_t j;
8291d86b91cSPoul-Henning Kamp 
8301d86b91cSPoul-Henning Kamp 	qoid[0] = 0;
8311d86b91cSPoul-Henning Kamp 	qoid[1] = 4;
8321d86b91cSPoul-Henning Kamp 	memcpy(qoid + 2, oid, len * sizeof(int));
8331d86b91cSPoul-Henning Kamp 
83431fb4661SDima Dorfman 	j = sizeof(buf);
8351d86b91cSPoul-Henning Kamp 	i = sysctl(qoid, len + 2, buf, &j, 0, 0);
8361d86b91cSPoul-Henning Kamp 	if (i)
8376d7a8f6cSUlrich Spörlein 		err(1, "sysctl fmt %d %zu %d", i, j, errno);
8381d86b91cSPoul-Henning Kamp 
8391d86b91cSPoul-Henning Kamp 	if (kind)
8401d86b91cSPoul-Henning Kamp 		*kind = *(u_int *)buf;
8411d86b91cSPoul-Henning Kamp 
8421d86b91cSPoul-Henning Kamp 	if (fmt)
8431d86b91cSPoul-Henning Kamp 		strcpy(fmt, (char *)(buf + sizeof(u_int)));
84421e1f596SDavid Malone 	return (0);
8451d86b91cSPoul-Henning Kamp }
8461d86b91cSPoul-Henning Kamp 
84760cf2c12SLuigi Rizzo /*
8481d86b91cSPoul-Henning Kamp  * This formats and outputs the value of one variable
8491d86b91cSPoul-Henning Kamp  *
8501d86b91cSPoul-Henning Kamp  * Returns zero if anything was actually output.
8511d86b91cSPoul-Henning Kamp  * Returns one if didn't know what to do with this.
8521d86b91cSPoul-Henning Kamp  * Return minus one if we had errors.
8531d86b91cSPoul-Henning Kamp  */
8541d86b91cSPoul-Henning Kamp static int
8551d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen)
8561d86b91cSPoul-Henning Kamp {
857ccf25977SRuslan Ermilov 	u_char buf[BUFSIZ], *val, *oval, *p;
858403c7f59SAlfred Perlstein 	char name[BUFSIZ], fmt[BUFSIZ];
859fd8c668aSDavid Malone 	const char *sep, *sep1;
8601d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
86121e1f596SDavid Malone 	uintmax_t umv;
86221e1f596SDavid Malone 	intmax_t mv;
863f8e4b4efSMatthew D Fleming 	int i, hexlen, sign, ctltype;
86441e419cbSDavid Malone 	size_t intlen;
865dbf9b92fSDoug Rabson 	size_t j, len;
8661d86b91cSPoul-Henning Kamp 	u_int kind;
867aa255ef6SWarner Losh 	float base;
86859101c5dSJohn Baldwin 	int (*func)(size_t, void *);
869aa255ef6SWarner Losh 	int prec;
8701d86b91cSPoul-Henning Kamp 
8716d7a8f6cSUlrich Spörlein 	/* Silence GCC. */
8726d7a8f6cSUlrich Spörlein 	umv = mv = intlen = 0;
8736d7a8f6cSUlrich Spörlein 
8749f98e452SMatthew N. Dodd 	bzero(buf, BUFSIZ);
875403c7f59SAlfred Perlstein 	bzero(fmt, BUFSIZ);
8769f98e452SMatthew N. Dodd 	bzero(name, BUFSIZ);
87781e7454aSDag-Erling Smørgrav 	qoid[0] = 0;
87881e7454aSDag-Erling Smørgrav 	memcpy(qoid + 2, oid, nlen * sizeof(int));
87981e7454aSDag-Erling Smørgrav 
88081e7454aSDag-Erling Smørgrav 	qoid[1] = 1;
88131fb4661SDima Dorfman 	j = sizeof(name);
88281e7454aSDag-Erling Smørgrav 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
88381e7454aSDag-Erling Smørgrav 	if (i || !j)
8846d7a8f6cSUlrich Spörlein 		err(1, "sysctl name %d %zu %d", i, j, errno);
88581e7454aSDag-Erling Smørgrav 
886403c7f59SAlfred Perlstein 	oidfmt(oid, nlen, fmt, &kind);
887403c7f59SAlfred Perlstein 	/* if Wflag then only list sysctls that are writeable and not stats. */
888403c7f59SAlfred Perlstein 	if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
889403c7f59SAlfred Perlstein 		return 1;
890403c7f59SAlfred Perlstein 
891403c7f59SAlfred Perlstein 	/* if Tflag then only list sysctls that are tuneables. */
892403c7f59SAlfred Perlstein 	if (Tflag && (kind & CTLFLAG_TUN) == 0)
893403c7f59SAlfred Perlstein 		return 1;
894403c7f59SAlfred Perlstein 
895ca5fac55SDag-Erling Smørgrav 	if (Nflag) {
896ca5fac55SDag-Erling Smørgrav 		printf("%s", name);
897ca5fac55SDag-Erling Smørgrav 		return (0);
898ca5fac55SDag-Erling Smørgrav 	}
899ca5fac55SDag-Erling Smørgrav 
900d0b8aabbSAnton Berezin 	if (eflag)
901d0b8aabbSAnton Berezin 		sep = "=";
902d0b8aabbSAnton Berezin 	else
903d0b8aabbSAnton Berezin 		sep = ": ";
904d0b8aabbSAnton Berezin 
9056105f815SLuigi Rizzo 	if (dflag) {	/* just print description */
9066105f815SLuigi Rizzo 		qoid[1] = 5;
9076105f815SLuigi Rizzo 		j = sizeof(buf);
9086105f815SLuigi Rizzo 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
9096105f815SLuigi Rizzo 		if (!nflag)
9106105f815SLuigi Rizzo 			printf("%s%s", name, sep);
9116105f815SLuigi Rizzo 		printf("%s", buf);
9126105f815SLuigi Rizzo 		return (0);
9136105f815SLuigi Rizzo 	}
9141d86b91cSPoul-Henning Kamp 	/* find an estimate of how much we need for this var */
91575820005SJohn-Mark Gurney 	if (Bflag)
91675820005SJohn-Mark Gurney 		j = Bflag;
91775820005SJohn-Mark Gurney 	else {
9181d86b91cSPoul-Henning Kamp 		j = 0;
9191d86b91cSPoul-Henning Kamp 		i = sysctl(oid, nlen, 0, &j, 0, 0);
9201d86b91cSPoul-Henning Kamp 		j += j; /* we want to be sure :-) */
92175820005SJohn-Mark Gurney 	}
9221d86b91cSPoul-Henning Kamp 
923ccf25977SRuslan Ermilov 	val = oval = malloc(j + 1);
924ccf25977SRuslan Ermilov 	if (val == NULL) {
925ccf25977SRuslan Ermilov 		warnx("malloc failed");
9266b6b665bSBruce Evans 		return (1);
927ccf25977SRuslan Ermilov 	}
92804006eabSHans Petter Selasky 	ctltype = (kind & CTLTYPE);
9291d86b91cSPoul-Henning Kamp 	len = j;
9301d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, val, &len, 0, 0);
93104006eabSHans Petter Selasky 	if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) {
932ccf25977SRuslan Ermilov 		free(oval);
9331d86b91cSPoul-Henning Kamp 		return (1);
934ccf25977SRuslan Ermilov 	}
9351d86b91cSPoul-Henning Kamp 
9361d86b91cSPoul-Henning Kamp 	if (bflag) {
9371d86b91cSPoul-Henning Kamp 		fwrite(val, 1, len, stdout);
938ccf25977SRuslan Ermilov 		free(oval);
9391d86b91cSPoul-Henning Kamp 		return (0);
9401d86b91cSPoul-Henning Kamp 	}
94176d3dc52SAndrey A. Chernov 	val[len] = '\0';
9421d86b91cSPoul-Henning Kamp 	p = val;
943cbc134adSMatthew D Fleming 	sign = ctl_sign[ctltype];
944cbc134adSMatthew D Fleming 	intlen = ctl_size[ctltype];
945cbc134adSMatthew D Fleming 
946f8e4b4efSMatthew D Fleming 	switch (ctltype) {
947f8e4b4efSMatthew D Fleming 	case CTLTYPE_STRING:
9481d86b91cSPoul-Henning Kamp 		if (!nflag)
949d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
9506d7a8f6cSUlrich Spörlein 		printf("%.*s", (int)len, p);
951ccf25977SRuslan Ermilov 		free(oval);
9521d86b91cSPoul-Henning Kamp 		return (0);
9531d86b91cSPoul-Henning Kamp 
954f8e4b4efSMatthew D Fleming 	case CTLTYPE_INT:
955f8e4b4efSMatthew D Fleming 	case CTLTYPE_UINT:
956f8e4b4efSMatthew D Fleming 	case CTLTYPE_LONG:
957f8e4b4efSMatthew D Fleming 	case CTLTYPE_ULONG:
958*2a71f1edSConrad Meyer 	case CTLTYPE_S8:
959*2a71f1edSConrad Meyer 	case CTLTYPE_S16:
960*2a71f1edSConrad Meyer 	case CTLTYPE_S32:
961cbc134adSMatthew D Fleming 	case CTLTYPE_S64:
962*2a71f1edSConrad Meyer 	case CTLTYPE_U8:
963*2a71f1edSConrad Meyer 	case CTLTYPE_U16:
964*2a71f1edSConrad Meyer 	case CTLTYPE_U32:
965cbc134adSMatthew D Fleming 	case CTLTYPE_U64:
966dbf9b92fSDoug Rabson 		if (!nflag)
967d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
968e37d2b30SDavid Malone 		hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
969fd8c668aSDavid Malone 		sep1 = "";
97041e419cbSDavid Malone 		while (len >= intlen) {
971f8e4b4efSMatthew D Fleming 			switch (kind & CTLTYPE) {
972f8e4b4efSMatthew D Fleming 			case CTLTYPE_INT:
973f8e4b4efSMatthew D Fleming 			case CTLTYPE_UINT:
974e37d2b30SDavid Malone 				umv = *(u_int *)p;
975e37d2b30SDavid Malone 				mv = *(int *)p;
97641e419cbSDavid Malone 				break;
977f8e4b4efSMatthew D Fleming 			case CTLTYPE_LONG:
978f8e4b4efSMatthew D Fleming 			case CTLTYPE_ULONG:
979e37d2b30SDavid Malone 				umv = *(u_long *)p;
980e37d2b30SDavid Malone 				mv = *(long *)p;
98141e419cbSDavid Malone 				break;
982*2a71f1edSConrad Meyer 			case CTLTYPE_S8:
983*2a71f1edSConrad Meyer 			case CTLTYPE_U8:
984*2a71f1edSConrad Meyer 				umv = *(uint8_t *)p;
985*2a71f1edSConrad Meyer 				mv = *(int8_t *)p;
986*2a71f1edSConrad Meyer 				break;
987*2a71f1edSConrad Meyer 			case CTLTYPE_S16:
988*2a71f1edSConrad Meyer 			case CTLTYPE_U16:
989*2a71f1edSConrad Meyer 				umv = *(uint16_t *)p;
990*2a71f1edSConrad Meyer 				mv = *(int16_t *)p;
991*2a71f1edSConrad Meyer 				break;
992*2a71f1edSConrad Meyer 			case CTLTYPE_S32:
993*2a71f1edSConrad Meyer 			case CTLTYPE_U32:
994*2a71f1edSConrad Meyer 				umv = *(uint32_t *)p;
995*2a71f1edSConrad Meyer 				mv = *(int32_t *)p;
996*2a71f1edSConrad Meyer 				break;
997cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
998cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
999cbc134adSMatthew D Fleming 				umv = *(uint64_t *)p;
1000cbc134adSMatthew D Fleming 				mv = *(int64_t *)p;
100141e419cbSDavid Malone 				break;
100241e419cbSDavid Malone 			}
1003fd8c668aSDavid Malone 			fputs(sep1, stdout);
1004f8e4b4efSMatthew D Fleming 			if (xflag)
1005e37d2b30SDavid Malone 				printf("%#0*jx", hexlen, umv);
1006f8e4b4efSMatthew D Fleming 			else if (!sign)
1007f8e4b4efSMatthew D Fleming 				printf(hflag ? "%'ju" : "%ju", umv);
100841e419cbSDavid Malone 			else if (fmt[1] == 'K') {
1009e37d2b30SDavid Malone 				if (mv < 0)
101021e1f596SDavid Malone 					printf("%jd", mv);
1011aa255ef6SWarner Losh 				else {
1012aa255ef6SWarner Losh 					/*
1013aa255ef6SWarner Losh 					 * See strIKtoi for details on fmt.
1014aa255ef6SWarner Losh 					 */
1015aa255ef6SWarner Losh 					prec = 1;
1016aa255ef6SWarner Losh 					if (fmt[2] != '\0')
1017aa255ef6SWarner Losh 						prec = fmt[2] - '0';
1018aa255ef6SWarner Losh 					base = 1.0;
1019aa255ef6SWarner Losh 					for (int i = 0; i < prec; i++)
1020aa255ef6SWarner Losh 						base *= 10.0;
1021aa255ef6SWarner Losh 					printf("%.*fC", prec,
1022aa255ef6SWarner Losh 					    (float)mv / base - 273.15);
1023aa255ef6SWarner Losh 				}
1024c591d41fSPeter Wemm 			} else
1025fd8c668aSDavid Malone 				printf(hflag ? "%'jd" : "%jd", mv);
1026fd8c668aSDavid Malone 			sep1 = " ";
102741e419cbSDavid Malone 			len -= intlen;
102841e419cbSDavid Malone 			p += intlen;
1029aa02fb57SPoul-Henning Kamp 		}
1030ccf25977SRuslan Ermilov 		free(oval);
1031dbf9b92fSDoug Rabson 		return (0);
1032dbf9b92fSDoug Rabson 
1033f8e4b4efSMatthew D Fleming 	case CTLTYPE_OPAQUE:
10341d86b91cSPoul-Henning Kamp 		i = 0;
1035a89ab9bbSDag-Erling Smørgrav 		if (strcmp(fmt, "S,clockinfo") == 0)
1036a89ab9bbSDag-Erling Smørgrav 			func = S_clockinfo;
1037a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,timeval") == 0)
1038a89ab9bbSDag-Erling Smørgrav 			func = S_timeval;
1039a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,loadavg") == 0)
1040a89ab9bbSDag-Erling Smørgrav 			func = S_loadavg;
1041f7550ecfSMatthew Dillon 		else if (strcmp(fmt, "S,vmtotal") == 0)
1042f7550ecfSMatthew Dillon 			func = S_vmtotal;
10437d8312ccSJohn Baldwin #ifdef __amd64__
10447d8312ccSJohn Baldwin 		else if (strcmp(fmt, "S,efi_map_header") == 0)
10457d8312ccSJohn Baldwin 			func = S_efi_map;
10467d8312ccSJohn Baldwin #endif
104789871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
104889871cdeSJohn Baldwin 		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
104989871cdeSJohn Baldwin 			func = S_bios_smap_xattr;
105089871cdeSJohn Baldwin #endif
1051a89ab9bbSDag-Erling Smørgrav 		else
1052a89ab9bbSDag-Erling Smørgrav 			func = NULL;
10531d86b91cSPoul-Henning Kamp 		if (func) {
10541d86b91cSPoul-Henning Kamp 			if (!nflag)
1055d0b8aabbSAnton Berezin 				printf("%s%s", name, sep);
105648cd487aSHartmut Brandt 			i = (*func)(len, p);
1057ccf25977SRuslan Ermilov 			free(oval);
105848cd487aSHartmut Brandt 			return (i);
10591d86b91cSPoul-Henning Kamp 		}
10601d86b91cSPoul-Henning Kamp 		/* FALLTHROUGH */
1061dea673e9SRodney W. Grimes 	default:
1062ccf25977SRuslan Ermilov 		if (!oflag && !xflag) {
1063ccf25977SRuslan Ermilov 			free(oval);
10641d86b91cSPoul-Henning Kamp 			return (1);
1065ccf25977SRuslan Ermilov 		}
10661d86b91cSPoul-Henning Kamp 		if (!nflag)
1067d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
10686d7a8f6cSUlrich Spörlein 		printf("Format:%s Length:%zu Dump:0x", fmt, len);
1069a89ab9bbSDag-Erling Smørgrav 		while (len-- && (xflag || p < val + 16))
10701d86b91cSPoul-Henning Kamp 			printf("%02x", *p++);
1071a89ab9bbSDag-Erling Smørgrav 		if (!xflag && len > 16)
10721d86b91cSPoul-Henning Kamp 			printf("...");
1073ccf25977SRuslan Ermilov 		free(oval);
10741d86b91cSPoul-Henning Kamp 		return (0);
10751d86b91cSPoul-Henning Kamp 	}
1076ccf25977SRuslan Ermilov 	free(oval);
10771d86b91cSPoul-Henning Kamp 	return (1);
1078dea673e9SRodney W. Grimes }
1079dea673e9SRodney W. Grimes 
10801d86b91cSPoul-Henning Kamp static int
10811d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len)
1082dea673e9SRodney W. Grimes {
10831d86b91cSPoul-Henning Kamp 	int name1[22], name2[22];
1084dbf9b92fSDoug Rabson 	int i, j;
1085dbf9b92fSDoug Rabson 	size_t l1, l2;
1086dea673e9SRodney W. Grimes 
10871d86b91cSPoul-Henning Kamp 	name1[0] = 0;
10881d86b91cSPoul-Henning Kamp 	name1[1] = 2;
10891d86b91cSPoul-Henning Kamp 	l1 = 2;
10901d86b91cSPoul-Henning Kamp 	if (len) {
10911d86b91cSPoul-Henning Kamp 		memcpy(name1+2, oid, len * sizeof(int));
10921d86b91cSPoul-Henning Kamp 		l1 += len;
10931d86b91cSPoul-Henning Kamp 	} else {
10941d86b91cSPoul-Henning Kamp 		name1[2] = 1;
10951d86b91cSPoul-Henning Kamp 		l1++;
10961d86b91cSPoul-Henning Kamp 	}
1097a89ab9bbSDag-Erling Smørgrav 	for (;;) {
109831fb4661SDima Dorfman 		l2 = sizeof(name2);
10991d86b91cSPoul-Henning Kamp 		j = sysctl(name1, l1, name2, &l2, 0, 0);
1100c1160fe4SBill Fumerola 		if (j < 0) {
11011d86b91cSPoul-Henning Kamp 			if (errno == ENOENT)
110221e1f596SDavid Malone 				return (0);
11031d86b91cSPoul-Henning Kamp 			else
11046d7a8f6cSUlrich Spörlein 				err(1, "sysctl(getnext) %d %zu", j, l2);
1105c1160fe4SBill Fumerola 		}
11061d86b91cSPoul-Henning Kamp 
11071d86b91cSPoul-Henning Kamp 		l2 /= sizeof(int);
11081d86b91cSPoul-Henning Kamp 
1109fd8c668aSDavid Malone 		if (len < 0 || l2 < (unsigned int)len)
111021e1f596SDavid Malone 			return (0);
11111d86b91cSPoul-Henning Kamp 
11121d86b91cSPoul-Henning Kamp 		for (i = 0; i < len; i++)
11131d86b91cSPoul-Henning Kamp 			if (name2[i] != oid[i])
111421e1f596SDavid Malone 				return (0);
11151d86b91cSPoul-Henning Kamp 
11161d86b91cSPoul-Henning Kamp 		i = show_var(name2, l2);
11171d86b91cSPoul-Henning Kamp 		if (!i && !bflag)
11181d86b91cSPoul-Henning Kamp 			putchar('\n');
11191d86b91cSPoul-Henning Kamp 
11201d86b91cSPoul-Henning Kamp 		memcpy(name1+2, name2, l2 * sizeof(int));
11211d86b91cSPoul-Henning Kamp 		l1 = 2 + l2;
11221d86b91cSPoul-Henning Kamp 	}
1123dea673e9SRodney W. Grimes }
1124