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[] = 4581e7454aSDag-Erling Smørgrav "$Id: sysctl.c,v 1.19 1998/11/08 19:27:43 phk Exp $"; 46dea673e9SRodney W. Grimes #endif /* not lint */ 47dea673e9SRodney W. Grimes 481d86b91cSPoul-Henning Kamp #include <sys/types.h> 49dea673e9SRodney W. Grimes #include <sys/stat.h> 50dea673e9SRodney W. Grimes #include <sys/sysctl.h> 511d86b91cSPoul-Henning Kamp #include <sys/resource.h> 52dea673e9SRodney W. Grimes 53d9b1bc77SPhilippe Charnier #include <ctype.h> 54d9b1bc77SPhilippe Charnier #include <err.h> 55dea673e9SRodney W. Grimes #include <errno.h> 56dea673e9SRodney W. Grimes #include <stdio.h> 57dea673e9SRodney W. Grimes #include <stdlib.h> 58dea673e9SRodney W. Grimes #include <string.h> 59d9b1bc77SPhilippe Charnier #include <unistd.h> 60dea673e9SRodney W. Grimes 6181e7454aSDag-Erling Smørgrav static int Aflag, aflag, bflag, dflag, nflag, wflag, Xflag; 62dea673e9SRodney W. Grimes 631d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 641d86b91cSPoul-Henning Kamp static void parse(char *); 651d86b91cSPoul-Henning Kamp static int show_var(int *, int); 661d86b91cSPoul-Henning Kamp static int sysctl_all (int *oid, int len); 671d86b91cSPoul-Henning Kamp static int name2oid(char *, int *); 68dea673e9SRodney W. Grimes 691d86b91cSPoul-Henning Kamp static void 701d86b91cSPoul-Henning Kamp usage(void) 711d86b91cSPoul-Henning Kamp { 72dea673e9SRodney W. Grimes 7381e7454aSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", 7481e7454aSDag-Erling Smørgrav "usage: sysctl [-bdn] variable ...", 7581e7454aSDag-Erling Smørgrav " sysctl [-bn] -w variable=value ...", 7681e7454aSDag-Erling Smørgrav " sysctl [-bdn] -a", 7781e7454aSDag-Erling Smørgrav " sysctl [-bdn] -A", 7881e7454aSDag-Erling Smørgrav " sysctl [-bdn] -X"); 791d86b91cSPoul-Henning Kamp exit(1); 801d86b91cSPoul-Henning Kamp } 81dea673e9SRodney W. Grimes 82dea673e9SRodney W. Grimes int 831d86b91cSPoul-Henning Kamp main(int argc, char **argv) 84dea673e9SRodney W. Grimes { 851d86b91cSPoul-Henning Kamp int ch; 861d86b91cSPoul-Henning Kamp setbuf(stdout,0); 871d86b91cSPoul-Henning Kamp setbuf(stderr,0); 88dea673e9SRodney W. Grimes 8981e7454aSDag-Erling Smørgrav while ((ch = getopt(argc, argv, "AabdnwX")) != -1) { 90dea673e9SRodney W. Grimes switch (ch) { 911d86b91cSPoul-Henning Kamp case 'A': Aflag = 1; break; 921d86b91cSPoul-Henning Kamp case 'a': aflag = 1; break; 931d86b91cSPoul-Henning Kamp case 'b': bflag = 1; break; 9481e7454aSDag-Erling Smørgrav case 'd': dflag = 1; break; 951d86b91cSPoul-Henning Kamp case 'n': nflag = 1; break; 961d86b91cSPoul-Henning Kamp case 'w': wflag = 1; break; 971d86b91cSPoul-Henning Kamp case 'X': Xflag = Aflag = 1; break; 981d86b91cSPoul-Henning Kamp default: usage(); 99dea673e9SRodney W. Grimes } 100dea673e9SRodney W. Grimes } 101dea673e9SRodney W. Grimes argc -= optind; 102dea673e9SRodney W. Grimes argv += optind; 103dea673e9SRodney W. Grimes 10481e7454aSDag-Erling Smørgrav if (wflag && (Aflag || aflag || dflag)) 10581e7454aSDag-Erling Smørgrav usage(); 1061d86b91cSPoul-Henning Kamp if (Aflag || aflag) 1071d86b91cSPoul-Henning Kamp exit (sysctl_all(0, 0)); 108dea673e9SRodney W. Grimes if (argc == 0) 109dea673e9SRodney W. Grimes usage(); 110dea673e9SRodney W. Grimes while (argc-- > 0) 1111d86b91cSPoul-Henning Kamp parse(*argv++); 112dea673e9SRodney W. Grimes exit(0); 113dea673e9SRodney W. Grimes } 114dea673e9SRodney W. Grimes 115dea673e9SRodney W. Grimes /* 116dea673e9SRodney W. Grimes * Parse a name into a MIB entry. 117dea673e9SRodney W. Grimes * Lookup and print out the MIB entry if it exists. 118dea673e9SRodney W. Grimes * Set a new value if requested. 119dea673e9SRodney W. Grimes */ 1201d86b91cSPoul-Henning Kamp static void 1211d86b91cSPoul-Henning Kamp parse(char *string) 122dea673e9SRodney W. Grimes { 1231d86b91cSPoul-Henning Kamp int len, i, j; 124dea673e9SRodney W. Grimes void *newval = 0; 125dea673e9SRodney W. Grimes int intval, newsize = 0; 126dea673e9SRodney W. Grimes quad_t quadval; 127dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 1281d86b91cSPoul-Henning Kamp char *cp, *bufp, buf[BUFSIZ]; 1291d86b91cSPoul-Henning Kamp u_int kind; 130dea673e9SRodney W. Grimes 131dea673e9SRodney W. Grimes bufp = buf; 132dea673e9SRodney W. Grimes snprintf(buf, BUFSIZ, "%s", string); 133dea673e9SRodney W. Grimes if ((cp = strchr(string, '=')) != NULL) { 134d9b1bc77SPhilippe Charnier if (!wflag) 135d9b1bc77SPhilippe Charnier errx(2, "must specify -w to set variables"); 136dea673e9SRodney W. Grimes *strchr(buf, '=') = '\0'; 137dea673e9SRodney W. Grimes *cp++ = '\0'; 138dea673e9SRodney W. Grimes while (isspace(*cp)) 139dea673e9SRodney W. Grimes cp++; 140dea673e9SRodney W. Grimes newval = cp; 141dea673e9SRodney W. Grimes newsize = strlen(cp); 142019d9330SSujal Patel } else { 143019d9330SSujal Patel if (wflag) 144019d9330SSujal Patel usage(); 145dea673e9SRodney W. Grimes } 1461d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 1471d86b91cSPoul-Henning Kamp 1481d86b91cSPoul-Henning Kamp if (len < 0) 149d9b1bc77SPhilippe Charnier errx(1, "unknown oid '%s'", bufp); 1501d86b91cSPoul-Henning Kamp 1511d86b91cSPoul-Henning Kamp if (oidfmt(mib, len, 0, &kind)) 152d9b1bc77SPhilippe Charnier err(1, "couldn't find format of oid '%s'", bufp); 1531d86b91cSPoul-Henning Kamp 1541d86b91cSPoul-Henning Kamp if (!wflag) { 1551d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 1561d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 1571d86b91cSPoul-Henning Kamp } else { 1581d86b91cSPoul-Henning Kamp i = show_var(mib, len); 1591d86b91cSPoul-Henning Kamp if (!i && !bflag) 1601d86b91cSPoul-Henning Kamp putchar('\n'); 161dea673e9SRodney W. Grimes } 1621d86b91cSPoul-Henning Kamp } else { 1631d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) 1641d86b91cSPoul-Henning Kamp errx(1, "oid '%s' isn't a leaf node", bufp); 165dea673e9SRodney W. Grimes 1661d86b91cSPoul-Henning Kamp if (!(kind&CTLFLAG_WR)) 1671d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is read only", bufp); 168dea673e9SRodney W. Grimes 1691d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 170dea673e9SRodney W. Grimes case CTLTYPE_INT: 171dea673e9SRodney W. Grimes intval = atoi(newval); 172dea673e9SRodney W. Grimes newval = &intval; 173dea673e9SRodney W. Grimes newsize = sizeof intval; 174dea673e9SRodney W. Grimes break; 1751d86b91cSPoul-Henning Kamp break; 1761d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 1771d86b91cSPoul-Henning Kamp break; 178dea673e9SRodney W. Grimes case CTLTYPE_QUAD: 1791d86b91cSPoul-Henning Kamp break; 180dea673e9SRodney W. Grimes sscanf(newval, "%qd", &quadval); 181dea673e9SRodney W. Grimes newval = &quadval; 182dea673e9SRodney W. Grimes newsize = sizeof quadval; 183dea673e9SRodney W. Grimes break; 1841d86b91cSPoul-Henning Kamp default: 1851d86b91cSPoul-Henning Kamp errx(1, "oid '%s' is type %d," 18614b94d04SJohn Polstra " cannot set that", bufp, 18714b94d04SJohn Polstra kind & CTLTYPE); 188dea673e9SRodney W. Grimes } 1891d86b91cSPoul-Henning Kamp 1901d86b91cSPoul-Henning Kamp i = show_var(mib, len); 1911d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 1921d86b91cSPoul-Henning Kamp if (!i && !bflag) 1931d86b91cSPoul-Henning Kamp putchar('\n'); 194dea673e9SRodney W. Grimes switch (errno) { 195dea673e9SRodney W. Grimes case EOPNOTSUPP: 196d9b1bc77SPhilippe Charnier errx(1, "%s: value is not available", 1971d86b91cSPoul-Henning Kamp string); 198dea673e9SRodney W. Grimes case ENOTDIR: 199d9b1bc77SPhilippe Charnier errx(1, "%s: specification is incomplete", 200dea673e9SRodney W. Grimes string); 201dea673e9SRodney W. Grimes case ENOMEM: 202d9b1bc77SPhilippe Charnier errx(1, "%s: type is unknown to this program", 203dea673e9SRodney W. Grimes string); 204dea673e9SRodney W. Grimes default: 205d9b1bc77SPhilippe Charnier warn("%s", string); 206dea673e9SRodney W. Grimes return; 207dea673e9SRodney W. Grimes } 208dea673e9SRodney W. Grimes } 2091d86b91cSPoul-Henning Kamp if (!bflag) 2101d86b91cSPoul-Henning Kamp printf(" -> "); 2111d86b91cSPoul-Henning Kamp i = nflag; 2121d86b91cSPoul-Henning Kamp nflag = 1; 2131d86b91cSPoul-Henning Kamp j = show_var(mib, len); 2141d86b91cSPoul-Henning Kamp if (!j && !bflag) 2151d86b91cSPoul-Henning Kamp putchar('\n'); 2161d86b91cSPoul-Henning Kamp nflag = i; 217dea673e9SRodney W. Grimes } 218dea673e9SRodney W. Grimes } 219dea673e9SRodney W. Grimes 2201d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 221dea673e9SRodney W. Grimes 2221d86b91cSPoul-Henning Kamp static int 2231d86b91cSPoul-Henning Kamp S_clockinfo(int l2, void *p) 2241d86b91cSPoul-Henning Kamp { 2251d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 2261d86b91cSPoul-Henning Kamp if (l2 != sizeof *ci) 227d9b1bc77SPhilippe Charnier err(1, "S_clockinfo %d != %d", l2, sizeof *ci); 2280fad62aeSJohn Hay printf("{ hz = %d, tick = %d, tickadj = %d, profhz = %d, stathz = %d }", 2290fad62aeSJohn Hay ci->hz, ci->tick, ci->tickadj, ci->profhz, ci->stathz); 2301d86b91cSPoul-Henning Kamp return (0); 231dea673e9SRodney W. Grimes } 232dea673e9SRodney W. Grimes 2331d86b91cSPoul-Henning Kamp static int 2341d86b91cSPoul-Henning Kamp S_loadavg(int l2, void *p) 2351d86b91cSPoul-Henning Kamp { 2361d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 2371d86b91cSPoul-Henning Kamp 2381d86b91cSPoul-Henning Kamp if (l2 != sizeof *tv) 239d9b1bc77SPhilippe Charnier err(1, "S_loadavg %d != %d", l2, sizeof *tv); 2401d86b91cSPoul-Henning Kamp 2411d86b91cSPoul-Henning Kamp printf("{ %.2f %.2f %.2f }", 2421d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 2431d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 2441d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 2451d86b91cSPoul-Henning Kamp return (0); 246dea673e9SRodney W. Grimes } 247dea673e9SRodney W. Grimes 2481d86b91cSPoul-Henning Kamp static int 2491d86b91cSPoul-Henning Kamp S_timeval(int l2, void *p) 2501d86b91cSPoul-Henning Kamp { 2511d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 252c2deb608SBruce Evans time_t tv_sec; 2531d86b91cSPoul-Henning Kamp char *p1, *p2; 254dea673e9SRodney W. Grimes 2551d86b91cSPoul-Henning Kamp if (l2 != sizeof *tv) 256d9b1bc77SPhilippe Charnier err(1, "S_timeval %d != %d", l2, sizeof *tv); 2571d86b91cSPoul-Henning Kamp printf("{ sec = %ld, usec = %ld } ", 2581d86b91cSPoul-Henning Kamp tv->tv_sec, tv->tv_usec); 259c2deb608SBruce Evans tv_sec = tv->tv_sec; 260c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 2611d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 2621d86b91cSPoul-Henning Kamp if (*p2 == '\n') 2631d86b91cSPoul-Henning Kamp *p2 = '\0'; 2641d86b91cSPoul-Henning Kamp fputs(p1, stdout); 2651d86b91cSPoul-Henning Kamp return (0); 2661d86b91cSPoul-Henning Kamp } 2671d86b91cSPoul-Henning Kamp 2681d86b91cSPoul-Henning Kamp static int 2691d86b91cSPoul-Henning Kamp T_dev_t(int l2, void *p) 2701d86b91cSPoul-Henning Kamp { 2711d86b91cSPoul-Henning Kamp dev_t *d = (dev_t *)p; 2721d86b91cSPoul-Henning Kamp if (l2 != sizeof *d) 273d9b1bc77SPhilippe Charnier err(1, "T_dev_T %d != %d", l2, sizeof *d); 2741d86b91cSPoul-Henning Kamp printf("{ major = %d, minor = %d }", 2751d86b91cSPoul-Henning Kamp major(*d), minor(*d)); 2761d86b91cSPoul-Henning Kamp return (0); 2771d86b91cSPoul-Henning Kamp } 2781d86b91cSPoul-Henning Kamp 2791d86b91cSPoul-Henning Kamp /* 2801d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 2811d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 2821d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 2831d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 2841d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 2851d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 2861d86b91cSPoul-Henning Kamp */ 2871d86b91cSPoul-Henning Kamp 2881d86b91cSPoul-Henning Kamp static int 2891d86b91cSPoul-Henning Kamp name2oid(char *name, int *oidp) 2901d86b91cSPoul-Henning Kamp { 2911d86b91cSPoul-Henning Kamp int oid[2]; 292dbf9b92fSDoug Rabson int i; 293dbf9b92fSDoug Rabson size_t j; 2941d86b91cSPoul-Henning Kamp 2951d86b91cSPoul-Henning Kamp oid[0] = 0; 2961d86b91cSPoul-Henning Kamp oid[1] = 3; 2971d86b91cSPoul-Henning Kamp 2981d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof (int); 2991d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 3001d86b91cSPoul-Henning Kamp if (i < 0) 3011d86b91cSPoul-Henning Kamp return i; 3021d86b91cSPoul-Henning Kamp j /= sizeof (int); 3031d86b91cSPoul-Henning Kamp return (j); 3041d86b91cSPoul-Henning Kamp } 3051d86b91cSPoul-Henning Kamp 3061d86b91cSPoul-Henning Kamp static int 3071d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 3081d86b91cSPoul-Henning Kamp { 3091d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 3101d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 311dbf9b92fSDoug Rabson int i; 312dbf9b92fSDoug Rabson size_t j; 3131d86b91cSPoul-Henning Kamp 3141d86b91cSPoul-Henning Kamp qoid[0] = 0; 3151d86b91cSPoul-Henning Kamp qoid[1] = 4; 3161d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 3171d86b91cSPoul-Henning Kamp 3181d86b91cSPoul-Henning Kamp j = sizeof buf; 3191d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 3201d86b91cSPoul-Henning Kamp if (i) 321d9b1bc77SPhilippe Charnier err(1, "sysctl fmt %d %d %d", i, j, errno); 3221d86b91cSPoul-Henning Kamp 3231d86b91cSPoul-Henning Kamp if (kind) 3241d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 3251d86b91cSPoul-Henning Kamp 3261d86b91cSPoul-Henning Kamp if (fmt) 3271d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 3281d86b91cSPoul-Henning Kamp return 0; 3291d86b91cSPoul-Henning Kamp } 3301d86b91cSPoul-Henning Kamp 3311d86b91cSPoul-Henning Kamp /* 3321d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 3331d86b91cSPoul-Henning Kamp * 3341d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 3351d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 3361d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 3371d86b91cSPoul-Henning Kamp */ 3381d86b91cSPoul-Henning Kamp 3391d86b91cSPoul-Henning Kamp static int 3401d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 3411d86b91cSPoul-Henning Kamp { 3421d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ], *val, *p; 34381e7454aSDag-Erling Smørgrav char name[BUFSIZ], descr[BUFSIZ], *fmt; 3441d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 345dbf9b92fSDoug Rabson int i; 346dbf9b92fSDoug Rabson size_t j, len; 3471d86b91cSPoul-Henning Kamp u_int kind; 3481d86b91cSPoul-Henning Kamp int (*func)(int, void *) = 0; 3491d86b91cSPoul-Henning Kamp 35081e7454aSDag-Erling Smørgrav qoid[0] = 0; 35181e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 35281e7454aSDag-Erling Smørgrav 35381e7454aSDag-Erling Smørgrav qoid[1] = 1; 35481e7454aSDag-Erling Smørgrav j = sizeof name; 35581e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 35681e7454aSDag-Erling Smørgrav if (i || !j) 35781e7454aSDag-Erling Smørgrav err(1, "sysctl name %d %d %d", i, j, errno); 35881e7454aSDag-Erling Smørgrav 35981e7454aSDag-Erling Smørgrav if (dflag) { 36081e7454aSDag-Erling Smørgrav qoid[1] = 5; 36181e7454aSDag-Erling Smørgrav j = sizeof descr; 36281e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, descr, &j, 0, 0); 36381e7454aSDag-Erling Smørgrav if (i || !j) 36481e7454aSDag-Erling Smørgrav err(1, "sysctl name %d %d %d", i, j, errno); 36581e7454aSDag-Erling Smørgrav if (!nflag) 36681e7454aSDag-Erling Smørgrav printf("%s: ", name); 36781e7454aSDag-Erling Smørgrav printf("%s", descr[0] ? descr : "[no description]"); 36881e7454aSDag-Erling Smørgrav return (0); 36981e7454aSDag-Erling Smørgrav } 37081e7454aSDag-Erling Smørgrav 3711d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 3721d86b91cSPoul-Henning Kamp j = 0; 3731d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 3741d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 3751d86b91cSPoul-Henning Kamp 3761d86b91cSPoul-Henning Kamp val = alloca(j); 3771d86b91cSPoul-Henning Kamp len = j; 3781d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 3791d86b91cSPoul-Henning Kamp if (i || !len) 3801d86b91cSPoul-Henning Kamp return (1); 3811d86b91cSPoul-Henning Kamp 3821d86b91cSPoul-Henning Kamp if (bflag) { 3831d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 3841d86b91cSPoul-Henning Kamp return (0); 3851d86b91cSPoul-Henning Kamp } 3861d86b91cSPoul-Henning Kamp 3871d86b91cSPoul-Henning Kamp qoid[1] = 4; 3881d86b91cSPoul-Henning Kamp j = sizeof buf; 3891d86b91cSPoul-Henning Kamp i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 3901d86b91cSPoul-Henning Kamp if (i || !j) 391d9b1bc77SPhilippe Charnier err(1, "sysctl fmt %d %d %d", i, j, errno); 3921d86b91cSPoul-Henning Kamp 3931d86b91cSPoul-Henning Kamp kind = *(u_int *)buf; 3941d86b91cSPoul-Henning Kamp 3951d86b91cSPoul-Henning Kamp fmt = (char *)(buf + sizeof(u_int)); 3961d86b91cSPoul-Henning Kamp 3971d86b91cSPoul-Henning Kamp p = val; 3981d86b91cSPoul-Henning Kamp switch (*fmt) { 3991d86b91cSPoul-Henning Kamp case 'A': 4001d86b91cSPoul-Henning Kamp if (!nflag) 4011d86b91cSPoul-Henning Kamp printf("%s: ", name); 4021d86b91cSPoul-Henning Kamp printf("%s", p); 4031d86b91cSPoul-Henning Kamp return (0); 4041d86b91cSPoul-Henning Kamp 4051d86b91cSPoul-Henning Kamp case 'I': 4061d86b91cSPoul-Henning Kamp if (!nflag) 4071d86b91cSPoul-Henning Kamp printf("%s: ", name); 4082b4c0a3bSPoul-Henning Kamp val = ""; 4092b4c0a3bSPoul-Henning Kamp while (len >= sizeof(int)) { 4102b4c0a3bSPoul-Henning Kamp printf("%s%d", val, *(int *)p); 4112b4c0a3bSPoul-Henning Kamp val = " "; 4122b4c0a3bSPoul-Henning Kamp len -= sizeof (int); 4132b4c0a3bSPoul-Henning Kamp p += sizeof (int); 4142b4c0a3bSPoul-Henning Kamp } 4151d86b91cSPoul-Henning Kamp return (0); 4161d86b91cSPoul-Henning Kamp 417dbf9b92fSDoug Rabson case 'L': 418dbf9b92fSDoug Rabson if (!nflag) 419dbf9b92fSDoug Rabson printf("%s: ", name); 420dbf9b92fSDoug Rabson printf("%ld", *(long *)p); 421dbf9b92fSDoug Rabson return (0); 422dbf9b92fSDoug Rabson 423dbf9b92fSDoug Rabson case 'P': 424dbf9b92fSDoug Rabson if (!nflag) 425dbf9b92fSDoug Rabson printf("%s: ", name); 426dbf9b92fSDoug Rabson printf("%p", *(void **)p); 427dbf9b92fSDoug Rabson return (0); 428dbf9b92fSDoug Rabson 4291d86b91cSPoul-Henning Kamp case 'T': 4301d86b91cSPoul-Henning Kamp case 'S': 4311d86b91cSPoul-Henning Kamp i = 0; 4321d86b91cSPoul-Henning Kamp if (!strcmp(fmt, "S,clockinfo")) func = S_clockinfo; 4331d86b91cSPoul-Henning Kamp else if (!strcmp(fmt, "S,timeval")) func = S_timeval; 4341d86b91cSPoul-Henning Kamp else if (!strcmp(fmt, "S,loadavg")) func = S_loadavg; 4351d86b91cSPoul-Henning Kamp else if (!strcmp(fmt, "T,dev_t")) func = T_dev_t; 4361d86b91cSPoul-Henning Kamp if (func) { 4371d86b91cSPoul-Henning Kamp if (!nflag) 4381d86b91cSPoul-Henning Kamp printf("%s: ", name); 4391d86b91cSPoul-Henning Kamp return ((*func)(len, p)); 4401d86b91cSPoul-Henning Kamp } 4411d86b91cSPoul-Henning Kamp /* FALL THROUGH */ 442dea673e9SRodney W. Grimes default: 4431d86b91cSPoul-Henning Kamp if (!Aflag) 4441d86b91cSPoul-Henning Kamp return (1); 4451d86b91cSPoul-Henning Kamp if (!nflag) 4461d86b91cSPoul-Henning Kamp printf("%s: ", name); 4471d86b91cSPoul-Henning Kamp printf("Format:%s Length:%d Dump:0x", fmt, len); 4481d86b91cSPoul-Henning Kamp while (len--) { 4491d86b91cSPoul-Henning Kamp printf("%02x", *p++); 4501d86b91cSPoul-Henning Kamp if (Xflag || p < val+16) 4511d86b91cSPoul-Henning Kamp continue; 4521d86b91cSPoul-Henning Kamp printf("..."); 453dea673e9SRodney W. Grimes break; 454dea673e9SRodney W. Grimes } 4551d86b91cSPoul-Henning Kamp return (0); 4561d86b91cSPoul-Henning Kamp } 4571d86b91cSPoul-Henning Kamp return (1); 458dea673e9SRodney W. Grimes } 459dea673e9SRodney W. Grimes 4601d86b91cSPoul-Henning Kamp static int 4611d86b91cSPoul-Henning Kamp sysctl_all (int *oid, int len) 462dea673e9SRodney W. Grimes { 4631d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 464dbf9b92fSDoug Rabson int i, j; 465dbf9b92fSDoug Rabson size_t l1, l2; 466dea673e9SRodney W. Grimes 4671d86b91cSPoul-Henning Kamp name1[0] = 0; 4681d86b91cSPoul-Henning Kamp name1[1] = 2; 4691d86b91cSPoul-Henning Kamp l1 = 2; 4701d86b91cSPoul-Henning Kamp if (len) { 4711d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len*sizeof (int)); 4721d86b91cSPoul-Henning Kamp l1 += len; 4731d86b91cSPoul-Henning Kamp } else { 4741d86b91cSPoul-Henning Kamp name1[2] = 1; 4751d86b91cSPoul-Henning Kamp l1++; 4761d86b91cSPoul-Henning Kamp } 4771d86b91cSPoul-Henning Kamp while (1) { 4781d86b91cSPoul-Henning Kamp l2 = sizeof name2; 4791d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 4801d86b91cSPoul-Henning Kamp if (j < 0) 4811d86b91cSPoul-Henning Kamp if (errno == ENOENT) 4821d86b91cSPoul-Henning Kamp return 0; 4831d86b91cSPoul-Henning Kamp else 484d9b1bc77SPhilippe Charnier err(1, "sysctl(getnext) %d %d", j, l2); 4851d86b91cSPoul-Henning Kamp 4861d86b91cSPoul-Henning Kamp l2 /= sizeof (int); 4871d86b91cSPoul-Henning Kamp 4881d86b91cSPoul-Henning Kamp if (l2 < len) 4891d86b91cSPoul-Henning Kamp return 0; 4901d86b91cSPoul-Henning Kamp 4911d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 4921d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 4931d86b91cSPoul-Henning Kamp return 0; 4941d86b91cSPoul-Henning Kamp 4951d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 4961d86b91cSPoul-Henning Kamp if (!i && !bflag) 4971d86b91cSPoul-Henning Kamp putchar('\n'); 4981d86b91cSPoul-Henning Kamp 4991d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2*sizeof (int)); 5001d86b91cSPoul-Henning Kamp l1 = 2 + l2; 5011d86b91cSPoul-Henning Kamp } 502dea673e9SRodney W. Grimes } 503