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__ 4960cf2c12SLuigi Rizzo #include <sys/diskslice.h> /* used for bootdev parsing */ 50bca9bbeaSLuigi Rizzo #include <sys/reboot.h> /* used for bootdev parsing */ 51bca9bbeaSLuigi Rizzo #endif 52ce685842SBruce Evans #include <sys/param.h> 53ce685842SBruce Evans #include <sys/time.h> 54ce685842SBruce Evans #include <sys/resource.h> 55dea673e9SRodney W. Grimes #include <sys/stat.h> 56dea673e9SRodney W. Grimes #include <sys/sysctl.h> 57dea673e9SRodney W. Grimes 58d9b1bc77SPhilippe Charnier #include <ctype.h> 59d9b1bc77SPhilippe Charnier #include <err.h> 60dea673e9SRodney W. Grimes #include <errno.h> 61dea673e9SRodney W. Grimes #include <stdio.h> 62dea673e9SRodney W. Grimes #include <stdlib.h> 63dea673e9SRodney W. Grimes #include <string.h> 64d9b1bc77SPhilippe Charnier #include <unistd.h> 65dea673e9SRodney W. Grimes 666105f815SLuigi Rizzo static int aflag, bflag, dflag, eflag, Nflag, nflag, oflag, xflag; 67dea673e9SRodney W. Grimes 681d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 691d86b91cSPoul-Henning Kamp static void parse(char *); 701d86b91cSPoul-Henning Kamp static int show_var(int *, int); 711d86b91cSPoul-Henning Kamp static int sysctl_all (int *oid, int len); 721d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 73dea673e9SRodney W. Grimes 74d58f0054SPoul-Henning Kamp static void set_T_dev_t (char *, void **, 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", 816105f815SLuigi Rizzo "usage: sysctl [-bdeNnox] variable[=value] ...", 826105f815SLuigi Rizzo " sysctl [-bdeNnox] -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; 901d86b91cSPoul-Henning Kamp setbuf(stdout,0); 911d86b91cSPoul-Henning Kamp setbuf(stderr,0); 92dea673e9SRodney W. Grimes 936105f815SLuigi Rizzo while ((ch = getopt(argc, argv, "AabdeNnowxX")) != -1) { 94dea673e9SRodney W. Grimes switch (ch) { 95ca5fac55SDag-Erling Smørgrav case 'A': 969a2402bcSDag-Erling Smørgrav /* compatibility */ 979a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 98ca5fac55SDag-Erling Smørgrav break; 99ca5fac55SDag-Erling Smørgrav case 'a': 100ca5fac55SDag-Erling Smørgrav aflag = 1; 101ca5fac55SDag-Erling Smørgrav break; 102ca5fac55SDag-Erling Smørgrav case 'b': 103ca5fac55SDag-Erling Smørgrav bflag = 1; 104ca5fac55SDag-Erling Smørgrav break; 1056105f815SLuigi Rizzo case 'd': 1066105f815SLuigi Rizzo dflag = 1; 1076105f815SLuigi Rizzo break; 108d0b8aabbSAnton Berezin case 'e': 109d0b8aabbSAnton Berezin eflag = 1; 110d0b8aabbSAnton Berezin break; 111ca5fac55SDag-Erling Smørgrav case 'N': 112ca5fac55SDag-Erling Smørgrav Nflag = 1; 113ca5fac55SDag-Erling Smørgrav break; 114ca5fac55SDag-Erling Smørgrav case 'n': 115ca5fac55SDag-Erling Smørgrav nflag = 1; 116ca5fac55SDag-Erling Smørgrav break; 1179a2402bcSDag-Erling Smørgrav case 'o': 1189a2402bcSDag-Erling Smørgrav oflag = 1; 1199a2402bcSDag-Erling Smørgrav break; 120ca5fac55SDag-Erling Smørgrav case 'w': 1219a2402bcSDag-Erling Smørgrav /* compatibility */ 1229a2402bcSDag-Erling Smørgrav /* ignored */ 123ca5fac55SDag-Erling Smørgrav break; 124ca5fac55SDag-Erling Smørgrav case 'X': 1259a2402bcSDag-Erling Smørgrav /* compatibility */ 1269a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 1279a2402bcSDag-Erling Smørgrav break; 1289a2402bcSDag-Erling Smørgrav case 'x': 1299a2402bcSDag-Erling Smørgrav xflag = 1; 130ca5fac55SDag-Erling Smørgrav break; 131ca5fac55SDag-Erling Smørgrav default: 132ca5fac55SDag-Erling Smørgrav usage(); 133dea673e9SRodney W. Grimes } 134dea673e9SRodney W. Grimes } 135dea673e9SRodney W. Grimes argc -= optind; 136dea673e9SRodney W. Grimes argv += optind; 137dea673e9SRodney W. Grimes 1389a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 13981e7454aSDag-Erling Smørgrav usage(); 1409a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 1411d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 142dea673e9SRodney W. Grimes if (argc == 0) 143dea673e9SRodney W. Grimes usage(); 144dea673e9SRodney W. Grimes while (argc-- > 0) 1451d86b91cSPoul-Henning Kamp parse(*argv++); 146dea673e9SRodney W. Grimes exit(0); 147dea673e9SRodney W. Grimes } 148dea673e9SRodney W. Grimes 149dea673e9SRodney W. Grimes /* 150dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 151dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 152dea673e9SRodney W. Grimes * Set a new value if requested. 153dea673e9SRodney W. Grimes */ 1541d86b91cSPoul-Henning Kamp static void 1551d86b91cSPoul-Henning Kamp parse(char *string) 156dea673e9SRodney W. Grimes { 1571d86b91cSPoul-Henning Kamp int len, i, j; 158dea673e9SRodney W. Grimes void *newval = 0; 1591ce1a53dSJim Pirzyk int intval; 1601ce1a53dSJim Pirzyk unsigned int uintval; 1611ce1a53dSJim Pirzyk long longval; 1621ce1a53dSJim Pirzyk unsigned long ulongval; 1631ce1a53dSJim Pirzyk size_t newsize = 0; 164dea673e9SRodney W. Grimes quad_t quadval; 165dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 166d58f0054SPoul-Henning Kamp char *cp, *bufp, buf[BUFSIZ], fmt[BUFSIZ]; 1671d86b91cSPoul-Henning Kamp u_int kind; 168dea673e9SRodney W. Grimes 169dea673e9SRodney W. Grimes bufp = buf; 170dea673e9SRodney W. Grimes snprintf(buf, BUFSIZ, "%s", string); 171dea673e9SRodney W. Grimes if ((cp = strchr(string, '=')) != NULL) { 172dea673e9SRodney W. Grimes *strchr(buf, '=') = '\0'; 173dea673e9SRodney W. Grimes *cp++ = '\0'; 174dea673e9SRodney W. Grimes while (isspace(*cp)) 175dea673e9SRodney W. Grimes cp++; 176dea673e9SRodney W. Grimes newval = cp; 177dea673e9SRodney W. Grimes newsize = strlen(cp); 178dea673e9SRodney W. Grimes } 1791d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 1801d86b91cSPoul-Henning Kamp 1811d86b91cSPoul-Henning Kamp if (len < 0) 182d9b1bc77SPhilippe Charnier errx(1, "unknown oid '%s'", bufp); 1831d86b91cSPoul-Henning Kamp 184d58f0054SPoul-Henning Kamp if (oidfmt(mib, len, fmt, &kind)) 185d9b1bc77SPhilippe Charnier err(1, "couldn't find format of oid '%s'", bufp); 1861d86b91cSPoul-Henning Kamp 1879a2402bcSDag-Erling Smørgrav if (newval == NULL) { 1881d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 1891d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 1901d86b91cSPoul-Henning Kamp } else { 1911d86b91cSPoul-Henning Kamp i = show_var(mib, len); 1921d86b91cSPoul-Henning Kamp if (!i && !bflag) 1931d86b91cSPoul-Henning Kamp putchar('\n'); 194dea673e9SRodney W. Grimes } 1951d86b91cSPoul-Henning Kamp } else { 1961d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) 1971d86b91cSPoul-Henning Kamp errx(1, "oid '%s' isn't a leaf node", bufp); 198dea673e9SRodney W. Grimes 1991d86b91cSPoul-Henning Kamp if (!(kind&CTLFLAG_WR)) 2001d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is read only", bufp); 201dea673e9SRodney W. Grimes 2021d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 203dea673e9SRodney W. Grimes case CTLTYPE_INT: 20426909c80SGreg Lehey intval = (int) strtol(newval, NULL, 0); 205dea673e9SRodney W. Grimes newval = &intval; 20631fb4661SDima Dorfman newsize = sizeof(intval); 207dea673e9SRodney W. Grimes break; 2081ce1a53dSJim Pirzyk case CTLTYPE_UINT: 2091ce1a53dSJim Pirzyk uintval = (int) strtoul(newval, NULL, 0); 2101ce1a53dSJim Pirzyk newval = &uintval; 2111ce1a53dSJim Pirzyk newsize = sizeof uintval; 2121ce1a53dSJim Pirzyk break; 2131ce1a53dSJim Pirzyk case CTLTYPE_LONG: 2141ce1a53dSJim Pirzyk longval = strtol(newval, NULL, 0); 2151ce1a53dSJim Pirzyk newval = &longval; 2161ce1a53dSJim Pirzyk newsize = sizeof longval; 2171ce1a53dSJim Pirzyk break; 2181ce1a53dSJim Pirzyk case CTLTYPE_ULONG: 2191ce1a53dSJim Pirzyk ulongval = strtoul(newval, NULL, 0); 2201ce1a53dSJim Pirzyk newval = &ulongval; 2211ce1a53dSJim Pirzyk newsize = sizeof ulongval; 2221d86b91cSPoul-Henning Kamp break; 2231d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 2241d86b91cSPoul-Henning Kamp break; 225dea673e9SRodney W. Grimes case CTLTYPE_QUAD: 226dea673e9SRodney W. Grimes sscanf(newval, "%qd", &quadval); 227dea673e9SRodney W. Grimes newval = &quadval; 22831fb4661SDima Dorfman newsize = sizeof(quadval); 229dea673e9SRodney W. Grimes break; 230d58f0054SPoul-Henning Kamp case CTLTYPE_OPAQUE: 231d58f0054SPoul-Henning Kamp if (strcmp(fmt, "T,dev_t") == 0) { 232d58f0054SPoul-Henning Kamp set_T_dev_t ((char*)newval, &newval, &newsize); 233d58f0054SPoul-Henning Kamp break; 234d58f0054SPoul-Henning Kamp } 235d58f0054SPoul-Henning Kamp /* FALLTHROUGH */ 2361d86b91cSPoul-Henning Kamp default: 2371d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is type %d," 23814b94d04SJohn Polstra " cannot set that", bufp, 23914b94d04SJohn Polstra kind & CTLTYPE); 240dea673e9SRodney W. Grimes } 2411d86b91cSPoul-Henning Kamp 2421d86b91cSPoul-Henning Kamp i = show_var(mib, len); 2431d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 2441d86b91cSPoul-Henning Kamp if (!i && !bflag) 2451d86b91cSPoul-Henning Kamp putchar('\n'); 246dea673e9SRodney W. Grimes switch (errno) { 247dea673e9SRodney W. Grimes case EOPNOTSUPP: 248d9b1bc77SPhilippe Charnier errx(1, "%s: value is not available", 2491d86b91cSPoul-Henning Kamp string); 250dea673e9SRodney W. Grimes case ENOTDIR: 251d9b1bc77SPhilippe Charnier errx(1, "%s: specification is incomplete", 252dea673e9SRodney W. Grimes string); 253dea673e9SRodney W. Grimes case ENOMEM: 254d9b1bc77SPhilippe Charnier errx(1, "%s: type is unknown to this program", 255dea673e9SRodney W. Grimes string); 256dea673e9SRodney W. Grimes default: 257d9b1bc77SPhilippe Charnier warn("%s", string); 258dea673e9SRodney W. Grimes return; 259dea673e9SRodney W. Grimes } 260dea673e9SRodney W. Grimes } 2611d86b91cSPoul-Henning Kamp if (!bflag) 2621d86b91cSPoul-Henning Kamp printf(" -> "); 2631d86b91cSPoul-Henning Kamp i = nflag; 2641d86b91cSPoul-Henning Kamp nflag = 1; 2651d86b91cSPoul-Henning Kamp j = show_var(mib, len); 2661d86b91cSPoul-Henning Kamp if (!j && !bflag) 2671d86b91cSPoul-Henning Kamp putchar('\n'); 2681d86b91cSPoul-Henning Kamp nflag = i; 269dea673e9SRodney W. Grimes } 270dea673e9SRodney W. Grimes } 271dea673e9SRodney W. Grimes 2721d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 273dea673e9SRodney W. Grimes 2741d86b91cSPoul-Henning Kamp static int 2751d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p) 2761d86b91cSPoul-Henning Kamp { 2771d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 27831fb4661SDima Dorfman if (l2 != sizeof(*ci)) 27931fb4661SDima Dorfman err(1, "S_clockinfo %d != %d", l2, sizeof(*ci)); 280b35c8f28SPoul-Henning Kamp printf("{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 281b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 2821d86b91cSPoul-Henning Kamp return (0); 283dea673e9SRodney W. Grimes } 284dea673e9SRodney W. Grimes 2851d86b91cSPoul-Henning Kamp static int 2861d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p) 2871d86b91cSPoul-Henning Kamp { 2881d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 2891d86b91cSPoul-Henning Kamp 29031fb4661SDima Dorfman if (l2 != sizeof(*tv)) 29131fb4661SDima Dorfman err(1, "S_loadavg %d != %d", l2, sizeof(*tv)); 2921d86b91cSPoul-Henning Kamp 2931d86b91cSPoul-Henning Kamp printf("{ %.2f %.2f %.2f }", 2941d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 2951d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 2961d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 2971d86b91cSPoul-Henning Kamp return (0); 298dea673e9SRodney W. Grimes } 299dea673e9SRodney W. Grimes 3001d86b91cSPoul-Henning Kamp static int 3011d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p) 3021d86b91cSPoul-Henning Kamp { 3031d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 304c2deb608SBruce Evans time_t tv_sec; 3051d86b91cSPoul-Henning Kamp char *p1, *p2; 306dea673e9SRodney W. Grimes 30731fb4661SDima Dorfman if (l2 != sizeof(*tv)) 30831fb4661SDima Dorfman err(1, "S_timeval %d != %d", l2, sizeof(*tv)); 3091d86b91cSPoul-Henning Kamp printf("{ sec = %ld, usec = %ld } ", 3101d86b91cSPoul-Henning Kamp tv->tv_sec, tv->tv_usec); 311c2deb608SBruce Evans tv_sec = tv->tv_sec; 312c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 3131d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 3141d86b91cSPoul-Henning Kamp if (*p2 == '\n') 3151d86b91cSPoul-Henning Kamp *p2 = '\0'; 3161d86b91cSPoul-Henning Kamp fputs(p1, stdout); 3171d86b91cSPoul-Henning Kamp return (0); 3181d86b91cSPoul-Henning Kamp } 3191d86b91cSPoul-Henning Kamp 3201d86b91cSPoul-Henning Kamp static int 3211d86b91cSPoul-Henning Kamp T_dev_t(int l2, void *p) 3221d86b91cSPoul-Henning Kamp { 3231d86b91cSPoul-Henning Kamp dev_t *d = (dev_t *)p; 32431fb4661SDima Dorfman if (l2 != sizeof(*d)) 32531fb4661SDima Dorfman err(1, "T_dev_T %d != %d", l2, sizeof(*d)); 3266ed3a297SPoul-Henning Kamp if ((int)(*d) != -1) { 3276ed3a297SPoul-Henning Kamp if (minor(*d) > 255 || minor(*d) < 0) 3286ed3a297SPoul-Henning Kamp printf("{ major = %d, minor = 0x%x }", 3296ed3a297SPoul-Henning Kamp major(*d), minor(*d)); 3306ed3a297SPoul-Henning Kamp else 3311d86b91cSPoul-Henning Kamp printf("{ major = %d, minor = %d }", 3321d86b91cSPoul-Henning Kamp major(*d), minor(*d)); 3336ed3a297SPoul-Henning Kamp } 3341d86b91cSPoul-Henning Kamp return (0); 3351d86b91cSPoul-Henning Kamp } 3361d86b91cSPoul-Henning Kamp 337d58f0054SPoul-Henning Kamp static void 338d58f0054SPoul-Henning Kamp set_T_dev_t (char *path, void **val, int *size) 339d58f0054SPoul-Henning Kamp { 340d58f0054SPoul-Henning Kamp static struct stat statb; 341d58f0054SPoul-Henning Kamp 342d58f0054SPoul-Henning Kamp if (strcmp(path, "none") && strcmp(path, "off")) { 343d58f0054SPoul-Henning Kamp int rc = stat (path, &statb); 344d58f0054SPoul-Henning Kamp if (rc) { 345d58f0054SPoul-Henning Kamp err(1, "cannot stat %s", path); 346d58f0054SPoul-Henning Kamp } 347d58f0054SPoul-Henning Kamp 348d58f0054SPoul-Henning Kamp if (!S_ISCHR(statb.st_mode)) { 349d58f0054SPoul-Henning Kamp errx(1, "must specify a device special file."); 350d58f0054SPoul-Henning Kamp } 351d58f0054SPoul-Henning Kamp } else { 352d58f0054SPoul-Henning Kamp statb.st_rdev = NODEV; 353d58f0054SPoul-Henning Kamp } 354d58f0054SPoul-Henning Kamp *val = (char*) &statb.st_rdev; 355d58f0054SPoul-Henning Kamp *size = sizeof statb.st_rdev; 356d58f0054SPoul-Henning Kamp } 357d58f0054SPoul-Henning Kamp 3581d86b91cSPoul-Henning Kamp /* 3591d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 3601d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 3611d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 3621d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 3631d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 3641d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 3651d86b91cSPoul-Henning Kamp */ 3661d86b91cSPoul-Henning Kamp 3671d86b91cSPoul-Henning Kamp static int 3681d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 3691d86b91cSPoul-Henning Kamp { 3701d86b91cSPoul-Henning Kamp int oid[2]; 371dbf9b92fSDoug Rabson int i; 372dbf9b92fSDoug Rabson size_t j; 3731d86b91cSPoul-Henning Kamp 3741d86b91cSPoul-Henning Kamp oid[0] = 0; 3751d86b91cSPoul-Henning Kamp oid[1] = 3; 3761d86b91cSPoul-Henning Kamp 3771d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 3781d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 3791d86b91cSPoul-Henning Kamp if (i < 0) 3801d86b91cSPoul-Henning Kamp return i; 3811d86b91cSPoul-Henning Kamp j /= sizeof(int); 3821d86b91cSPoul-Henning Kamp return (j); 3831d86b91cSPoul-Henning Kamp } 3841d86b91cSPoul-Henning Kamp 3851d86b91cSPoul-Henning Kamp static int 3861d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 3871d86b91cSPoul-Henning Kamp { 3881d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 3891d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 390dbf9b92fSDoug Rabson int i; 391dbf9b92fSDoug Rabson size_t j; 3921d86b91cSPoul-Henning Kamp 3931d86b91cSPoul-Henning Kamp qoid[0] = 0; 3941d86b91cSPoul-Henning Kamp qoid[1] = 4; 3951d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 3961d86b91cSPoul-Henning Kamp 39731fb4661SDima Dorfman j = sizeof(buf); 3981d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 3991d86b91cSPoul-Henning Kamp if (i) 400d9b1bc77SPhilippe Charnier err(1, "sysctl fmt %d %d %d", i, j, errno); 4011d86b91cSPoul-Henning Kamp 4021d86b91cSPoul-Henning Kamp if (kind) 4031d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 4041d86b91cSPoul-Henning Kamp 4051d86b91cSPoul-Henning Kamp if (fmt) 4061d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 4071d86b91cSPoul-Henning Kamp return 0; 4081d86b91cSPoul-Henning Kamp } 4091d86b91cSPoul-Henning Kamp 410bca9bbeaSLuigi Rizzo #ifdef __i386__ 4111d86b91cSPoul-Henning Kamp /* 41260cf2c12SLuigi Rizzo * Code to map a bootdev major number into a suitable device name. 41360cf2c12SLuigi Rizzo * Major numbers are mapped into names as in boot2.c 41460cf2c12SLuigi Rizzo */ 41560cf2c12SLuigi Rizzo struct _foo { 41660cf2c12SLuigi Rizzo int majdev; 41760cf2c12SLuigi Rizzo char *name; 41860cf2c12SLuigi Rizzo } maj2name[] = { 41960cf2c12SLuigi Rizzo 30, "ad", 42060cf2c12SLuigi Rizzo 0, "wd", 42160cf2c12SLuigi Rizzo 1, "wfd", 42260cf2c12SLuigi Rizzo 2, "fd", 42360cf2c12SLuigi Rizzo 4, "da", 42460cf2c12SLuigi Rizzo -1, NULL /* terminator */ 42560cf2c12SLuigi Rizzo }; 42660cf2c12SLuigi Rizzo 42760cf2c12SLuigi Rizzo static int 42860cf2c12SLuigi Rizzo machdep_bootdev(u_long value) 42960cf2c12SLuigi Rizzo { 43060cf2c12SLuigi Rizzo int majdev, unit, slice, part; 43160cf2c12SLuigi Rizzo struct _foo *p; 43260cf2c12SLuigi Rizzo 43360cf2c12SLuigi Rizzo if (value & B_MAGICMASK != B_DEVMAGIC) { 43460cf2c12SLuigi Rizzo printf("invalid (0x%08x)", value); 43560cf2c12SLuigi Rizzo return 0; 43660cf2c12SLuigi Rizzo } 43760cf2c12SLuigi Rizzo majdev = B_TYPE(value); 43860cf2c12SLuigi Rizzo unit = B_UNIT(value); 43960cf2c12SLuigi Rizzo slice = B_SLICE(value); 44060cf2c12SLuigi Rizzo part = B_PARTITION(value); 44160cf2c12SLuigi Rizzo if (majdev == 2) { /* floppy, as known to the boot block... */ 44260cf2c12SLuigi Rizzo printf("/dev/fd%d", unit); 44360cf2c12SLuigi Rizzo return 0; 44460cf2c12SLuigi Rizzo } 44560cf2c12SLuigi Rizzo for (p = maj2name; p->name != NULL && p->majdev != majdev ; p++) ; 44660cf2c12SLuigi Rizzo if (p->name != NULL) { /* found */ 44760cf2c12SLuigi Rizzo if (slice == WHOLE_DISK_SLICE) 44860cf2c12SLuigi Rizzo printf("/dev/%s%d%c", p->name, unit, part); 44960cf2c12SLuigi Rizzo else 45060cf2c12SLuigi Rizzo printf("/dev/%s%ds%d%c", 45160cf2c12SLuigi Rizzo p->name, unit, slice - BASE_SLICE + 1, part + 'a'); 45260cf2c12SLuigi Rizzo } else 45360cf2c12SLuigi Rizzo printf("unknown (major %d unit %d slice %d part %d)", 45460cf2c12SLuigi Rizzo majdev, unit, slice, part); 45560cf2c12SLuigi Rizzo return 0; 45660cf2c12SLuigi Rizzo } 457bca9bbeaSLuigi Rizzo #endif 45860cf2c12SLuigi Rizzo 45960cf2c12SLuigi Rizzo /* 4601d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 4611d86b91cSPoul-Henning Kamp * 4621d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 4631d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 4641d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 4651d86b91cSPoul-Henning Kamp */ 4661d86b91cSPoul-Henning Kamp 4671d86b91cSPoul-Henning Kamp static int 4681d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 4691d86b91cSPoul-Henning Kamp { 4701d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ], *val, *p; 471d0b8aabbSAnton Berezin char name[BUFSIZ], *fmt, *sep; 4721d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 473dbf9b92fSDoug Rabson int i; 474dbf9b92fSDoug Rabson size_t j, len; 4751d86b91cSPoul-Henning Kamp u_int kind; 476a89ab9bbSDag-Erling Smørgrav int (*func)(int, void *); 4771d86b91cSPoul-Henning Kamp 47881e7454aSDag-Erling Smørgrav qoid[0] = 0; 47981e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 48081e7454aSDag-Erling Smørgrav 48181e7454aSDag-Erling Smørgrav qoid[1] = 1; 48231fb4661SDima Dorfman j = sizeof(name); 48381e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 48481e7454aSDag-Erling Smørgrav if (i || !j) 48581e7454aSDag-Erling Smørgrav err(1, "sysctl name %d %d %d", i, j, errno); 48681e7454aSDag-Erling Smørgrav 487ca5fac55SDag-Erling Smørgrav if (Nflag) { 488ca5fac55SDag-Erling Smørgrav printf("%s", name); 489ca5fac55SDag-Erling Smørgrav return (0); 490ca5fac55SDag-Erling Smørgrav } 491ca5fac55SDag-Erling Smørgrav 492d0b8aabbSAnton Berezin if (eflag) 493d0b8aabbSAnton Berezin sep = "="; 494d0b8aabbSAnton Berezin else 495d0b8aabbSAnton Berezin sep = ": "; 496d0b8aabbSAnton Berezin 4976105f815SLuigi Rizzo if (dflag) { /* just print description */ 4986105f815SLuigi Rizzo qoid[1] = 5; 4996105f815SLuigi Rizzo j = sizeof(buf); 5006105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 5016105f815SLuigi Rizzo if (!nflag) 5026105f815SLuigi Rizzo printf("%s%s", name, sep); 5036105f815SLuigi Rizzo printf("%s", buf); 5046105f815SLuigi Rizzo return (0); 5056105f815SLuigi Rizzo } 5061d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 5071d86b91cSPoul-Henning Kamp j = 0; 5081d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 5091d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 5101d86b91cSPoul-Henning Kamp 5111d86b91cSPoul-Henning Kamp val = alloca(j); 5121d86b91cSPoul-Henning Kamp len = j; 5131d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 5141d86b91cSPoul-Henning Kamp if (i || !len) 5151d86b91cSPoul-Henning Kamp return (1); 5161d86b91cSPoul-Henning Kamp 5171d86b91cSPoul-Henning Kamp if (bflag) { 5181d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 5191d86b91cSPoul-Henning Kamp return (0); 5201d86b91cSPoul-Henning Kamp } 5211d86b91cSPoul-Henning Kamp 522d58f0054SPoul-Henning Kamp fmt = buf; 523d58f0054SPoul-Henning Kamp oidfmt(oid, nlen, fmt, &kind); 5241d86b91cSPoul-Henning Kamp p = val; 5251d86b91cSPoul-Henning Kamp switch (*fmt) { 5261d86b91cSPoul-Henning Kamp case 'A': 5271d86b91cSPoul-Henning Kamp if (!nflag) 528d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5291d86b91cSPoul-Henning Kamp printf("%s", p); 5301d86b91cSPoul-Henning Kamp return (0); 5311d86b91cSPoul-Henning Kamp 5321d86b91cSPoul-Henning Kamp case 'I': 5331d86b91cSPoul-Henning Kamp if (!nflag) 534d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5359701cd40SJohn Baldwin fmt++; 5362b4c0a3bSPoul-Henning Kamp val = ""; 5372b4c0a3bSPoul-Henning Kamp while (len >= sizeof(int)) { 5389701cd40SJohn Baldwin if(*fmt == 'U') 5399701cd40SJohn Baldwin printf("%s%u", val, *(unsigned int *)p); 5409701cd40SJohn Baldwin else 5412b4c0a3bSPoul-Henning Kamp printf("%s%d", val, *(int *)p); 5422b4c0a3bSPoul-Henning Kamp val = " "; 5432b4c0a3bSPoul-Henning Kamp len -= sizeof(int); 5442b4c0a3bSPoul-Henning Kamp p += sizeof(int); 5452b4c0a3bSPoul-Henning Kamp } 5461d86b91cSPoul-Henning Kamp return (0); 5471d86b91cSPoul-Henning Kamp 548dbf9b92fSDoug Rabson case 'L': 549dbf9b92fSDoug Rabson if (!nflag) 550d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5519701cd40SJohn Baldwin fmt++; 552bca9bbeaSLuigi Rizzo #ifdef __i386__ 55360cf2c12SLuigi Rizzo if (!strcmp(name, "machdep.guessed_bootdev")) 55460cf2c12SLuigi Rizzo return machdep_bootdev(*(unsigned long *)p); 555bca9bbeaSLuigi Rizzo #endif 556aa02fb57SPoul-Henning Kamp val = ""; 557aa02fb57SPoul-Henning Kamp while (len >= sizeof(long)) { 5589701cd40SJohn Baldwin if(*fmt == 'U') 559aa02fb57SPoul-Henning Kamp printf("%s%lu", val, *(unsigned long *)p); 5609701cd40SJohn Baldwin else 561aa02fb57SPoul-Henning Kamp printf("%s%ld", val, *(long *)p); 562aa02fb57SPoul-Henning Kamp val = " "; 5633c884b50SAndrew Gallatin len -= sizeof(long); 5643c884b50SAndrew Gallatin p += sizeof(long); 565aa02fb57SPoul-Henning Kamp } 566dbf9b92fSDoug Rabson return (0); 567dbf9b92fSDoug Rabson 568dbf9b92fSDoug Rabson case 'P': 569dbf9b92fSDoug Rabson if (!nflag) 570d0b8aabbSAnton Berezin printf("%s%s", name, sep); 571dbf9b92fSDoug Rabson printf("%p", *(void **)p); 572dbf9b92fSDoug Rabson return (0); 573dbf9b92fSDoug Rabson 5741d86b91cSPoul-Henning Kamp case 'T': 5751d86b91cSPoul-Henning Kamp case 'S': 5761d86b91cSPoul-Henning Kamp i = 0; 577a89ab9bbSDag-Erling Smørgrav if (strcmp(fmt, "S,clockinfo") == 0) 578a89ab9bbSDag-Erling Smørgrav func = S_clockinfo; 579a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,timeval") == 0) 580a89ab9bbSDag-Erling Smørgrav func = S_timeval; 581a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "S,loadavg") == 0) 582a89ab9bbSDag-Erling Smørgrav func = S_loadavg; 583a89ab9bbSDag-Erling Smørgrav else if (strcmp(fmt, "T,dev_t") == 0) 584a89ab9bbSDag-Erling Smørgrav func = T_dev_t; 585a89ab9bbSDag-Erling Smørgrav else 586a89ab9bbSDag-Erling Smørgrav func = NULL; 5871d86b91cSPoul-Henning Kamp if (func) { 5881d86b91cSPoul-Henning Kamp if (!nflag) 589d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5901d86b91cSPoul-Henning Kamp return ((*func)(len, p)); 5911d86b91cSPoul-Henning Kamp } 5921d86b91cSPoul-Henning Kamp /* FALL THROUGH */ 593dea673e9SRodney W. Grimes default: 5949a2402bcSDag-Erling Smørgrav if (!oflag && !xflag) 5951d86b91cSPoul-Henning Kamp return (1); 5961d86b91cSPoul-Henning Kamp if (!nflag) 597d0b8aabbSAnton Berezin printf("%s%s", name, sep); 5981d86b91cSPoul-Henning Kamp printf("Format:%s Length:%d Dump:0x", fmt, len); 599a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 6001d86b91cSPoul-Henning Kamp printf("%02x", *p++); 601a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 6021d86b91cSPoul-Henning Kamp printf("..."); 6031d86b91cSPoul-Henning Kamp return (0); 6041d86b91cSPoul-Henning Kamp } 6051d86b91cSPoul-Henning Kamp return (1); 606dea673e9SRodney W. Grimes } 607dea673e9SRodney W. Grimes 6081d86b91cSPoul-Henning Kamp static int 6091d86b91cSPoul-Henning Kamp sysctl_all (int *oid, int len) 610dea673e9SRodney W. Grimes { 6111d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 612dbf9b92fSDoug Rabson int i, j; 613dbf9b92fSDoug Rabson size_t l1, l2; 614dea673e9SRodney W. Grimes 6151d86b91cSPoul-Henning Kamp name1[0] = 0; 6161d86b91cSPoul-Henning Kamp name1[1] = 2; 6171d86b91cSPoul-Henning Kamp l1 = 2; 6181d86b91cSPoul-Henning Kamp if (len) { 6191d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 6201d86b91cSPoul-Henning Kamp l1 += len; 6211d86b91cSPoul-Henning Kamp } else { 6221d86b91cSPoul-Henning Kamp name1[2] = 1; 6231d86b91cSPoul-Henning Kamp l1++; 6241d86b91cSPoul-Henning Kamp } 625a89ab9bbSDag-Erling Smørgrav for (;;) { 62631fb4661SDima Dorfman l2 = sizeof(name2); 6271d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 628c1160fe4SBill Fumerola if (j < 0) { 6291d86b91cSPoul-Henning Kamp if (errno == ENOENT) 6301d86b91cSPoul-Henning Kamp return 0; 6311d86b91cSPoul-Henning Kamp else 632d9b1bc77SPhilippe Charnier err(1, "sysctl(getnext) %d %d", j, l2); 633c1160fe4SBill Fumerola } 6341d86b91cSPoul-Henning Kamp 6351d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 6361d86b91cSPoul-Henning Kamp 6371d86b91cSPoul-Henning Kamp if (l2 < len) 6381d86b91cSPoul-Henning Kamp return 0; 6391d86b91cSPoul-Henning Kamp 6401d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 6411d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 6421d86b91cSPoul-Henning Kamp return 0; 6431d86b91cSPoul-Henning Kamp 6441d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 6451d86b91cSPoul-Henning Kamp if (!i && !bflag) 6461d86b91cSPoul-Henning Kamp putchar('\n'); 6471d86b91cSPoul-Henning Kamp 6481d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 6491d86b91cSPoul-Henning Kamp l1 = 2 + l2; 6501d86b91cSPoul-Henning Kamp } 651dea673e9SRodney W. Grimes } 652