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> 59d9b1bc77SPhilippe Charnier #include <unistd.h> 60dea673e9SRodney W. Grimes 6124b2aa32SGavin Atkinson static int aflag, bflag, dflag, eflag, hflag, iflag; 629ecd2e32SAlfred Perlstein static int Nflag, nflag, oflag, qflag, Tflag, Wflag, xflag, warncount; 63dea673e9SRodney W. Grimes 641d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 65aae75101SXin LI static void parse(const char *); 661d86b91cSPoul-Henning Kamp static int show_var(int *, int); 671d86b91cSPoul-Henning Kamp static int sysctl_all(int *oid, int len); 681d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 69dea673e9SRodney W. Grimes 70a7b5ad27SEd Schouten static int set_IK(const char *, int *); 71d58f0054SPoul-Henning Kamp 721d86b91cSPoul-Henning Kamp static void 731d86b91cSPoul-Henning Kamp usage(void) 741d86b91cSPoul-Henning Kamp { 75dea673e9SRodney W. Grimes 769a2402bcSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n", 779ecd2e32SAlfred Perlstein "usage: sysctl [-bdehiNnoqTWx] name[=value] ...", 789ecd2e32SAlfred Perlstein " sysctl [-bdehNnoqTWx] -a"); 791d86b91cSPoul-Henning Kamp exit(1); 801d86b91cSPoul-Henning Kamp } 81dea673e9SRodney W. Grimes 82dea673e9SRodney W. Grimes int 831d86b91cSPoul-Henning Kamp main(int argc, char **argv) 84dea673e9SRodney W. Grimes { 851d86b91cSPoul-Henning Kamp int ch; 8645817aaaSDag-Erling Smørgrav 8745817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 881d86b91cSPoul-Henning Kamp setbuf(stdout,0); 891d86b91cSPoul-Henning Kamp setbuf(stderr,0); 90dea673e9SRodney W. Grimes 919ecd2e32SAlfred Perlstein while ((ch = getopt(argc, argv, "AabdehiNnoqTwWxX")) != -1) { 92dea673e9SRodney W. Grimes switch (ch) { 93ca5fac55SDag-Erling Smørgrav case 'A': 949a2402bcSDag-Erling Smørgrav /* compatibility */ 959a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 96ca5fac55SDag-Erling Smørgrav break; 97ca5fac55SDag-Erling Smørgrav case 'a': 98ca5fac55SDag-Erling Smørgrav aflag = 1; 99ca5fac55SDag-Erling Smørgrav break; 100ca5fac55SDag-Erling Smørgrav case 'b': 101ca5fac55SDag-Erling Smørgrav bflag = 1; 102ca5fac55SDag-Erling Smørgrav break; 1036105f815SLuigi Rizzo case 'd': 1046105f815SLuigi Rizzo dflag = 1; 1056105f815SLuigi Rizzo break; 106d0b8aabbSAnton Berezin case 'e': 107d0b8aabbSAnton Berezin eflag = 1; 108d0b8aabbSAnton Berezin break; 10945817aaaSDag-Erling Smørgrav case 'h': 11045817aaaSDag-Erling Smørgrav hflag = 1; 11145817aaaSDag-Erling Smørgrav break; 11224b2aa32SGavin Atkinson case 'i': 11324b2aa32SGavin Atkinson iflag = 1; 11424b2aa32SGavin Atkinson break; 115ca5fac55SDag-Erling Smørgrav case 'N': 116ca5fac55SDag-Erling Smørgrav Nflag = 1; 117ca5fac55SDag-Erling Smørgrav break; 118ca5fac55SDag-Erling Smørgrav case 'n': 119ca5fac55SDag-Erling Smørgrav nflag = 1; 120ca5fac55SDag-Erling Smørgrav break; 1219a2402bcSDag-Erling Smørgrav case 'o': 1229a2402bcSDag-Erling Smørgrav oflag = 1; 1239a2402bcSDag-Erling Smørgrav break; 124f93d36fdSRobert Watson case 'q': 125f93d36fdSRobert Watson qflag = 1; 126f93d36fdSRobert Watson break; 1279ecd2e32SAlfred Perlstein case 'T': 1289ecd2e32SAlfred Perlstein Tflag = 1; 1299ecd2e32SAlfred Perlstein break; 130ca5fac55SDag-Erling Smørgrav case 'w': 1319a2402bcSDag-Erling Smørgrav /* compatibility */ 1329a2402bcSDag-Erling Smørgrav /* ignored */ 133ca5fac55SDag-Erling Smørgrav break; 1349ecd2e32SAlfred Perlstein case 'W': 1359ecd2e32SAlfred Perlstein Wflag = 1; 1369ecd2e32SAlfred Perlstein break; 137ca5fac55SDag-Erling Smørgrav case 'X': 1389a2402bcSDag-Erling Smørgrav /* compatibility */ 1399a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 1409a2402bcSDag-Erling Smørgrav break; 1419a2402bcSDag-Erling Smørgrav case 'x': 1429a2402bcSDag-Erling Smørgrav xflag = 1; 143ca5fac55SDag-Erling Smørgrav break; 144ca5fac55SDag-Erling Smørgrav default: 145ca5fac55SDag-Erling Smørgrav usage(); 146dea673e9SRodney W. Grimes } 147dea673e9SRodney W. Grimes } 148dea673e9SRodney W. Grimes argc -= optind; 149dea673e9SRodney W. Grimes argv += optind; 150dea673e9SRodney W. Grimes 1519a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 15281e7454aSDag-Erling Smørgrav usage(); 1539a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 1541d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 155dea673e9SRodney W. Grimes if (argc == 0) 156dea673e9SRodney W. Grimes usage(); 157d9fcd86cSMike Makonnen 158d9fcd86cSMike Makonnen warncount = 0; 159dea673e9SRodney W. Grimes while (argc-- > 0) 1601d86b91cSPoul-Henning Kamp parse(*argv++); 161d9fcd86cSMike Makonnen exit(warncount); 162dea673e9SRodney W. Grimes } 163dea673e9SRodney W. Grimes 164dea673e9SRodney W. Grimes /* 165dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 166dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 167dea673e9SRodney W. Grimes * Set a new value if requested. 168dea673e9SRodney W. Grimes */ 1691d86b91cSPoul-Henning Kamp static void 170aae75101SXin LI parse(const char *string) 171dea673e9SRodney W. Grimes { 1721d86b91cSPoul-Henning Kamp int len, i, j; 173dea673e9SRodney W. Grimes void *newval = 0; 1741ce1a53dSJim Pirzyk int intval; 1751ce1a53dSJim Pirzyk unsigned int uintval; 1761ce1a53dSJim Pirzyk long longval; 1771ce1a53dSJim Pirzyk unsigned long ulongval; 1781ce1a53dSJim Pirzyk size_t newsize = 0; 179cbc134adSMatthew D Fleming int64_t i64val; 180cbc134adSMatthew D Fleming uint64_t u64val; 181dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 182a78d3eafSRobert Watson char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ]; 1831d86b91cSPoul-Henning Kamp u_int kind; 184dea673e9SRodney W. Grimes 185aae75101SXin LI cp = buf; 1861d4961c0SSuleiman Souhlal if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) 1871d4961c0SSuleiman Souhlal errx(1, "oid too long: '%s'", string); 188aae75101SXin LI bufp = strsep(&cp, "="); 189aae75101SXin LI if (cp != NULL) { 1909ecd2e32SAlfred Perlstein /* Tflag just lists tunables, do not allow assignment */ 1919ecd2e32SAlfred Perlstein if (Tflag || Wflag) { 1929ecd2e32SAlfred Perlstein warnx("Can't set variables when using -T or -W"); 1939ecd2e32SAlfred Perlstein usage(); 1949ecd2e32SAlfred Perlstein } 195dea673e9SRodney W. Grimes while (isspace(*cp)) 196dea673e9SRodney W. Grimes cp++; 197dea673e9SRodney W. Grimes newval = cp; 198dea673e9SRodney W. Grimes newsize = strlen(cp); 199dea673e9SRodney W. Grimes } 2001d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 2011d86b91cSPoul-Henning Kamp 202f93d36fdSRobert Watson if (len < 0) { 20324b2aa32SGavin Atkinson if (iflag) 20424b2aa32SGavin Atkinson return; 205f93d36fdSRobert Watson if (qflag) 206f93d36fdSRobert Watson exit(1); 207f93d36fdSRobert Watson else 208d9b1bc77SPhilippe Charnier errx(1, "unknown oid '%s'", bufp); 209f93d36fdSRobert Watson } 2101d86b91cSPoul-Henning Kamp 211d58f0054SPoul-Henning Kamp if (oidfmt(mib, len, fmt, &kind)) 212d9b1bc77SPhilippe Charnier err(1, "couldn't find format of oid '%s'", bufp); 2131d86b91cSPoul-Henning Kamp 2140b6230f1SJohn Baldwin if (newval == NULL || dflag) { 2151d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 216b2680e20SMatthew N. Dodd if (dflag) { 217b2680e20SMatthew N. Dodd i = show_var(mib, len); 218b2680e20SMatthew N. Dodd if (!i && !bflag) 219b2680e20SMatthew N. Dodd putchar('\n'); 220b2680e20SMatthew N. Dodd } 2211d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 2221d86b91cSPoul-Henning Kamp } else { 2231d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2241d86b91cSPoul-Henning Kamp if (!i && !bflag) 2251d86b91cSPoul-Henning Kamp putchar('\n'); 226dea673e9SRodney W. Grimes } 2271d86b91cSPoul-Henning Kamp } else { 2281d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) 2291d86b91cSPoul-Henning Kamp errx(1, "oid '%s' isn't a leaf node", bufp); 230dea673e9SRodney W. Grimes 231ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 2329b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 233ac8711d2SMike Silbersack warnx("oid '%s' is a read only tunable", bufp); 234ac8711d2SMike Silbersack errx(1, "Tunable values are set in /boot/loader.conf"); 2359b4b73b7SMike Silbersack } else { 2361d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is read only", bufp); 2379b4b73b7SMike Silbersack } 238ac8711d2SMike Silbersack } 239dea673e9SRodney W. Grimes 240a78d3eafSRobert Watson if ((kind & CTLTYPE) == CTLTYPE_INT || 241a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_UINT || 242a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_LONG || 2434d90830fSDima Dorfman (kind & CTLTYPE) == CTLTYPE_ULONG || 244cbc134adSMatthew D Fleming (kind & CTLTYPE) == CTLTYPE_S64 || 245cbc134adSMatthew D Fleming (kind & CTLTYPE) == CTLTYPE_U64) { 246a78d3eafSRobert Watson if (strlen(newval) == 0) 247a78d3eafSRobert Watson errx(1, "empty numeric value"); 248a78d3eafSRobert Watson } 249a78d3eafSRobert Watson 2501d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 251dea673e9SRodney W. Grimes case CTLTYPE_INT: 252d45564dcSHajimu UMEMOTO if (strcmp(fmt, "IK") == 0) { 25321e1f596SDavid Malone if (!set_IK(newval, &intval)) 254d45564dcSHajimu UMEMOTO errx(1, "invalid value '%s'", 255fd8c668aSDavid Malone (char *)newval); 256d45564dcSHajimu UMEMOTO } else { 257d45564dcSHajimu UMEMOTO intval = (int)strtol(newval, &endptr, 258d45564dcSHajimu UMEMOTO 0); 259a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 260a78d3eafSRobert Watson errx(1, "invalid integer '%s'", 261fd8c668aSDavid Malone (char *)newval); 262d45564dcSHajimu UMEMOTO } 263dea673e9SRodney W. Grimes newval = &intval; 26431fb4661SDima Dorfman newsize = sizeof(intval); 265dea673e9SRodney W. Grimes break; 2661ce1a53dSJim Pirzyk case CTLTYPE_UINT: 267a78d3eafSRobert Watson uintval = (int) strtoul(newval, &endptr, 0); 268a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 269a78d3eafSRobert Watson errx(1, "invalid unsigned integer '%s'", 270fd8c668aSDavid Malone (char *)newval); 2711ce1a53dSJim Pirzyk newval = &uintval; 27221e1f596SDavid Malone newsize = sizeof(uintval); 2731ce1a53dSJim Pirzyk break; 2741ce1a53dSJim Pirzyk case CTLTYPE_LONG: 275a78d3eafSRobert Watson longval = strtol(newval, &endptr, 0); 276a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 277a78d3eafSRobert Watson errx(1, "invalid long integer '%s'", 278fd8c668aSDavid Malone (char *)newval); 2791ce1a53dSJim Pirzyk newval = &longval; 28021e1f596SDavid Malone newsize = sizeof(longval); 2811ce1a53dSJim Pirzyk break; 2821ce1a53dSJim Pirzyk case CTLTYPE_ULONG: 283a78d3eafSRobert Watson ulongval = strtoul(newval, &endptr, 0); 284a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 285a78d3eafSRobert Watson errx(1, "invalid unsigned long integer" 286fd8c668aSDavid Malone " '%s'", (char *)newval); 2871ce1a53dSJim Pirzyk newval = &ulongval; 28821e1f596SDavid Malone newsize = sizeof(ulongval); 2891d86b91cSPoul-Henning Kamp break; 2901d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 2911d86b91cSPoul-Henning Kamp break; 292cbc134adSMatthew D Fleming case CTLTYPE_S64: 293cbc134adSMatthew D Fleming i64val = strtoimax(newval, &endptr, 0); 2946d7a8f6cSUlrich Spörlein if (endptr == newval || *endptr != '\0') 295cbc134adSMatthew D Fleming errx(1, "invalid int64_t '%s'", 296cbc134adSMatthew D Fleming (char *)newval); 297cbc134adSMatthew D Fleming newval = &i64val; 298cbc134adSMatthew D Fleming newsize = sizeof(i64val); 299cbc134adSMatthew D Fleming break; 300cbc134adSMatthew D Fleming case CTLTYPE_U64: 301cbc134adSMatthew D Fleming u64val = strtoumax(newval, &endptr, 0); 302cbc134adSMatthew D Fleming if (endptr == newval || *endptr != '\0') 303cbc134adSMatthew D Fleming errx(1, "invalid uint64_t '%s'", 304cbc134adSMatthew D Fleming (char *)newval); 305cbc134adSMatthew D Fleming newval = &u64val; 306cbc134adSMatthew D Fleming newsize = sizeof(u64val); 307dea673e9SRodney W. Grimes break; 308d58f0054SPoul-Henning Kamp case CTLTYPE_OPAQUE: 309d58f0054SPoul-Henning Kamp /* FALLTHROUGH */ 3101d86b91cSPoul-Henning Kamp default: 3111d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is type %d," 31214b94d04SJohn Polstra " cannot set that", bufp, 31314b94d04SJohn Polstra kind & CTLTYPE); 314dea673e9SRodney W. Grimes } 3151d86b91cSPoul-Henning Kamp 3161d86b91cSPoul-Henning Kamp i = show_var(mib, len); 3171d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 3181d86b91cSPoul-Henning Kamp if (!i && !bflag) 3191d86b91cSPoul-Henning Kamp putchar('\n'); 320dea673e9SRodney W. Grimes switch (errno) { 321dea673e9SRodney W. Grimes case EOPNOTSUPP: 322d9b1bc77SPhilippe Charnier errx(1, "%s: value is not available", 3231d86b91cSPoul-Henning Kamp string); 324dea673e9SRodney W. Grimes case ENOTDIR: 325d9b1bc77SPhilippe Charnier errx(1, "%s: specification is incomplete", 326dea673e9SRodney W. Grimes string); 327dea673e9SRodney W. Grimes case ENOMEM: 328d9b1bc77SPhilippe Charnier errx(1, "%s: type is unknown to this program", 329dea673e9SRodney W. Grimes string); 330dea673e9SRodney W. Grimes default: 331d9b1bc77SPhilippe Charnier warn("%s", string); 332d9fcd86cSMike Makonnen warncount++; 333dea673e9SRodney W. Grimes return; 334dea673e9SRodney W. Grimes } 335dea673e9SRodney W. Grimes } 3361d86b91cSPoul-Henning Kamp if (!bflag) 3371d86b91cSPoul-Henning Kamp printf(" -> "); 3381d86b91cSPoul-Henning Kamp i = nflag; 3391d86b91cSPoul-Henning Kamp nflag = 1; 3401d86b91cSPoul-Henning Kamp j = show_var(mib, len); 3411d86b91cSPoul-Henning Kamp if (!j && !bflag) 3421d86b91cSPoul-Henning Kamp putchar('\n'); 3431d86b91cSPoul-Henning Kamp nflag = i; 344dea673e9SRodney W. Grimes } 345dea673e9SRodney W. Grimes } 346dea673e9SRodney W. Grimes 3471d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 348dea673e9SRodney W. Grimes 3491d86b91cSPoul-Henning Kamp static int 3501d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p) 3511d86b91cSPoul-Henning Kamp { 3521d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 35321e1f596SDavid Malone 354996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 3556d7a8f6cSUlrich Spörlein warnx("S_clockinfo %d != %zu", l2, sizeof(*ci)); 3566b6b665bSBruce Evans return (1); 357996076bbSAlfred Perlstein } 35845817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 35945817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 360b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 3611d86b91cSPoul-Henning Kamp return (0); 362dea673e9SRodney W. Grimes } 363dea673e9SRodney W. Grimes 3641d86b91cSPoul-Henning Kamp static int 3651d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p) 3661d86b91cSPoul-Henning Kamp { 3671d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 3681d86b91cSPoul-Henning Kamp 369996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 3706d7a8f6cSUlrich Spörlein warnx("S_loadavg %d != %zu", l2, sizeof(*tv)); 3716b6b665bSBruce Evans return (1); 372996076bbSAlfred Perlstein } 37345817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 3741d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 3751d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 3761d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 3771d86b91cSPoul-Henning Kamp return (0); 378dea673e9SRodney W. Grimes } 379dea673e9SRodney W. Grimes 3801d86b91cSPoul-Henning Kamp static int 3811d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p) 3821d86b91cSPoul-Henning Kamp { 3831d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 384c2deb608SBruce Evans time_t tv_sec; 3851d86b91cSPoul-Henning Kamp char *p1, *p2; 386dea673e9SRodney W. Grimes 387996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 3886d7a8f6cSUlrich Spörlein warnx("S_timeval %d != %zu", l2, sizeof(*tv)); 3896b6b665bSBruce Evans return (1); 390996076bbSAlfred Perlstein } 391db87e2dcSJohn Hay printf(hflag ? "{ sec = %'jd, usec = %'ld } " : 392db87e2dcSJohn Hay "{ sec = %jd, usec = %ld } ", 393db87e2dcSJohn Hay (intmax_t)tv->tv_sec, tv->tv_usec); 394c2deb608SBruce Evans tv_sec = tv->tv_sec; 395c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 3961d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 3971d86b91cSPoul-Henning Kamp if (*p2 == '\n') 3981d86b91cSPoul-Henning Kamp *p2 = '\0'; 3991d86b91cSPoul-Henning Kamp fputs(p1, stdout); 400f2359a24SRebecca Cran free(p1); 4011d86b91cSPoul-Henning Kamp return (0); 4021d86b91cSPoul-Henning Kamp } 4031d86b91cSPoul-Henning Kamp 4041d86b91cSPoul-Henning Kamp static int 405f7550ecfSMatthew Dillon S_vmtotal(int l2, void *p) 406f7550ecfSMatthew Dillon { 407f7550ecfSMatthew Dillon struct vmtotal *v = (struct vmtotal *)p; 408654e22e7SMatthew Dillon int pageKilo = getpagesize() / 1024; 409f7550ecfSMatthew Dillon 410f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 4116d7a8f6cSUlrich Spörlein warnx("S_vmtotal %d != %zu", l2, sizeof(*v)); 4126b6b665bSBruce Evans return (1); 413f7550ecfSMatthew Dillon } 414f7550ecfSMatthew Dillon 415654e22e7SMatthew Dillon printf( 416654e22e7SMatthew Dillon "\nSystem wide totals computed every five seconds:" 417654e22e7SMatthew Dillon " (values in kilobytes)\n"); 418f7550ecfSMatthew Dillon printf("===============================================\n"); 419654e22e7SMatthew Dillon printf( 420bad4d172SRuslan Ermilov "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: " 421bad4d172SRuslan Ermilov "%hd Sleep: %hd)\n", 422f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 423654e22e7SMatthew Dillon printf( 42413e86ef7SMarko Zec "Virtual Memory:\t\t(Total: %dK Active: %dK)\n", 425bad4d172SRuslan Ermilov v->t_vm * pageKilo, v->t_avm * pageKilo); 42613e86ef7SMarko Zec printf("Real Memory:\t\t(Total: %dK Active: %dK)\n", 427bad4d172SRuslan Ermilov v->t_rm * pageKilo, v->t_arm * pageKilo); 428bad4d172SRuslan Ermilov printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n", 429bad4d172SRuslan Ermilov v->t_vmshr * pageKilo, v->t_avmshr * pageKilo); 430bad4d172SRuslan Ermilov printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n", 431bad4d172SRuslan Ermilov v->t_rmshr * pageKilo, v->t_armshr * pageKilo); 432ad0e6cdaSEitan Adler printf("Free Memory:\t%dK\n", v->t_free * pageKilo); 433f7550ecfSMatthew Dillon 434f7550ecfSMatthew Dillon return (0); 435f7550ecfSMatthew Dillon } 436f7550ecfSMatthew Dillon 437f7550ecfSMatthew Dillon static int 438a7b5ad27SEd Schouten set_IK(const char *str, int *val) 439d45564dcSHajimu UMEMOTO { 440d45564dcSHajimu UMEMOTO float temp; 441d45564dcSHajimu UMEMOTO int len, kelv; 442a7b5ad27SEd Schouten const char *p; 443a7b5ad27SEd Schouten char *endptr; 444d45564dcSHajimu UMEMOTO 445d45564dcSHajimu UMEMOTO if ((len = strlen(str)) == 0) 446d45564dcSHajimu UMEMOTO return (0); 447d45564dcSHajimu UMEMOTO p = &str[len - 1]; 448d45564dcSHajimu UMEMOTO if (*p == 'C' || *p == 'F') { 449d45564dcSHajimu UMEMOTO temp = strtof(str, &endptr); 450a7b5ad27SEd Schouten if (endptr == str || endptr != p) 451d45564dcSHajimu UMEMOTO return (0); 452d45564dcSHajimu UMEMOTO if (*p == 'F') 453d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 454d45564dcSHajimu UMEMOTO kelv = temp * 10 + 2732; 455d45564dcSHajimu UMEMOTO } else { 456d45564dcSHajimu UMEMOTO kelv = (int)strtol(str, &endptr, 10); 457d45564dcSHajimu UMEMOTO if (endptr == str || *endptr != '\0') 458d45564dcSHajimu UMEMOTO return (0); 459d45564dcSHajimu UMEMOTO } 460d45564dcSHajimu UMEMOTO *val = kelv; 461d45564dcSHajimu UMEMOTO return (1); 462d45564dcSHajimu UMEMOTO } 463d45564dcSHajimu UMEMOTO 4641d86b91cSPoul-Henning Kamp /* 4651d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 4661d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 4671d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 4681d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 4691d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 4701d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 4711d86b91cSPoul-Henning Kamp */ 4721d86b91cSPoul-Henning Kamp 4731d86b91cSPoul-Henning Kamp static int 4741d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 4751d86b91cSPoul-Henning Kamp { 4761d86b91cSPoul-Henning Kamp int oid[2]; 477dbf9b92fSDoug Rabson int i; 478dbf9b92fSDoug Rabson size_t j; 4791d86b91cSPoul-Henning Kamp 4801d86b91cSPoul-Henning Kamp oid[0] = 0; 4811d86b91cSPoul-Henning Kamp oid[1] = 3; 4821d86b91cSPoul-Henning Kamp 4831d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 4841d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 4851d86b91cSPoul-Henning Kamp if (i < 0) 48621e1f596SDavid Malone return (i); 4871d86b91cSPoul-Henning Kamp j /= sizeof(int); 4881d86b91cSPoul-Henning Kamp return (j); 4891d86b91cSPoul-Henning Kamp } 4901d86b91cSPoul-Henning Kamp 4911d86b91cSPoul-Henning Kamp static int 4921d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 4931d86b91cSPoul-Henning Kamp { 4941d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 4951d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 496dbf9b92fSDoug Rabson int i; 497dbf9b92fSDoug Rabson size_t j; 4981d86b91cSPoul-Henning Kamp 4991d86b91cSPoul-Henning Kamp qoid[0] = 0; 5001d86b91cSPoul-Henning Kamp qoid[1] = 4; 5011d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 5021d86b91cSPoul-Henning Kamp 50331fb4661SDima Dorfman j = sizeof(buf); 5041d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 5051d86b91cSPoul-Henning Kamp if (i) 5066d7a8f6cSUlrich Spörlein err(1, "sysctl fmt %d %zu %d", i, j, errno); 5071d86b91cSPoul-Henning Kamp 5081d86b91cSPoul-Henning Kamp if (kind) 5091d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 5101d86b91cSPoul-Henning Kamp 5111d86b91cSPoul-Henning Kamp if (fmt) 5121d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 51321e1f596SDavid Malone return (0); 5141d86b91cSPoul-Henning Kamp } 5151d86b91cSPoul-Henning Kamp 516cbc134adSMatthew D Fleming static int ctl_sign[CTLTYPE+1] = { 517cbc134adSMatthew D Fleming [CTLTYPE_INT] = 1, 518cbc134adSMatthew D Fleming [CTLTYPE_LONG] = 1, 519cbc134adSMatthew D Fleming [CTLTYPE_S64] = 1, 520cbc134adSMatthew D Fleming }; 521cbc134adSMatthew D Fleming 522cbc134adSMatthew D Fleming static int ctl_size[CTLTYPE+1] = { 523cbc134adSMatthew D Fleming [CTLTYPE_INT] = sizeof(int), 524cbc134adSMatthew D Fleming [CTLTYPE_UINT] = sizeof(u_int), 525cbc134adSMatthew D Fleming [CTLTYPE_LONG] = sizeof(long), 526cbc134adSMatthew D Fleming [CTLTYPE_ULONG] = sizeof(u_long), 527cbc134adSMatthew D Fleming [CTLTYPE_S64] = sizeof(int64_t), 528cbc134adSMatthew D Fleming [CTLTYPE_U64] = sizeof(int64_t), 529cbc134adSMatthew D Fleming }; 530cbc134adSMatthew D Fleming 53160cf2c12SLuigi Rizzo /* 5321d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 5331d86b91cSPoul-Henning Kamp * 5341d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 5351d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 5361d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 5371d86b91cSPoul-Henning Kamp */ 5381d86b91cSPoul-Henning Kamp static int 5391d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 5401d86b91cSPoul-Henning Kamp { 541ccf25977SRuslan Ermilov u_char buf[BUFSIZ], *val, *oval, *p; 542*403c7f59SAlfred Perlstein char name[BUFSIZ], fmt[BUFSIZ]; 543fd8c668aSDavid Malone const char *sep, *sep1; 5441d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 54521e1f596SDavid Malone uintmax_t umv; 54621e1f596SDavid Malone intmax_t mv; 547f8e4b4efSMatthew D Fleming int i, hexlen, sign, ctltype; 54841e419cbSDavid Malone size_t intlen; 549dbf9b92fSDoug Rabson size_t j, len; 5501d86b91cSPoul-Henning Kamp u_int kind; 551a89ab9bbSDag-Erling Smørgrav int (*func)(int, void *); 5521d86b91cSPoul-Henning Kamp 5536d7a8f6cSUlrich Spörlein /* Silence GCC. */ 5546d7a8f6cSUlrich Spörlein umv = mv = intlen = 0; 5556d7a8f6cSUlrich Spörlein 5569f98e452SMatthew N. Dodd bzero(buf, BUFSIZ); 557*403c7f59SAlfred Perlstein bzero(fmt, BUFSIZ); 5589f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 55981e7454aSDag-Erling Smørgrav qoid[0] = 0; 56081e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 56181e7454aSDag-Erling Smørgrav 56281e7454aSDag-Erling Smørgrav qoid[1] = 1; 56331fb4661SDima Dorfman j = sizeof(name); 56481e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 56581e7454aSDag-Erling Smørgrav if (i || !j) 5666d7a8f6cSUlrich Spörlein err(1, "sysctl name %d %zu %d", i, j, errno); 56781e7454aSDag-Erling Smørgrav 568*403c7f59SAlfred Perlstein oidfmt(oid, nlen, fmt, &kind); 569*403c7f59SAlfred Perlstein /* if Wflag then only list sysctls that are writeable and not stats. */ 570*403c7f59SAlfred Perlstein if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) 571*403c7f59SAlfred Perlstein return 1; 572*403c7f59SAlfred Perlstein 573*403c7f59SAlfred Perlstein /* if Tflag then only list sysctls that are tuneables. */ 574*403c7f59SAlfred Perlstein if (Tflag && (kind & CTLFLAG_TUN) == 0) 575*403c7f59SAlfred Perlstein return 1; 576*403c7f59SAlfred Perlstein 577ca5fac55SDag-Erling Smørgrav if (Nflag) { 578ca5fac55SDag-Erling Smørgrav printf("%s", name); 579ca5fac55SDag-Erling Smørgrav return (0); 580ca5fac55SDag-Erling Smørgrav } 581ca5fac55SDag-Erling Smørgrav 582d0b8aabbSAnton Berezin if (eflag) 583d0b8aabbSAnton Berezin sep = "="; 584d0b8aabbSAnton Berezin else 585d0b8aabbSAnton Berezin sep = ": "; 586d0b8aabbSAnton Berezin 5876105f815SLuigi Rizzo if (dflag) { /* just print description */ 5886105f815SLuigi Rizzo qoid[1] = 5; 5896105f815SLuigi Rizzo j = sizeof(buf); 5906105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 5916105f815SLuigi Rizzo if (!nflag) 5926105f815SLuigi Rizzo printf("%s%s", name, sep); 5936105f815SLuigi Rizzo printf("%s", buf); 5946105f815SLuigi Rizzo return (0); 5956105f815SLuigi Rizzo } 5961d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 5971d86b91cSPoul-Henning Kamp j = 0; 5981d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 5991d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 6001d86b91cSPoul-Henning Kamp 601ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 602ccf25977SRuslan Ermilov if (val == NULL) { 603ccf25977SRuslan Ermilov warnx("malloc failed"); 6046b6b665bSBruce Evans return (1); 605ccf25977SRuslan Ermilov } 6061d86b91cSPoul-Henning Kamp len = j; 6071d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 608ccf25977SRuslan Ermilov if (i || !len) { 609ccf25977SRuslan Ermilov free(oval); 6101d86b91cSPoul-Henning Kamp return (1); 611ccf25977SRuslan Ermilov } 6121d86b91cSPoul-Henning Kamp 6131d86b91cSPoul-Henning Kamp if (bflag) { 6141d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 615ccf25977SRuslan Ermilov free(oval); 6161d86b91cSPoul-Henning Kamp return (0); 6171d86b91cSPoul-Henning Kamp } 61876d3dc52SAndrey A. Chernov val[len] = '\0'; 6191d86b91cSPoul-Henning Kamp p = val; 620f8e4b4efSMatthew D Fleming ctltype = (kind & CTLTYPE); 621cbc134adSMatthew D Fleming sign = ctl_sign[ctltype]; 622cbc134adSMatthew D Fleming intlen = ctl_size[ctltype]; 623cbc134adSMatthew D Fleming 624f8e4b4efSMatthew D Fleming switch (ctltype) { 625f8e4b4efSMatthew D Fleming case CTLTYPE_STRING: 6261d86b91cSPoul-Henning Kamp if (!nflag) 627d0b8aabbSAnton Berezin printf("%s%s", name, sep); 6286d7a8f6cSUlrich Spörlein printf("%.*s", (int)len, p); 629ccf25977SRuslan Ermilov free(oval); 6301d86b91cSPoul-Henning Kamp return (0); 6311d86b91cSPoul-Henning Kamp 632f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 633f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 634f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 635f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 636cbc134adSMatthew D Fleming case CTLTYPE_S64: 637cbc134adSMatthew D Fleming case CTLTYPE_U64: 638dbf9b92fSDoug Rabson if (!nflag) 639d0b8aabbSAnton Berezin printf("%s%s", name, sep); 640e37d2b30SDavid Malone hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; 641fd8c668aSDavid Malone sep1 = ""; 64241e419cbSDavid Malone while (len >= intlen) { 643f8e4b4efSMatthew D Fleming switch (kind & CTLTYPE) { 644f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 645f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 646e37d2b30SDavid Malone umv = *(u_int *)p; 647e37d2b30SDavid Malone mv = *(int *)p; 64841e419cbSDavid Malone break; 649f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 650f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 651e37d2b30SDavid Malone umv = *(u_long *)p; 652e37d2b30SDavid Malone mv = *(long *)p; 65341e419cbSDavid Malone break; 654cbc134adSMatthew D Fleming case CTLTYPE_S64: 655cbc134adSMatthew D Fleming case CTLTYPE_U64: 656cbc134adSMatthew D Fleming umv = *(uint64_t *)p; 657cbc134adSMatthew D Fleming mv = *(int64_t *)p; 65841e419cbSDavid Malone break; 65941e419cbSDavid Malone } 660fd8c668aSDavid Malone fputs(sep1, stdout); 661f8e4b4efSMatthew D Fleming if (xflag) 662e37d2b30SDavid Malone printf("%#0*jx", hexlen, umv); 663f8e4b4efSMatthew D Fleming else if (!sign) 664f8e4b4efSMatthew D Fleming printf(hflag ? "%'ju" : "%ju", umv); 66541e419cbSDavid Malone else if (fmt[1] == 'K') { 666e37d2b30SDavid Malone if (mv < 0) 66721e1f596SDavid Malone printf("%jd", mv); 6689701cd40SJohn Baldwin else 66921e1f596SDavid Malone printf("%.1fC", (mv - 2732.0) / 10); 670c591d41fSPeter Wemm } else 671fd8c668aSDavid Malone printf(hflag ? "%'jd" : "%jd", mv); 672fd8c668aSDavid Malone sep1 = " "; 67341e419cbSDavid Malone len -= intlen; 67441e419cbSDavid Malone p += intlen; 675aa02fb57SPoul-Henning Kamp } 676ccf25977SRuslan Ermilov free(oval); 677dbf9b92fSDoug Rabson return (0); 678dbf9b92fSDoug Rabson 679f8e4b4efSMatthew D Fleming case CTLTYPE_OPAQUE: 6801d86b91cSPoul-Henning Kamp i = 0; 681a89ab9bbSDag-Erling Smørgrav if (strcmp(fmt, "S,clockinfo") == 0) 682a89ab9bbSDag-Erling Smørgrav func = S_clockinfo; 683a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,timeval") == 0) 684a89ab9bbSDag-Erling Smørgrav func = S_timeval; 685a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,loadavg") == 0) 686a89ab9bbSDag-Erling Smørgrav func = S_loadavg; 687f7550ecfSMatthew Dillon else if (strcmp(fmt, "S,vmtotal") == 0) 688f7550ecfSMatthew Dillon func = S_vmtotal; 689a89ab9bbSDag-Erling Smørgrav else 690a89ab9bbSDag-Erling Smørgrav func = NULL; 6911d86b91cSPoul-Henning Kamp if (func) { 6921d86b91cSPoul-Henning Kamp if (!nflag) 693d0b8aabbSAnton Berezin printf("%s%s", name, sep); 69448cd487aSHartmut Brandt i = (*func)(len, p); 695ccf25977SRuslan Ermilov free(oval); 69648cd487aSHartmut Brandt return (i); 6971d86b91cSPoul-Henning Kamp } 6981d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 699dea673e9SRodney W. Grimes default: 700ccf25977SRuslan Ermilov if (!oflag && !xflag) { 701ccf25977SRuslan Ermilov free(oval); 7021d86b91cSPoul-Henning Kamp return (1); 703ccf25977SRuslan Ermilov } 7041d86b91cSPoul-Henning Kamp if (!nflag) 705d0b8aabbSAnton Berezin printf("%s%s", name, sep); 7066d7a8f6cSUlrich Spörlein printf("Format:%s Length:%zu Dump:0x", fmt, len); 707a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 7081d86b91cSPoul-Henning Kamp printf("%02x", *p++); 709a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 7101d86b91cSPoul-Henning Kamp printf("..."); 711ccf25977SRuslan Ermilov free(oval); 7121d86b91cSPoul-Henning Kamp return (0); 7131d86b91cSPoul-Henning Kamp } 714ccf25977SRuslan Ermilov free(oval); 7151d86b91cSPoul-Henning Kamp return (1); 716dea673e9SRodney W. Grimes } 717dea673e9SRodney W. Grimes 7181d86b91cSPoul-Henning Kamp static int 7191d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len) 720dea673e9SRodney W. Grimes { 7211d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 722dbf9b92fSDoug Rabson int i, j; 723dbf9b92fSDoug Rabson size_t l1, l2; 724dea673e9SRodney W. Grimes 7251d86b91cSPoul-Henning Kamp name1[0] = 0; 7261d86b91cSPoul-Henning Kamp name1[1] = 2; 7271d86b91cSPoul-Henning Kamp l1 = 2; 7281d86b91cSPoul-Henning Kamp if (len) { 7291d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 7301d86b91cSPoul-Henning Kamp l1 += len; 7311d86b91cSPoul-Henning Kamp } else { 7321d86b91cSPoul-Henning Kamp name1[2] = 1; 7331d86b91cSPoul-Henning Kamp l1++; 7341d86b91cSPoul-Henning Kamp } 735a89ab9bbSDag-Erling Smørgrav for (;;) { 73631fb4661SDima Dorfman l2 = sizeof(name2); 7371d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 738c1160fe4SBill Fumerola if (j < 0) { 7391d86b91cSPoul-Henning Kamp if (errno == ENOENT) 74021e1f596SDavid Malone return (0); 7411d86b91cSPoul-Henning Kamp else 7426d7a8f6cSUlrich Spörlein err(1, "sysctl(getnext) %d %zu", j, l2); 743c1160fe4SBill Fumerola } 7441d86b91cSPoul-Henning Kamp 7451d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 7461d86b91cSPoul-Henning Kamp 747fd8c668aSDavid Malone if (len < 0 || l2 < (unsigned int)len) 74821e1f596SDavid Malone return (0); 7491d86b91cSPoul-Henning Kamp 7501d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 7511d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 75221e1f596SDavid Malone return (0); 7531d86b91cSPoul-Henning Kamp 7541d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 7551d86b91cSPoul-Henning Kamp if (!i && !bflag) 7561d86b91cSPoul-Henning Kamp putchar('\n'); 7571d86b91cSPoul-Henning Kamp 7581d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 7591d86b91cSPoul-Henning Kamp l1 = 2 + l2; 7601d86b91cSPoul-Henning Kamp } 761dea673e9SRodney W. Grimes } 762