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 44bca9bbeaSLuigi Rizzo #ifdef __i386__ 45bca9bbeaSLuigi Rizzo #include <sys/reboot.h> /* used for bootdev parsing */ 46bca9bbeaSLuigi Rizzo #endif 47ce685842SBruce Evans #include <sys/param.h> 48ce685842SBruce Evans #include <sys/time.h> 49ce685842SBruce Evans #include <sys/resource.h> 50dea673e9SRodney W. Grimes #include <sys/stat.h> 51dea673e9SRodney W. Grimes #include <sys/sysctl.h> 52f7550ecfSMatthew Dillon #include <sys/vmmeter.h> 53dea673e9SRodney W. Grimes 54d9b1bc77SPhilippe Charnier #include <ctype.h> 55d9b1bc77SPhilippe Charnier #include <err.h> 56dea673e9SRodney W. Grimes #include <errno.h> 5741e419cbSDavid Malone #include <inttypes.h> 5845817aaaSDag-Erling Smørgrav #include <locale.h> 59dea673e9SRodney W. Grimes #include <stdio.h> 60dea673e9SRodney W. Grimes #include <stdlib.h> 61dea673e9SRodney W. Grimes #include <string.h> 62d9b1bc77SPhilippe Charnier #include <unistd.h> 63dea673e9SRodney W. Grimes 64f93d36fdSRobert Watson static int aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag; 65f93d36fdSRobert Watson static int qflag, xflag; 66dea673e9SRodney W. Grimes 671d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 681d86b91cSPoul-Henning Kamp static void parse(char *); 691d86b91cSPoul-Henning Kamp static int show_var(int *, int); 701d86b91cSPoul-Henning Kamp static int sysctl_all (int *oid, int len); 711d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 72dea673e9SRodney W. Grimes 737e9c84c7SPeter Wemm static void set_T_dev_t (char *, void **, size_t *); 74d45564dcSHajimu UMEMOTO static int set_IK(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", 81855b068aSRuslan Ermilov "usage: sysctl [-bdehNnoqx] name[=value] ...", 82855b068aSRuslan Ermilov " sysctl [-bdehNnoqx] -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; 9045817aaaSDag-Erling Smørgrav 9145817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 921d86b91cSPoul-Henning Kamp setbuf(stdout,0); 931d86b91cSPoul-Henning Kamp setbuf(stderr,0); 94dea673e9SRodney W. Grimes 95f93d36fdSRobert Watson while ((ch = getopt(argc, argv, "AabdehNnoqwxX")) != -1) { 96dea673e9SRodney W. Grimes switch (ch) { 97ca5fac55SDag-Erling Smørgrav case 'A': 989a2402bcSDag-Erling Smørgrav /* compatibility */ 999a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 100ca5fac55SDag-Erling Smørgrav break; 101ca5fac55SDag-Erling Smørgrav case 'a': 102ca5fac55SDag-Erling Smørgrav aflag = 1; 103ca5fac55SDag-Erling Smørgrav break; 104ca5fac55SDag-Erling Smørgrav case 'b': 105ca5fac55SDag-Erling Smørgrav bflag = 1; 106ca5fac55SDag-Erling Smørgrav break; 1076105f815SLuigi Rizzo case 'd': 1086105f815SLuigi Rizzo dflag = 1; 1096105f815SLuigi Rizzo break; 110d0b8aabbSAnton Berezin case 'e': 111d0b8aabbSAnton Berezin eflag = 1; 112d0b8aabbSAnton Berezin break; 11345817aaaSDag-Erling Smørgrav case 'h': 11445817aaaSDag-Erling Smørgrav hflag = 1; 11545817aaaSDag-Erling Smørgrav break; 116ca5fac55SDag-Erling Smørgrav case 'N': 117ca5fac55SDag-Erling Smørgrav Nflag = 1; 118ca5fac55SDag-Erling Smørgrav break; 119ca5fac55SDag-Erling Smørgrav case 'n': 120ca5fac55SDag-Erling Smørgrav nflag = 1; 121ca5fac55SDag-Erling Smørgrav break; 1229a2402bcSDag-Erling Smørgrav case 'o': 1239a2402bcSDag-Erling Smørgrav oflag = 1; 1249a2402bcSDag-Erling Smørgrav break; 125f93d36fdSRobert Watson case 'q': 126f93d36fdSRobert Watson qflag = 1; 127f93d36fdSRobert Watson break; 128ca5fac55SDag-Erling Smørgrav case 'w': 1299a2402bcSDag-Erling Smørgrav /* compatibility */ 1309a2402bcSDag-Erling Smørgrav /* ignored */ 131ca5fac55SDag-Erling Smørgrav break; 132ca5fac55SDag-Erling Smørgrav case 'X': 1339a2402bcSDag-Erling Smørgrav /* compatibility */ 1349a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 1359a2402bcSDag-Erling Smørgrav break; 1369a2402bcSDag-Erling Smørgrav case 'x': 1379a2402bcSDag-Erling Smørgrav xflag = 1; 138ca5fac55SDag-Erling Smørgrav break; 139ca5fac55SDag-Erling Smørgrav default: 140ca5fac55SDag-Erling Smørgrav usage(); 141dea673e9SRodney W. Grimes } 142dea673e9SRodney W. Grimes } 143dea673e9SRodney W. Grimes argc -= optind; 144dea673e9SRodney W. Grimes argv += optind; 145dea673e9SRodney W. Grimes 1469a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 14781e7454aSDag-Erling Smørgrav usage(); 1489a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 1491d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 150dea673e9SRodney W. Grimes if (argc == 0) 151dea673e9SRodney W. Grimes usage(); 152dea673e9SRodney W. Grimes while (argc-- > 0) 1531d86b91cSPoul-Henning Kamp parse(*argv++); 154dea673e9SRodney W. Grimes exit(0); 155dea673e9SRodney W. Grimes } 156dea673e9SRodney W. Grimes 157dea673e9SRodney W. Grimes /* 158dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 159dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 160dea673e9SRodney W. Grimes * Set a new value if requested. 161dea673e9SRodney W. Grimes */ 1621d86b91cSPoul-Henning Kamp static void 1631d86b91cSPoul-Henning Kamp parse(char *string) 164dea673e9SRodney W. Grimes { 1651d86b91cSPoul-Henning Kamp int len, i, j; 166dea673e9SRodney W. Grimes void *newval = 0; 1671ce1a53dSJim Pirzyk int intval; 1681ce1a53dSJim Pirzyk unsigned int uintval; 1691ce1a53dSJim Pirzyk long longval; 1701ce1a53dSJim Pirzyk unsigned long ulongval; 1711ce1a53dSJim Pirzyk size_t newsize = 0; 172dea673e9SRodney W. Grimes quad_t quadval; 173dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 174a78d3eafSRobert Watson char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ]; 1751d86b91cSPoul-Henning Kamp u_int kind; 176dea673e9SRodney W. Grimes 177dea673e9SRodney W. Grimes bufp = buf; 1781d4961c0SSuleiman Souhlal if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) 1791d4961c0SSuleiman Souhlal errx(1, "oid too long: '%s'", string); 180dea673e9SRodney W. Grimes if ((cp = strchr(string, '=')) != NULL) { 181dea673e9SRodney W. Grimes *strchr(buf, '=') = '\0'; 182dea673e9SRodney W. Grimes *cp++ = '\0'; 183dea673e9SRodney W. Grimes while (isspace(*cp)) 184dea673e9SRodney W. Grimes cp++; 185dea673e9SRodney W. Grimes newval = cp; 186dea673e9SRodney W. Grimes newsize = strlen(cp); 187dea673e9SRodney W. Grimes } 1881d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 1891d86b91cSPoul-Henning Kamp 190f93d36fdSRobert Watson if (len < 0) { 191f93d36fdSRobert Watson if (qflag) 192f93d36fdSRobert Watson exit(1); 193f93d36fdSRobert Watson else 194d9b1bc77SPhilippe Charnier errx(1, "unknown oid '%s'", bufp); 195f93d36fdSRobert Watson } 1961d86b91cSPoul-Henning Kamp 197d58f0054SPoul-Henning Kamp if (oidfmt(mib, len, fmt, &kind)) 198d9b1bc77SPhilippe Charnier err(1, "couldn't find format of oid '%s'", bufp); 1991d86b91cSPoul-Henning Kamp 2009a2402bcSDag-Erling Smørgrav if (newval == NULL) { 2011d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 202b2680e20SMatthew N. Dodd if (dflag) { 203b2680e20SMatthew N. Dodd i = show_var(mib, len); 204b2680e20SMatthew N. Dodd if (!i && !bflag) 205b2680e20SMatthew N. Dodd putchar('\n'); 206b2680e20SMatthew N. Dodd } 2071d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 2081d86b91cSPoul-Henning Kamp } else { 2091d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2101d86b91cSPoul-Henning Kamp if (!i && !bflag) 2111d86b91cSPoul-Henning Kamp putchar('\n'); 212dea673e9SRodney W. Grimes } 2131d86b91cSPoul-Henning Kamp } else { 2141d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) 2151d86b91cSPoul-Henning Kamp errx(1, "oid '%s' isn't a leaf node", bufp); 216dea673e9SRodney W. Grimes 217ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 2189b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 219ac8711d2SMike Silbersack warnx("oid '%s' is a read only tunable", bufp); 220ac8711d2SMike Silbersack errx(1, "Tunable values are set in /boot/loader.conf"); 2219b4b73b7SMike Silbersack } else { 2221d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is read only", bufp); 2239b4b73b7SMike Silbersack } 224ac8711d2SMike Silbersack } 225dea673e9SRodney W. Grimes 226a78d3eafSRobert Watson if ((kind & CTLTYPE) == CTLTYPE_INT || 227a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_UINT || 228a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_LONG || 2294d90830fSDima Dorfman (kind & CTLTYPE) == CTLTYPE_ULONG || 2304d90830fSDima Dorfman (kind & CTLTYPE) == CTLTYPE_QUAD) { 231a78d3eafSRobert Watson if (strlen(newval) == 0) 232a78d3eafSRobert Watson errx(1, "empty numeric value"); 233a78d3eafSRobert Watson } 234a78d3eafSRobert Watson 2351d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 236dea673e9SRodney W. Grimes case CTLTYPE_INT: 237d45564dcSHajimu UMEMOTO if (strcmp(fmt, "IK") == 0) { 238d45564dcSHajimu UMEMOTO if (!set_IK((char*)newval, &intval)) 239d45564dcSHajimu UMEMOTO errx(1, "invalid value '%s'", 240d45564dcSHajimu UMEMOTO newval); 241d45564dcSHajimu UMEMOTO } else { 242d45564dcSHajimu UMEMOTO intval = (int)strtol(newval, &endptr, 243d45564dcSHajimu UMEMOTO 0); 244a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 245a78d3eafSRobert Watson errx(1, "invalid integer '%s'", 246a78d3eafSRobert Watson newval); 247d45564dcSHajimu UMEMOTO } 248dea673e9SRodney W. Grimes newval = &intval; 24931fb4661SDima Dorfman newsize = sizeof(intval); 250dea673e9SRodney W. Grimes break; 2511ce1a53dSJim Pirzyk case CTLTYPE_UINT: 252a78d3eafSRobert Watson uintval = (int) strtoul(newval, &endptr, 0); 253a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 254a78d3eafSRobert Watson errx(1, "invalid unsigned integer '%s'", 255a78d3eafSRobert Watson newval); 2561ce1a53dSJim Pirzyk newval = &uintval; 2571ce1a53dSJim Pirzyk newsize = sizeof uintval; 2581ce1a53dSJim Pirzyk break; 2591ce1a53dSJim Pirzyk case CTLTYPE_LONG: 260a78d3eafSRobert Watson longval = strtol(newval, &endptr, 0); 261a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 262a78d3eafSRobert Watson errx(1, "invalid long integer '%s'", 263a78d3eafSRobert Watson newval); 2641ce1a53dSJim Pirzyk newval = &longval; 2651ce1a53dSJim Pirzyk newsize = sizeof longval; 2661ce1a53dSJim Pirzyk break; 2671ce1a53dSJim Pirzyk case CTLTYPE_ULONG: 268a78d3eafSRobert Watson ulongval = strtoul(newval, &endptr, 0); 269a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 270a78d3eafSRobert Watson errx(1, "invalid unsigned long integer" 271a78d3eafSRobert Watson " '%s'", newval); 2721ce1a53dSJim Pirzyk newval = &ulongval; 2731ce1a53dSJim Pirzyk newsize = sizeof ulongval; 2741d86b91cSPoul-Henning Kamp break; 2751d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 2761d86b91cSPoul-Henning Kamp break; 277dea673e9SRodney W. Grimes case CTLTYPE_QUAD: 278dea673e9SRodney W. Grimes sscanf(newval, "%qd", &quadval); 279dea673e9SRodney W. Grimes newval = &quadval; 28031fb4661SDima Dorfman newsize = sizeof(quadval); 281dea673e9SRodney W. Grimes break; 282d58f0054SPoul-Henning Kamp case CTLTYPE_OPAQUE: 283d58f0054SPoul-Henning Kamp if (strcmp(fmt, "T,dev_t") == 0) { 284d58f0054SPoul-Henning Kamp set_T_dev_t ((char*)newval, &newval, &newsize); 285d58f0054SPoul-Henning Kamp break; 286d58f0054SPoul-Henning Kamp } 287d58f0054SPoul-Henning Kamp /* FALLTHROUGH */ 2881d86b91cSPoul-Henning Kamp default: 2891d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is type %d," 29014b94d04SJohn Polstra " cannot set that", bufp, 29114b94d04SJohn Polstra kind & CTLTYPE); 292dea673e9SRodney W. Grimes } 2931d86b91cSPoul-Henning Kamp 2941d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2951d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 2961d86b91cSPoul-Henning Kamp if (!i && !bflag) 2971d86b91cSPoul-Henning Kamp putchar('\n'); 298dea673e9SRodney W. Grimes switch (errno) { 299dea673e9SRodney W. Grimes case EOPNOTSUPP: 300d9b1bc77SPhilippe Charnier errx(1, "%s: value is not available", 3011d86b91cSPoul-Henning Kamp string); 302dea673e9SRodney W. Grimes case ENOTDIR: 303d9b1bc77SPhilippe Charnier errx(1, "%s: specification is incomplete", 304dea673e9SRodney W. Grimes string); 305dea673e9SRodney W. Grimes case ENOMEM: 306d9b1bc77SPhilippe Charnier errx(1, "%s: type is unknown to this program", 307dea673e9SRodney W. Grimes string); 308dea673e9SRodney W. Grimes default: 309d9b1bc77SPhilippe Charnier warn("%s", string); 310dea673e9SRodney W. Grimes return; 311dea673e9SRodney W. Grimes } 312dea673e9SRodney W. Grimes } 3131d86b91cSPoul-Henning Kamp if (!bflag) 3141d86b91cSPoul-Henning Kamp printf(" -> "); 3151d86b91cSPoul-Henning Kamp i = nflag; 3161d86b91cSPoul-Henning Kamp nflag = 1; 3171d86b91cSPoul-Henning Kamp j = show_var(mib, len); 3181d86b91cSPoul-Henning Kamp if (!j && !bflag) 3191d86b91cSPoul-Henning Kamp putchar('\n'); 3201d86b91cSPoul-Henning Kamp nflag = i; 321dea673e9SRodney W. Grimes } 322dea673e9SRodney W. Grimes } 323dea673e9SRodney W. Grimes 3241d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 325dea673e9SRodney W. Grimes 3261d86b91cSPoul-Henning Kamp static int 3271d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p) 3281d86b91cSPoul-Henning Kamp { 3291d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 330996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 331996076bbSAlfred Perlstein warnx("S_clockinfo %d != %d", l2, sizeof(*ci)); 332996076bbSAlfred Perlstein return (0); 333996076bbSAlfred Perlstein } 33445817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 33545817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 336b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 3371d86b91cSPoul-Henning Kamp return (0); 338dea673e9SRodney W. Grimes } 339dea673e9SRodney W. Grimes 3401d86b91cSPoul-Henning Kamp static int 3411d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p) 3421d86b91cSPoul-Henning Kamp { 3431d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 3441d86b91cSPoul-Henning Kamp 345996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 346996076bbSAlfred Perlstein warnx("S_loadavg %d != %d", l2, sizeof(*tv)); 347996076bbSAlfred Perlstein return (0); 348996076bbSAlfred Perlstein } 34945817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 3501d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 3511d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 3521d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 3531d86b91cSPoul-Henning Kamp return (0); 354dea673e9SRodney W. Grimes } 355dea673e9SRodney W. Grimes 3561d86b91cSPoul-Henning Kamp static int 3571d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p) 3581d86b91cSPoul-Henning Kamp { 3591d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 360c2deb608SBruce Evans time_t tv_sec; 3611d86b91cSPoul-Henning Kamp char *p1, *p2; 362dea673e9SRodney W. Grimes 363996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 364996076bbSAlfred Perlstein warnx("S_timeval %d != %d", l2, sizeof(*tv)); 365996076bbSAlfred Perlstein return (0); 366996076bbSAlfred Perlstein } 36745817aaaSDag-Erling Smørgrav printf(hflag ? "{ sec = %'ld, usec = %'ld } " : 36845817aaaSDag-Erling Smørgrav "{ sec = %ld, usec = %ld } ", 3691d86b91cSPoul-Henning Kamp tv->tv_sec, tv->tv_usec); 370c2deb608SBruce Evans tv_sec = tv->tv_sec; 371c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 3721d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 3731d86b91cSPoul-Henning Kamp if (*p2 == '\n') 3741d86b91cSPoul-Henning Kamp *p2 = '\0'; 3751d86b91cSPoul-Henning Kamp fputs(p1, stdout); 3761d86b91cSPoul-Henning Kamp return (0); 3771d86b91cSPoul-Henning Kamp } 3781d86b91cSPoul-Henning Kamp 3791d86b91cSPoul-Henning Kamp static int 380f7550ecfSMatthew Dillon S_vmtotal(int l2, void *p) 381f7550ecfSMatthew Dillon { 382f7550ecfSMatthew Dillon struct vmtotal *v = (struct vmtotal *)p; 383654e22e7SMatthew Dillon int pageKilo = getpagesize() / 1024; 384f7550ecfSMatthew Dillon 385f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 386f7550ecfSMatthew Dillon warnx("S_vmtotal %d != %d", l2, sizeof(*v)); 387f7550ecfSMatthew Dillon return (0); 388f7550ecfSMatthew Dillon } 389f7550ecfSMatthew Dillon 390654e22e7SMatthew Dillon printf( 391654e22e7SMatthew Dillon "\nSystem wide totals computed every five seconds:" 392654e22e7SMatthew Dillon " (values in kilobytes)\n"); 393f7550ecfSMatthew Dillon printf("===============================================\n"); 394654e22e7SMatthew Dillon printf( 395bad4d172SRuslan Ermilov "Processes:\t\t(RUNQ: %hd Disk Wait: %hd Page Wait: " 396bad4d172SRuslan Ermilov "%hd Sleep: %hd)\n", 397f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 398654e22e7SMatthew Dillon printf( 399bad4d172SRuslan Ermilov "Virtual Memory:\t\t(Total: %dK, Active %dK)\n", 400bad4d172SRuslan Ermilov v->t_vm * pageKilo, v->t_avm * pageKilo); 401bad4d172SRuslan Ermilov printf("Real Memory:\t\t(Total: %dK Active %dK)\n", 402bad4d172SRuslan Ermilov v->t_rm * pageKilo, v->t_arm * pageKilo); 403bad4d172SRuslan Ermilov printf("Shared Virtual Memory:\t(Total: %dK Active: %dK)\n", 404bad4d172SRuslan Ermilov v->t_vmshr * pageKilo, v->t_avmshr * pageKilo); 405bad4d172SRuslan Ermilov printf("Shared Real Memory:\t(Total: %dK Active: %dK)\n", 406bad4d172SRuslan Ermilov v->t_rmshr * pageKilo, v->t_armshr * pageKilo); 407bad4d172SRuslan Ermilov printf("Free Memory Pages:\t%dK\n", v->t_free * pageKilo); 408f7550ecfSMatthew Dillon 409f7550ecfSMatthew Dillon return (0); 410f7550ecfSMatthew Dillon } 411f7550ecfSMatthew Dillon 412f7550ecfSMatthew Dillon static int 4131d86b91cSPoul-Henning Kamp T_dev_t(int l2, void *p) 4141d86b91cSPoul-Henning Kamp { 4151d86b91cSPoul-Henning Kamp dev_t *d = (dev_t *)p; 416996076bbSAlfred Perlstein if (l2 != sizeof(*d)) { 417996076bbSAlfred Perlstein warnx("T_dev_T %d != %d", l2, sizeof(*d)); 418996076bbSAlfred Perlstein return (0); 419996076bbSAlfred Perlstein } 4206ed3a297SPoul-Henning Kamp if ((int)(*d) != -1) { 4216ed3a297SPoul-Henning Kamp if (minor(*d) > 255 || minor(*d) < 0) 4226ed3a297SPoul-Henning Kamp printf("{ major = %d, minor = 0x%x }", 4236ed3a297SPoul-Henning Kamp major(*d), minor(*d)); 4246ed3a297SPoul-Henning Kamp else 4251d86b91cSPoul-Henning Kamp printf("{ major = %d, minor = %d }", 4261d86b91cSPoul-Henning Kamp major(*d), minor(*d)); 4276ed3a297SPoul-Henning Kamp } 4281d86b91cSPoul-Henning Kamp return (0); 4291d86b91cSPoul-Henning Kamp } 4301d86b91cSPoul-Henning Kamp 431d58f0054SPoul-Henning Kamp static void 4327e9c84c7SPeter Wemm set_T_dev_t (char *path, void **val, size_t *size) 433d58f0054SPoul-Henning Kamp { 434d58f0054SPoul-Henning Kamp static struct stat statb; 435d58f0054SPoul-Henning Kamp 436d58f0054SPoul-Henning Kamp if (strcmp(path, "none") && strcmp(path, "off")) { 437d58f0054SPoul-Henning Kamp int rc = stat (path, &statb); 438d58f0054SPoul-Henning Kamp if (rc) { 439d58f0054SPoul-Henning Kamp err(1, "cannot stat %s", path); 440d58f0054SPoul-Henning Kamp } 441d58f0054SPoul-Henning Kamp 442d58f0054SPoul-Henning Kamp if (!S_ISCHR(statb.st_mode)) { 443d58f0054SPoul-Henning Kamp errx(1, "must specify a device special file."); 444d58f0054SPoul-Henning Kamp } 445d58f0054SPoul-Henning Kamp } else { 446d58f0054SPoul-Henning Kamp statb.st_rdev = NODEV; 447d58f0054SPoul-Henning Kamp } 448d58f0054SPoul-Henning Kamp *val = (char*) &statb.st_rdev; 449d58f0054SPoul-Henning Kamp *size = sizeof statb.st_rdev; 450d58f0054SPoul-Henning Kamp } 451d58f0054SPoul-Henning Kamp 452d45564dcSHajimu UMEMOTO static int 453d45564dcSHajimu UMEMOTO set_IK(char *str, int *val) 454d45564dcSHajimu UMEMOTO { 455d45564dcSHajimu UMEMOTO float temp; 456d45564dcSHajimu UMEMOTO int len, kelv; 457d45564dcSHajimu UMEMOTO char *p, *endptr; 458d45564dcSHajimu UMEMOTO 459d45564dcSHajimu UMEMOTO if ((len = strlen(str)) == 0) 460d45564dcSHajimu UMEMOTO return (0); 461d45564dcSHajimu UMEMOTO p = &str[len - 1]; 462d45564dcSHajimu UMEMOTO if (*p == 'C' || *p == 'F') { 463d45564dcSHajimu UMEMOTO *p = '\0'; 464d45564dcSHajimu UMEMOTO temp = strtof(str, &endptr); 465d45564dcSHajimu UMEMOTO if (endptr == str || *endptr != '\0') 466d45564dcSHajimu UMEMOTO return (0); 467d45564dcSHajimu UMEMOTO if (*p == 'F') 468d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 469d45564dcSHajimu UMEMOTO kelv = temp * 10 + 2732; 470d45564dcSHajimu UMEMOTO } else { 471d45564dcSHajimu UMEMOTO kelv = (int)strtol(str, &endptr, 10); 472d45564dcSHajimu UMEMOTO if (endptr == str || *endptr != '\0') 473d45564dcSHajimu UMEMOTO return (0); 474d45564dcSHajimu UMEMOTO } 475d45564dcSHajimu UMEMOTO *val = kelv; 476d45564dcSHajimu UMEMOTO return (1); 477d45564dcSHajimu UMEMOTO } 478d45564dcSHajimu UMEMOTO 4791d86b91cSPoul-Henning Kamp /* 4801d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 4811d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 4821d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 4831d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 4841d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 4851d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 4861d86b91cSPoul-Henning Kamp */ 4871d86b91cSPoul-Henning Kamp 4881d86b91cSPoul-Henning Kamp static int 4891d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 4901d86b91cSPoul-Henning Kamp { 4911d86b91cSPoul-Henning Kamp int oid[2]; 492dbf9b92fSDoug Rabson int i; 493dbf9b92fSDoug Rabson size_t j; 4941d86b91cSPoul-Henning Kamp 4951d86b91cSPoul-Henning Kamp oid[0] = 0; 4961d86b91cSPoul-Henning Kamp oid[1] = 3; 4971d86b91cSPoul-Henning Kamp 4981d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 4991d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 5001d86b91cSPoul-Henning Kamp if (i < 0) 5011d86b91cSPoul-Henning Kamp return i; 5021d86b91cSPoul-Henning Kamp j /= sizeof(int); 5031d86b91cSPoul-Henning Kamp return (j); 5041d86b91cSPoul-Henning Kamp } 5051d86b91cSPoul-Henning Kamp 5061d86b91cSPoul-Henning Kamp static int 5071d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 5081d86b91cSPoul-Henning Kamp { 5091d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 5101d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 511dbf9b92fSDoug Rabson int i; 512dbf9b92fSDoug Rabson size_t j; 5131d86b91cSPoul-Henning Kamp 5141d86b91cSPoul-Henning Kamp qoid[0] = 0; 5151d86b91cSPoul-Henning Kamp qoid[1] = 4; 5161d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 5171d86b91cSPoul-Henning Kamp 51831fb4661SDima Dorfman j = sizeof(buf); 5191d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 5201d86b91cSPoul-Henning Kamp if (i) 521d9b1bc77SPhilippe Charnier err(1, "sysctl fmt %d %d %d", i, j, errno); 5221d86b91cSPoul-Henning Kamp 5231d86b91cSPoul-Henning Kamp if (kind) 5241d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 5251d86b91cSPoul-Henning Kamp 5261d86b91cSPoul-Henning Kamp if (fmt) 5271d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 5281d86b91cSPoul-Henning Kamp return 0; 5291d86b91cSPoul-Henning Kamp } 5301d86b91cSPoul-Henning Kamp 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 5391d86b91cSPoul-Henning Kamp static int 5401d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 5411d86b91cSPoul-Henning Kamp { 542ccf25977SRuslan Ermilov u_char buf[BUFSIZ], *val, *oval, *p; 543d0b8aabbSAnton Berezin char name[BUFSIZ], *fmt, *sep; 5441d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 54541e419cbSDavid Malone int i, flen, iv; 54641e419cbSDavid Malone unsigned int uiv; 54741e419cbSDavid Malone long lv; 54841e419cbSDavid Malone unsigned long ulv; 54941e419cbSDavid Malone quad_t qv; 55041e419cbSDavid Malone u_quad_t uqv; 55141e419cbSDavid Malone size_t intlen; 55241e419cbSDavid Malone intmax_t v; 55341e419cbSDavid Malone uintmax_t uv; 554dbf9b92fSDoug Rabson size_t j, len; 5551d86b91cSPoul-Henning Kamp u_int kind; 556a89ab9bbSDag-Erling Smørgrav int (*func)(int, void *); 5571d86b91cSPoul-Henning Kamp 5589f98e452SMatthew N. Dodd bzero(buf, BUFSIZ); 5599f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 56081e7454aSDag-Erling Smørgrav qoid[0] = 0; 56181e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 56281e7454aSDag-Erling Smørgrav 56381e7454aSDag-Erling Smørgrav qoid[1] = 1; 56431fb4661SDima Dorfman j = sizeof(name); 56581e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 56681e7454aSDag-Erling Smørgrav if (i || !j) 56781e7454aSDag-Erling Smørgrav err(1, "sysctl name %d %d %d", i, j, errno); 56881e7454aSDag-Erling Smørgrav 569ca5fac55SDag-Erling Smørgrav if (Nflag) { 570ca5fac55SDag-Erling Smørgrav printf("%s", name); 571ca5fac55SDag-Erling Smørgrav return (0); 572ca5fac55SDag-Erling Smørgrav } 573ca5fac55SDag-Erling Smørgrav 574d0b8aabbSAnton Berezin if (eflag) 575d0b8aabbSAnton Berezin sep = "="; 576d0b8aabbSAnton Berezin else 577d0b8aabbSAnton Berezin sep = ": "; 578d0b8aabbSAnton Berezin 5796105f815SLuigi Rizzo if (dflag) { /* just print description */ 5806105f815SLuigi Rizzo qoid[1] = 5; 5816105f815SLuigi Rizzo j = sizeof(buf); 5826105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 5836105f815SLuigi Rizzo if (!nflag) 5846105f815SLuigi Rizzo printf("%s%s", name, sep); 5856105f815SLuigi Rizzo printf("%s", buf); 5866105f815SLuigi Rizzo return (0); 5876105f815SLuigi Rizzo } 5881d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 5891d86b91cSPoul-Henning Kamp j = 0; 5901d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 5911d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 5921d86b91cSPoul-Henning Kamp 593ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 594ccf25977SRuslan Ermilov if (val == NULL) { 595ccf25977SRuslan Ermilov warnx("malloc failed"); 596ccf25977SRuslan Ermilov return (-1); 597ccf25977SRuslan Ermilov } 5981d86b91cSPoul-Henning Kamp len = j; 5991d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 600ccf25977SRuslan Ermilov if (i || !len) { 601ccf25977SRuslan Ermilov free(oval); 6021d86b91cSPoul-Henning Kamp return (1); 603ccf25977SRuslan Ermilov } 6041d86b91cSPoul-Henning Kamp 6051d86b91cSPoul-Henning Kamp if (bflag) { 6061d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 607ccf25977SRuslan Ermilov free(oval); 6081d86b91cSPoul-Henning Kamp return (0); 6091d86b91cSPoul-Henning Kamp } 61076d3dc52SAndrey A. Chernov val[len] = '\0'; 611d58f0054SPoul-Henning Kamp fmt = buf; 612d58f0054SPoul-Henning Kamp oidfmt(oid, nlen, fmt, &kind); 6131d86b91cSPoul-Henning Kamp p = val; 6141d86b91cSPoul-Henning Kamp switch (*fmt) { 6151d86b91cSPoul-Henning Kamp case 'A': 6161d86b91cSPoul-Henning Kamp if (!nflag) 617d0b8aabbSAnton Berezin printf("%s%s", name, sep); 6189866352eSPeter Wemm printf("%.*s", len, p); 619ccf25977SRuslan Ermilov free(oval); 6201d86b91cSPoul-Henning Kamp return (0); 6211d86b91cSPoul-Henning Kamp 6221d86b91cSPoul-Henning Kamp case 'I': 623dbf9b92fSDoug Rabson case 'L': 62441e419cbSDavid Malone case 'Q': 625dbf9b92fSDoug Rabson if (!nflag) 626d0b8aabbSAnton Berezin printf("%s%s", name, sep); 62741e419cbSDavid Malone switch (*fmt) { 62841e419cbSDavid Malone case 'I': intlen = sizeof(int); flen = 10; break; 62941e419cbSDavid Malone case 'L': intlen = sizeof(long); flen = 18; break; 63041e419cbSDavid Malone case 'Q': intlen = sizeof(quad_t); flen = 18; break; 63141e419cbSDavid Malone } 632aa02fb57SPoul-Henning Kamp val = ""; 63341e419cbSDavid Malone while (len >= intlen) { 63441e419cbSDavid Malone switch (*fmt) { 63541e419cbSDavid Malone case 'I': 63641e419cbSDavid Malone memcpy(&uiv, p, intlen); uv = uiv; 63741e419cbSDavid Malone memcpy(&iv, p, intlen); v = iv; 63841e419cbSDavid Malone break; 63941e419cbSDavid Malone case 'L': 64041e419cbSDavid Malone memcpy(&ulv, p, intlen); uv = ulv; 64141e419cbSDavid Malone memcpy(&lv, p, intlen); v = lv; 64241e419cbSDavid Malone break; 64341e419cbSDavid Malone case 'Q': 64441e419cbSDavid Malone memcpy(&uqv, p, intlen); uv = uqv; 64541e419cbSDavid Malone memcpy(&qv, p, intlen); v = qv; 64641e419cbSDavid Malone break; 64741e419cbSDavid Malone } 64845817aaaSDag-Erling Smørgrav fputs(val, stdout); 64941e419cbSDavid Malone if (fmt[1] == 'U') 65041e419cbSDavid Malone printf(hflag ? "%'ju" : "%ju", uv); 65141e419cbSDavid Malone else if (fmt[1] == 'X') 65241e419cbSDavid Malone printf(hflag ? "%'#0*jx" : "%#0*jx", flen, uv); 65341e419cbSDavid Malone else if (fmt[1] == 'K') { 65441e419cbSDavid Malone if (*(int *)p < 0) 65541e419cbSDavid Malone printf("%jd", v); 6569701cd40SJohn Baldwin else 65741e419cbSDavid Malone printf("%.1fC", (v - 2732.0) / 10); 658c591d41fSPeter Wemm } else 65941e419cbSDavid Malone printf(hflag ? "%'d" : "%d", v); 660aa02fb57SPoul-Henning Kamp val = " "; 66141e419cbSDavid Malone len -= intlen; 66241e419cbSDavid Malone p += intlen; 663aa02fb57SPoul-Henning Kamp } 664ccf25977SRuslan Ermilov free(oval); 665dbf9b92fSDoug Rabson return (0); 666dbf9b92fSDoug Rabson 667dbf9b92fSDoug Rabson case 'P': 668dbf9b92fSDoug Rabson if (!nflag) 669d0b8aabbSAnton Berezin printf("%s%s", name, sep); 670dbf9b92fSDoug Rabson printf("%p", *(void **)p); 671ccf25977SRuslan Ermilov free(oval); 672dbf9b92fSDoug Rabson return (0); 673dbf9b92fSDoug Rabson 6741d86b91cSPoul-Henning Kamp case 'T': 6751d86b91cSPoul-Henning Kamp case 'S': 6761d86b91cSPoul-Henning Kamp i = 0; 677a89ab9bbSDag-Erling Smørgrav if (strcmp(fmt, "S,clockinfo") == 0) 678a89ab9bbSDag-Erling Smørgrav func = S_clockinfo; 679a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,timeval") == 0) 680a89ab9bbSDag-Erling Smørgrav func = S_timeval; 681a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,loadavg") == 0) 682a89ab9bbSDag-Erling Smørgrav func = S_loadavg; 683f7550ecfSMatthew Dillon else if (strcmp(fmt, "S,vmtotal") == 0) 684f7550ecfSMatthew Dillon func = S_vmtotal; 685a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "T,dev_t") == 0) 686a89ab9bbSDag-Erling Smørgrav func = T_dev_t; 687a89ab9bbSDag-Erling Smørgrav else 688a89ab9bbSDag-Erling Smørgrav func = NULL; 6891d86b91cSPoul-Henning Kamp if (func) { 6901d86b91cSPoul-Henning Kamp if (!nflag) 691d0b8aabbSAnton Berezin printf("%s%s", name, sep); 69248cd487aSHartmut Brandt i = (*func)(len, p); 693ccf25977SRuslan Ermilov free(oval); 69448cd487aSHartmut Brandt return (i); 6951d86b91cSPoul-Henning Kamp } 6961d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 697dea673e9SRodney W. Grimes default: 698ccf25977SRuslan Ermilov if (!oflag && !xflag) { 699ccf25977SRuslan Ermilov free(oval); 7001d86b91cSPoul-Henning Kamp return (1); 701ccf25977SRuslan Ermilov } 7021d86b91cSPoul-Henning Kamp if (!nflag) 703d0b8aabbSAnton Berezin printf("%s%s", name, sep); 7041d86b91cSPoul-Henning Kamp printf("Format:%s Length:%d Dump:0x", fmt, len); 705a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 7061d86b91cSPoul-Henning Kamp printf("%02x", *p++); 707a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 7081d86b91cSPoul-Henning Kamp printf("..."); 709ccf25977SRuslan Ermilov free(oval); 7101d86b91cSPoul-Henning Kamp return (0); 7111d86b91cSPoul-Henning Kamp } 712ccf25977SRuslan Ermilov free(oval); 7131d86b91cSPoul-Henning Kamp return (1); 714dea673e9SRodney W. Grimes } 715dea673e9SRodney W. Grimes 7161d86b91cSPoul-Henning Kamp static int 7171d86b91cSPoul-Henning Kamp sysctl_all (int *oid, int len) 718dea673e9SRodney W. Grimes { 7191d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 720dbf9b92fSDoug Rabson int i, j; 721dbf9b92fSDoug Rabson size_t l1, l2; 722dea673e9SRodney W. Grimes 7231d86b91cSPoul-Henning Kamp name1[0] = 0; 7241d86b91cSPoul-Henning Kamp name1[1] = 2; 7251d86b91cSPoul-Henning Kamp l1 = 2; 7261d86b91cSPoul-Henning Kamp if (len) { 7271d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 7281d86b91cSPoul-Henning Kamp l1 += len; 7291d86b91cSPoul-Henning Kamp } else { 7301d86b91cSPoul-Henning Kamp name1[2] = 1; 7311d86b91cSPoul-Henning Kamp l1++; 7321d86b91cSPoul-Henning Kamp } 733a89ab9bbSDag-Erling Smørgrav for (;;) { 73431fb4661SDima Dorfman l2 = sizeof(name2); 7351d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 736c1160fe4SBill Fumerola if (j < 0) { 7371d86b91cSPoul-Henning Kamp if (errno == ENOENT) 7381d86b91cSPoul-Henning Kamp return 0; 7391d86b91cSPoul-Henning Kamp else 740d9b1bc77SPhilippe Charnier err(1, "sysctl(getnext) %d %d", j, l2); 741c1160fe4SBill Fumerola } 7421d86b91cSPoul-Henning Kamp 7431d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 7441d86b91cSPoul-Henning Kamp 7451d86b91cSPoul-Henning Kamp if (l2 < len) 7461d86b91cSPoul-Henning Kamp return 0; 7471d86b91cSPoul-Henning Kamp 7481d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 7491d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 7501d86b91cSPoul-Henning Kamp return 0; 7511d86b91cSPoul-Henning Kamp 7521d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 7531d86b91cSPoul-Henning Kamp if (!i && !bflag) 7541d86b91cSPoul-Henning Kamp putchar('\n'); 7551d86b91cSPoul-Henning Kamp 7561d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 7571d86b91cSPoul-Henning Kamp l1 = 2 + l2; 7581d86b91cSPoul-Henning Kamp } 759dea673e9SRodney W. Grimes } 760