xref: /freebsd/sbin/sysctl/sysctl.c (revision 6f36135181a8e98e468a61adf2ef169a2bd5ce86)
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 
51d9b1bc77SPhilippe Charnier #include <ctype.h>
52d9b1bc77SPhilippe Charnier #include <err.h>
53dea673e9SRodney W. Grimes #include <errno.h>
5441e419cbSDavid Malone #include <inttypes.h>
5545817aaaSDag-Erling Smørgrav #include <locale.h>
56dea673e9SRodney W. Grimes #include <stdio.h>
57dea673e9SRodney W. Grimes #include <stdlib.h>
58dea673e9SRodney W. Grimes #include <string.h>
59da178c77SXin LI #include <sysexits.h>
60d9b1bc77SPhilippe Charnier #include <unistd.h>
61dea673e9SRodney W. Grimes 
62da178c77SXin LI static const char *conffile;
63da178c77SXin LI 
6424b2aa32SGavin Atkinson static int	aflag, bflag, dflag, eflag, hflag, iflag;
65da178c77SXin LI static int	Nflag, nflag, oflag, qflag, Tflag, Wflag, xflag;
66dea673e9SRodney W. Grimes 
671d86b91cSPoul-Henning Kamp static int	oidfmt(int *, int, char *, u_int *);
68da178c77SXin LI static int	parsefile(const char *);
69da178c77SXin LI static int	parse(const char *, int);
701d86b91cSPoul-Henning Kamp static int	show_var(int *, int);
711d86b91cSPoul-Henning Kamp static int	sysctl_all(int *oid, int len);
721d86b91cSPoul-Henning Kamp static int	name2oid(char *, int *);
73dea673e9SRodney W. Grimes 
74a7b5ad27SEd Schouten static int	set_IK(const char *, int *);
75d58f0054SPoul-Henning Kamp 
761d86b91cSPoul-Henning Kamp static void
771d86b91cSPoul-Henning Kamp usage(void)
781d86b91cSPoul-Henning Kamp {
79dea673e9SRodney W. Grimes 
809a2402bcSDag-Erling Smørgrav 	(void)fprintf(stderr, "%s\n%s\n",
81da178c77SXin LI 	    "usage: sysctl [-bdehiNnoqTWx] [-f filename] name[=value] ...",
829ecd2e32SAlfred Perlstein 	    "       sysctl [-bdehNnoqTWx] -a");
831d86b91cSPoul-Henning Kamp 	exit(1);
841d86b91cSPoul-Henning Kamp }
85dea673e9SRodney W. Grimes 
86dea673e9SRodney W. Grimes int
871d86b91cSPoul-Henning Kamp main(int argc, char **argv)
88dea673e9SRodney W. Grimes {
891d86b91cSPoul-Henning Kamp 	int ch;
90da178c77SXin LI 	int warncount = 0;
9145817aaaSDag-Erling Smørgrav 
9245817aaaSDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "");
931d86b91cSPoul-Henning Kamp 	setbuf(stdout,0);
941d86b91cSPoul-Henning Kamp 	setbuf(stderr,0);
95dea673e9SRodney W. Grimes 
96da178c77SXin LI 	while ((ch = getopt(argc, argv, "Aabdef:hiNnoqTwWxX")) != -1) {
97dea673e9SRodney W. Grimes 		switch (ch) {
98ca5fac55SDag-Erling Smørgrav 		case 'A':
999a2402bcSDag-Erling Smørgrav 			/* compatibility */
1009a2402bcSDag-Erling Smørgrav 			aflag = oflag = 1;
101ca5fac55SDag-Erling Smørgrav 			break;
102ca5fac55SDag-Erling Smørgrav 		case 'a':
103ca5fac55SDag-Erling Smørgrav 			aflag = 1;
104ca5fac55SDag-Erling Smørgrav 			break;
105ca5fac55SDag-Erling Smørgrav 		case 'b':
106ca5fac55SDag-Erling Smørgrav 			bflag = 1;
107ca5fac55SDag-Erling Smørgrav 			break;
1086105f815SLuigi Rizzo 		case 'd':
1096105f815SLuigi Rizzo 			dflag = 1;
1106105f815SLuigi Rizzo 			break;
111d0b8aabbSAnton Berezin 		case 'e':
112d0b8aabbSAnton Berezin 			eflag = 1;
113d0b8aabbSAnton Berezin 			break;
114da178c77SXin LI 		case 'f':
115da178c77SXin LI 			conffile = optarg;
116da178c77SXin LI 			break;
11745817aaaSDag-Erling Smørgrav 		case 'h':
11845817aaaSDag-Erling Smørgrav 			hflag = 1;
11945817aaaSDag-Erling Smørgrav 			break;
12024b2aa32SGavin Atkinson 		case 'i':
12124b2aa32SGavin Atkinson 			iflag = 1;
12224b2aa32SGavin Atkinson 			break;
123ca5fac55SDag-Erling Smørgrav 		case 'N':
124ca5fac55SDag-Erling Smørgrav 			Nflag = 1;
125ca5fac55SDag-Erling Smørgrav 			break;
126ca5fac55SDag-Erling Smørgrav 		case 'n':
127ca5fac55SDag-Erling Smørgrav 			nflag = 1;
128ca5fac55SDag-Erling Smørgrav 			break;
1299a2402bcSDag-Erling Smørgrav 		case 'o':
1309a2402bcSDag-Erling Smørgrav 			oflag = 1;
1319a2402bcSDag-Erling Smørgrav 			break;
132f93d36fdSRobert Watson 		case 'q':
133f93d36fdSRobert Watson 			qflag = 1;
134f93d36fdSRobert Watson 			break;
1359ecd2e32SAlfred Perlstein 		case 'T':
1369ecd2e32SAlfred Perlstein 			Tflag = 1;
1379ecd2e32SAlfred Perlstein 			break;
138ca5fac55SDag-Erling Smørgrav 		case 'w':
1399a2402bcSDag-Erling Smørgrav 			/* compatibility */
1409a2402bcSDag-Erling Smørgrav 			/* ignored */
141ca5fac55SDag-Erling Smørgrav 			break;
1429ecd2e32SAlfred Perlstein 		case 'W':
1439ecd2e32SAlfred Perlstein 			Wflag = 1;
1449ecd2e32SAlfred Perlstein 			break;
145ca5fac55SDag-Erling Smørgrav 		case 'X':
1469a2402bcSDag-Erling Smørgrav 			/* compatibility */
1479a2402bcSDag-Erling Smørgrav 			aflag = xflag = 1;
1489a2402bcSDag-Erling Smørgrav 			break;
1499a2402bcSDag-Erling Smørgrav 		case 'x':
1509a2402bcSDag-Erling Smørgrav 			xflag = 1;
151ca5fac55SDag-Erling Smørgrav 			break;
152ca5fac55SDag-Erling Smørgrav 		default:
153ca5fac55SDag-Erling Smørgrav 			usage();
154dea673e9SRodney W. Grimes 		}
155dea673e9SRodney W. Grimes 	}
156dea673e9SRodney W. Grimes 	argc -= optind;
157dea673e9SRodney W. Grimes 	argv += optind;
158dea673e9SRodney W. Grimes 
1599a2402bcSDag-Erling Smørgrav 	if (Nflag && nflag)
16081e7454aSDag-Erling Smørgrav 		usage();
1619a2402bcSDag-Erling Smørgrav 	if (aflag && argc == 0)
1621d86b91cSPoul-Henning Kamp 		exit(sysctl_all(0, 0));
163da178c77SXin LI 	if (argc == 0 && conffile == NULL)
164dea673e9SRodney W. Grimes 		usage();
165d9fcd86cSMike Makonnen 
166d9fcd86cSMike Makonnen 	warncount = 0;
167da178c77SXin LI 	if (conffile != NULL)
168da178c77SXin LI 		warncount += parsefile(conffile);
169da178c77SXin LI 
170dea673e9SRodney W. Grimes 	while (argc-- > 0)
171da178c77SXin LI 		warncount += parse(*argv++, 0);
172da178c77SXin LI 
173da178c77SXin LI 	return (warncount);
174dea673e9SRodney W. Grimes }
175dea673e9SRodney W. Grimes 
176dea673e9SRodney W. Grimes /*
177dea673e9SRodney W. Grimes  * Parse a name into a MIB entry.
178dea673e9SRodney W. Grimes  * Lookup and print out the MIB entry if it exists.
179dea673e9SRodney W. Grimes  * Set a new value if requested.
180dea673e9SRodney W. Grimes  */
181da178c77SXin LI static int
182da178c77SXin LI parse(const char *string, int lineno)
183dea673e9SRodney W. Grimes {
1841d86b91cSPoul-Henning Kamp 	int len, i, j;
185dea673e9SRodney W. Grimes 	void *newval = 0;
1861ce1a53dSJim Pirzyk 	int intval;
1871ce1a53dSJim Pirzyk 	unsigned int uintval;
1881ce1a53dSJim Pirzyk 	long longval;
1891ce1a53dSJim Pirzyk 	unsigned long ulongval;
1901ce1a53dSJim Pirzyk 	size_t newsize = 0;
191cbc134adSMatthew D Fleming 	int64_t i64val;
192cbc134adSMatthew D Fleming 	uint64_t u64val;
193dea673e9SRodney W. Grimes 	int mib[CTL_MAXNAME];
194da178c77SXin LI 	char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ], line[BUFSIZ];
1951d86b91cSPoul-Henning Kamp 	u_int kind;
196dea673e9SRodney W. Grimes 
197da178c77SXin LI 	if (lineno)
198da178c77SXin LI 		snprintf(line, sizeof(line), " at line %d", lineno);
199da178c77SXin LI 	else
200da178c77SXin LI 		line[0] = '\0';
201da178c77SXin LI 
202aae75101SXin LI 	cp = buf;
203da178c77SXin LI 	if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) {
204da178c77SXin LI 		warn("oid too long: '%s'%s", string, line);
205da178c77SXin LI 		return (1);
206da178c77SXin LI 	}
207da178c77SXin LI 	bufp = strsep(&cp, "=:");
208aae75101SXin LI 	if (cp != NULL) {
2099ecd2e32SAlfred Perlstein 		/* Tflag just lists tunables, do not allow assignment */
2109ecd2e32SAlfred Perlstein 		if (Tflag || Wflag) {
2119ecd2e32SAlfred Perlstein 			warnx("Can't set variables when using -T or -W");
2129ecd2e32SAlfred Perlstein 			usage();
2139ecd2e32SAlfred Perlstein 		}
214dea673e9SRodney W. Grimes 		while (isspace(*cp))
215dea673e9SRodney W. Grimes 			cp++;
216da178c77SXin LI 		/* Strip a pair of " or ' if any. */
217da178c77SXin LI 		switch (*cp) {
218da178c77SXin LI 		case '\"':
219da178c77SXin LI 		case '\'':
220da178c77SXin LI 			if (cp[strlen(cp) - 1] == *cp)
221da178c77SXin LI 				cp[strlen(cp) - 1] = '\0';
222da178c77SXin LI 			cp++;
223da178c77SXin LI 		}
224dea673e9SRodney W. Grimes 		newval = cp;
225dea673e9SRodney W. Grimes 		newsize = strlen(cp);
226dea673e9SRodney W. Grimes 	}
2271d86b91cSPoul-Henning Kamp 	len = name2oid(bufp, mib);
2281d86b91cSPoul-Henning Kamp 
229f93d36fdSRobert Watson 	if (len < 0) {
23024b2aa32SGavin Atkinson 		if (iflag)
231da178c77SXin LI 			return (0);
232f93d36fdSRobert Watson 		if (qflag)
233da178c77SXin LI 			return (1);
234da178c77SXin LI 		else {
235da178c77SXin LI 			warn("unknown oid '%s'%s", bufp, line);
236da178c77SXin LI 			return (1);
237da178c77SXin LI 		}
238f93d36fdSRobert Watson 	}
2391d86b91cSPoul-Henning Kamp 
240da178c77SXin LI 	if (oidfmt(mib, len, fmt, &kind)) {
241da178c77SXin LI 		warn("couldn't find format of oid '%s'%s", bufp, line);
242da178c77SXin LI 		if (iflag)
243da178c77SXin LI 			return (1);
244da178c77SXin LI 		else
245da178c77SXin LI 			exit(1);
246da178c77SXin LI 	}
2471d86b91cSPoul-Henning Kamp 
2480b6230f1SJohn Baldwin 	if (newval == NULL || dflag) {
2491d86b91cSPoul-Henning Kamp 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
250b2680e20SMatthew N. Dodd 			if (dflag) {
251b2680e20SMatthew N. Dodd 				i = show_var(mib, len);
252b2680e20SMatthew N. Dodd 				if (!i && !bflag)
253b2680e20SMatthew N. Dodd 					putchar('\n');
254b2680e20SMatthew N. Dodd 			}
2551d86b91cSPoul-Henning Kamp 			sysctl_all(mib, len);
2561d86b91cSPoul-Henning Kamp 		} else {
2571d86b91cSPoul-Henning Kamp 			i = show_var(mib, len);
2581d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
2591d86b91cSPoul-Henning Kamp 				putchar('\n');
260dea673e9SRodney W. Grimes 		}
2611d86b91cSPoul-Henning Kamp 	} else {
262da178c77SXin LI 		if ((kind & CTLTYPE) == CTLTYPE_NODE) {
263da178c77SXin LI 			warn("oid '%s' isn't a leaf node%s", bufp, line);
264da178c77SXin LI 			return (1);
265da178c77SXin LI 		}
266dea673e9SRodney W. Grimes 
267ac8711d2SMike Silbersack 		if (!(kind & CTLFLAG_WR)) {
2689b4b73b7SMike Silbersack 			if (kind & CTLFLAG_TUN) {
269*6f361351SXin LI 				warnx("oid '%s' is a read only tunable%s", bufp, line);
270da178c77SXin LI 				warnx("Tunable values are set in /boot/loader.conf");
271da178c77SXin LI 			} else
272da178c77SXin LI 				warnx("oid '%s' is read only%s", bufp, line);
273da178c77SXin LI 			return (1);
274ac8711d2SMike Silbersack 		}
275dea673e9SRodney W. Grimes 
276a78d3eafSRobert Watson 		if ((kind & CTLTYPE) == CTLTYPE_INT ||
277a78d3eafSRobert Watson 		    (kind & CTLTYPE) == CTLTYPE_UINT ||
278a78d3eafSRobert Watson 		    (kind & CTLTYPE) == CTLTYPE_LONG ||
2794d90830fSDima Dorfman 		    (kind & CTLTYPE) == CTLTYPE_ULONG ||
280cbc134adSMatthew D Fleming 		    (kind & CTLTYPE) == CTLTYPE_S64 ||
281cbc134adSMatthew D Fleming 		    (kind & CTLTYPE) == CTLTYPE_U64) {
282da178c77SXin LI 			if (strlen(newval) == 0) {
283da178c77SXin LI 				warnx("empty numeric value");
284da178c77SXin LI 				return (1);
285da178c77SXin LI 			}
286a78d3eafSRobert Watson 		}
287a78d3eafSRobert Watson 
2881d86b91cSPoul-Henning Kamp 		switch (kind & CTLTYPE) {
289dea673e9SRodney W. Grimes 			case CTLTYPE_INT:
290d45564dcSHajimu UMEMOTO 				if (strcmp(fmt, "IK") == 0) {
291da178c77SXin LI 					if (!set_IK(newval, &intval)) {
292da178c77SXin LI 						warnx("invalid value '%s'%s",
293da178c77SXin LI 						    (char *)newval, line);
294da178c77SXin LI 						return (1);
295da178c77SXin LI 					}
296d45564dcSHajimu UMEMOTO  				} else {
297d45564dcSHajimu UMEMOTO 					intval = (int)strtol(newval, &endptr,
298d45564dcSHajimu UMEMOTO 					    0);
299da178c77SXin LI 					if (endptr == newval || *endptr != '\0') {
300da178c77SXin LI 						warnx("invalid integer '%s'%s",
301da178c77SXin LI 						    (char *)newval, line);
302da178c77SXin LI 						return (1);
303da178c77SXin LI 					}
304d45564dcSHajimu UMEMOTO 				}
305dea673e9SRodney W. Grimes 				newval = &intval;
30631fb4661SDima Dorfman 				newsize = sizeof(intval);
307dea673e9SRodney W. Grimes 				break;
3081ce1a53dSJim Pirzyk 			case CTLTYPE_UINT:
309a78d3eafSRobert Watson 				uintval = (int) strtoul(newval, &endptr, 0);
310da178c77SXin LI 				if (endptr == newval || *endptr != '\0') {
311da178c77SXin LI 					warnx("invalid unsigned integer '%s'%s",
312da178c77SXin LI 					    (char *)newval, line);
313da178c77SXin LI 					return (1);
314da178c77SXin LI 				}
3151ce1a53dSJim Pirzyk 				newval = &uintval;
31621e1f596SDavid Malone 				newsize = sizeof(uintval);
3171ce1a53dSJim Pirzyk 				break;
3181ce1a53dSJim Pirzyk 			case CTLTYPE_LONG:
319a78d3eafSRobert Watson 				longval = strtol(newval, &endptr, 0);
320da178c77SXin LI 				if (endptr == newval || *endptr != '\0') {
321da178c77SXin LI 					warnx("invalid long integer '%s'%s",
322da178c77SXin LI 					    (char *)newval, line);
323da178c77SXin LI 					return (1);
324da178c77SXin LI 				}
3251ce1a53dSJim Pirzyk 				newval = &longval;
32621e1f596SDavid Malone 				newsize = sizeof(longval);
3271ce1a53dSJim Pirzyk 				break;
3281ce1a53dSJim Pirzyk 			case CTLTYPE_ULONG:
329a78d3eafSRobert Watson 				ulongval = strtoul(newval, &endptr, 0);
330da178c77SXin LI 				if (endptr == newval || *endptr != '\0') {
331da178c77SXin LI 					warnx("invalid unsigned long integer"
332da178c77SXin LI 					    " '%s'%s", (char *)newval, line);
333da178c77SXin LI 					return (1);
334da178c77SXin LI 				}
3351ce1a53dSJim Pirzyk 				newval = &ulongval;
33621e1f596SDavid Malone 				newsize = sizeof(ulongval);
3371d86b91cSPoul-Henning Kamp 				break;
3381d86b91cSPoul-Henning Kamp 			case CTLTYPE_STRING:
3391d86b91cSPoul-Henning Kamp 				break;
340cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
341cbc134adSMatthew D Fleming 				i64val = strtoimax(newval, &endptr, 0);
342da178c77SXin LI 				if (endptr == newval || *endptr != '\0') {
343da178c77SXin LI 					warnx("invalid int64_t '%s'%s",
344da178c77SXin LI 					    (char *)newval, line);
345da178c77SXin LI 					return (1);
346da178c77SXin LI 				}
347cbc134adSMatthew D Fleming 				newval = &i64val;
348cbc134adSMatthew D Fleming 				newsize = sizeof(i64val);
349cbc134adSMatthew D Fleming 				break;
350cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
351cbc134adSMatthew D Fleming 				u64val = strtoumax(newval, &endptr, 0);
352da178c77SXin LI 				if (endptr == newval || *endptr != '\0') {
353da178c77SXin LI 					warnx("invalid uint64_t '%s'%s",
354da178c77SXin LI 					    (char *)newval, line);
355da178c77SXin LI 					return (1);
356da178c77SXin LI 				}
357cbc134adSMatthew D Fleming 				newval = &u64val;
358cbc134adSMatthew D Fleming 				newsize = sizeof(u64val);
359dea673e9SRodney W. Grimes 				break;
360d58f0054SPoul-Henning Kamp 			case CTLTYPE_OPAQUE:
361d58f0054SPoul-Henning Kamp 				/* FALLTHROUGH */
3621d86b91cSPoul-Henning Kamp 			default:
363da178c77SXin LI 				warnx("oid '%s' is type %d,"
364da178c77SXin LI 					" cannot set that%s", bufp,
365da178c77SXin LI 					kind & CTLTYPE, line);
366da178c77SXin LI 				return (1);
367dea673e9SRodney W. Grimes 		}
3681d86b91cSPoul-Henning Kamp 
3691d86b91cSPoul-Henning Kamp 		i = show_var(mib, len);
3701d86b91cSPoul-Henning Kamp 		if (sysctl(mib, len, 0, 0, newval, newsize) == -1) {
3711d86b91cSPoul-Henning Kamp 			if (!i && !bflag)
3721d86b91cSPoul-Henning Kamp 				putchar('\n');
373dea673e9SRodney W. Grimes 			switch (errno) {
374dea673e9SRodney W. Grimes 			case EOPNOTSUPP:
375da178c77SXin LI 				warnx("%s: value is not available%s",
376da178c77SXin LI 					string, line);
377da178c77SXin LI 				return (1);
378dea673e9SRodney W. Grimes 			case ENOTDIR:
379da178c77SXin LI 				warnx("%s: specification is incomplete%s",
380da178c77SXin LI 					string, line);
381da178c77SXin LI 				return (1);
382dea673e9SRodney W. Grimes 			case ENOMEM:
383da178c77SXin LI 				warnx("%s: type is unknown to this program%s",
384da178c77SXin LI 					string, line);
385da178c77SXin LI 				return (1);
386dea673e9SRodney W. Grimes 			default:
387da178c77SXin LI 				warn("%s%s", string, line);
388da178c77SXin LI 				return (1);
389dea673e9SRodney W. Grimes 			}
390dea673e9SRodney W. Grimes 		}
3911d86b91cSPoul-Henning Kamp 		if (!bflag)
3921d86b91cSPoul-Henning Kamp 			printf(" -> ");
3931d86b91cSPoul-Henning Kamp 		i = nflag;
3941d86b91cSPoul-Henning Kamp 		nflag = 1;
3951d86b91cSPoul-Henning Kamp 		j = show_var(mib, len);
3961d86b91cSPoul-Henning Kamp 		if (!j && !bflag)
3971d86b91cSPoul-Henning Kamp 			putchar('\n');
3981d86b91cSPoul-Henning Kamp 		nflag = i;
399dea673e9SRodney W. Grimes 	}
400da178c77SXin LI 
401da178c77SXin LI 	return (0);
402da178c77SXin LI }
403da178c77SXin LI 
404da178c77SXin LI static int
405da178c77SXin LI parsefile(const char *filename)
406da178c77SXin LI {
407da178c77SXin LI 	FILE *file;
408da178c77SXin LI 	char line[BUFSIZ], *p, *pq, *pdq;
409da178c77SXin LI 	int warncount = 0, lineno = 0;
410da178c77SXin LI 
411da178c77SXin LI 	file = fopen(filename, "r");
412da178c77SXin LI 	if (file == NULL)
413da178c77SXin LI 		err(EX_NOINPUT, "%s", filename);
414da178c77SXin LI 	while (fgets(line, sizeof(line), file) != NULL) {
415da178c77SXin LI 		lineno++;
416da178c77SXin LI 		p = line;
417da178c77SXin LI 		pq = strchr(line, '\'');
418da178c77SXin LI 		pdq = strchr(line, '\"');
419da178c77SXin LI 		/* Replace the first # with \0. */
420da178c77SXin LI 		while((p = strchr(p, '#')) != NULL) {
421da178c77SXin LI 			if (pq != NULL && p > pq) {
422da178c77SXin LI 				if ((p = strchr(pq+1, '\'')) != NULL)
423da178c77SXin LI 					*(++p) = '\0';
424da178c77SXin LI 				break;
425da178c77SXin LI 			} else if (pdq != NULL && p > pdq) {
426da178c77SXin LI 				if ((p = strchr(pdq+1, '\"')) != NULL)
427da178c77SXin LI 					*(++p) = '\0';
428da178c77SXin LI 				break;
429da178c77SXin LI 			} else if (p == line || *(p-1) != '\\') {
430da178c77SXin LI 				*p = '\0';
431da178c77SXin LI 				break;
432da178c77SXin LI 			}
433da178c77SXin LI 			p++;
434da178c77SXin LI 		}
435da178c77SXin LI 		/* Trim spaces */
436da178c77SXin LI 		p = line + strlen(line) - 1;
437da178c77SXin LI 		while (p >= line && isspace((int)*p)) {
438da178c77SXin LI 			*p = '\0';
439da178c77SXin LI 			p--;
440da178c77SXin LI 		}
441da178c77SXin LI 		p = line;
442da178c77SXin LI 		while (isspace((int)*p))
443da178c77SXin LI 			p++;
444da178c77SXin LI 		if (*p == '\0')
445da178c77SXin LI 			continue;
446da178c77SXin LI 		else
447da178c77SXin LI 			warncount += parse(p, lineno);
448da178c77SXin LI 	}
449da178c77SXin LI 	fclose(file);
450da178c77SXin LI 
451da178c77SXin LI 	return (warncount);
452dea673e9SRodney W. Grimes }
453dea673e9SRodney W. Grimes 
4541d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */
455dea673e9SRodney W. Grimes 
4561d86b91cSPoul-Henning Kamp static int
4571d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p)
4581d86b91cSPoul-Henning Kamp {
4591d86b91cSPoul-Henning Kamp 	struct clockinfo *ci = (struct clockinfo*)p;
46021e1f596SDavid Malone 
461996076bbSAlfred Perlstein 	if (l2 != sizeof(*ci)) {
4626d7a8f6cSUlrich Spörlein 		warnx("S_clockinfo %d != %zu", l2, sizeof(*ci));
4636b6b665bSBruce Evans 		return (1);
464996076bbSAlfred Perlstein 	}
46545817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" :
46645817aaaSDag-Erling Smørgrav 		"{ hz = %d, tick = %d, profhz = %d, stathz = %d }",
467b35c8f28SPoul-Henning Kamp 		ci->hz, ci->tick, ci->profhz, ci->stathz);
4681d86b91cSPoul-Henning Kamp 	return (0);
469dea673e9SRodney W. Grimes }
470dea673e9SRodney W. Grimes 
4711d86b91cSPoul-Henning Kamp static int
4721d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p)
4731d86b91cSPoul-Henning Kamp {
4741d86b91cSPoul-Henning Kamp 	struct loadavg *tv = (struct loadavg*)p;
4751d86b91cSPoul-Henning Kamp 
476996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
4776d7a8f6cSUlrich Spörlein 		warnx("S_loadavg %d != %zu", l2, sizeof(*tv));
4786b6b665bSBruce Evans 		return (1);
479996076bbSAlfred Perlstein 	}
48045817aaaSDag-Erling Smørgrav 	printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }",
4811d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[0]/(double)tv->fscale,
4821d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[1]/(double)tv->fscale,
4831d86b91cSPoul-Henning Kamp 		(double)tv->ldavg[2]/(double)tv->fscale);
4841d86b91cSPoul-Henning Kamp 	return (0);
485dea673e9SRodney W. Grimes }
486dea673e9SRodney W. Grimes 
4871d86b91cSPoul-Henning Kamp static int
4881d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p)
4891d86b91cSPoul-Henning Kamp {
4901d86b91cSPoul-Henning Kamp 	struct timeval *tv = (struct timeval*)p;
491c2deb608SBruce Evans 	time_t tv_sec;
4921d86b91cSPoul-Henning Kamp 	char *p1, *p2;
493dea673e9SRodney W. Grimes 
494996076bbSAlfred Perlstein 	if (l2 != sizeof(*tv)) {
4956d7a8f6cSUlrich Spörlein 		warnx("S_timeval %d != %zu", l2, sizeof(*tv));
4966b6b665bSBruce Evans 		return (1);
497996076bbSAlfred Perlstein 	}
498db87e2dcSJohn Hay 	printf(hflag ? "{ sec = %'jd, usec = %'ld } " :
499db87e2dcSJohn Hay 		"{ sec = %jd, usec = %ld } ",
500db87e2dcSJohn Hay 		(intmax_t)tv->tv_sec, tv->tv_usec);
501c2deb608SBruce Evans 	tv_sec = tv->tv_sec;
502c2deb608SBruce Evans 	p1 = strdup(ctime(&tv_sec));
5031d86b91cSPoul-Henning Kamp 	for (p2=p1; *p2 ; p2++)
5041d86b91cSPoul-Henning Kamp 		if (*p2 == '\n')
5051d86b91cSPoul-Henning Kamp 			*p2 = '\0';
5061d86b91cSPoul-Henning Kamp 	fputs(p1, stdout);
507f2359a24SRebecca Cran 	free(p1);
5081d86b91cSPoul-Henning Kamp 	return (0);
5091d86b91cSPoul-Henning Kamp }
5101d86b91cSPoul-Henning Kamp 
5111d86b91cSPoul-Henning Kamp static int
512f7550ecfSMatthew Dillon S_vmtotal(int l2, void *p)
513f7550ecfSMatthew Dillon {
514f7550ecfSMatthew Dillon 	struct vmtotal *v = (struct vmtotal *)p;
515654e22e7SMatthew Dillon 	int pageKilo = getpagesize() / 1024;
516f7550ecfSMatthew Dillon 
517f7550ecfSMatthew Dillon 	if (l2 != sizeof(*v)) {
5186d7a8f6cSUlrich Spörlein 		warnx("S_vmtotal %d != %zu", l2, sizeof(*v));
5196b6b665bSBruce Evans 		return (1);
520f7550ecfSMatthew Dillon 	}
521f7550ecfSMatthew Dillon 
522654e22e7SMatthew Dillon 	printf(
523654e22e7SMatthew Dillon 	    "\nSystem wide totals computed every five seconds:"
524654e22e7SMatthew Dillon 	    " (values in kilobytes)\n");
525f7550ecfSMatthew Dillon 	printf("===============================================\n");
526654e22e7SMatthew Dillon 	printf(
527bad4d172SRuslan Ermilov 	    "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: "
528bad4d172SRuslan Ermilov 	    "%hd Sleep: %hd)\n",
529f7550ecfSMatthew Dillon 	    v->t_rq, v->t_dw, v->t_pw, v->t_sl);
530654e22e7SMatthew Dillon 	printf(
53113e86ef7SMarko Zec 	    "Virtual Memory:\t\t(Total: %dK Active: %dK)\n",
532bad4d172SRuslan Ermilov 	    v->t_vm * pageKilo, v->t_avm * pageKilo);
53313e86ef7SMarko Zec 	printf("Real Memory:\t\t(Total: %dK Active: %dK)\n",
534bad4d172SRuslan Ermilov 	    v->t_rm * pageKilo, v->t_arm * pageKilo);
535bad4d172SRuslan Ermilov 	printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n",
536bad4d172SRuslan Ermilov 	    v->t_vmshr * pageKilo, v->t_avmshr * pageKilo);
537bad4d172SRuslan Ermilov 	printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n",
538bad4d172SRuslan Ermilov 	    v->t_rmshr * pageKilo, v->t_armshr * pageKilo);
539ad0e6cdaSEitan Adler 	printf("Free Memory:\t%dK\n", v->t_free * pageKilo);
540f7550ecfSMatthew Dillon 
541f7550ecfSMatthew Dillon 	return (0);
542f7550ecfSMatthew Dillon }
543f7550ecfSMatthew Dillon 
544f7550ecfSMatthew Dillon static int
545a7b5ad27SEd Schouten set_IK(const char *str, int *val)
546d45564dcSHajimu UMEMOTO {
547d45564dcSHajimu UMEMOTO 	float temp;
548d45564dcSHajimu UMEMOTO 	int len, kelv;
549a7b5ad27SEd Schouten 	const char *p;
550a7b5ad27SEd Schouten 	char *endptr;
551d45564dcSHajimu UMEMOTO 
552d45564dcSHajimu UMEMOTO 	if ((len = strlen(str)) == 0)
553d45564dcSHajimu UMEMOTO 		return (0);
554d45564dcSHajimu UMEMOTO 	p = &str[len - 1];
555d45564dcSHajimu UMEMOTO 	if (*p == 'C' || *p == 'F') {
556d45564dcSHajimu UMEMOTO 		temp = strtof(str, &endptr);
557a7b5ad27SEd Schouten 		if (endptr == str || endptr != p)
558d45564dcSHajimu UMEMOTO 			return (0);
559d45564dcSHajimu UMEMOTO 		if (*p == 'F')
560d45564dcSHajimu UMEMOTO 			temp = (temp - 32) * 5 / 9;
561d45564dcSHajimu UMEMOTO 		kelv = temp * 10 + 2732;
562d45564dcSHajimu UMEMOTO 	} else {
563d45564dcSHajimu UMEMOTO 		kelv = (int)strtol(str, &endptr, 10);
564d45564dcSHajimu UMEMOTO 		if (endptr == str || *endptr != '\0')
565d45564dcSHajimu UMEMOTO 			return (0);
566d45564dcSHajimu UMEMOTO 	}
567d45564dcSHajimu UMEMOTO 	*val = kelv;
568d45564dcSHajimu UMEMOTO 	return (1);
569d45564dcSHajimu UMEMOTO }
570d45564dcSHajimu UMEMOTO 
5711d86b91cSPoul-Henning Kamp /*
5721d86b91cSPoul-Henning Kamp  * These functions uses a presently undocumented interface to the kernel
5731d86b91cSPoul-Henning Kamp  * to walk the tree and get the type so it can print the value.
5741d86b91cSPoul-Henning Kamp  * This interface is under work and consideration, and should probably
5751d86b91cSPoul-Henning Kamp  * be killed with a big axe by the first person who can find the time.
5761d86b91cSPoul-Henning Kamp  * (be aware though, that the proper interface isn't as obvious as it
5771d86b91cSPoul-Henning Kamp  * may seem, there are various conflicting requirements.
5781d86b91cSPoul-Henning Kamp  */
5791d86b91cSPoul-Henning Kamp 
5801d86b91cSPoul-Henning Kamp static int
5811d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp)
5821d86b91cSPoul-Henning Kamp {
5831d86b91cSPoul-Henning Kamp 	int oid[2];
584dbf9b92fSDoug Rabson 	int i;
585dbf9b92fSDoug Rabson 	size_t j;
5861d86b91cSPoul-Henning Kamp 
5871d86b91cSPoul-Henning Kamp 	oid[0] = 0;
5881d86b91cSPoul-Henning Kamp 	oid[1] = 3;
5891d86b91cSPoul-Henning Kamp 
5901d86b91cSPoul-Henning Kamp 	j = CTL_MAXNAME * sizeof(int);
5911d86b91cSPoul-Henning Kamp 	i = sysctl(oid, 2, oidp, &j, name, strlen(name));
5921d86b91cSPoul-Henning Kamp 	if (i < 0)
59321e1f596SDavid Malone 		return (i);
5941d86b91cSPoul-Henning Kamp 	j /= sizeof(int);
5951d86b91cSPoul-Henning Kamp 	return (j);
5961d86b91cSPoul-Henning Kamp }
5971d86b91cSPoul-Henning Kamp 
5981d86b91cSPoul-Henning Kamp static int
5991d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind)
6001d86b91cSPoul-Henning Kamp {
6011d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
6021d86b91cSPoul-Henning Kamp 	u_char buf[BUFSIZ];
603dbf9b92fSDoug Rabson 	int i;
604dbf9b92fSDoug Rabson 	size_t j;
6051d86b91cSPoul-Henning Kamp 
6061d86b91cSPoul-Henning Kamp 	qoid[0] = 0;
6071d86b91cSPoul-Henning Kamp 	qoid[1] = 4;
6081d86b91cSPoul-Henning Kamp 	memcpy(qoid + 2, oid, len * sizeof(int));
6091d86b91cSPoul-Henning Kamp 
61031fb4661SDima Dorfman 	j = sizeof(buf);
6111d86b91cSPoul-Henning Kamp 	i = sysctl(qoid, len + 2, buf, &j, 0, 0);
6121d86b91cSPoul-Henning Kamp 	if (i)
6136d7a8f6cSUlrich Spörlein 		err(1, "sysctl fmt %d %zu %d", i, j, errno);
6141d86b91cSPoul-Henning Kamp 
6151d86b91cSPoul-Henning Kamp 	if (kind)
6161d86b91cSPoul-Henning Kamp 		*kind = *(u_int *)buf;
6171d86b91cSPoul-Henning Kamp 
6181d86b91cSPoul-Henning Kamp 	if (fmt)
6191d86b91cSPoul-Henning Kamp 		strcpy(fmt, (char *)(buf + sizeof(u_int)));
62021e1f596SDavid Malone 	return (0);
6211d86b91cSPoul-Henning Kamp }
6221d86b91cSPoul-Henning Kamp 
623cbc134adSMatthew D Fleming static int ctl_sign[CTLTYPE+1] = {
624cbc134adSMatthew D Fleming 	[CTLTYPE_INT] = 1,
625cbc134adSMatthew D Fleming 	[CTLTYPE_LONG] = 1,
626cbc134adSMatthew D Fleming 	[CTLTYPE_S64] = 1,
627cbc134adSMatthew D Fleming };
628cbc134adSMatthew D Fleming 
629cbc134adSMatthew D Fleming static int ctl_size[CTLTYPE+1] = {
630cbc134adSMatthew D Fleming 	[CTLTYPE_INT] = sizeof(int),
631cbc134adSMatthew D Fleming 	[CTLTYPE_UINT] = sizeof(u_int),
632cbc134adSMatthew D Fleming 	[CTLTYPE_LONG] = sizeof(long),
633cbc134adSMatthew D Fleming 	[CTLTYPE_ULONG] = sizeof(u_long),
634cbc134adSMatthew D Fleming 	[CTLTYPE_S64] = sizeof(int64_t),
635cbc134adSMatthew D Fleming 	[CTLTYPE_U64] = sizeof(int64_t),
636cbc134adSMatthew D Fleming };
637cbc134adSMatthew D Fleming 
63860cf2c12SLuigi Rizzo /*
6391d86b91cSPoul-Henning Kamp  * This formats and outputs the value of one variable
6401d86b91cSPoul-Henning Kamp  *
6411d86b91cSPoul-Henning Kamp  * Returns zero if anything was actually output.
6421d86b91cSPoul-Henning Kamp  * Returns one if didn't know what to do with this.
6431d86b91cSPoul-Henning Kamp  * Return minus one if we had errors.
6441d86b91cSPoul-Henning Kamp  */
6451d86b91cSPoul-Henning Kamp static int
6461d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen)
6471d86b91cSPoul-Henning Kamp {
648ccf25977SRuslan Ermilov 	u_char buf[BUFSIZ], *val, *oval, *p;
649403c7f59SAlfred Perlstein 	char name[BUFSIZ], fmt[BUFSIZ];
650fd8c668aSDavid Malone 	const char *sep, *sep1;
6511d86b91cSPoul-Henning Kamp 	int qoid[CTL_MAXNAME+2];
65221e1f596SDavid Malone 	uintmax_t umv;
65321e1f596SDavid Malone 	intmax_t mv;
654f8e4b4efSMatthew D Fleming 	int i, hexlen, sign, ctltype;
65541e419cbSDavid Malone 	size_t intlen;
656dbf9b92fSDoug Rabson 	size_t j, len;
6571d86b91cSPoul-Henning Kamp 	u_int kind;
658a89ab9bbSDag-Erling Smørgrav 	int (*func)(int, void *);
6591d86b91cSPoul-Henning Kamp 
6606d7a8f6cSUlrich Spörlein 	/* Silence GCC. */
6616d7a8f6cSUlrich Spörlein 	umv = mv = intlen = 0;
6626d7a8f6cSUlrich Spörlein 
6639f98e452SMatthew N. Dodd 	bzero(buf, BUFSIZ);
664403c7f59SAlfred Perlstein 	bzero(fmt, BUFSIZ);
6659f98e452SMatthew N. Dodd 	bzero(name, BUFSIZ);
66681e7454aSDag-Erling Smørgrav 	qoid[0] = 0;
66781e7454aSDag-Erling Smørgrav 	memcpy(qoid + 2, oid, nlen * sizeof(int));
66881e7454aSDag-Erling Smørgrav 
66981e7454aSDag-Erling Smørgrav 	qoid[1] = 1;
67031fb4661SDima Dorfman 	j = sizeof(name);
67181e7454aSDag-Erling Smørgrav 	i = sysctl(qoid, nlen + 2, name, &j, 0, 0);
67281e7454aSDag-Erling Smørgrav 	if (i || !j)
6736d7a8f6cSUlrich Spörlein 		err(1, "sysctl name %d %zu %d", i, j, errno);
67481e7454aSDag-Erling Smørgrav 
675403c7f59SAlfred Perlstein 	oidfmt(oid, nlen, fmt, &kind);
676403c7f59SAlfred Perlstein 	/* if Wflag then only list sysctls that are writeable and not stats. */
677403c7f59SAlfred Perlstein 	if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0))
678403c7f59SAlfred Perlstein 		return 1;
679403c7f59SAlfred Perlstein 
680403c7f59SAlfred Perlstein 	/* if Tflag then only list sysctls that are tuneables. */
681403c7f59SAlfred Perlstein 	if (Tflag && (kind & CTLFLAG_TUN) == 0)
682403c7f59SAlfred Perlstein 		return 1;
683403c7f59SAlfred Perlstein 
684ca5fac55SDag-Erling Smørgrav 	if (Nflag) {
685ca5fac55SDag-Erling Smørgrav 		printf("%s", name);
686ca5fac55SDag-Erling Smørgrav 		return (0);
687ca5fac55SDag-Erling Smørgrav 	}
688ca5fac55SDag-Erling Smørgrav 
689d0b8aabbSAnton Berezin 	if (eflag)
690d0b8aabbSAnton Berezin 		sep = "=";
691d0b8aabbSAnton Berezin 	else
692d0b8aabbSAnton Berezin 		sep = ": ";
693d0b8aabbSAnton Berezin 
6946105f815SLuigi Rizzo 	if (dflag) {	/* just print description */
6956105f815SLuigi Rizzo 		qoid[1] = 5;
6966105f815SLuigi Rizzo 		j = sizeof(buf);
6976105f815SLuigi Rizzo 		i = sysctl(qoid, nlen + 2, buf, &j, 0, 0);
6986105f815SLuigi Rizzo 		if (!nflag)
6996105f815SLuigi Rizzo 			printf("%s%s", name, sep);
7006105f815SLuigi Rizzo 		printf("%s", buf);
7016105f815SLuigi Rizzo 		return (0);
7026105f815SLuigi Rizzo 	}
7031d86b91cSPoul-Henning Kamp 	/* find an estimate of how much we need for this var */
7041d86b91cSPoul-Henning Kamp 	j = 0;
7051d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, 0, &j, 0, 0);
7061d86b91cSPoul-Henning Kamp 	j += j; /* we want to be sure :-) */
7071d86b91cSPoul-Henning Kamp 
708ccf25977SRuslan Ermilov 	val = oval = malloc(j + 1);
709ccf25977SRuslan Ermilov 	if (val == NULL) {
710ccf25977SRuslan Ermilov 		warnx("malloc failed");
7116b6b665bSBruce Evans 		return (1);
712ccf25977SRuslan Ermilov 	}
7131d86b91cSPoul-Henning Kamp 	len = j;
7141d86b91cSPoul-Henning Kamp 	i = sysctl(oid, nlen, val, &len, 0, 0);
715ccf25977SRuslan Ermilov 	if (i || !len) {
716ccf25977SRuslan Ermilov 		free(oval);
7171d86b91cSPoul-Henning Kamp 		return (1);
718ccf25977SRuslan Ermilov 	}
7191d86b91cSPoul-Henning Kamp 
7201d86b91cSPoul-Henning Kamp 	if (bflag) {
7211d86b91cSPoul-Henning Kamp 		fwrite(val, 1, len, stdout);
722ccf25977SRuslan Ermilov 		free(oval);
7231d86b91cSPoul-Henning Kamp 		return (0);
7241d86b91cSPoul-Henning Kamp 	}
72576d3dc52SAndrey A. Chernov 	val[len] = '\0';
7261d86b91cSPoul-Henning Kamp 	p = val;
727f8e4b4efSMatthew D Fleming 	ctltype = (kind & CTLTYPE);
728cbc134adSMatthew D Fleming 	sign = ctl_sign[ctltype];
729cbc134adSMatthew D Fleming 	intlen = ctl_size[ctltype];
730cbc134adSMatthew D Fleming 
731f8e4b4efSMatthew D Fleming 	switch (ctltype) {
732f8e4b4efSMatthew D Fleming 	case CTLTYPE_STRING:
7331d86b91cSPoul-Henning Kamp 		if (!nflag)
734d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
7356d7a8f6cSUlrich Spörlein 		printf("%.*s", (int)len, p);
736ccf25977SRuslan Ermilov 		free(oval);
7371d86b91cSPoul-Henning Kamp 		return (0);
7381d86b91cSPoul-Henning Kamp 
739f8e4b4efSMatthew D Fleming 	case CTLTYPE_INT:
740f8e4b4efSMatthew D Fleming 	case CTLTYPE_UINT:
741f8e4b4efSMatthew D Fleming 	case CTLTYPE_LONG:
742f8e4b4efSMatthew D Fleming 	case CTLTYPE_ULONG:
743cbc134adSMatthew D Fleming 	case CTLTYPE_S64:
744cbc134adSMatthew D Fleming 	case CTLTYPE_U64:
745dbf9b92fSDoug Rabson 		if (!nflag)
746d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
747e37d2b30SDavid Malone 		hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
748fd8c668aSDavid Malone 		sep1 = "";
74941e419cbSDavid Malone 		while (len >= intlen) {
750f8e4b4efSMatthew D Fleming 			switch (kind & CTLTYPE) {
751f8e4b4efSMatthew D Fleming 			case CTLTYPE_INT:
752f8e4b4efSMatthew D Fleming 			case CTLTYPE_UINT:
753e37d2b30SDavid Malone 				umv = *(u_int *)p;
754e37d2b30SDavid Malone 				mv = *(int *)p;
75541e419cbSDavid Malone 				break;
756f8e4b4efSMatthew D Fleming 			case CTLTYPE_LONG:
757f8e4b4efSMatthew D Fleming 			case CTLTYPE_ULONG:
758e37d2b30SDavid Malone 				umv = *(u_long *)p;
759e37d2b30SDavid Malone 				mv = *(long *)p;
76041e419cbSDavid Malone 				break;
761cbc134adSMatthew D Fleming 			case CTLTYPE_S64:
762cbc134adSMatthew D Fleming 			case CTLTYPE_U64:
763cbc134adSMatthew D Fleming 				umv = *(uint64_t *)p;
764cbc134adSMatthew D Fleming 				mv = *(int64_t *)p;
76541e419cbSDavid Malone 				break;
76641e419cbSDavid Malone 			}
767fd8c668aSDavid Malone 			fputs(sep1, stdout);
768f8e4b4efSMatthew D Fleming 			if (xflag)
769e37d2b30SDavid Malone 				printf("%#0*jx", hexlen, umv);
770f8e4b4efSMatthew D Fleming 			else if (!sign)
771f8e4b4efSMatthew D Fleming 				printf(hflag ? "%'ju" : "%ju", umv);
77241e419cbSDavid Malone 			else if (fmt[1] == 'K') {
773e37d2b30SDavid Malone 				if (mv < 0)
77421e1f596SDavid Malone 					printf("%jd", mv);
7759701cd40SJohn Baldwin 				else
77621e1f596SDavid Malone 					printf("%.1fC", (mv - 2732.0) / 10);
777c591d41fSPeter Wemm 			} else
778fd8c668aSDavid Malone 				printf(hflag ? "%'jd" : "%jd", mv);
779fd8c668aSDavid Malone 			sep1 = " ";
78041e419cbSDavid Malone 			len -= intlen;
78141e419cbSDavid Malone 			p += intlen;
782aa02fb57SPoul-Henning Kamp 		}
783ccf25977SRuslan Ermilov 		free(oval);
784dbf9b92fSDoug Rabson 		return (0);
785dbf9b92fSDoug Rabson 
786f8e4b4efSMatthew D Fleming 	case CTLTYPE_OPAQUE:
7871d86b91cSPoul-Henning Kamp 		i = 0;
788a89ab9bbSDag-Erling Smørgrav 		if (strcmp(fmt, "S,clockinfo") == 0)
789a89ab9bbSDag-Erling Smørgrav 			func = S_clockinfo;
790a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,timeval") == 0)
791a89ab9bbSDag-Erling Smørgrav 			func = S_timeval;
792a89ab9bbSDag-Erling Smørgrav 		else if (strcmp(fmt, "S,loadavg") == 0)
793a89ab9bbSDag-Erling Smørgrav 			func = S_loadavg;
794f7550ecfSMatthew Dillon 		else if (strcmp(fmt, "S,vmtotal") == 0)
795f7550ecfSMatthew Dillon 			func = S_vmtotal;
796a89ab9bbSDag-Erling Smørgrav 		else
797a89ab9bbSDag-Erling Smørgrav 			func = NULL;
7981d86b91cSPoul-Henning Kamp 		if (func) {
7991d86b91cSPoul-Henning Kamp 			if (!nflag)
800d0b8aabbSAnton Berezin 				printf("%s%s", name, sep);
80148cd487aSHartmut Brandt 			i = (*func)(len, p);
802ccf25977SRuslan Ermilov 			free(oval);
80348cd487aSHartmut Brandt 			return (i);
8041d86b91cSPoul-Henning Kamp 		}
8051d86b91cSPoul-Henning Kamp 		/* FALLTHROUGH */
806dea673e9SRodney W. Grimes 	default:
807ccf25977SRuslan Ermilov 		if (!oflag && !xflag) {
808ccf25977SRuslan Ermilov 			free(oval);
8091d86b91cSPoul-Henning Kamp 			return (1);
810ccf25977SRuslan Ermilov 		}
8111d86b91cSPoul-Henning Kamp 		if (!nflag)
812d0b8aabbSAnton Berezin 			printf("%s%s", name, sep);
8136d7a8f6cSUlrich Spörlein 		printf("Format:%s Length:%zu Dump:0x", fmt, len);
814a89ab9bbSDag-Erling Smørgrav 		while (len-- && (xflag || p < val + 16))
8151d86b91cSPoul-Henning Kamp 			printf("%02x", *p++);
816a89ab9bbSDag-Erling Smørgrav 		if (!xflag && len > 16)
8171d86b91cSPoul-Henning Kamp 			printf("...");
818ccf25977SRuslan Ermilov 		free(oval);
8191d86b91cSPoul-Henning Kamp 		return (0);
8201d86b91cSPoul-Henning Kamp 	}
821ccf25977SRuslan Ermilov 	free(oval);
8221d86b91cSPoul-Henning Kamp 	return (1);
823dea673e9SRodney W. Grimes }
824dea673e9SRodney W. Grimes 
8251d86b91cSPoul-Henning Kamp static int
8261d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len)
827dea673e9SRodney W. Grimes {
8281d86b91cSPoul-Henning Kamp 	int name1[22], name2[22];
829dbf9b92fSDoug Rabson 	int i, j;
830dbf9b92fSDoug Rabson 	size_t l1, l2;
831dea673e9SRodney W. Grimes 
8321d86b91cSPoul-Henning Kamp 	name1[0] = 0;
8331d86b91cSPoul-Henning Kamp 	name1[1] = 2;
8341d86b91cSPoul-Henning Kamp 	l1 = 2;
8351d86b91cSPoul-Henning Kamp 	if (len) {
8361d86b91cSPoul-Henning Kamp 		memcpy(name1+2, oid, len * sizeof(int));
8371d86b91cSPoul-Henning Kamp 		l1 += len;
8381d86b91cSPoul-Henning Kamp 	} else {
8391d86b91cSPoul-Henning Kamp 		name1[2] = 1;
8401d86b91cSPoul-Henning Kamp 		l1++;
8411d86b91cSPoul-Henning Kamp 	}
842a89ab9bbSDag-Erling Smørgrav 	for (;;) {
84331fb4661SDima Dorfman 		l2 = sizeof(name2);
8441d86b91cSPoul-Henning Kamp 		j = sysctl(name1, l1, name2, &l2, 0, 0);
845c1160fe4SBill Fumerola 		if (j < 0) {
8461d86b91cSPoul-Henning Kamp 			if (errno == ENOENT)
84721e1f596SDavid Malone 				return (0);
8481d86b91cSPoul-Henning Kamp 			else
8496d7a8f6cSUlrich Spörlein 				err(1, "sysctl(getnext) %d %zu", j, l2);
850c1160fe4SBill Fumerola 		}
8511d86b91cSPoul-Henning Kamp 
8521d86b91cSPoul-Henning Kamp 		l2 /= sizeof(int);
8531d86b91cSPoul-Henning Kamp 
854fd8c668aSDavid Malone 		if (len < 0 || l2 < (unsigned int)len)
85521e1f596SDavid Malone 			return (0);
8561d86b91cSPoul-Henning Kamp 
8571d86b91cSPoul-Henning Kamp 		for (i = 0; i < len; i++)
8581d86b91cSPoul-Henning Kamp 			if (name2[i] != oid[i])
85921e1f596SDavid Malone 				return (0);
8601d86b91cSPoul-Henning Kamp 
8611d86b91cSPoul-Henning Kamp 		i = show_var(name2, l2);
8621d86b91cSPoul-Henning Kamp 		if (!i && !bflag)
8631d86b91cSPoul-Henning Kamp 			putchar('\n');
8641d86b91cSPoul-Henning Kamp 
8651d86b91cSPoul-Henning Kamp 		memcpy(name1+2, name2, l2 * sizeof(int));
8661d86b91cSPoul-Henning Kamp 		l1 = 2 + l2;
8671d86b91cSPoul-Henning Kamp 	}
868dea673e9SRodney W. Grimes }
869