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 5189871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 5289871cdeSJohn Baldwin #include <machine/pc/bios.h> 5389871cdeSJohn Baldwin #endif 5489871cdeSJohn Baldwin 55d9b1bc77SPhilippe Charnier #include <ctype.h> 56d9b1bc77SPhilippe Charnier #include <err.h> 57dea673e9SRodney W. Grimes #include <errno.h> 5841e419cbSDavid Malone #include <inttypes.h> 5945817aaaSDag-Erling Smørgrav #include <locale.h> 60dea673e9SRodney W. Grimes #include <stdio.h> 61dea673e9SRodney W. Grimes #include <stdlib.h> 62dea673e9SRodney W. Grimes #include <string.h> 63da178c77SXin LI #include <sysexits.h> 64d9b1bc77SPhilippe Charnier #include <unistd.h> 65dea673e9SRodney W. Grimes 66da178c77SXin LI static const char *conffile; 67da178c77SXin LI 6824b2aa32SGavin Atkinson static int aflag, bflag, dflag, eflag, hflag, iflag; 69da178c77SXin LI static int Nflag, nflag, oflag, qflag, Tflag, Wflag, xflag; 70dea673e9SRodney W. Grimes 711d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 72da178c77SXin LI static int parsefile(const char *); 73da178c77SXin LI static int parse(const char *, int); 741d86b91cSPoul-Henning Kamp static int show_var(int *, int); 751d86b91cSPoul-Henning Kamp static int sysctl_all(int *oid, int len); 761d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 77dea673e9SRodney W. Grimes 78a7b5ad27SEd Schouten static int set_IK(const char *, int *); 79d58f0054SPoul-Henning Kamp 801d86b91cSPoul-Henning Kamp static void 811d86b91cSPoul-Henning Kamp usage(void) 821d86b91cSPoul-Henning Kamp { 83dea673e9SRodney W. Grimes 849a2402bcSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n", 85da178c77SXin LI "usage: sysctl [-bdehiNnoqTWx] [-f filename] name[=value] ...", 869ecd2e32SAlfred Perlstein " sysctl [-bdehNnoqTWx] -a"); 871d86b91cSPoul-Henning Kamp exit(1); 881d86b91cSPoul-Henning Kamp } 89dea673e9SRodney W. Grimes 90dea673e9SRodney W. Grimes int 911d86b91cSPoul-Henning Kamp main(int argc, char **argv) 92dea673e9SRodney W. Grimes { 931d86b91cSPoul-Henning Kamp int ch; 94da178c77SXin LI int warncount = 0; 9545817aaaSDag-Erling Smørgrav 9645817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 971d86b91cSPoul-Henning Kamp setbuf(stdout,0); 981d86b91cSPoul-Henning Kamp setbuf(stderr,0); 99dea673e9SRodney W. Grimes 100da178c77SXin LI while ((ch = getopt(argc, argv, "Aabdef:hiNnoqTwWxX")) != -1) { 101dea673e9SRodney W. Grimes switch (ch) { 102ca5fac55SDag-Erling Smørgrav case 'A': 1039a2402bcSDag-Erling Smørgrav /* compatibility */ 1049a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 105ca5fac55SDag-Erling Smørgrav break; 106ca5fac55SDag-Erling Smørgrav case 'a': 107ca5fac55SDag-Erling Smørgrav aflag = 1; 108ca5fac55SDag-Erling Smørgrav break; 109ca5fac55SDag-Erling Smørgrav case 'b': 110ca5fac55SDag-Erling Smørgrav bflag = 1; 111ca5fac55SDag-Erling Smørgrav break; 1126105f815SLuigi Rizzo case 'd': 1136105f815SLuigi Rizzo dflag = 1; 1146105f815SLuigi Rizzo break; 115d0b8aabbSAnton Berezin case 'e': 116d0b8aabbSAnton Berezin eflag = 1; 117d0b8aabbSAnton Berezin break; 118da178c77SXin LI case 'f': 119da178c77SXin LI conffile = optarg; 120da178c77SXin LI break; 12145817aaaSDag-Erling Smørgrav case 'h': 12245817aaaSDag-Erling Smørgrav hflag = 1; 12345817aaaSDag-Erling Smørgrav break; 12424b2aa32SGavin Atkinson case 'i': 12524b2aa32SGavin Atkinson iflag = 1; 12624b2aa32SGavin Atkinson break; 127ca5fac55SDag-Erling Smørgrav case 'N': 128ca5fac55SDag-Erling Smørgrav Nflag = 1; 129ca5fac55SDag-Erling Smørgrav break; 130ca5fac55SDag-Erling Smørgrav case 'n': 131ca5fac55SDag-Erling Smørgrav nflag = 1; 132ca5fac55SDag-Erling Smørgrav break; 1339a2402bcSDag-Erling Smørgrav case 'o': 1349a2402bcSDag-Erling Smørgrav oflag = 1; 1359a2402bcSDag-Erling Smørgrav break; 136f93d36fdSRobert Watson case 'q': 137f93d36fdSRobert Watson qflag = 1; 138f93d36fdSRobert Watson break; 1399ecd2e32SAlfred Perlstein case 'T': 1409ecd2e32SAlfred Perlstein Tflag = 1; 1419ecd2e32SAlfred Perlstein break; 142ca5fac55SDag-Erling Smørgrav case 'w': 1439a2402bcSDag-Erling Smørgrav /* compatibility */ 1449a2402bcSDag-Erling Smørgrav /* ignored */ 145ca5fac55SDag-Erling Smørgrav break; 1469ecd2e32SAlfred Perlstein case 'W': 1479ecd2e32SAlfred Perlstein Wflag = 1; 1489ecd2e32SAlfred Perlstein break; 149ca5fac55SDag-Erling Smørgrav case 'X': 1509a2402bcSDag-Erling Smørgrav /* compatibility */ 1519a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 1529a2402bcSDag-Erling Smørgrav break; 1539a2402bcSDag-Erling Smørgrav case 'x': 1549a2402bcSDag-Erling Smørgrav xflag = 1; 155ca5fac55SDag-Erling Smørgrav break; 156ca5fac55SDag-Erling Smørgrav default: 157ca5fac55SDag-Erling Smørgrav usage(); 158dea673e9SRodney W. Grimes } 159dea673e9SRodney W. Grimes } 160dea673e9SRodney W. Grimes argc -= optind; 161dea673e9SRodney W. Grimes argv += optind; 162dea673e9SRodney W. Grimes 1639a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 16481e7454aSDag-Erling Smørgrav usage(); 1659a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 1661d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 167da178c77SXin LI if (argc == 0 && conffile == NULL) 168dea673e9SRodney W. Grimes usage(); 169d9fcd86cSMike Makonnen 170d9fcd86cSMike Makonnen warncount = 0; 171da178c77SXin LI if (conffile != NULL) 172da178c77SXin LI warncount += parsefile(conffile); 173da178c77SXin LI 174dea673e9SRodney W. Grimes while (argc-- > 0) 175da178c77SXin LI warncount += parse(*argv++, 0); 176da178c77SXin LI 177da178c77SXin LI return (warncount); 178dea673e9SRodney W. Grimes } 179dea673e9SRodney W. Grimes 180dea673e9SRodney W. Grimes /* 181dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 182dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 183dea673e9SRodney W. Grimes * Set a new value if requested. 184dea673e9SRodney W. Grimes */ 185da178c77SXin LI static int 186da178c77SXin LI parse(const char *string, int lineno) 187dea673e9SRodney W. Grimes { 1881d86b91cSPoul-Henning Kamp int len, i, j; 189dea673e9SRodney W. Grimes void *newval = 0; 1901ce1a53dSJim Pirzyk int intval; 1911ce1a53dSJim Pirzyk unsigned int uintval; 1921ce1a53dSJim Pirzyk long longval; 1931ce1a53dSJim Pirzyk unsigned long ulongval; 1941ce1a53dSJim Pirzyk size_t newsize = 0; 195cbc134adSMatthew D Fleming int64_t i64val; 196cbc134adSMatthew D Fleming uint64_t u64val; 197dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 198da178c77SXin LI char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ], line[BUFSIZ]; 1991d86b91cSPoul-Henning Kamp u_int kind; 200dea673e9SRodney W. Grimes 201da178c77SXin LI if (lineno) 202da178c77SXin LI snprintf(line, sizeof(line), " at line %d", lineno); 203da178c77SXin LI else 204da178c77SXin LI line[0] = '\0'; 205da178c77SXin LI 206aae75101SXin LI cp = buf; 207da178c77SXin LI if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) { 208c6919e7fSEdward Tomasz Napierala warnx("oid too long: '%s'%s", string, line); 209da178c77SXin LI return (1); 210da178c77SXin LI } 211da178c77SXin LI bufp = strsep(&cp, "=:"); 212aae75101SXin LI if (cp != NULL) { 2139ecd2e32SAlfred Perlstein /* Tflag just lists tunables, do not allow assignment */ 2149ecd2e32SAlfred Perlstein if (Tflag || Wflag) { 2159ecd2e32SAlfred Perlstein warnx("Can't set variables when using -T or -W"); 2169ecd2e32SAlfred Perlstein usage(); 2179ecd2e32SAlfred Perlstein } 218dea673e9SRodney W. Grimes while (isspace(*cp)) 219dea673e9SRodney W. Grimes cp++; 220da178c77SXin LI /* Strip a pair of " or ' if any. */ 221da178c77SXin LI switch (*cp) { 222da178c77SXin LI case '\"': 223da178c77SXin LI case '\'': 224da178c77SXin LI if (cp[strlen(cp) - 1] == *cp) 225da178c77SXin LI cp[strlen(cp) - 1] = '\0'; 226da178c77SXin LI cp++; 227da178c77SXin LI } 228dea673e9SRodney W. Grimes newval = cp; 229dea673e9SRodney W. Grimes newsize = strlen(cp); 230dea673e9SRodney W. Grimes } 2311d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 2321d86b91cSPoul-Henning Kamp 233f93d36fdSRobert Watson if (len < 0) { 23424b2aa32SGavin Atkinson if (iflag) 235da178c77SXin LI return (0); 236f93d36fdSRobert Watson if (qflag) 237da178c77SXin LI return (1); 238da178c77SXin LI else { 239da178c77SXin LI warn("unknown oid '%s'%s", bufp, line); 240da178c77SXin LI return (1); 241da178c77SXin LI } 242f93d36fdSRobert Watson } 2431d86b91cSPoul-Henning Kamp 244da178c77SXin LI if (oidfmt(mib, len, fmt, &kind)) { 245da178c77SXin LI warn("couldn't find format of oid '%s'%s", bufp, line); 246da178c77SXin LI if (iflag) 247da178c77SXin LI return (1); 248da178c77SXin LI else 249da178c77SXin LI exit(1); 250da178c77SXin LI } 2511d86b91cSPoul-Henning Kamp 2520b6230f1SJohn Baldwin if (newval == NULL || dflag) { 2531d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 254b2680e20SMatthew N. Dodd if (dflag) { 255b2680e20SMatthew N. Dodd i = show_var(mib, len); 256b2680e20SMatthew N. Dodd if (!i && !bflag) 257b2680e20SMatthew N. Dodd putchar('\n'); 258b2680e20SMatthew N. Dodd } 2591d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 2601d86b91cSPoul-Henning Kamp } else { 2611d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2621d86b91cSPoul-Henning Kamp if (!i && !bflag) 2631d86b91cSPoul-Henning Kamp putchar('\n'); 264dea673e9SRodney W. Grimes } 2651d86b91cSPoul-Henning Kamp } else { 266da178c77SXin LI if ((kind & CTLTYPE) == CTLTYPE_NODE) { 267c6919e7fSEdward Tomasz Napierala warnx("oid '%s' isn't a leaf node%s", bufp, line); 268da178c77SXin LI return (1); 269da178c77SXin LI } 270dea673e9SRodney W. Grimes 271ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 2729b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 2736f361351SXin LI warnx("oid '%s' is a read only tunable%s", bufp, line); 274da178c77SXin LI warnx("Tunable values are set in /boot/loader.conf"); 275da178c77SXin LI } else 276da178c77SXin LI warnx("oid '%s' is read only%s", bufp, line); 277da178c77SXin LI return (1); 278ac8711d2SMike Silbersack } 279dea673e9SRodney W. Grimes 280a78d3eafSRobert Watson if ((kind & CTLTYPE) == CTLTYPE_INT || 281a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_UINT || 282a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_LONG || 2834d90830fSDima Dorfman (kind & CTLTYPE) == CTLTYPE_ULONG || 284cbc134adSMatthew D Fleming (kind & CTLTYPE) == CTLTYPE_S64 || 285cbc134adSMatthew D Fleming (kind & CTLTYPE) == CTLTYPE_U64) { 286da178c77SXin LI if (strlen(newval) == 0) { 287da178c77SXin LI warnx("empty numeric value"); 288da178c77SXin LI return (1); 289da178c77SXin LI } 290a78d3eafSRobert Watson } 291a78d3eafSRobert Watson 2921d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 293dea673e9SRodney W. Grimes case CTLTYPE_INT: 294d45564dcSHajimu UMEMOTO if (strcmp(fmt, "IK") == 0) { 295da178c77SXin LI if (!set_IK(newval, &intval)) { 296da178c77SXin LI warnx("invalid value '%s'%s", 297da178c77SXin LI (char *)newval, line); 298da178c77SXin LI return (1); 299da178c77SXin LI } 300d45564dcSHajimu UMEMOTO } else { 301d45564dcSHajimu UMEMOTO intval = (int)strtol(newval, &endptr, 302d45564dcSHajimu UMEMOTO 0); 303da178c77SXin LI if (endptr == newval || *endptr != '\0') { 304da178c77SXin LI warnx("invalid integer '%s'%s", 305da178c77SXin LI (char *)newval, line); 306da178c77SXin LI return (1); 307da178c77SXin LI } 308d45564dcSHajimu UMEMOTO } 309dea673e9SRodney W. Grimes newval = &intval; 31031fb4661SDima Dorfman newsize = sizeof(intval); 311dea673e9SRodney W. Grimes break; 3121ce1a53dSJim Pirzyk case CTLTYPE_UINT: 313a78d3eafSRobert Watson uintval = (int) strtoul(newval, &endptr, 0); 314da178c77SXin LI if (endptr == newval || *endptr != '\0') { 315da178c77SXin LI warnx("invalid unsigned integer '%s'%s", 316da178c77SXin LI (char *)newval, line); 317da178c77SXin LI return (1); 318da178c77SXin LI } 3191ce1a53dSJim Pirzyk newval = &uintval; 32021e1f596SDavid Malone newsize = sizeof(uintval); 3211ce1a53dSJim Pirzyk break; 3221ce1a53dSJim Pirzyk case CTLTYPE_LONG: 323a78d3eafSRobert Watson longval = strtol(newval, &endptr, 0); 324da178c77SXin LI if (endptr == newval || *endptr != '\0') { 325da178c77SXin LI warnx("invalid long integer '%s'%s", 326da178c77SXin LI (char *)newval, line); 327da178c77SXin LI return (1); 328da178c77SXin LI } 3291ce1a53dSJim Pirzyk newval = &longval; 33021e1f596SDavid Malone newsize = sizeof(longval); 3311ce1a53dSJim Pirzyk break; 3321ce1a53dSJim Pirzyk case CTLTYPE_ULONG: 333a78d3eafSRobert Watson ulongval = strtoul(newval, &endptr, 0); 334da178c77SXin LI if (endptr == newval || *endptr != '\0') { 335da178c77SXin LI warnx("invalid unsigned long integer" 336da178c77SXin LI " '%s'%s", (char *)newval, line); 337da178c77SXin LI return (1); 338da178c77SXin LI } 3391ce1a53dSJim Pirzyk newval = &ulongval; 34021e1f596SDavid Malone newsize = sizeof(ulongval); 3411d86b91cSPoul-Henning Kamp break; 3421d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 3431d86b91cSPoul-Henning Kamp break; 344cbc134adSMatthew D Fleming case CTLTYPE_S64: 345cbc134adSMatthew D Fleming i64val = strtoimax(newval, &endptr, 0); 346da178c77SXin LI if (endptr == newval || *endptr != '\0') { 347da178c77SXin LI warnx("invalid int64_t '%s'%s", 348da178c77SXin LI (char *)newval, line); 349da178c77SXin LI return (1); 350da178c77SXin LI } 351cbc134adSMatthew D Fleming newval = &i64val; 352cbc134adSMatthew D Fleming newsize = sizeof(i64val); 353cbc134adSMatthew D Fleming break; 354cbc134adSMatthew D Fleming case CTLTYPE_U64: 355cbc134adSMatthew D Fleming u64val = strtoumax(newval, &endptr, 0); 356da178c77SXin LI if (endptr == newval || *endptr != '\0') { 357da178c77SXin LI warnx("invalid uint64_t '%s'%s", 358da178c77SXin LI (char *)newval, line); 359da178c77SXin LI return (1); 360da178c77SXin LI } 361cbc134adSMatthew D Fleming newval = &u64val; 362cbc134adSMatthew D Fleming newsize = sizeof(u64val); 363dea673e9SRodney W. Grimes break; 364d58f0054SPoul-Henning Kamp case CTLTYPE_OPAQUE: 365d58f0054SPoul-Henning Kamp /* FALLTHROUGH */ 3661d86b91cSPoul-Henning Kamp default: 367da178c77SXin LI warnx("oid '%s' is type %d," 368da178c77SXin LI " cannot set that%s", bufp, 369da178c77SXin LI kind & CTLTYPE, line); 370da178c77SXin LI return (1); 371dea673e9SRodney W. Grimes } 3721d86b91cSPoul-Henning Kamp 3731d86b91cSPoul-Henning Kamp i = show_var(mib, len); 3741d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 3751d86b91cSPoul-Henning Kamp if (!i && !bflag) 3761d86b91cSPoul-Henning Kamp putchar('\n'); 377dea673e9SRodney W. Grimes switch (errno) { 378dea673e9SRodney W. Grimes case EOPNOTSUPP: 379da178c77SXin LI warnx("%s: value is not available%s", 380da178c77SXin LI string, line); 381da178c77SXin LI return (1); 382dea673e9SRodney W. Grimes case ENOTDIR: 383da178c77SXin LI warnx("%s: specification is incomplete%s", 384da178c77SXin LI string, line); 385da178c77SXin LI return (1); 386dea673e9SRodney W. Grimes case ENOMEM: 387da178c77SXin LI warnx("%s: type is unknown to this program%s", 388da178c77SXin LI string, line); 389da178c77SXin LI return (1); 390dea673e9SRodney W. Grimes default: 391da178c77SXin LI warn("%s%s", string, line); 392da178c77SXin LI return (1); 393dea673e9SRodney W. Grimes } 394dea673e9SRodney W. Grimes } 3951d86b91cSPoul-Henning Kamp if (!bflag) 3961d86b91cSPoul-Henning Kamp printf(" -> "); 3971d86b91cSPoul-Henning Kamp i = nflag; 3981d86b91cSPoul-Henning Kamp nflag = 1; 3991d86b91cSPoul-Henning Kamp j = show_var(mib, len); 4001d86b91cSPoul-Henning Kamp if (!j && !bflag) 4011d86b91cSPoul-Henning Kamp putchar('\n'); 4021d86b91cSPoul-Henning Kamp nflag = i; 403dea673e9SRodney W. Grimes } 404da178c77SXin LI 405da178c77SXin LI return (0); 406da178c77SXin LI } 407da178c77SXin LI 408da178c77SXin LI static int 409da178c77SXin LI parsefile(const char *filename) 410da178c77SXin LI { 411da178c77SXin LI FILE *file; 412da178c77SXin LI char line[BUFSIZ], *p, *pq, *pdq; 413da178c77SXin LI int warncount = 0, lineno = 0; 414da178c77SXin LI 415da178c77SXin LI file = fopen(filename, "r"); 416da178c77SXin LI if (file == NULL) 417da178c77SXin LI err(EX_NOINPUT, "%s", filename); 418da178c77SXin LI while (fgets(line, sizeof(line), file) != NULL) { 419da178c77SXin LI lineno++; 420da178c77SXin LI p = line; 421da178c77SXin LI pq = strchr(line, '\''); 422da178c77SXin LI pdq = strchr(line, '\"'); 423da178c77SXin LI /* Replace the first # with \0. */ 424da178c77SXin LI while((p = strchr(p, '#')) != NULL) { 425da178c77SXin LI if (pq != NULL && p > pq) { 426da178c77SXin LI if ((p = strchr(pq+1, '\'')) != NULL) 427da178c77SXin LI *(++p) = '\0'; 428da178c77SXin LI break; 429da178c77SXin LI } else if (pdq != NULL && p > pdq) { 430da178c77SXin LI if ((p = strchr(pdq+1, '\"')) != NULL) 431da178c77SXin LI *(++p) = '\0'; 432da178c77SXin LI break; 433da178c77SXin LI } else if (p == line || *(p-1) != '\\') { 434da178c77SXin LI *p = '\0'; 435da178c77SXin LI break; 436da178c77SXin LI } 437da178c77SXin LI p++; 438da178c77SXin LI } 439da178c77SXin LI /* Trim spaces */ 440da178c77SXin LI p = line + strlen(line) - 1; 441da178c77SXin LI while (p >= line && isspace((int)*p)) { 442da178c77SXin LI *p = '\0'; 443da178c77SXin LI p--; 444da178c77SXin LI } 445da178c77SXin LI p = line; 446da178c77SXin LI while (isspace((int)*p)) 447da178c77SXin LI p++; 448da178c77SXin LI if (*p == '\0') 449da178c77SXin LI continue; 450da178c77SXin LI else 451da178c77SXin LI warncount += parse(p, lineno); 452da178c77SXin LI } 453da178c77SXin LI fclose(file); 454da178c77SXin LI 455da178c77SXin LI return (warncount); 456dea673e9SRodney W. Grimes } 457dea673e9SRodney W. Grimes 4581d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 459dea673e9SRodney W. Grimes 4601d86b91cSPoul-Henning Kamp static int 461*59101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p) 4621d86b91cSPoul-Henning Kamp { 4631d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 46421e1f596SDavid Malone 465996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 466*59101c5dSJohn Baldwin warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci)); 4676b6b665bSBruce Evans return (1); 468996076bbSAlfred Perlstein } 46945817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 47045817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 471b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 4721d86b91cSPoul-Henning Kamp return (0); 473dea673e9SRodney W. Grimes } 474dea673e9SRodney W. Grimes 4751d86b91cSPoul-Henning Kamp static int 476*59101c5dSJohn Baldwin S_loadavg(size_t l2, void *p) 4771d86b91cSPoul-Henning Kamp { 4781d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 4791d86b91cSPoul-Henning Kamp 480996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 481*59101c5dSJohn Baldwin warnx("S_loadavg %zu != %zu", l2, sizeof(*tv)); 4826b6b665bSBruce Evans return (1); 483996076bbSAlfred Perlstein } 48445817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 4851d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 4861d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 4871d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 4881d86b91cSPoul-Henning Kamp return (0); 489dea673e9SRodney W. Grimes } 490dea673e9SRodney W. Grimes 4911d86b91cSPoul-Henning Kamp static int 492*59101c5dSJohn Baldwin S_timeval(size_t l2, void *p) 4931d86b91cSPoul-Henning Kamp { 4941d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 495c2deb608SBruce Evans time_t tv_sec; 4961d86b91cSPoul-Henning Kamp char *p1, *p2; 497dea673e9SRodney W. Grimes 498996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 499*59101c5dSJohn Baldwin warnx("S_timeval %zu != %zu", l2, sizeof(*tv)); 5006b6b665bSBruce Evans return (1); 501996076bbSAlfred Perlstein } 502db87e2dcSJohn Hay printf(hflag ? "{ sec = %'jd, usec = %'ld } " : 503db87e2dcSJohn Hay "{ sec = %jd, usec = %ld } ", 504db87e2dcSJohn Hay (intmax_t)tv->tv_sec, tv->tv_usec); 505c2deb608SBruce Evans tv_sec = tv->tv_sec; 506c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 5071d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 5081d86b91cSPoul-Henning Kamp if (*p2 == '\n') 5091d86b91cSPoul-Henning Kamp *p2 = '\0'; 5101d86b91cSPoul-Henning Kamp fputs(p1, stdout); 511f2359a24SRebecca Cran free(p1); 5121d86b91cSPoul-Henning Kamp return (0); 5131d86b91cSPoul-Henning Kamp } 5141d86b91cSPoul-Henning Kamp 5151d86b91cSPoul-Henning Kamp static int 516*59101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p) 517f7550ecfSMatthew Dillon { 518f7550ecfSMatthew Dillon struct vmtotal *v = (struct vmtotal *)p; 519654e22e7SMatthew Dillon int pageKilo = getpagesize() / 1024; 520f7550ecfSMatthew Dillon 521f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 522*59101c5dSJohn Baldwin warnx("S_vmtotal %zu != %zu", l2, sizeof(*v)); 5236b6b665bSBruce Evans return (1); 524f7550ecfSMatthew Dillon } 525f7550ecfSMatthew Dillon 526654e22e7SMatthew Dillon printf( 527654e22e7SMatthew Dillon "\nSystem wide totals computed every five seconds:" 528654e22e7SMatthew Dillon " (values in kilobytes)\n"); 529f7550ecfSMatthew Dillon printf("===============================================\n"); 530654e22e7SMatthew Dillon printf( 531bad4d172SRuslan Ermilov "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: " 532bad4d172SRuslan Ermilov "%hd Sleep: %hd)\n", 533f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 534654e22e7SMatthew Dillon printf( 53513e86ef7SMarko Zec "Virtual Memory:\t\t(Total: %dK Active: %dK)\n", 536bad4d172SRuslan Ermilov v->t_vm * pageKilo, v->t_avm * pageKilo); 53713e86ef7SMarko Zec printf("Real Memory:\t\t(Total: %dK Active: %dK)\n", 538bad4d172SRuslan Ermilov v->t_rm * pageKilo, v->t_arm * pageKilo); 539bad4d172SRuslan Ermilov printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n", 540bad4d172SRuslan Ermilov v->t_vmshr * pageKilo, v->t_avmshr * pageKilo); 541bad4d172SRuslan Ermilov printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n", 542bad4d172SRuslan Ermilov v->t_rmshr * pageKilo, v->t_armshr * pageKilo); 543*59101c5dSJohn Baldwin printf("Free Memory:\t%dK", v->t_free * pageKilo); 544f7550ecfSMatthew Dillon 545f7550ecfSMatthew Dillon return (0); 546f7550ecfSMatthew Dillon } 547f7550ecfSMatthew Dillon 54889871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 54989871cdeSJohn Baldwin static int 550*59101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p) 55189871cdeSJohn Baldwin { 55289871cdeSJohn Baldwin struct bios_smap_xattr *smap, *end; 55389871cdeSJohn Baldwin 55489871cdeSJohn Baldwin if (l2 % sizeof(*smap) != 0) { 555*59101c5dSJohn Baldwin warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2, 55689871cdeSJohn Baldwin sizeof(*smap)); 55789871cdeSJohn Baldwin return (1); 55889871cdeSJohn Baldwin } 55989871cdeSJohn Baldwin 56089871cdeSJohn Baldwin end = (struct bios_smap_xattr *)((char *)p + l2); 56189871cdeSJohn Baldwin for (smap = p; smap < end; smap++) 56289871cdeSJohn Baldwin printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx", 56389871cdeSJohn Baldwin smap->type, smap->xattr, (uintmax_t)smap->base, 56489871cdeSJohn Baldwin (uintmax_t)smap->length); 56589871cdeSJohn Baldwin return (0); 56689871cdeSJohn Baldwin } 56789871cdeSJohn Baldwin #endif 56889871cdeSJohn Baldwin 569f7550ecfSMatthew Dillon static int 570a7b5ad27SEd Schouten set_IK(const char *str, int *val) 571d45564dcSHajimu UMEMOTO { 572d45564dcSHajimu UMEMOTO float temp; 573d45564dcSHajimu UMEMOTO int len, kelv; 574a7b5ad27SEd Schouten const char *p; 575a7b5ad27SEd Schouten char *endptr; 576d45564dcSHajimu UMEMOTO 577d45564dcSHajimu UMEMOTO if ((len = strlen(str)) == 0) 578d45564dcSHajimu UMEMOTO return (0); 579d45564dcSHajimu UMEMOTO p = &str[len - 1]; 580d45564dcSHajimu UMEMOTO if (*p == 'C' || *p == 'F') { 581d45564dcSHajimu UMEMOTO temp = strtof(str, &endptr); 582a7b5ad27SEd Schouten if (endptr == str || endptr != p) 583d45564dcSHajimu UMEMOTO return (0); 584d45564dcSHajimu UMEMOTO if (*p == 'F') 585d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 586d45564dcSHajimu UMEMOTO kelv = temp * 10 + 2732; 587d45564dcSHajimu UMEMOTO } else { 588d45564dcSHajimu UMEMOTO kelv = (int)strtol(str, &endptr, 10); 589d45564dcSHajimu UMEMOTO if (endptr == str || *endptr != '\0') 590d45564dcSHajimu UMEMOTO return (0); 591d45564dcSHajimu UMEMOTO } 592d45564dcSHajimu UMEMOTO *val = kelv; 593d45564dcSHajimu UMEMOTO return (1); 594d45564dcSHajimu UMEMOTO } 595d45564dcSHajimu UMEMOTO 5961d86b91cSPoul-Henning Kamp /* 5971d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 5981d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 5991d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 6001d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 6011d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 6021d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 6031d86b91cSPoul-Henning Kamp */ 6041d86b91cSPoul-Henning Kamp 6051d86b91cSPoul-Henning Kamp static int 6061d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 6071d86b91cSPoul-Henning Kamp { 6081d86b91cSPoul-Henning Kamp int oid[2]; 609dbf9b92fSDoug Rabson int i; 610dbf9b92fSDoug Rabson size_t j; 6111d86b91cSPoul-Henning Kamp 6121d86b91cSPoul-Henning Kamp oid[0] = 0; 6131d86b91cSPoul-Henning Kamp oid[1] = 3; 6141d86b91cSPoul-Henning Kamp 6151d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 6161d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 6171d86b91cSPoul-Henning Kamp if (i < 0) 61821e1f596SDavid Malone return (i); 6191d86b91cSPoul-Henning Kamp j /= sizeof(int); 6201d86b91cSPoul-Henning Kamp return (j); 6211d86b91cSPoul-Henning Kamp } 6221d86b91cSPoul-Henning Kamp 6231d86b91cSPoul-Henning Kamp static int 6241d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 6251d86b91cSPoul-Henning Kamp { 6261d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 6271d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 628dbf9b92fSDoug Rabson int i; 629dbf9b92fSDoug Rabson size_t j; 6301d86b91cSPoul-Henning Kamp 6311d86b91cSPoul-Henning Kamp qoid[0] = 0; 6321d86b91cSPoul-Henning Kamp qoid[1] = 4; 6331d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 6341d86b91cSPoul-Henning Kamp 63531fb4661SDima Dorfman j = sizeof(buf); 6361d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 6371d86b91cSPoul-Henning Kamp if (i) 6386d7a8f6cSUlrich Spörlein err(1, "sysctl fmt %d %zu %d", i, j, errno); 6391d86b91cSPoul-Henning Kamp 6401d86b91cSPoul-Henning Kamp if (kind) 6411d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 6421d86b91cSPoul-Henning Kamp 6431d86b91cSPoul-Henning Kamp if (fmt) 6441d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 64521e1f596SDavid Malone return (0); 6461d86b91cSPoul-Henning Kamp } 6471d86b91cSPoul-Henning Kamp 648cbc134adSMatthew D Fleming static int ctl_sign[CTLTYPE+1] = { 649cbc134adSMatthew D Fleming [CTLTYPE_INT] = 1, 650cbc134adSMatthew D Fleming [CTLTYPE_LONG] = 1, 651cbc134adSMatthew D Fleming [CTLTYPE_S64] = 1, 652cbc134adSMatthew D Fleming }; 653cbc134adSMatthew D Fleming 654cbc134adSMatthew D Fleming static int ctl_size[CTLTYPE+1] = { 655cbc134adSMatthew D Fleming [CTLTYPE_INT] = sizeof(int), 656cbc134adSMatthew D Fleming [CTLTYPE_UINT] = sizeof(u_int), 657cbc134adSMatthew D Fleming [CTLTYPE_LONG] = sizeof(long), 658cbc134adSMatthew D Fleming [CTLTYPE_ULONG] = sizeof(u_long), 659cbc134adSMatthew D Fleming [CTLTYPE_S64] = sizeof(int64_t), 660cbc134adSMatthew D Fleming [CTLTYPE_U64] = sizeof(int64_t), 661cbc134adSMatthew D Fleming }; 662cbc134adSMatthew D Fleming 66360cf2c12SLuigi Rizzo /* 6641d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 6651d86b91cSPoul-Henning Kamp * 6661d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 6671d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 6681d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 6691d86b91cSPoul-Henning Kamp */ 6701d86b91cSPoul-Henning Kamp static int 6711d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 6721d86b91cSPoul-Henning Kamp { 673ccf25977SRuslan Ermilov u_char buf[BUFSIZ], *val, *oval, *p; 674403c7f59SAlfred Perlstein char name[BUFSIZ], fmt[BUFSIZ]; 675fd8c668aSDavid Malone const char *sep, *sep1; 6761d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 67721e1f596SDavid Malone uintmax_t umv; 67821e1f596SDavid Malone intmax_t mv; 679f8e4b4efSMatthew D Fleming int i, hexlen, sign, ctltype; 68041e419cbSDavid Malone size_t intlen; 681dbf9b92fSDoug Rabson size_t j, len; 6821d86b91cSPoul-Henning Kamp u_int kind; 683*59101c5dSJohn Baldwin int (*func)(size_t, void *); 6841d86b91cSPoul-Henning Kamp 6856d7a8f6cSUlrich Spörlein /* Silence GCC. */ 6866d7a8f6cSUlrich Spörlein umv = mv = intlen = 0; 6876d7a8f6cSUlrich Spörlein 6889f98e452SMatthew N. Dodd bzero(buf, BUFSIZ); 689403c7f59SAlfred Perlstein bzero(fmt, BUFSIZ); 6909f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 69181e7454aSDag-Erling Smørgrav qoid[0] = 0; 69281e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 69381e7454aSDag-Erling Smørgrav 69481e7454aSDag-Erling Smørgrav qoid[1] = 1; 69531fb4661SDima Dorfman j = sizeof(name); 69681e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 69781e7454aSDag-Erling Smørgrav if (i || !j) 6986d7a8f6cSUlrich Spörlein err(1, "sysctl name %d %zu %d", i, j, errno); 69981e7454aSDag-Erling Smørgrav 700403c7f59SAlfred Perlstein oidfmt(oid, nlen, fmt, &kind); 701403c7f59SAlfred Perlstein /* if Wflag then only list sysctls that are writeable and not stats. */ 702403c7f59SAlfred Perlstein if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) 703403c7f59SAlfred Perlstein return 1; 704403c7f59SAlfred Perlstein 705403c7f59SAlfred Perlstein /* if Tflag then only list sysctls that are tuneables. */ 706403c7f59SAlfred Perlstein if (Tflag && (kind & CTLFLAG_TUN) == 0) 707403c7f59SAlfred Perlstein return 1; 708403c7f59SAlfred Perlstein 709ca5fac55SDag-Erling Smørgrav if (Nflag) { 710ca5fac55SDag-Erling Smørgrav printf("%s", name); 711ca5fac55SDag-Erling Smørgrav return (0); 712ca5fac55SDag-Erling Smørgrav } 713ca5fac55SDag-Erling Smørgrav 714d0b8aabbSAnton Berezin if (eflag) 715d0b8aabbSAnton Berezin sep = "="; 716d0b8aabbSAnton Berezin else 717d0b8aabbSAnton Berezin sep = ": "; 718d0b8aabbSAnton Berezin 7196105f815SLuigi Rizzo if (dflag) { /* just print description */ 7206105f815SLuigi Rizzo qoid[1] = 5; 7216105f815SLuigi Rizzo j = sizeof(buf); 7226105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 7236105f815SLuigi Rizzo if (!nflag) 7246105f815SLuigi Rizzo printf("%s%s", name, sep); 7256105f815SLuigi Rizzo printf("%s", buf); 7266105f815SLuigi Rizzo return (0); 7276105f815SLuigi Rizzo } 7281d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 7291d86b91cSPoul-Henning Kamp j = 0; 7301d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 7311d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 7321d86b91cSPoul-Henning Kamp 733ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 734ccf25977SRuslan Ermilov if (val == NULL) { 735ccf25977SRuslan Ermilov warnx("malloc failed"); 7366b6b665bSBruce Evans return (1); 737ccf25977SRuslan Ermilov } 73804006eabSHans Petter Selasky ctltype = (kind & CTLTYPE); 7391d86b91cSPoul-Henning Kamp len = j; 7401d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 74104006eabSHans Petter Selasky if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) { 742ccf25977SRuslan Ermilov free(oval); 7431d86b91cSPoul-Henning Kamp return (1); 744ccf25977SRuslan Ermilov } 7451d86b91cSPoul-Henning Kamp 7461d86b91cSPoul-Henning Kamp if (bflag) { 7471d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 748ccf25977SRuslan Ermilov free(oval); 7491d86b91cSPoul-Henning Kamp return (0); 7501d86b91cSPoul-Henning Kamp } 75176d3dc52SAndrey A. Chernov val[len] = '\0'; 7521d86b91cSPoul-Henning Kamp p = val; 753cbc134adSMatthew D Fleming sign = ctl_sign[ctltype]; 754cbc134adSMatthew D Fleming intlen = ctl_size[ctltype]; 755cbc134adSMatthew D Fleming 756f8e4b4efSMatthew D Fleming switch (ctltype) { 757f8e4b4efSMatthew D Fleming case CTLTYPE_STRING: 7581d86b91cSPoul-Henning Kamp if (!nflag) 759d0b8aabbSAnton Berezin printf("%s%s", name, sep); 7606d7a8f6cSUlrich Spörlein printf("%.*s", (int)len, p); 761ccf25977SRuslan Ermilov free(oval); 7621d86b91cSPoul-Henning Kamp return (0); 7631d86b91cSPoul-Henning Kamp 764f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 765f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 766f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 767f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 768cbc134adSMatthew D Fleming case CTLTYPE_S64: 769cbc134adSMatthew D Fleming case CTLTYPE_U64: 770dbf9b92fSDoug Rabson if (!nflag) 771d0b8aabbSAnton Berezin printf("%s%s", name, sep); 772e37d2b30SDavid Malone hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; 773fd8c668aSDavid Malone sep1 = ""; 77441e419cbSDavid Malone while (len >= intlen) { 775f8e4b4efSMatthew D Fleming switch (kind & CTLTYPE) { 776f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 777f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 778e37d2b30SDavid Malone umv = *(u_int *)p; 779e37d2b30SDavid Malone mv = *(int *)p; 78041e419cbSDavid Malone break; 781f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 782f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 783e37d2b30SDavid Malone umv = *(u_long *)p; 784e37d2b30SDavid Malone mv = *(long *)p; 78541e419cbSDavid Malone break; 786cbc134adSMatthew D Fleming case CTLTYPE_S64: 787cbc134adSMatthew D Fleming case CTLTYPE_U64: 788cbc134adSMatthew D Fleming umv = *(uint64_t *)p; 789cbc134adSMatthew D Fleming mv = *(int64_t *)p; 79041e419cbSDavid Malone break; 79141e419cbSDavid Malone } 792fd8c668aSDavid Malone fputs(sep1, stdout); 793f8e4b4efSMatthew D Fleming if (xflag) 794e37d2b30SDavid Malone printf("%#0*jx", hexlen, umv); 795f8e4b4efSMatthew D Fleming else if (!sign) 796f8e4b4efSMatthew D Fleming printf(hflag ? "%'ju" : "%ju", umv); 79741e419cbSDavid Malone else if (fmt[1] == 'K') { 798e37d2b30SDavid Malone if (mv < 0) 79921e1f596SDavid Malone printf("%jd", mv); 8009701cd40SJohn Baldwin else 80121e1f596SDavid Malone printf("%.1fC", (mv - 2732.0) / 10); 802c591d41fSPeter Wemm } else 803fd8c668aSDavid Malone printf(hflag ? "%'jd" : "%jd", mv); 804fd8c668aSDavid Malone sep1 = " "; 80541e419cbSDavid Malone len -= intlen; 80641e419cbSDavid Malone p += intlen; 807aa02fb57SPoul-Henning Kamp } 808ccf25977SRuslan Ermilov free(oval); 809dbf9b92fSDoug Rabson return (0); 810dbf9b92fSDoug Rabson 811f8e4b4efSMatthew D Fleming case CTLTYPE_OPAQUE: 8121d86b91cSPoul-Henning Kamp i = 0; 813a89ab9bbSDag-Erling Smørgrav if (strcmp(fmt, "S,clockinfo") == 0) 814a89ab9bbSDag-Erling Smørgrav func = S_clockinfo; 815a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,timeval") == 0) 816a89ab9bbSDag-Erling Smørgrav func = S_timeval; 817a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,loadavg") == 0) 818a89ab9bbSDag-Erling Smørgrav func = S_loadavg; 819f7550ecfSMatthew Dillon else if (strcmp(fmt, "S,vmtotal") == 0) 820f7550ecfSMatthew Dillon func = S_vmtotal; 82189871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 82289871cdeSJohn Baldwin else if (strcmp(fmt, "S,bios_smap_xattr") == 0) 82389871cdeSJohn Baldwin func = S_bios_smap_xattr; 82489871cdeSJohn Baldwin #endif 825a89ab9bbSDag-Erling Smørgrav else 826a89ab9bbSDag-Erling Smørgrav func = NULL; 8271d86b91cSPoul-Henning Kamp if (func) { 8281d86b91cSPoul-Henning Kamp if (!nflag) 829d0b8aabbSAnton Berezin printf("%s%s", name, sep); 83048cd487aSHartmut Brandt i = (*func)(len, p); 831ccf25977SRuslan Ermilov free(oval); 83248cd487aSHartmut Brandt return (i); 8331d86b91cSPoul-Henning Kamp } 8341d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 835dea673e9SRodney W. Grimes default: 836ccf25977SRuslan Ermilov if (!oflag && !xflag) { 837ccf25977SRuslan Ermilov free(oval); 8381d86b91cSPoul-Henning Kamp return (1); 839ccf25977SRuslan Ermilov } 8401d86b91cSPoul-Henning Kamp if (!nflag) 841d0b8aabbSAnton Berezin printf("%s%s", name, sep); 8426d7a8f6cSUlrich Spörlein printf("Format:%s Length:%zu Dump:0x", fmt, len); 843a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 8441d86b91cSPoul-Henning Kamp printf("%02x", *p++); 845a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 8461d86b91cSPoul-Henning Kamp printf("..."); 847ccf25977SRuslan Ermilov free(oval); 8481d86b91cSPoul-Henning Kamp return (0); 8491d86b91cSPoul-Henning Kamp } 850ccf25977SRuslan Ermilov free(oval); 8511d86b91cSPoul-Henning Kamp return (1); 852dea673e9SRodney W. Grimes } 853dea673e9SRodney W. Grimes 8541d86b91cSPoul-Henning Kamp static int 8551d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len) 856dea673e9SRodney W. Grimes { 8571d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 858dbf9b92fSDoug Rabson int i, j; 859dbf9b92fSDoug Rabson size_t l1, l2; 860dea673e9SRodney W. Grimes 8611d86b91cSPoul-Henning Kamp name1[0] = 0; 8621d86b91cSPoul-Henning Kamp name1[1] = 2; 8631d86b91cSPoul-Henning Kamp l1 = 2; 8641d86b91cSPoul-Henning Kamp if (len) { 8651d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 8661d86b91cSPoul-Henning Kamp l1 += len; 8671d86b91cSPoul-Henning Kamp } else { 8681d86b91cSPoul-Henning Kamp name1[2] = 1; 8691d86b91cSPoul-Henning Kamp l1++; 8701d86b91cSPoul-Henning Kamp } 871a89ab9bbSDag-Erling Smørgrav for (;;) { 87231fb4661SDima Dorfman l2 = sizeof(name2); 8731d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 874c1160fe4SBill Fumerola if (j < 0) { 8751d86b91cSPoul-Henning Kamp if (errno == ENOENT) 87621e1f596SDavid Malone return (0); 8771d86b91cSPoul-Henning Kamp else 8786d7a8f6cSUlrich Spörlein err(1, "sysctl(getnext) %d %zu", j, l2); 879c1160fe4SBill Fumerola } 8801d86b91cSPoul-Henning Kamp 8811d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 8821d86b91cSPoul-Henning Kamp 883fd8c668aSDavid Malone if (len < 0 || l2 < (unsigned int)len) 88421e1f596SDavid Malone return (0); 8851d86b91cSPoul-Henning Kamp 8861d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 8871d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 88821e1f596SDavid Malone return (0); 8891d86b91cSPoul-Henning Kamp 8901d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 8911d86b91cSPoul-Henning Kamp if (!i && !bflag) 8921d86b91cSPoul-Henning Kamp putchar('\n'); 8931d86b91cSPoul-Henning Kamp 8941d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 8951d86b91cSPoul-Henning Kamp l1 = 2 + l2; 8961d86b91cSPoul-Henning Kamp } 897dea673e9SRodney W. Grimes } 898