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 * 3. All advertising materials mentioning features or use of this software 14dea673e9SRodney W. Grimes * must display the following acknowledgement: 15dea673e9SRodney W. Grimes * This product includes software developed by the University of 16dea673e9SRodney W. Grimes * California, Berkeley and its contributors. 17dea673e9SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 18dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 19dea673e9SRodney W. Grimes * without specific prior written permission. 20dea673e9SRodney W. Grimes * 21dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31dea673e9SRodney W. Grimes * SUCH DAMAGE. 32dea673e9SRodney W. Grimes */ 33dea673e9SRodney W. Grimes 34dea673e9SRodney W. Grimes #ifndef lint 35d9b1bc77SPhilippe Charnier static const char copyright[] = 36dea673e9SRodney W. Grimes "@(#) Copyright (c) 1993\n\ 37dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 38dea673e9SRodney W. Grimes #endif /* not lint */ 39dea673e9SRodney W. Grimes 40dea673e9SRodney W. Grimes #ifndef lint 41d9b1bc77SPhilippe Charnier #if 0 42d9b1bc77SPhilippe Charnier static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; 43d9b1bc77SPhilippe Charnier #endif 4435c13fa0SGarrett Wollman static const char rcsid[] = 457f3dea24SPeter Wemm "$FreeBSD$"; 46dea673e9SRodney W. Grimes #endif /* not lint */ 47dea673e9SRodney W. Grimes 48bca9bbeaSLuigi Rizzo #ifdef __i386__ 49bca9bbeaSLuigi Rizzo #include <sys/reboot.h> /* used for bootdev parsing */ 50bca9bbeaSLuigi Rizzo #endif 51ce685842SBruce Evans #include <sys/param.h> 52ce685842SBruce Evans #include <sys/time.h> 53ce685842SBruce Evans #include <sys/resource.h> 54dea673e9SRodney W. Grimes #include <sys/stat.h> 55dea673e9SRodney W. Grimes #include <sys/sysctl.h> 56f7550ecfSMatthew Dillon #include <sys/vmmeter.h> 57dea673e9SRodney W. Grimes 58d9b1bc77SPhilippe Charnier #include <ctype.h> 59d9b1bc77SPhilippe Charnier #include <err.h> 60dea673e9SRodney W. Grimes #include <errno.h> 6145817aaaSDag-Erling Smørgrav #include <locale.h> 62dea673e9SRodney W. Grimes #include <stdio.h> 63dea673e9SRodney W. Grimes #include <stdlib.h> 64dea673e9SRodney W. Grimes #include <string.h> 65d9b1bc77SPhilippe Charnier #include <unistd.h> 66dea673e9SRodney W. Grimes 6745817aaaSDag-Erling Smørgrav static int aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag, xflag; 68dea673e9SRodney W. Grimes 691d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 701d86b91cSPoul-Henning Kamp static void parse(char *); 711d86b91cSPoul-Henning Kamp static int show_var(int *, int); 721d86b91cSPoul-Henning Kamp static int sysctl_all (int *oid, int len); 731d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 74dea673e9SRodney W. Grimes 757e9c84c7SPeter Wemm static void set_T_dev_t (char *, void **, size_t *); 76d58f0054SPoul-Henning Kamp 771d86b91cSPoul-Henning Kamp static void 781d86b91cSPoul-Henning Kamp usage(void) 791d86b91cSPoul-Henning Kamp { 80dea673e9SRodney W. Grimes 819a2402bcSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n", 8245817aaaSDag-Erling Smørgrav "usage: sysctl [-bdehNnox] variable[=value] ...", 8345817aaaSDag-Erling Smørgrav " sysctl [-bdehNnox] -a"); 841d86b91cSPoul-Henning Kamp exit(1); 851d86b91cSPoul-Henning Kamp } 86dea673e9SRodney W. Grimes 87dea673e9SRodney W. Grimes int 881d86b91cSPoul-Henning Kamp main(int argc, char **argv) 89dea673e9SRodney W. Grimes { 901d86b91cSPoul-Henning Kamp int ch; 9145817aaaSDag-Erling Smørgrav 9245817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 931d86b91cSPoul-Henning Kamp setbuf(stdout,0); 941d86b91cSPoul-Henning Kamp setbuf(stderr,0); 95dea673e9SRodney W. Grimes 9645817aaaSDag-Erling Smørgrav while ((ch = getopt(argc, argv, "AabdehNnowxX")) != -1) { 97dea673e9SRodney W. Grimes switch (ch) { 98ca5fac55SDag-Erling Smørgrav case 'A': 999a2402bcSDag-Erling Smørgrav /* compatibility */ 1009a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 101ca5fac55SDag-Erling Smørgrav break; 102ca5fac55SDag-Erling Smørgrav case 'a': 103ca5fac55SDag-Erling Smørgrav aflag = 1; 104ca5fac55SDag-Erling Smørgrav break; 105ca5fac55SDag-Erling Smørgrav case 'b': 106ca5fac55SDag-Erling Smørgrav bflag = 1; 107ca5fac55SDag-Erling Smørgrav break; 1086105f815SLuigi Rizzo case 'd': 1096105f815SLuigi Rizzo dflag = 1; 1106105f815SLuigi Rizzo break; 111d0b8aabbSAnton Berezin case 'e': 112d0b8aabbSAnton Berezin eflag = 1; 113d0b8aabbSAnton Berezin break; 11445817aaaSDag-Erling Smørgrav case 'h': 11545817aaaSDag-Erling Smørgrav hflag = 1; 11645817aaaSDag-Erling Smørgrav break; 117ca5fac55SDag-Erling Smørgrav case 'N': 118ca5fac55SDag-Erling Smørgrav Nflag = 1; 119ca5fac55SDag-Erling Smørgrav break; 120ca5fac55SDag-Erling Smørgrav case 'n': 121ca5fac55SDag-Erling Smørgrav nflag = 1; 122ca5fac55SDag-Erling Smørgrav break; 1239a2402bcSDag-Erling Smørgrav case 'o': 1249a2402bcSDag-Erling Smørgrav oflag = 1; 1259a2402bcSDag-Erling Smørgrav break; 126ca5fac55SDag-Erling Smørgrav case 'w': 1279a2402bcSDag-Erling Smørgrav /* compatibility */ 1289a2402bcSDag-Erling Smørgrav /* ignored */ 129ca5fac55SDag-Erling Smørgrav break; 130ca5fac55SDag-Erling Smørgrav case 'X': 1319a2402bcSDag-Erling Smørgrav /* compatibility */ 1329a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 1339a2402bcSDag-Erling Smørgrav break; 1349a2402bcSDag-Erling Smørgrav case 'x': 1359a2402bcSDag-Erling Smørgrav xflag = 1; 136ca5fac55SDag-Erling Smørgrav break; 137ca5fac55SDag-Erling Smørgrav default: 138ca5fac55SDag-Erling Smørgrav usage(); 139dea673e9SRodney W. Grimes } 140dea673e9SRodney W. Grimes } 141dea673e9SRodney W. Grimes argc -= optind; 142dea673e9SRodney W. Grimes argv += optind; 143dea673e9SRodney W. Grimes 1449a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 14581e7454aSDag-Erling Smørgrav usage(); 1469a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 1471d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 148dea673e9SRodney W. Grimes if (argc == 0) 149dea673e9SRodney W. Grimes usage(); 150dea673e9SRodney W. Grimes while (argc-- > 0) 1511d86b91cSPoul-Henning Kamp parse(*argv++); 152dea673e9SRodney W. Grimes exit(0); 153dea673e9SRodney W. Grimes } 154dea673e9SRodney W. Grimes 155dea673e9SRodney W. Grimes /* 156dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 157dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 158dea673e9SRodney W. Grimes * Set a new value if requested. 159dea673e9SRodney W. Grimes */ 1601d86b91cSPoul-Henning Kamp static void 1611d86b91cSPoul-Henning Kamp parse(char *string) 162dea673e9SRodney W. Grimes { 1631d86b91cSPoul-Henning Kamp int len, i, j; 164dea673e9SRodney W. Grimes void *newval = 0; 1651ce1a53dSJim Pirzyk int intval; 1661ce1a53dSJim Pirzyk unsigned int uintval; 1671ce1a53dSJim Pirzyk long longval; 1681ce1a53dSJim Pirzyk unsigned long ulongval; 1691ce1a53dSJim Pirzyk size_t newsize = 0; 170dea673e9SRodney W. Grimes quad_t quadval; 171dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 172a78d3eafSRobert Watson char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ]; 1731d86b91cSPoul-Henning Kamp u_int kind; 174dea673e9SRodney W. Grimes 175dea673e9SRodney W. Grimes bufp = buf; 176dea673e9SRodney W. Grimes snprintf(buf, BUFSIZ, "%s", string); 177dea673e9SRodney W. Grimes if ((cp = strchr(string, '=')) != NULL) { 178dea673e9SRodney W. Grimes *strchr(buf, '=') = '\0'; 179dea673e9SRodney W. Grimes *cp++ = '\0'; 180dea673e9SRodney W. Grimes while (isspace(*cp)) 181dea673e9SRodney W. Grimes cp++; 182dea673e9SRodney W. Grimes newval = cp; 183dea673e9SRodney W. Grimes newsize = strlen(cp); 184dea673e9SRodney W. Grimes } 1851d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 1861d86b91cSPoul-Henning Kamp 1871d86b91cSPoul-Henning Kamp if (len < 0) 188d9b1bc77SPhilippe Charnier errx(1, "unknown oid '%s'", bufp); 1891d86b91cSPoul-Henning Kamp 190d58f0054SPoul-Henning Kamp if (oidfmt(mib, len, fmt, &kind)) 191d9b1bc77SPhilippe Charnier err(1, "couldn't find format of oid '%s'", bufp); 1921d86b91cSPoul-Henning Kamp 1939a2402bcSDag-Erling Smørgrav if (newval == NULL) { 1941d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 1951d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 1961d86b91cSPoul-Henning Kamp } else { 1971d86b91cSPoul-Henning Kamp i = show_var(mib, len); 1981d86b91cSPoul-Henning Kamp if (!i && !bflag) 1991d86b91cSPoul-Henning Kamp putchar('\n'); 200dea673e9SRodney W. Grimes } 2011d86b91cSPoul-Henning Kamp } else { 2021d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) 2031d86b91cSPoul-Henning Kamp errx(1, "oid '%s' isn't a leaf node", bufp); 204dea673e9SRodney W. Grimes 205ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 2069b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 207ac8711d2SMike Silbersack warnx("oid '%s' is a read only tunable", bufp); 208ac8711d2SMike Silbersack errx(1, "Tunable values are set in /boot/loader.conf"); 2099b4b73b7SMike Silbersack } else { 2101d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is read only", bufp); 2119b4b73b7SMike Silbersack } 212ac8711d2SMike Silbersack } 213dea673e9SRodney W. Grimes 214a78d3eafSRobert Watson if ((kind & CTLTYPE) == CTLTYPE_INT || 215a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_UINT || 216a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_LONG || 217a78d3eafSRobert Watson (kind & CTLTYPE) == CTLTYPE_ULONG) { 218a78d3eafSRobert Watson if (strlen(newval) == 0) 219a78d3eafSRobert Watson errx(1, "empty numeric value"); 220a78d3eafSRobert Watson } 221a78d3eafSRobert Watson 2221d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 223dea673e9SRodney W. Grimes case CTLTYPE_INT: 224a78d3eafSRobert Watson intval = (int)strtol(newval, &endptr, 0); 225a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 226a78d3eafSRobert Watson errx(1, "invalid integer '%s'", 227a78d3eafSRobert Watson newval); 228dea673e9SRodney W. Grimes newval = &intval; 22931fb4661SDima Dorfman newsize = sizeof(intval); 230dea673e9SRodney W. Grimes break; 2311ce1a53dSJim Pirzyk case CTLTYPE_UINT: 232a78d3eafSRobert Watson uintval = (int) strtoul(newval, &endptr, 0); 233a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 234a78d3eafSRobert Watson errx(1, "invalid unsigned integer '%s'", 235a78d3eafSRobert Watson newval); 2361ce1a53dSJim Pirzyk newval = &uintval; 2371ce1a53dSJim Pirzyk newsize = sizeof uintval; 2381ce1a53dSJim Pirzyk break; 2391ce1a53dSJim Pirzyk case CTLTYPE_LONG: 240a78d3eafSRobert Watson longval = strtol(newval, &endptr, 0); 241a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 242a78d3eafSRobert Watson errx(1, "invalid long integer '%s'", 243a78d3eafSRobert Watson newval); 2441ce1a53dSJim Pirzyk newval = &longval; 2451ce1a53dSJim Pirzyk newsize = sizeof longval; 2461ce1a53dSJim Pirzyk break; 2471ce1a53dSJim Pirzyk case CTLTYPE_ULONG: 248a78d3eafSRobert Watson ulongval = strtoul(newval, &endptr, 0); 249a78d3eafSRobert Watson if (endptr == newval || *endptr != '\0') 250a78d3eafSRobert Watson errx(1, "invalid unsigned long integer" 251a78d3eafSRobert Watson " '%s'", newval); 2521ce1a53dSJim Pirzyk newval = &ulongval; 2531ce1a53dSJim Pirzyk newsize = sizeof ulongval; 2541d86b91cSPoul-Henning Kamp break; 2551d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 2561d86b91cSPoul-Henning Kamp break; 257dea673e9SRodney W. Grimes case CTLTYPE_QUAD: 258dea673e9SRodney W. Grimes sscanf(newval, "%qd", &quadval); 259dea673e9SRodney W. Grimes newval = &quadval; 26031fb4661SDima Dorfman newsize = sizeof(quadval); 261dea673e9SRodney W. Grimes break; 262d58f0054SPoul-Henning Kamp case CTLTYPE_OPAQUE: 263d58f0054SPoul-Henning Kamp if (strcmp(fmt, "T,dev_t") == 0) { 264d58f0054SPoul-Henning Kamp set_T_dev_t ((char*)newval, &newval, &newsize); 265d58f0054SPoul-Henning Kamp break; 266d58f0054SPoul-Henning Kamp } 267d58f0054SPoul-Henning Kamp /* FALLTHROUGH */ 2681d86b91cSPoul-Henning Kamp default: 2691d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is type %d," 27014b94d04SJohn Polstra " cannot set that", bufp, 27114b94d04SJohn Polstra kind & CTLTYPE); 272dea673e9SRodney W. Grimes } 2731d86b91cSPoul-Henning Kamp 2741d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2751d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 2761d86b91cSPoul-Henning Kamp if (!i && !bflag) 2771d86b91cSPoul-Henning Kamp putchar('\n'); 278dea673e9SRodney W. Grimes switch (errno) { 279dea673e9SRodney W. Grimes case EOPNOTSUPP: 280d9b1bc77SPhilippe Charnier errx(1, "%s: value is not available", 2811d86b91cSPoul-Henning Kamp string); 282dea673e9SRodney W. Grimes case ENOTDIR: 283d9b1bc77SPhilippe Charnier errx(1, "%s: specification is incomplete", 284dea673e9SRodney W. Grimes string); 285dea673e9SRodney W. Grimes case ENOMEM: 286d9b1bc77SPhilippe Charnier errx(1, "%s: type is unknown to this program", 287dea673e9SRodney W. Grimes string); 288dea673e9SRodney W. Grimes default: 289d9b1bc77SPhilippe Charnier warn("%s", string); 290dea673e9SRodney W. Grimes return; 291dea673e9SRodney W. Grimes } 292dea673e9SRodney W. Grimes } 2931d86b91cSPoul-Henning Kamp if (!bflag) 2941d86b91cSPoul-Henning Kamp printf(" -> "); 2951d86b91cSPoul-Henning Kamp i = nflag; 2961d86b91cSPoul-Henning Kamp nflag = 1; 2971d86b91cSPoul-Henning Kamp j = show_var(mib, len); 2981d86b91cSPoul-Henning Kamp if (!j && !bflag) 2991d86b91cSPoul-Henning Kamp putchar('\n'); 3001d86b91cSPoul-Henning Kamp nflag = i; 301dea673e9SRodney W. Grimes } 302dea673e9SRodney W. Grimes } 303dea673e9SRodney W. Grimes 3041d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 305dea673e9SRodney W. Grimes 3061d86b91cSPoul-Henning Kamp static int 3071d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p) 3081d86b91cSPoul-Henning Kamp { 3091d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 310996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 311996076bbSAlfred Perlstein warnx("S_clockinfo %d != %d", l2, sizeof(*ci)); 312996076bbSAlfred Perlstein return (0); 313996076bbSAlfred Perlstein } 31445817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 31545817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 316b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 3171d86b91cSPoul-Henning Kamp return (0); 318dea673e9SRodney W. Grimes } 319dea673e9SRodney W. Grimes 3201d86b91cSPoul-Henning Kamp static int 3211d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p) 3221d86b91cSPoul-Henning Kamp { 3231d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 3241d86b91cSPoul-Henning Kamp 325996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 326996076bbSAlfred Perlstein warnx("S_loadavg %d != %d", l2, sizeof(*tv)); 327996076bbSAlfred Perlstein return (0); 328996076bbSAlfred Perlstein } 32945817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 3301d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 3311d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 3321d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 3331d86b91cSPoul-Henning Kamp return (0); 334dea673e9SRodney W. Grimes } 335dea673e9SRodney W. Grimes 3361d86b91cSPoul-Henning Kamp static int 3371d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p) 3381d86b91cSPoul-Henning Kamp { 3391d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 340c2deb608SBruce Evans time_t tv_sec; 3411d86b91cSPoul-Henning Kamp char *p1, *p2; 342dea673e9SRodney W. Grimes 343996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 344996076bbSAlfred Perlstein warnx("S_timeval %d != %d", l2, sizeof(*tv)); 345996076bbSAlfred Perlstein return (0); 346996076bbSAlfred Perlstein } 34745817aaaSDag-Erling Smørgrav printf(hflag ? "{ sec = %'ld, usec = %'ld } " : 34845817aaaSDag-Erling Smørgrav "{ sec = %ld, usec = %ld } ", 3491d86b91cSPoul-Henning Kamp tv->tv_sec, tv->tv_usec); 350c2deb608SBruce Evans tv_sec = tv->tv_sec; 351c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 3521d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 3531d86b91cSPoul-Henning Kamp if (*p2 == '\n') 3541d86b91cSPoul-Henning Kamp *p2 = '\0'; 3551d86b91cSPoul-Henning Kamp fputs(p1, stdout); 3561d86b91cSPoul-Henning Kamp return (0); 3571d86b91cSPoul-Henning Kamp } 3581d86b91cSPoul-Henning Kamp 3591d86b91cSPoul-Henning Kamp static int 360f7550ecfSMatthew Dillon S_vmtotal(int l2, void *p) 361f7550ecfSMatthew Dillon { 362f7550ecfSMatthew Dillon struct vmtotal *v = (struct vmtotal *)p; 363654e22e7SMatthew Dillon int pageKilo = getpagesize() / 1024; 364f7550ecfSMatthew Dillon 365f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 366f7550ecfSMatthew Dillon warnx("S_vmtotal %d != %d", l2, sizeof(*v)); 367f7550ecfSMatthew Dillon return (0); 368f7550ecfSMatthew Dillon } 369f7550ecfSMatthew Dillon 370654e22e7SMatthew Dillon printf( 371654e22e7SMatthew Dillon "\nSystem wide totals computed every five seconds:" 372654e22e7SMatthew Dillon " (values in kilobytes)\n"); 373f7550ecfSMatthew Dillon printf("===============================================\n"); 374654e22e7SMatthew Dillon printf( 375654e22e7SMatthew Dillon "Processes:\t\t(RUNQ: %hu Disk Wait: %hu Page Wait: " 376654e22e7SMatthew Dillon "%hu Sleep: %hu)\n", 377f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 378654e22e7SMatthew Dillon printf( 379654e22e7SMatthew Dillon "Virtual Memory:\t\t(Total: %luK, Active %lldK)\n", 380654e22e7SMatthew Dillon (unsigned long)v->t_vm / 1024, 381654e22e7SMatthew Dillon (long long)v->t_avm * pageKilo); 382654e22e7SMatthew Dillon printf("Real Memory:\t\t(Total: %lldK Active %lldK)\n", 383654e22e7SMatthew Dillon (long long)v->t_rm * pageKilo, (long long)v->t_arm * pageKilo); 384654e22e7SMatthew Dillon printf("Shared Virtual Memory:\t(Total: %lldK Active: %lldK)\n", 385654e22e7SMatthew Dillon (long long)v->t_vmshr * pageKilo, 386654e22e7SMatthew Dillon (long long)v->t_avmshr * pageKilo); 387654e22e7SMatthew Dillon printf("Shared Real Memory:\t(Total: %lldK Active: %lldK)\n", 388654e22e7SMatthew Dillon (long long)v->t_rmshr * pageKilo, 389654e22e7SMatthew Dillon (long long)v->t_armshr * pageKilo); 390654e22e7SMatthew Dillon printf("Free Memory Pages:\t%ldK\n", (long long)v->t_free * pageKilo); 391f7550ecfSMatthew Dillon 392f7550ecfSMatthew Dillon return (0); 393f7550ecfSMatthew Dillon } 394f7550ecfSMatthew Dillon 395f7550ecfSMatthew Dillon static int 3961d86b91cSPoul-Henning Kamp T_dev_t(int l2, void *p) 3971d86b91cSPoul-Henning Kamp { 3981d86b91cSPoul-Henning Kamp dev_t *d = (dev_t *)p; 399996076bbSAlfred Perlstein if (l2 != sizeof(*d)) { 400996076bbSAlfred Perlstein warnx("T_dev_T %d != %d", l2, sizeof(*d)); 401996076bbSAlfred Perlstein return (0); 402996076bbSAlfred Perlstein } 4036ed3a297SPoul-Henning Kamp if ((int)(*d) != -1) { 4046ed3a297SPoul-Henning Kamp if (minor(*d) > 255 || minor(*d) < 0) 4056ed3a297SPoul-Henning Kamp printf("{ major = %d, minor = 0x%x }", 4066ed3a297SPoul-Henning Kamp major(*d), minor(*d)); 4076ed3a297SPoul-Henning Kamp else 4081d86b91cSPoul-Henning Kamp printf("{ major = %d, minor = %d }", 4091d86b91cSPoul-Henning Kamp major(*d), minor(*d)); 4106ed3a297SPoul-Henning Kamp } 4111d86b91cSPoul-Henning Kamp return (0); 4121d86b91cSPoul-Henning Kamp } 4131d86b91cSPoul-Henning Kamp 414d58f0054SPoul-Henning Kamp static void 4157e9c84c7SPeter Wemm set_T_dev_t (char *path, void **val, size_t *size) 416d58f0054SPoul-Henning Kamp { 417d58f0054SPoul-Henning Kamp static struct stat statb; 418d58f0054SPoul-Henning Kamp 419d58f0054SPoul-Henning Kamp if (strcmp(path, "none") && strcmp(path, "off")) { 420d58f0054SPoul-Henning Kamp int rc = stat (path, &statb); 421d58f0054SPoul-Henning Kamp if (rc) { 422d58f0054SPoul-Henning Kamp err(1, "cannot stat %s", path); 423d58f0054SPoul-Henning Kamp } 424d58f0054SPoul-Henning Kamp 425d58f0054SPoul-Henning Kamp if (!S_ISCHR(statb.st_mode)) { 426d58f0054SPoul-Henning Kamp errx(1, "must specify a device special file."); 427d58f0054SPoul-Henning Kamp } 428d58f0054SPoul-Henning Kamp } else { 429d58f0054SPoul-Henning Kamp statb.st_rdev = NODEV; 430d58f0054SPoul-Henning Kamp } 431d58f0054SPoul-Henning Kamp *val = (char*) &statb.st_rdev; 432d58f0054SPoul-Henning Kamp *size = sizeof statb.st_rdev; 433d58f0054SPoul-Henning Kamp } 434d58f0054SPoul-Henning Kamp 4351d86b91cSPoul-Henning Kamp /* 4361d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 4371d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 4381d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 4391d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 4401d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 4411d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 4421d86b91cSPoul-Henning Kamp */ 4431d86b91cSPoul-Henning Kamp 4441d86b91cSPoul-Henning Kamp static int 4451d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 4461d86b91cSPoul-Henning Kamp { 4471d86b91cSPoul-Henning Kamp int oid[2]; 448dbf9b92fSDoug Rabson int i; 449dbf9b92fSDoug Rabson size_t j; 4501d86b91cSPoul-Henning Kamp 4511d86b91cSPoul-Henning Kamp oid[0] = 0; 4521d86b91cSPoul-Henning Kamp oid[1] = 3; 4531d86b91cSPoul-Henning Kamp 4541d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 4551d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 4561d86b91cSPoul-Henning Kamp if (i < 0) 4571d86b91cSPoul-Henning Kamp return i; 4581d86b91cSPoul-Henning Kamp j /= sizeof(int); 4591d86b91cSPoul-Henning Kamp return (j); 4601d86b91cSPoul-Henning Kamp } 4611d86b91cSPoul-Henning Kamp 4621d86b91cSPoul-Henning Kamp static int 4631d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 4641d86b91cSPoul-Henning Kamp { 4651d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 4661d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 467dbf9b92fSDoug Rabson int i; 468dbf9b92fSDoug Rabson size_t j; 4691d86b91cSPoul-Henning Kamp 4701d86b91cSPoul-Henning Kamp qoid[0] = 0; 4711d86b91cSPoul-Henning Kamp qoid[1] = 4; 4721d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 4731d86b91cSPoul-Henning Kamp 47431fb4661SDima Dorfman j = sizeof(buf); 4751d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 4761d86b91cSPoul-Henning Kamp if (i) 477d9b1bc77SPhilippe Charnier err(1, "sysctl fmt %d %d %d", i, j, errno); 4781d86b91cSPoul-Henning Kamp 4791d86b91cSPoul-Henning Kamp if (kind) 4801d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 4811d86b91cSPoul-Henning Kamp 4821d86b91cSPoul-Henning Kamp if (fmt) 4831d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 4841d86b91cSPoul-Henning Kamp return 0; 4851d86b91cSPoul-Henning Kamp } 4861d86b91cSPoul-Henning Kamp 48760cf2c12SLuigi Rizzo /* 4881d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 4891d86b91cSPoul-Henning Kamp * 4901d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 4911d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 4921d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 4931d86b91cSPoul-Henning Kamp */ 4941d86b91cSPoul-Henning Kamp 4951d86b91cSPoul-Henning Kamp static int 4961d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 4971d86b91cSPoul-Henning Kamp { 4981d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ], *val, *p; 499d0b8aabbSAnton Berezin char name[BUFSIZ], *fmt, *sep; 5001d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 501dbf9b92fSDoug Rabson int i; 502dbf9b92fSDoug Rabson size_t j, len; 5031d86b91cSPoul-Henning Kamp u_int kind; 504a89ab9bbSDag-Erling Smørgrav int (*func)(int, void *); 5051d86b91cSPoul-Henning Kamp 50681e7454aSDag-Erling Smørgrav qoid[0] = 0; 50781e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 50881e7454aSDag-Erling Smørgrav 50981e7454aSDag-Erling Smørgrav qoid[1] = 1; 51031fb4661SDima Dorfman j = sizeof(name); 51181e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 51281e7454aSDag-Erling Smørgrav if (i || !j) 51381e7454aSDag-Erling Smørgrav err(1, "sysctl name %d %d %d", i, j, errno); 51481e7454aSDag-Erling Smørgrav 515ca5fac55SDag-Erling Smørgrav if (Nflag) { 516ca5fac55SDag-Erling Smørgrav printf("%s", name); 517ca5fac55SDag-Erling Smørgrav return (0); 518ca5fac55SDag-Erling Smørgrav } 519ca5fac55SDag-Erling Smørgrav 520d0b8aabbSAnton Berezin if (eflag) 521d0b8aabbSAnton Berezin sep = "="; 522d0b8aabbSAnton Berezin else 523d0b8aabbSAnton Berezin sep = ": "; 524d0b8aabbSAnton Berezin 5256105f815SLuigi Rizzo if (dflag) { /* just print description */ 5266105f815SLuigi Rizzo qoid[1] = 5; 5276105f815SLuigi Rizzo j = sizeof(buf); 5286105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 5296105f815SLuigi Rizzo if (!nflag) 5306105f815SLuigi Rizzo printf("%s%s", name, sep); 5316105f815SLuigi Rizzo printf("%s", buf); 5326105f815SLuigi Rizzo return (0); 5336105f815SLuigi Rizzo } 5341d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 5351d86b91cSPoul-Henning Kamp j = 0; 5361d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 5371d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 5381d86b91cSPoul-Henning Kamp 539661b2c16SPeter Wemm val = alloca(j + 1); 5401d86b91cSPoul-Henning Kamp len = j; 5411d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 5421d86b91cSPoul-Henning Kamp if (i || !len) 5431d86b91cSPoul-Henning Kamp return (1); 5441d86b91cSPoul-Henning Kamp 5451d86b91cSPoul-Henning Kamp if (bflag) { 5461d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 5471d86b91cSPoul-Henning Kamp return (0); 5481d86b91cSPoul-Henning Kamp } 54976d3dc52SAndrey A. Chernov val[len] = '\0'; 550d58f0054SPoul-Henning Kamp fmt = buf; 551d58f0054SPoul-Henning Kamp oidfmt(oid, nlen, fmt, &kind); 5521d86b91cSPoul-Henning Kamp p = val; 5531d86b91cSPoul-Henning Kamp switch (*fmt) { 5541d86b91cSPoul-Henning Kamp case 'A': 5551d86b91cSPoul-Henning Kamp if (!nflag) 556d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5579866352eSPeter Wemm printf("%.*s", len, p); 5581d86b91cSPoul-Henning Kamp return (0); 5591d86b91cSPoul-Henning Kamp 5601d86b91cSPoul-Henning Kamp case 'I': 5611d86b91cSPoul-Henning Kamp if (!nflag) 562d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5639701cd40SJohn Baldwin fmt++; 5642b4c0a3bSPoul-Henning Kamp val = ""; 5652b4c0a3bSPoul-Henning Kamp while (len >= sizeof(int)) { 56645817aaaSDag-Erling Smørgrav fputs(val, stdout); 5679701cd40SJohn Baldwin if(*fmt == 'U') 56845817aaaSDag-Erling Smørgrav printf(hflag ? "%'u" : "%u", *(unsigned int *)p); 5699701cd40SJohn Baldwin else 57045817aaaSDag-Erling Smørgrav printf(hflag ? "%'d" : "%d", *(int *)p); 5712b4c0a3bSPoul-Henning Kamp val = " "; 5722b4c0a3bSPoul-Henning Kamp len -= sizeof(int); 5732b4c0a3bSPoul-Henning Kamp p += sizeof(int); 5742b4c0a3bSPoul-Henning Kamp } 5751d86b91cSPoul-Henning Kamp return (0); 5761d86b91cSPoul-Henning Kamp 577dbf9b92fSDoug Rabson case 'L': 578dbf9b92fSDoug Rabson if (!nflag) 579d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5809701cd40SJohn Baldwin fmt++; 581aa02fb57SPoul-Henning Kamp val = ""; 582aa02fb57SPoul-Henning Kamp while (len >= sizeof(long)) { 58345817aaaSDag-Erling Smørgrav fputs(val, stdout); 5849701cd40SJohn Baldwin if(*fmt == 'U') 58545817aaaSDag-Erling Smørgrav printf(hflag ? "%'lu" : "%lu", *(unsigned long *)p); 5869701cd40SJohn Baldwin else 58745817aaaSDag-Erling Smørgrav printf(hflag ? "%'ld" : "%ld", *(long *)p); 588aa02fb57SPoul-Henning Kamp val = " "; 5893c884b50SAndrew Gallatin len -= sizeof(long); 5903c884b50SAndrew Gallatin p += sizeof(long); 591aa02fb57SPoul-Henning Kamp } 592dbf9b92fSDoug Rabson return (0); 593dbf9b92fSDoug Rabson 594dbf9b92fSDoug Rabson case 'P': 595dbf9b92fSDoug Rabson if (!nflag) 596d0b8aabbSAnton Berezin printf("%s%s", name, sep); 597dbf9b92fSDoug Rabson printf("%p", *(void **)p); 598dbf9b92fSDoug Rabson return (0); 599dbf9b92fSDoug Rabson 6001d86b91cSPoul-Henning Kamp case 'T': 6011d86b91cSPoul-Henning Kamp case 'S': 6021d86b91cSPoul-Henning Kamp i = 0; 603a89ab9bbSDag-Erling Smørgrav if (strcmp(fmt, "S,clockinfo") == 0) 604a89ab9bbSDag-Erling Smørgrav func = S_clockinfo; 605a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,timeval") == 0) 606a89ab9bbSDag-Erling Smørgrav func = S_timeval; 607a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,loadavg") == 0) 608a89ab9bbSDag-Erling Smørgrav func = S_loadavg; 609f7550ecfSMatthew Dillon else if (strcmp(fmt, "S,vmtotal") == 0) 610f7550ecfSMatthew Dillon func = S_vmtotal; 611a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "T,dev_t") == 0) 612a89ab9bbSDag-Erling Smørgrav func = T_dev_t; 613a89ab9bbSDag-Erling Smørgrav else 614a89ab9bbSDag-Erling Smørgrav func = NULL; 6151d86b91cSPoul-Henning Kamp if (func) { 6161d86b91cSPoul-Henning Kamp if (!nflag) 617d0b8aabbSAnton Berezin printf("%s%s", name, sep); 6181d86b91cSPoul-Henning Kamp return ((*func)(len, p)); 6191d86b91cSPoul-Henning Kamp } 6201d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 621dea673e9SRodney W. Grimes default: 6229a2402bcSDag-Erling Smørgrav if (!oflag && !xflag) 6231d86b91cSPoul-Henning Kamp return (1); 6241d86b91cSPoul-Henning Kamp if (!nflag) 625d0b8aabbSAnton Berezin printf("%s%s", name, sep); 6261d86b91cSPoul-Henning Kamp printf("Format:%s Length:%d Dump:0x", fmt, len); 627a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 6281d86b91cSPoul-Henning Kamp printf("%02x", *p++); 629a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 6301d86b91cSPoul-Henning Kamp printf("..."); 6311d86b91cSPoul-Henning Kamp return (0); 6321d86b91cSPoul-Henning Kamp } 6331d86b91cSPoul-Henning Kamp return (1); 634dea673e9SRodney W. Grimes } 635dea673e9SRodney W. Grimes 6361d86b91cSPoul-Henning Kamp static int 6371d86b91cSPoul-Henning Kamp sysctl_all (int *oid, int len) 638dea673e9SRodney W. Grimes { 6391d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 640dbf9b92fSDoug Rabson int i, j; 641dbf9b92fSDoug Rabson size_t l1, l2; 642dea673e9SRodney W. Grimes 6431d86b91cSPoul-Henning Kamp name1[0] = 0; 6441d86b91cSPoul-Henning Kamp name1[1] = 2; 6451d86b91cSPoul-Henning Kamp l1 = 2; 6461d86b91cSPoul-Henning Kamp if (len) { 6471d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 6481d86b91cSPoul-Henning Kamp l1 += len; 6491d86b91cSPoul-Henning Kamp } else { 6501d86b91cSPoul-Henning Kamp name1[2] = 1; 6511d86b91cSPoul-Henning Kamp l1++; 6521d86b91cSPoul-Henning Kamp } 653a89ab9bbSDag-Erling Smørgrav for (;;) { 65431fb4661SDima Dorfman l2 = sizeof(name2); 6551d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 656c1160fe4SBill Fumerola if (j < 0) { 6571d86b91cSPoul-Henning Kamp if (errno == ENOENT) 6581d86b91cSPoul-Henning Kamp return 0; 6591d86b91cSPoul-Henning Kamp else 660d9b1bc77SPhilippe Charnier err(1, "sysctl(getnext) %d %d", j, l2); 661c1160fe4SBill Fumerola } 6621d86b91cSPoul-Henning Kamp 6631d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 6641d86b91cSPoul-Henning Kamp 6651d86b91cSPoul-Henning Kamp if (l2 < len) 6661d86b91cSPoul-Henning Kamp return 0; 6671d86b91cSPoul-Henning Kamp 6681d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 6691d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 6701d86b91cSPoul-Henning Kamp return 0; 6711d86b91cSPoul-Henning Kamp 6721d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 6731d86b91cSPoul-Henning Kamp if (!i && !bflag) 6741d86b91cSPoul-Henning Kamp putchar('\n'); 6751d86b91cSPoul-Henning Kamp 6761d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 6771d86b91cSPoul-Henning Kamp l1 = 2 + l2; 6781d86b91cSPoul-Henning Kamp } 679dea673e9SRodney W. Grimes } 680