18a16b7a1SPedro F. Giffuni /*- 28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 38a16b7a1SPedro F. Giffuni * 4dea673e9SRodney W. Grimes * Copyright (c) 1993 5dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 6dea673e9SRodney W. Grimes * 7dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 8dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 9dea673e9SRodney W. Grimes * are met: 10dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 11dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 12dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 13dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 14dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 16dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 17dea673e9SRodney W. Grimes * without specific prior written permission. 18dea673e9SRodney W. Grimes * 19dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29dea673e9SRodney W. Grimes * SUCH DAMAGE. 30dea673e9SRodney W. Grimes */ 31dea673e9SRodney W. Grimes 32dea673e9SRodney W. Grimes #ifndef lint 33d9b1bc77SPhilippe Charnier static const char copyright[] = 34dea673e9SRodney W. Grimes "@(#) Copyright (c) 1993\n\ 35dea673e9SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 36dea673e9SRodney W. Grimes #endif /* not lint */ 37dea673e9SRodney W. Grimes 38dea673e9SRodney W. Grimes #ifndef lint 39d9b1bc77SPhilippe Charnier #if 0 40d9b1bc77SPhilippe Charnier static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; 41d9b1bc77SPhilippe Charnier #endif 4235c13fa0SGarrett Wollman static const char rcsid[] = 437f3dea24SPeter Wemm "$FreeBSD$"; 44dea673e9SRodney W. Grimes #endif /* not lint */ 45dea673e9SRodney W. Grimes 46ce685842SBruce Evans #include <sys/param.h> 47ce685842SBruce Evans #include <sys/time.h> 48ce685842SBruce Evans #include <sys/resource.h> 49dea673e9SRodney W. Grimes #include <sys/stat.h> 50dea673e9SRodney W. Grimes #include <sys/sysctl.h> 51f7550ecfSMatthew Dillon #include <sys/vmmeter.h> 52dea673e9SRodney W. Grimes 537d8312ccSJohn Baldwin #ifdef __amd64__ 547d8312ccSJohn Baldwin #include <sys/efi.h> 557d8312ccSJohn Baldwin #include <machine/metadata.h> 567d8312ccSJohn Baldwin #endif 577d8312ccSJohn Baldwin 5889871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 5989871cdeSJohn Baldwin #include <machine/pc/bios.h> 6089871cdeSJohn Baldwin #endif 6189871cdeSJohn Baldwin 62e267e00eSXin LI #include <assert.h> 63d9b1bc77SPhilippe Charnier #include <ctype.h> 64d9b1bc77SPhilippe Charnier #include <err.h> 65dea673e9SRodney W. Grimes #include <errno.h> 6641e419cbSDavid Malone #include <inttypes.h> 6745817aaaSDag-Erling Smørgrav #include <locale.h> 682365fe56SJohn Baldwin #include <stdbool.h> 69dea673e9SRodney W. Grimes #include <stdio.h> 70dea673e9SRodney W. Grimes #include <stdlib.h> 71dea673e9SRodney W. Grimes #include <string.h> 72da178c77SXin LI #include <sysexits.h> 73d9b1bc77SPhilippe Charnier #include <unistd.h> 74dea673e9SRodney W. Grimes 75da178c77SXin LI static const char *conffile; 76da178c77SXin LI 7775820005SJohn-Mark Gurney static int aflag, bflag, Bflag, dflag, eflag, hflag, iflag; 788020192dSMarcelo Araujo static int Nflag, nflag, oflag, qflag, tflag, Tflag, Wflag, xflag; 79dea673e9SRodney W. Grimes 801d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 81da178c77SXin LI static int parsefile(const char *); 82da178c77SXin LI static int parse(const char *, int); 831d86b91cSPoul-Henning Kamp static int show_var(int *, int); 841d86b91cSPoul-Henning Kamp static int sysctl_all(int *oid, int len); 85c58f8df6SXin LI static int name2oid(const char *, int *); 86dea673e9SRodney W. Grimes 87aa255ef6SWarner Losh static int strIKtoi(const char *, char **, const char *); 88e267e00eSXin LI 89e267e00eSXin LI static int ctl_sign[CTLTYPE+1] = { 90e267e00eSXin LI [CTLTYPE_INT] = 1, 91e267e00eSXin LI [CTLTYPE_LONG] = 1, 922a71f1edSConrad Meyer [CTLTYPE_S8] = 1, 932a71f1edSConrad Meyer [CTLTYPE_S16] = 1, 942a71f1edSConrad Meyer [CTLTYPE_S32] = 1, 95e267e00eSXin LI [CTLTYPE_S64] = 1, 96e267e00eSXin LI }; 97e267e00eSXin LI 98e267e00eSXin LI static int ctl_size[CTLTYPE+1] = { 99e267e00eSXin LI [CTLTYPE_INT] = sizeof(int), 100e267e00eSXin LI [CTLTYPE_UINT] = sizeof(u_int), 101e267e00eSXin LI [CTLTYPE_LONG] = sizeof(long), 102e267e00eSXin LI [CTLTYPE_ULONG] = sizeof(u_long), 1032a71f1edSConrad Meyer [CTLTYPE_S8] = sizeof(int8_t), 1042a71f1edSConrad Meyer [CTLTYPE_S16] = sizeof(int16_t), 1052a71f1edSConrad Meyer [CTLTYPE_S32] = sizeof(int32_t), 106e267e00eSXin LI [CTLTYPE_S64] = sizeof(int64_t), 1072a71f1edSConrad Meyer [CTLTYPE_U8] = sizeof(uint8_t), 1082a71f1edSConrad Meyer [CTLTYPE_U16] = sizeof(uint16_t), 1092a71f1edSConrad Meyer [CTLTYPE_U32] = sizeof(uint32_t), 110e267e00eSXin LI [CTLTYPE_U64] = sizeof(uint64_t), 111e267e00eSXin LI }; 112e267e00eSXin LI 113e267e00eSXin LI static const char *ctl_typename[CTLTYPE+1] = { 114e267e00eSXin LI [CTLTYPE_INT] = "integer", 115e267e00eSXin LI [CTLTYPE_UINT] = "unsigned integer", 116e267e00eSXin LI [CTLTYPE_LONG] = "long integer", 117e267e00eSXin LI [CTLTYPE_ULONG] = "unsigned long", 1182a71f1edSConrad Meyer [CTLTYPE_U8] = "uint8_t", 1192a71f1edSConrad Meyer [CTLTYPE_U16] = "uint16_t", 1203ddb14a5SAndriy Voskoboinyk [CTLTYPE_U32] = "uint32_t", 121e267e00eSXin LI [CTLTYPE_U64] = "uint64_t", 1222a71f1edSConrad Meyer [CTLTYPE_S8] = "int8_t", 1232a71f1edSConrad Meyer [CTLTYPE_S16] = "int16_t", 1242a71f1edSConrad Meyer [CTLTYPE_S32] = "int32_t", 1252a71f1edSConrad Meyer [CTLTYPE_S64] = "int64_t", 1268020192dSMarcelo Araujo [CTLTYPE_NODE] = "node", 1278020192dSMarcelo Araujo [CTLTYPE_STRING] = "string", 1288020192dSMarcelo Araujo [CTLTYPE_OPAQUE] = "opaque", 129e267e00eSXin LI }; 130d58f0054SPoul-Henning Kamp 1311d86b91cSPoul-Henning Kamp static void 1321d86b91cSPoul-Henning Kamp usage(void) 1331d86b91cSPoul-Henning Kamp { 134dea673e9SRodney W. Grimes 1359a2402bcSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n", 1368020192dSMarcelo Araujo "usage: sysctl [-bdehiNnoqTtWx] [ -B <bufsize> ] [-f filename] name[=value] ...", 1378020192dSMarcelo Araujo " sysctl [-bdehNnoqTtWx] [ -B <bufsize> ] -a"); 1381d86b91cSPoul-Henning Kamp exit(1); 1391d86b91cSPoul-Henning Kamp } 140dea673e9SRodney W. Grimes 141dea673e9SRodney W. Grimes int 1421d86b91cSPoul-Henning Kamp main(int argc, char **argv) 143dea673e9SRodney W. Grimes { 1441d86b91cSPoul-Henning Kamp int ch; 145da178c77SXin LI int warncount = 0; 14645817aaaSDag-Erling Smørgrav 14745817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 1481d86b91cSPoul-Henning Kamp setbuf(stdout,0); 1491d86b91cSPoul-Henning Kamp setbuf(stderr,0); 150dea673e9SRodney W. Grimes 1518020192dSMarcelo Araujo while ((ch = getopt(argc, argv, "AabB:def:hiNnoqtTwWxX")) != -1) { 152dea673e9SRodney W. Grimes switch (ch) { 153ca5fac55SDag-Erling Smørgrav case 'A': 1549a2402bcSDag-Erling Smørgrav /* compatibility */ 1559a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 156ca5fac55SDag-Erling Smørgrav break; 157ca5fac55SDag-Erling Smørgrav case 'a': 158ca5fac55SDag-Erling Smørgrav aflag = 1; 159ca5fac55SDag-Erling Smørgrav break; 160ca5fac55SDag-Erling Smørgrav case 'b': 161ca5fac55SDag-Erling Smørgrav bflag = 1; 162ca5fac55SDag-Erling Smørgrav break; 16375820005SJohn-Mark Gurney case 'B': 16475820005SJohn-Mark Gurney Bflag = strtol(optarg, NULL, 0); 16575820005SJohn-Mark Gurney break; 1666105f815SLuigi Rizzo case 'd': 1676105f815SLuigi Rizzo dflag = 1; 1686105f815SLuigi Rizzo break; 169d0b8aabbSAnton Berezin case 'e': 170d0b8aabbSAnton Berezin eflag = 1; 171d0b8aabbSAnton Berezin break; 172da178c77SXin LI case 'f': 173da178c77SXin LI conffile = optarg; 174da178c77SXin LI break; 17545817aaaSDag-Erling Smørgrav case 'h': 17645817aaaSDag-Erling Smørgrav hflag = 1; 17745817aaaSDag-Erling Smørgrav break; 17824b2aa32SGavin Atkinson case 'i': 17924b2aa32SGavin Atkinson iflag = 1; 18024b2aa32SGavin Atkinson break; 181ca5fac55SDag-Erling Smørgrav case 'N': 182ca5fac55SDag-Erling Smørgrav Nflag = 1; 183ca5fac55SDag-Erling Smørgrav break; 184ca5fac55SDag-Erling Smørgrav case 'n': 185ca5fac55SDag-Erling Smørgrav nflag = 1; 186ca5fac55SDag-Erling Smørgrav break; 1879a2402bcSDag-Erling Smørgrav case 'o': 1889a2402bcSDag-Erling Smørgrav oflag = 1; 1899a2402bcSDag-Erling Smørgrav break; 190f93d36fdSRobert Watson case 'q': 191f93d36fdSRobert Watson qflag = 1; 192f93d36fdSRobert Watson break; 1938020192dSMarcelo Araujo case 't': 1948020192dSMarcelo Araujo tflag = 1; 1958020192dSMarcelo Araujo break; 1969ecd2e32SAlfred Perlstein case 'T': 1979ecd2e32SAlfred Perlstein Tflag = 1; 1989ecd2e32SAlfred Perlstein break; 199ca5fac55SDag-Erling Smørgrav case 'w': 2009a2402bcSDag-Erling Smørgrav /* compatibility */ 2019a2402bcSDag-Erling Smørgrav /* ignored */ 202ca5fac55SDag-Erling Smørgrav break; 2039ecd2e32SAlfred Perlstein case 'W': 2049ecd2e32SAlfred Perlstein Wflag = 1; 2059ecd2e32SAlfred Perlstein break; 206ca5fac55SDag-Erling Smørgrav case 'X': 2079a2402bcSDag-Erling Smørgrav /* compatibility */ 2089a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 2099a2402bcSDag-Erling Smørgrav break; 2109a2402bcSDag-Erling Smørgrav case 'x': 2119a2402bcSDag-Erling Smørgrav xflag = 1; 212ca5fac55SDag-Erling Smørgrav break; 213ca5fac55SDag-Erling Smørgrav default: 214ca5fac55SDag-Erling Smørgrav usage(); 215dea673e9SRodney W. Grimes } 216dea673e9SRodney W. Grimes } 217dea673e9SRodney W. Grimes argc -= optind; 218dea673e9SRodney W. Grimes argv += optind; 219dea673e9SRodney W. Grimes 2209a2402bcSDag-Erling Smørgrav if (Nflag && nflag) 22181e7454aSDag-Erling Smørgrav usage(); 2229a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 2231d86b91cSPoul-Henning Kamp exit(sysctl_all(0, 0)); 224da178c77SXin LI if (argc == 0 && conffile == NULL) 225dea673e9SRodney W. Grimes usage(); 226d9fcd86cSMike Makonnen 227d9fcd86cSMike Makonnen warncount = 0; 228da178c77SXin LI if (conffile != NULL) 229da178c77SXin LI warncount += parsefile(conffile); 230da178c77SXin LI 231dea673e9SRodney W. Grimes while (argc-- > 0) 232da178c77SXin LI warncount += parse(*argv++, 0); 233da178c77SXin LI 234da178c77SXin LI return (warncount); 235dea673e9SRodney W. Grimes } 236dea673e9SRodney W. Grimes 237dea673e9SRodney W. Grimes /* 2382365fe56SJohn Baldwin * Parse a single numeric value, append it to 'newbuf', and update 2392365fe56SJohn Baldwin * 'newsize'. Returns true if the value was parsed and false if the 2402365fe56SJohn Baldwin * value was invalid. Non-numeric types (strings) are handled 2412365fe56SJohn Baldwin * directly in parse(). 242dea673e9SRodney W. Grimes */ 2432365fe56SJohn Baldwin static bool 2442365fe56SJohn Baldwin parse_numeric(const char *newvalstr, const char *fmt, u_int kind, 2452365fe56SJohn Baldwin void **newbufp, size_t *newsizep) 246dea673e9SRodney W. Grimes { 2472365fe56SJohn Baldwin void *newbuf; 248e267e00eSXin LI const void *newval; 2492a71f1edSConrad Meyer int8_t i8val; 250c3220d0bSConrad Meyer uint8_t u8val; 2512a71f1edSConrad Meyer int16_t i16val; 252c3220d0bSConrad Meyer uint16_t u16val; 2532a71f1edSConrad Meyer int32_t i32val; 2542a71f1edSConrad Meyer uint32_t u32val; 2551ce1a53dSJim Pirzyk int intval; 2561ce1a53dSJim Pirzyk unsigned int uintval; 2571ce1a53dSJim Pirzyk long longval; 2581ce1a53dSJim Pirzyk unsigned long ulongval; 259cbc134adSMatthew D Fleming int64_t i64val; 260cbc134adSMatthew D Fleming uint64_t u64val; 2612365fe56SJohn Baldwin size_t valsize; 2622365fe56SJohn Baldwin char *endptr = NULL; 2632365fe56SJohn Baldwin 2642365fe56SJohn Baldwin errno = 0; 2652365fe56SJohn Baldwin 2662365fe56SJohn Baldwin switch (kind & CTLTYPE) { 2672365fe56SJohn Baldwin case CTLTYPE_INT: 2682365fe56SJohn Baldwin if (strncmp(fmt, "IK", 2) == 0) 2692365fe56SJohn Baldwin intval = strIKtoi(newvalstr, &endptr, fmt); 2702365fe56SJohn Baldwin else 2712365fe56SJohn Baldwin intval = (int)strtol(newvalstr, &endptr, 0); 2722365fe56SJohn Baldwin newval = &intval; 2732365fe56SJohn Baldwin valsize = sizeof(intval); 2742365fe56SJohn Baldwin break; 2752365fe56SJohn Baldwin case CTLTYPE_UINT: 2762365fe56SJohn Baldwin uintval = (int) strtoul(newvalstr, &endptr, 0); 2772365fe56SJohn Baldwin newval = &uintval; 2782365fe56SJohn Baldwin valsize = sizeof(uintval); 2792365fe56SJohn Baldwin break; 2802365fe56SJohn Baldwin case CTLTYPE_LONG: 2812365fe56SJohn Baldwin longval = strtol(newvalstr, &endptr, 0); 2822365fe56SJohn Baldwin newval = &longval; 2832365fe56SJohn Baldwin valsize = sizeof(longval); 2842365fe56SJohn Baldwin break; 2852365fe56SJohn Baldwin case CTLTYPE_ULONG: 2862365fe56SJohn Baldwin ulongval = strtoul(newvalstr, &endptr, 0); 2872365fe56SJohn Baldwin newval = &ulongval; 2882365fe56SJohn Baldwin valsize = sizeof(ulongval); 2892365fe56SJohn Baldwin break; 2902365fe56SJohn Baldwin case CTLTYPE_S8: 2912365fe56SJohn Baldwin i8val = (int8_t)strtol(newvalstr, &endptr, 0); 2922365fe56SJohn Baldwin newval = &i8val; 2932365fe56SJohn Baldwin valsize = sizeof(i8val); 2942365fe56SJohn Baldwin break; 2952365fe56SJohn Baldwin case CTLTYPE_S16: 2962365fe56SJohn Baldwin i16val = (int16_t)strtol(newvalstr, &endptr, 0); 2972365fe56SJohn Baldwin newval = &i16val; 2982365fe56SJohn Baldwin valsize = sizeof(i16val); 2992365fe56SJohn Baldwin break; 3002365fe56SJohn Baldwin case CTLTYPE_S32: 3012365fe56SJohn Baldwin i32val = (int32_t)strtol(newvalstr, &endptr, 0); 3022365fe56SJohn Baldwin newval = &i32val; 3032365fe56SJohn Baldwin valsize = sizeof(i32val); 3042365fe56SJohn Baldwin break; 3052365fe56SJohn Baldwin case CTLTYPE_S64: 3062365fe56SJohn Baldwin i64val = strtoimax(newvalstr, &endptr, 0); 3072365fe56SJohn Baldwin newval = &i64val; 3082365fe56SJohn Baldwin valsize = sizeof(i64val); 3092365fe56SJohn Baldwin break; 3102365fe56SJohn Baldwin case CTLTYPE_U8: 3112365fe56SJohn Baldwin u8val = (uint8_t)strtoul(newvalstr, &endptr, 0); 3122365fe56SJohn Baldwin newval = &u8val; 3132365fe56SJohn Baldwin valsize = sizeof(u8val); 3142365fe56SJohn Baldwin break; 3152365fe56SJohn Baldwin case CTLTYPE_U16: 3162365fe56SJohn Baldwin u16val = (uint16_t)strtoul(newvalstr, &endptr, 0); 3172365fe56SJohn Baldwin newval = &u16val; 3182365fe56SJohn Baldwin valsize = sizeof(u16val); 3192365fe56SJohn Baldwin break; 3202365fe56SJohn Baldwin case CTLTYPE_U32: 3212365fe56SJohn Baldwin u32val = (uint32_t)strtoul(newvalstr, &endptr, 0); 3222365fe56SJohn Baldwin newval = &u32val; 3232365fe56SJohn Baldwin valsize = sizeof(u32val); 3242365fe56SJohn Baldwin break; 3252365fe56SJohn Baldwin case CTLTYPE_U64: 3262365fe56SJohn Baldwin u64val = strtoumax(newvalstr, &endptr, 0); 3272365fe56SJohn Baldwin newval = &u64val; 3282365fe56SJohn Baldwin valsize = sizeof(u64val); 3292365fe56SJohn Baldwin break; 3302365fe56SJohn Baldwin default: 3312365fe56SJohn Baldwin /* NOTREACHED */ 3322365fe56SJohn Baldwin abort(); 3332365fe56SJohn Baldwin } 3342365fe56SJohn Baldwin 3352365fe56SJohn Baldwin if (errno != 0 || endptr == newvalstr || 3362365fe56SJohn Baldwin (endptr != NULL && *endptr != '\0')) 3372365fe56SJohn Baldwin return (false); 3382365fe56SJohn Baldwin 3392365fe56SJohn Baldwin newbuf = realloc(*newbufp, *newsizep + valsize); 3402365fe56SJohn Baldwin if (newbuf == NULL) 3412365fe56SJohn Baldwin err(1, "out of memory"); 3422365fe56SJohn Baldwin memcpy((char *)newbuf + *newsizep, newval, valsize); 3432365fe56SJohn Baldwin *newbufp = newbuf; 3442365fe56SJohn Baldwin *newsizep += valsize; 3452365fe56SJohn Baldwin 3462365fe56SJohn Baldwin return (true); 3472365fe56SJohn Baldwin } 3482365fe56SJohn Baldwin 3492365fe56SJohn Baldwin /* 3502365fe56SJohn Baldwin * Parse a name into a MIB entry. 3512365fe56SJohn Baldwin * Lookup and print out the MIB entry if it exists. 3522365fe56SJohn Baldwin * Set a new value if requested. 3532365fe56SJohn Baldwin */ 3542365fe56SJohn Baldwin static int 3552365fe56SJohn Baldwin parse(const char *string, int lineno) 3562365fe56SJohn Baldwin { 3572365fe56SJohn Baldwin int len, i, j; 3582365fe56SJohn Baldwin const void *newval; 3592365fe56SJohn Baldwin char *newvalstr = NULL; 3602365fe56SJohn Baldwin void *newbuf; 3612365fe56SJohn Baldwin size_t newsize = Bflag; 362dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 3632365fe56SJohn Baldwin char *cp, *bufp, buf[BUFSIZ], fmt[BUFSIZ], line[BUFSIZ]; 3641d86b91cSPoul-Henning Kamp u_int kind; 365dea673e9SRodney W. Grimes 366da178c77SXin LI if (lineno) 367da178c77SXin LI snprintf(line, sizeof(line), " at line %d", lineno); 368da178c77SXin LI else 369da178c77SXin LI line[0] = '\0'; 370da178c77SXin LI 371aae75101SXin LI cp = buf; 372da178c77SXin LI if (snprintf(buf, BUFSIZ, "%s", string) >= BUFSIZ) { 373c6919e7fSEdward Tomasz Napierala warnx("oid too long: '%s'%s", string, line); 374da178c77SXin LI return (1); 375da178c77SXin LI } 376da178c77SXin LI bufp = strsep(&cp, "=:"); 377aae75101SXin LI if (cp != NULL) { 3789ecd2e32SAlfred Perlstein /* Tflag just lists tunables, do not allow assignment */ 3799ecd2e32SAlfred Perlstein if (Tflag || Wflag) { 3809ecd2e32SAlfred Perlstein warnx("Can't set variables when using -T or -W"); 3819ecd2e32SAlfred Perlstein usage(); 3829ecd2e32SAlfred Perlstein } 383dea673e9SRodney W. Grimes while (isspace(*cp)) 384dea673e9SRodney W. Grimes cp++; 385da178c77SXin LI /* Strip a pair of " or ' if any. */ 386da178c77SXin LI switch (*cp) { 387da178c77SXin LI case '\"': 388da178c77SXin LI case '\'': 389da178c77SXin LI if (cp[strlen(cp) - 1] == *cp) 390da178c77SXin LI cp[strlen(cp) - 1] = '\0'; 391da178c77SXin LI cp++; 392da178c77SXin LI } 393e267e00eSXin LI newvalstr = cp; 394dea673e9SRodney W. Grimes newsize = strlen(cp); 395dea673e9SRodney W. Grimes } 396ca587fdaSBaptiste Daroussin /* Trim spaces */ 397ca587fdaSBaptiste Daroussin cp = bufp + strlen(bufp) - 1; 398ca587fdaSBaptiste Daroussin while (cp >= bufp && isspace((int)*cp)) { 399ca587fdaSBaptiste Daroussin *cp = '\0'; 400ca587fdaSBaptiste Daroussin cp--; 401ca587fdaSBaptiste Daroussin } 4021d86b91cSPoul-Henning Kamp len = name2oid(bufp, mib); 4031d86b91cSPoul-Henning Kamp 404f93d36fdSRobert Watson if (len < 0) { 40524b2aa32SGavin Atkinson if (iflag) 406da178c77SXin LI return (0); 407f93d36fdSRobert Watson if (qflag) 408da178c77SXin LI return (1); 409da178c77SXin LI else { 410e1619d12SBaptiste Daroussin if (errno == ENOENT) { 411e1619d12SBaptiste Daroussin warnx("unknown oid '%s'%s", bufp, line); 412e1619d12SBaptiste Daroussin } else { 413da178c77SXin LI warn("unknown oid '%s'%s", bufp, line); 414e1619d12SBaptiste Daroussin } 415da178c77SXin LI return (1); 416da178c77SXin LI } 417f93d36fdSRobert Watson } 4181d86b91cSPoul-Henning Kamp 419da178c77SXin LI if (oidfmt(mib, len, fmt, &kind)) { 420da178c77SXin LI warn("couldn't find format of oid '%s'%s", bufp, line); 421da178c77SXin LI if (iflag) 422da178c77SXin LI return (1); 423da178c77SXin LI else 424da178c77SXin LI exit(1); 425da178c77SXin LI } 4261d86b91cSPoul-Henning Kamp 427e267e00eSXin LI if (newvalstr == NULL || dflag) { 4281d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 429b2680e20SMatthew N. Dodd if (dflag) { 430b2680e20SMatthew N. Dodd i = show_var(mib, len); 431b2680e20SMatthew N. Dodd if (!i && !bflag) 432b2680e20SMatthew N. Dodd putchar('\n'); 433b2680e20SMatthew N. Dodd } 4341d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 4351d86b91cSPoul-Henning Kamp } else { 4361d86b91cSPoul-Henning Kamp i = show_var(mib, len); 4371d86b91cSPoul-Henning Kamp if (!i && !bflag) 4381d86b91cSPoul-Henning Kamp putchar('\n'); 439dea673e9SRodney W. Grimes } 4401d86b91cSPoul-Henning Kamp } else { 441da178c77SXin LI if ((kind & CTLTYPE) == CTLTYPE_NODE) { 442c6919e7fSEdward Tomasz Napierala warnx("oid '%s' isn't a leaf node%s", bufp, line); 443da178c77SXin LI return (1); 444da178c77SXin LI } 445dea673e9SRodney W. Grimes 446ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 4479b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 4486f361351SXin LI warnx("oid '%s' is a read only tunable%s", bufp, line); 449da178c77SXin LI warnx("Tunable values are set in /boot/loader.conf"); 450da178c77SXin LI } else 451da178c77SXin LI warnx("oid '%s' is read only%s", bufp, line); 452da178c77SXin LI return (1); 453ac8711d2SMike Silbersack } 454dea673e9SRodney W. Grimes 455e267e00eSXin LI switch (kind & CTLTYPE) { 456e267e00eSXin LI case CTLTYPE_INT: 457e267e00eSXin LI case CTLTYPE_UINT: 458e267e00eSXin LI case CTLTYPE_LONG: 459e267e00eSXin LI case CTLTYPE_ULONG: 4602a71f1edSConrad Meyer case CTLTYPE_S8: 4612a71f1edSConrad Meyer case CTLTYPE_S16: 4622a71f1edSConrad Meyer case CTLTYPE_S32: 463e267e00eSXin LI case CTLTYPE_S64: 4642a71f1edSConrad Meyer case CTLTYPE_U8: 4652a71f1edSConrad Meyer case CTLTYPE_U16: 4662a71f1edSConrad Meyer case CTLTYPE_U32: 467e267e00eSXin LI case CTLTYPE_U64: 468e267e00eSXin LI if (strlen(newvalstr) == 0) { 469da178c77SXin LI warnx("empty numeric value"); 470da178c77SXin LI return (1); 471da178c77SXin LI } 472e267e00eSXin LI /* FALLTHROUGH */ 473e267e00eSXin LI case CTLTYPE_STRING: 474e267e00eSXin LI break; 475e267e00eSXin LI default: 476e267e00eSXin LI warnx("oid '%s' is type %d," 477e267e00eSXin LI " cannot set that%s", bufp, 478e267e00eSXin LI kind & CTLTYPE, line); 479e267e00eSXin LI return (1); 480a78d3eafSRobert Watson } 481a78d3eafSRobert Watson 4822365fe56SJohn Baldwin newbuf = NULL; 4834b8740cdSXin LI 4841d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 4851d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 486e267e00eSXin LI newval = newvalstr; 4871d86b91cSPoul-Henning Kamp break; 4881d86b91cSPoul-Henning Kamp default: 4892365fe56SJohn Baldwin newsize = 0; 4902365fe56SJohn Baldwin while ((cp = strsep(&newvalstr, " ,")) != NULL) { 4912365fe56SJohn Baldwin if (*cp == '\0') 4922365fe56SJohn Baldwin continue; 4932365fe56SJohn Baldwin if (!parse_numeric(cp, fmt, kind, &newbuf, 4942365fe56SJohn Baldwin &newsize)) { 4952365fe56SJohn Baldwin warnx("invalid %s '%s'%s", 4962365fe56SJohn Baldwin ctl_typename[kind & CTLTYPE], 4972365fe56SJohn Baldwin cp, line); 4982365fe56SJohn Baldwin free(newbuf); 499da178c77SXin LI return (1); 500dea673e9SRodney W. Grimes } 5012365fe56SJohn Baldwin } 5022365fe56SJohn Baldwin newval = newbuf; 5032365fe56SJohn Baldwin break; 5042365fe56SJohn Baldwin } 5051d86b91cSPoul-Henning Kamp 5061d86b91cSPoul-Henning Kamp i = show_var(mib, len); 5071d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 5082365fe56SJohn Baldwin free(newbuf); 5091d86b91cSPoul-Henning Kamp if (!i && !bflag) 5101d86b91cSPoul-Henning Kamp putchar('\n'); 511dea673e9SRodney W. Grimes switch (errno) { 512dea673e9SRodney W. Grimes case EOPNOTSUPP: 513da178c77SXin LI warnx("%s: value is not available%s", 514da178c77SXin LI string, line); 515da178c77SXin LI return (1); 516dea673e9SRodney W. Grimes case ENOTDIR: 517da178c77SXin LI warnx("%s: specification is incomplete%s", 518da178c77SXin LI string, line); 519da178c77SXin LI return (1); 520dea673e9SRodney W. Grimes case ENOMEM: 521da178c77SXin LI warnx("%s: type is unknown to this program%s", 522da178c77SXin LI string, line); 523da178c77SXin LI return (1); 524dea673e9SRodney W. Grimes default: 525da178c77SXin LI warn("%s%s", string, line); 526da178c77SXin LI return (1); 527dea673e9SRodney W. Grimes } 528dea673e9SRodney W. Grimes } 5292365fe56SJohn Baldwin free(newbuf); 5301d86b91cSPoul-Henning Kamp if (!bflag) 5311d86b91cSPoul-Henning Kamp printf(" -> "); 5321d86b91cSPoul-Henning Kamp i = nflag; 5331d86b91cSPoul-Henning Kamp nflag = 1; 5341d86b91cSPoul-Henning Kamp j = show_var(mib, len); 5351d86b91cSPoul-Henning Kamp if (!j && !bflag) 5361d86b91cSPoul-Henning Kamp putchar('\n'); 5371d86b91cSPoul-Henning Kamp nflag = i; 538dea673e9SRodney W. Grimes } 539da178c77SXin LI 540da178c77SXin LI return (0); 541da178c77SXin LI } 542da178c77SXin LI 543da178c77SXin LI static int 544da178c77SXin LI parsefile(const char *filename) 545da178c77SXin LI { 546da178c77SXin LI FILE *file; 547da178c77SXin LI char line[BUFSIZ], *p, *pq, *pdq; 548da178c77SXin LI int warncount = 0, lineno = 0; 549da178c77SXin LI 550da178c77SXin LI file = fopen(filename, "r"); 551da178c77SXin LI if (file == NULL) 552da178c77SXin LI err(EX_NOINPUT, "%s", filename); 553da178c77SXin LI while (fgets(line, sizeof(line), file) != NULL) { 554da178c77SXin LI lineno++; 555da178c77SXin LI p = line; 556da178c77SXin LI pq = strchr(line, '\''); 557da178c77SXin LI pdq = strchr(line, '\"'); 558da178c77SXin LI /* Replace the first # with \0. */ 559da178c77SXin LI while((p = strchr(p, '#')) != NULL) { 560da178c77SXin LI if (pq != NULL && p > pq) { 561da178c77SXin LI if ((p = strchr(pq+1, '\'')) != NULL) 562da178c77SXin LI *(++p) = '\0'; 563da178c77SXin LI break; 564da178c77SXin LI } else if (pdq != NULL && p > pdq) { 565da178c77SXin LI if ((p = strchr(pdq+1, '\"')) != NULL) 566da178c77SXin LI *(++p) = '\0'; 567da178c77SXin LI break; 568da178c77SXin LI } else if (p == line || *(p-1) != '\\') { 569da178c77SXin LI *p = '\0'; 570da178c77SXin LI break; 571da178c77SXin LI } 572da178c77SXin LI p++; 573da178c77SXin LI } 574da178c77SXin LI /* Trim spaces */ 575da178c77SXin LI p = line + strlen(line) - 1; 576da178c77SXin LI while (p >= line && isspace((int)*p)) { 577da178c77SXin LI *p = '\0'; 578da178c77SXin LI p--; 579da178c77SXin LI } 580da178c77SXin LI p = line; 581da178c77SXin LI while (isspace((int)*p)) 582da178c77SXin LI p++; 583da178c77SXin LI if (*p == '\0') 584da178c77SXin LI continue; 585da178c77SXin LI else 586da178c77SXin LI warncount += parse(p, lineno); 587da178c77SXin LI } 588da178c77SXin LI fclose(file); 589da178c77SXin LI 590da178c77SXin LI return (warncount); 591dea673e9SRodney W. Grimes } 592dea673e9SRodney W. Grimes 5931d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 594dea673e9SRodney W. Grimes 5951d86b91cSPoul-Henning Kamp static int 59659101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p) 5971d86b91cSPoul-Henning Kamp { 5981d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 59921e1f596SDavid Malone 600996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 60159101c5dSJohn Baldwin warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci)); 6026b6b665bSBruce Evans return (1); 603996076bbSAlfred Perlstein } 60445817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 60545817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 606b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 6071d86b91cSPoul-Henning Kamp return (0); 608dea673e9SRodney W. Grimes } 609dea673e9SRodney W. Grimes 6101d86b91cSPoul-Henning Kamp static int 61159101c5dSJohn Baldwin S_loadavg(size_t l2, void *p) 6121d86b91cSPoul-Henning Kamp { 6131d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 6141d86b91cSPoul-Henning Kamp 615996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 61659101c5dSJohn Baldwin warnx("S_loadavg %zu != %zu", l2, sizeof(*tv)); 6176b6b665bSBruce Evans return (1); 618996076bbSAlfred Perlstein } 61945817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 6201d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 6211d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 6221d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 6231d86b91cSPoul-Henning Kamp return (0); 624dea673e9SRodney W. Grimes } 625dea673e9SRodney W. Grimes 6261d86b91cSPoul-Henning Kamp static int 62759101c5dSJohn Baldwin S_timeval(size_t l2, void *p) 6281d86b91cSPoul-Henning Kamp { 6291d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 630c2deb608SBruce Evans time_t tv_sec; 6311d86b91cSPoul-Henning Kamp char *p1, *p2; 632dea673e9SRodney W. Grimes 633996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 63459101c5dSJohn Baldwin warnx("S_timeval %zu != %zu", l2, sizeof(*tv)); 6356b6b665bSBruce Evans return (1); 636996076bbSAlfred Perlstein } 637db87e2dcSJohn Hay printf(hflag ? "{ sec = %'jd, usec = %'ld } " : 638db87e2dcSJohn Hay "{ sec = %jd, usec = %ld } ", 639db87e2dcSJohn Hay (intmax_t)tv->tv_sec, tv->tv_usec); 640c2deb608SBruce Evans tv_sec = tv->tv_sec; 641c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 6421d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 6431d86b91cSPoul-Henning Kamp if (*p2 == '\n') 6441d86b91cSPoul-Henning Kamp *p2 = '\0'; 6451d86b91cSPoul-Henning Kamp fputs(p1, stdout); 646f2359a24SRebecca Cran free(p1); 6471d86b91cSPoul-Henning Kamp return (0); 6481d86b91cSPoul-Henning Kamp } 6491d86b91cSPoul-Henning Kamp 6501d86b91cSPoul-Henning Kamp static int 65159101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p) 652f7550ecfSMatthew Dillon { 65341c0f8d3SKonstantin Belousov struct vmtotal *v; 65441c0f8d3SKonstantin Belousov int pageKilo; 655f7550ecfSMatthew Dillon 656f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 65759101c5dSJohn Baldwin warnx("S_vmtotal %zu != %zu", l2, sizeof(*v)); 6586b6b665bSBruce Evans return (1); 659f7550ecfSMatthew Dillon } 660f7550ecfSMatthew Dillon 66141c0f8d3SKonstantin Belousov v = p; 66241c0f8d3SKonstantin Belousov pageKilo = getpagesize() / 1024; 66341c0f8d3SKonstantin Belousov 66441c0f8d3SKonstantin Belousov #define pg2k(a) ((uintmax_t)(a) * pageKilo) 66541c0f8d3SKonstantin Belousov printf("\nSystem wide totals computed every five seconds:" 666654e22e7SMatthew Dillon " (values in kilobytes)\n"); 667f7550ecfSMatthew Dillon printf("===============================================\n"); 66841c0f8d3SKonstantin Belousov printf("Processes:\t\t(RUNQ: %d Disk Wait: %d Page Wait: " 66941c0f8d3SKonstantin Belousov "%d Sleep: %d)\n", 670f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 67141c0f8d3SKonstantin Belousov printf("Virtual Memory:\t\t(Total: %juK Active: %juK)\n", 67241c0f8d3SKonstantin Belousov pg2k(v->t_vm), pg2k(v->t_avm)); 67341c0f8d3SKonstantin Belousov printf("Real Memory:\t\t(Total: %juK Active: %juK)\n", 67441c0f8d3SKonstantin Belousov pg2k(v->t_rm), pg2k(v->t_arm)); 67541c0f8d3SKonstantin Belousov printf("Shared Virtual Memory:\t(Total: %juK Active: %juK)\n", 67641c0f8d3SKonstantin Belousov pg2k(v->t_vmshr), pg2k(v->t_avmshr)); 67741c0f8d3SKonstantin Belousov printf("Shared Real Memory:\t(Total: %juK Active: %juK)\n", 67841c0f8d3SKonstantin Belousov pg2k(v->t_rmshr), pg2k(v->t_armshr)); 67941c0f8d3SKonstantin Belousov printf("Free Memory:\t%juK", pg2k(v->t_free)); 680f7550ecfSMatthew Dillon return (0); 681f7550ecfSMatthew Dillon } 682f7550ecfSMatthew Dillon 6837d8312ccSJohn Baldwin #ifdef __amd64__ 6847d8312ccSJohn Baldwin static int 6857d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p) 6867d8312ccSJohn Baldwin { 6877d8312ccSJohn Baldwin struct efi_map_header *efihdr; 6887d8312ccSJohn Baldwin struct efi_md *map; 6897d8312ccSJohn Baldwin const char *type; 6907d8312ccSJohn Baldwin size_t efisz; 6917d8312ccSJohn Baldwin int ndesc, i; 6927d8312ccSJohn Baldwin 693*7404ab5bSKonstantin Belousov static const char * const types[] = { 694*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_NULL] = "Reserved", 695*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_CODE] = "LoaderCode", 696*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_DATA] = "LoaderData", 697*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_BS_CODE] = "BootServicesCode", 698*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_BS_DATA] = "BootServicesData", 699*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_RT_CODE] = "RuntimeServicesCode", 700*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_RT_DATA] = "RuntimeServicesData", 701*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_FREE] = "ConventionalMemory", 702*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_BAD] = "UnusableMemory", 703*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_RECLAIM] = "ACPIReclaimMemory", 704*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_FIRMWARE] = "ACPIMemoryNVS", 705*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_IOMEM] = "MemoryMappedIO", 706*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_IOPORT] = "MemoryMappedIOPortSpace", 707*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_PALCODE] = "PalCode", 708*7404ab5bSKonstantin Belousov [EFI_MD_TYPE_PERSISTENT] = "PersistentMemory", 7097d8312ccSJohn Baldwin }; 7107d8312ccSJohn Baldwin 7117d8312ccSJohn Baldwin /* 7127d8312ccSJohn Baldwin * Memory map data provided by UEFI via the GetMemoryMap 7137d8312ccSJohn Baldwin * Boot Services API. 7147d8312ccSJohn Baldwin */ 7157d8312ccSJohn Baldwin if (l2 < sizeof(*efihdr)) { 7167d8312ccSJohn Baldwin warnx("S_efi_map length less than header"); 7177d8312ccSJohn Baldwin return (1); 7187d8312ccSJohn Baldwin } 7197d8312ccSJohn Baldwin efihdr = p; 7207d8312ccSJohn Baldwin efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf; 7217d8312ccSJohn Baldwin map = (struct efi_md *)((uint8_t *)efihdr + efisz); 7227d8312ccSJohn Baldwin 7237d8312ccSJohn Baldwin if (efihdr->descriptor_size == 0) 7247d8312ccSJohn Baldwin return (0); 7257d8312ccSJohn Baldwin if (l2 != efisz + efihdr->memory_size) { 7267d8312ccSJohn Baldwin warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz + 7277d8312ccSJohn Baldwin efihdr->memory_size); 7287d8312ccSJohn Baldwin return (1); 7297d8312ccSJohn Baldwin } 7307d8312ccSJohn Baldwin ndesc = efihdr->memory_size / efihdr->descriptor_size; 7317d8312ccSJohn Baldwin 7327d8312ccSJohn Baldwin printf("\n%23s %12s %12s %8s %4s", 7337d8312ccSJohn Baldwin "Type", "Physical", "Virtual", "#Pages", "Attr"); 7347d8312ccSJohn Baldwin 7357d8312ccSJohn Baldwin for (i = 0; i < ndesc; i++, 7367d8312ccSJohn Baldwin map = efi_next_descriptor(map, efihdr->descriptor_size)) { 737*7404ab5bSKonstantin Belousov type = NULL; 738*7404ab5bSKonstantin Belousov if (map->md_type < nitems(types)) 7397d8312ccSJohn Baldwin type = types[map->md_type]; 740*7404ab5bSKonstantin Belousov if (type == NULL) 7417d8312ccSJohn Baldwin type = "<INVALID>"; 74241c0f8d3SKonstantin Belousov printf("\n%23s %012jx %12p %08jx ", type, 74341c0f8d3SKonstantin Belousov (uintmax_t)map->md_phys, map->md_virt, 74441c0f8d3SKonstantin Belousov (uintmax_t)map->md_pages); 7457d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UC) 7467d8312ccSJohn Baldwin printf("UC "); 7477d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WC) 7487d8312ccSJohn Baldwin printf("WC "); 7497d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WT) 7507d8312ccSJohn Baldwin printf("WT "); 7517d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WB) 7527d8312ccSJohn Baldwin printf("WB "); 7537d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UCE) 7547d8312ccSJohn Baldwin printf("UCE "); 7557d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WP) 7567d8312ccSJohn Baldwin printf("WP "); 7577d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RP) 7587d8312ccSJohn Baldwin printf("RP "); 7597d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_XP) 7607d8312ccSJohn Baldwin printf("XP "); 7617d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RT) 7627d8312ccSJohn Baldwin printf("RUNTIME"); 7637d8312ccSJohn Baldwin } 7647d8312ccSJohn Baldwin return (0); 7657d8312ccSJohn Baldwin } 7667d8312ccSJohn Baldwin #endif 7677d8312ccSJohn Baldwin 76889871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 76989871cdeSJohn Baldwin static int 77059101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p) 77189871cdeSJohn Baldwin { 77289871cdeSJohn Baldwin struct bios_smap_xattr *smap, *end; 77389871cdeSJohn Baldwin 77489871cdeSJohn Baldwin if (l2 % sizeof(*smap) != 0) { 77559101c5dSJohn Baldwin warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2, 77689871cdeSJohn Baldwin sizeof(*smap)); 77789871cdeSJohn Baldwin return (1); 77889871cdeSJohn Baldwin } 77989871cdeSJohn Baldwin 78089871cdeSJohn Baldwin end = (struct bios_smap_xattr *)((char *)p + l2); 78189871cdeSJohn Baldwin for (smap = p; smap < end; smap++) 78289871cdeSJohn Baldwin printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx", 78389871cdeSJohn Baldwin smap->type, smap->xattr, (uintmax_t)smap->base, 78489871cdeSJohn Baldwin (uintmax_t)smap->length); 78589871cdeSJohn Baldwin return (0); 78689871cdeSJohn Baldwin } 78789871cdeSJohn Baldwin #endif 78889871cdeSJohn Baldwin 789f7550ecfSMatthew Dillon static int 790aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt) 791d45564dcSHajimu UMEMOTO { 792e267e00eSXin LI int kelv; 793d45564dcSHajimu UMEMOTO float temp; 794e267e00eSXin LI size_t len; 795a7b5ad27SEd Schouten const char *p; 796aa255ef6SWarner Losh int prec, i; 797d45564dcSHajimu UMEMOTO 798e267e00eSXin LI assert(errno == 0); 799e267e00eSXin LI 800e267e00eSXin LI len = strlen(str); 801e267e00eSXin LI /* caller already checked this */ 802e267e00eSXin LI assert(len > 0); 803e267e00eSXin LI 804aa255ef6SWarner Losh /* 805aa255ef6SWarner Losh * A format of "IK" is in deciKelvin. A format of "IK3" is in 806aa255ef6SWarner Losh * milliKelvin. The single digit following IK is log10 of the 807aa255ef6SWarner Losh * multiplying factor to convert Kelvin into the untis of this sysctl, 808aa255ef6SWarner Losh * or the dividing factor to convert the sysctl value to Kelvin. Numbers 809aa255ef6SWarner Losh * larger than 6 will run into precision issues with 32-bit integers. 810aa255ef6SWarner Losh * Characters that aren't ASCII digits after the 'K' are ignored. No 811aa255ef6SWarner Losh * localization is present because this is an interface from the kernel 812aa255ef6SWarner Losh * to this program (eg not an end-user interface), so isdigit() isn't 813aa255ef6SWarner Losh * used here. 814aa255ef6SWarner Losh */ 815aa255ef6SWarner Losh if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9') 816aa255ef6SWarner Losh prec = fmt[2] - '0'; 817aa255ef6SWarner Losh else 818aa255ef6SWarner Losh prec = 1; 819d45564dcSHajimu UMEMOTO p = &str[len - 1]; 820aa255ef6SWarner Losh if (*p == 'C' || *p == 'F' || *p == 'K') { 821e267e00eSXin LI temp = strtof(str, endptrp); 822689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 823d45564dcSHajimu UMEMOTO if (*p == 'F') 824d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 825689c8e8bSXin LI *endptrp = NULL; 826aa255ef6SWarner Losh if (*p != 'K') 827aa255ef6SWarner Losh temp += 273.15; 828aa255ef6SWarner Losh for (i = 0; i < prec; i++) 829aa255ef6SWarner Losh temp *= 10.0; 830aa255ef6SWarner Losh return ((int)(temp + 0.5)); 831d45564dcSHajimu UMEMOTO } 832e267e00eSXin LI } else { 833aa255ef6SWarner Losh /* No unit specified -> treat it as a raw number */ 834e267e00eSXin LI kelv = (int)strtol(str, endptrp, 10); 835689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 836689c8e8bSXin LI *endptrp = NULL; 837e267e00eSXin LI return (kelv); 838e267e00eSXin LI } 839689c8e8bSXin LI } 840e267e00eSXin LI 841e267e00eSXin LI errno = ERANGE; 842e267e00eSXin LI return (0); 843d45564dcSHajimu UMEMOTO } 844d45564dcSHajimu UMEMOTO 8451d86b91cSPoul-Henning Kamp /* 8461d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 8471d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 8481d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 8491d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 8501d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 8511d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 8521d86b91cSPoul-Henning Kamp */ 8531d86b91cSPoul-Henning Kamp 8541d86b91cSPoul-Henning Kamp static int 855c58f8df6SXin LI name2oid(const char *name, int *oidp) 8561d86b91cSPoul-Henning Kamp { 8571d86b91cSPoul-Henning Kamp int oid[2]; 858dbf9b92fSDoug Rabson int i; 859dbf9b92fSDoug Rabson size_t j; 8601d86b91cSPoul-Henning Kamp 8611d86b91cSPoul-Henning Kamp oid[0] = 0; 8621d86b91cSPoul-Henning Kamp oid[1] = 3; 8631d86b91cSPoul-Henning Kamp 8641d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 8651d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 8661d86b91cSPoul-Henning Kamp if (i < 0) 86721e1f596SDavid Malone return (i); 8681d86b91cSPoul-Henning Kamp j /= sizeof(int); 8691d86b91cSPoul-Henning Kamp return (j); 8701d86b91cSPoul-Henning Kamp } 8711d86b91cSPoul-Henning Kamp 8721d86b91cSPoul-Henning Kamp static int 8731d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 8741d86b91cSPoul-Henning Kamp { 8751d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 8761d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 877dbf9b92fSDoug Rabson int i; 878dbf9b92fSDoug Rabson size_t j; 8791d86b91cSPoul-Henning Kamp 8801d86b91cSPoul-Henning Kamp qoid[0] = 0; 8811d86b91cSPoul-Henning Kamp qoid[1] = 4; 8821d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 8831d86b91cSPoul-Henning Kamp 88431fb4661SDima Dorfman j = sizeof(buf); 8851d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 8861d86b91cSPoul-Henning Kamp if (i) 8876d7a8f6cSUlrich Spörlein err(1, "sysctl fmt %d %zu %d", i, j, errno); 8881d86b91cSPoul-Henning Kamp 8891d86b91cSPoul-Henning Kamp if (kind) 8901d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 8911d86b91cSPoul-Henning Kamp 8921d86b91cSPoul-Henning Kamp if (fmt) 8931d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 89421e1f596SDavid Malone return (0); 8951d86b91cSPoul-Henning Kamp } 8961d86b91cSPoul-Henning Kamp 89760cf2c12SLuigi Rizzo /* 8981d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 8991d86b91cSPoul-Henning Kamp * 9001d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 9011d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 9021d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 9031d86b91cSPoul-Henning Kamp */ 9041d86b91cSPoul-Henning Kamp static int 9051d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 9061d86b91cSPoul-Henning Kamp { 907ccf25977SRuslan Ermilov u_char buf[BUFSIZ], *val, *oval, *p; 908403c7f59SAlfred Perlstein char name[BUFSIZ], fmt[BUFSIZ]; 9098020192dSMarcelo Araujo const char *sep, *sep1, *prntype; 9101d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 91121e1f596SDavid Malone uintmax_t umv; 91221e1f596SDavid Malone intmax_t mv; 913f8e4b4efSMatthew D Fleming int i, hexlen, sign, ctltype; 91441e419cbSDavid Malone size_t intlen; 915dbf9b92fSDoug Rabson size_t j, len; 9161d86b91cSPoul-Henning Kamp u_int kind; 917aa255ef6SWarner Losh float base; 91859101c5dSJohn Baldwin int (*func)(size_t, void *); 919aa255ef6SWarner Losh int prec; 9201d86b91cSPoul-Henning Kamp 9216d7a8f6cSUlrich Spörlein /* Silence GCC. */ 9226d7a8f6cSUlrich Spörlein umv = mv = intlen = 0; 9236d7a8f6cSUlrich Spörlein 9249f98e452SMatthew N. Dodd bzero(buf, BUFSIZ); 925403c7f59SAlfred Perlstein bzero(fmt, BUFSIZ); 9269f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 92781e7454aSDag-Erling Smørgrav qoid[0] = 0; 92881e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 92981e7454aSDag-Erling Smørgrav 93081e7454aSDag-Erling Smørgrav qoid[1] = 1; 93131fb4661SDima Dorfman j = sizeof(name); 93281e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 93381e7454aSDag-Erling Smørgrav if (i || !j) 9346d7a8f6cSUlrich Spörlein err(1, "sysctl name %d %zu %d", i, j, errno); 93581e7454aSDag-Erling Smørgrav 936403c7f59SAlfred Perlstein oidfmt(oid, nlen, fmt, &kind); 937403c7f59SAlfred Perlstein /* if Wflag then only list sysctls that are writeable and not stats. */ 938403c7f59SAlfred Perlstein if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) 939403c7f59SAlfred Perlstein return 1; 940403c7f59SAlfred Perlstein 941403c7f59SAlfred Perlstein /* if Tflag then only list sysctls that are tuneables. */ 942403c7f59SAlfred Perlstein if (Tflag && (kind & CTLFLAG_TUN) == 0) 943403c7f59SAlfred Perlstein return 1; 944403c7f59SAlfred Perlstein 945ca5fac55SDag-Erling Smørgrav if (Nflag) { 946ca5fac55SDag-Erling Smørgrav printf("%s", name); 947ca5fac55SDag-Erling Smørgrav return (0); 948ca5fac55SDag-Erling Smørgrav } 949ca5fac55SDag-Erling Smørgrav 950d0b8aabbSAnton Berezin if (eflag) 951d0b8aabbSAnton Berezin sep = "="; 952d0b8aabbSAnton Berezin else 953d0b8aabbSAnton Berezin sep = ": "; 954d0b8aabbSAnton Berezin 9558020192dSMarcelo Araujo ctltype = (kind & CTLTYPE); 9568020192dSMarcelo Araujo if (tflag || dflag) { 9578020192dSMarcelo Araujo if (!nflag) 9588020192dSMarcelo Araujo printf("%s%s", name, sep); 9598020192dSMarcelo Araujo if (ctl_typename[ctltype] != NULL) 9608020192dSMarcelo Araujo prntype = ctl_typename[ctltype]; 9618020192dSMarcelo Araujo else 9628020192dSMarcelo Araujo prntype = "unknown"; 9638020192dSMarcelo Araujo if (tflag && dflag) 9648020192dSMarcelo Araujo printf("%s%s", prntype, sep); 9658020192dSMarcelo Araujo else if (tflag) { 9668020192dSMarcelo Araujo printf("%s", prntype); 9678020192dSMarcelo Araujo return (0); 9688020192dSMarcelo Araujo } 9696105f815SLuigi Rizzo qoid[1] = 5; 9706105f815SLuigi Rizzo j = sizeof(buf); 9716105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 9726105f815SLuigi Rizzo printf("%s", buf); 9736105f815SLuigi Rizzo return (0); 9746105f815SLuigi Rizzo } 975a18f34feSAndrew Gallatin 976a18f34feSAndrew Gallatin /* don't fetch opaques that we don't know how to print */ 977a18f34feSAndrew Gallatin if (ctltype == CTLTYPE_OPAQUE) { 978a18f34feSAndrew Gallatin if (strcmp(fmt, "S,clockinfo") == 0) 979a18f34feSAndrew Gallatin func = S_clockinfo; 980a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,timeval") == 0) 981a18f34feSAndrew Gallatin func = S_timeval; 982a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,loadavg") == 0) 983a18f34feSAndrew Gallatin func = S_loadavg; 984a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,vmtotal") == 0) 985a18f34feSAndrew Gallatin func = S_vmtotal; 986a18f34feSAndrew Gallatin #ifdef __amd64__ 987a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,efi_map_header") == 0) 988a18f34feSAndrew Gallatin func = S_efi_map; 989a18f34feSAndrew Gallatin #endif 990a18f34feSAndrew Gallatin #if defined(__amd64__) || defined(__i386__) 991a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,bios_smap_xattr") == 0) 992a18f34feSAndrew Gallatin func = S_bios_smap_xattr; 993a18f34feSAndrew Gallatin #endif 994a18f34feSAndrew Gallatin else { 995a18f34feSAndrew Gallatin func = NULL; 996a18f34feSAndrew Gallatin if (!bflag && !oflag && !xflag) 997a18f34feSAndrew Gallatin return (1); 998a18f34feSAndrew Gallatin } 999a18f34feSAndrew Gallatin } 1000a18f34feSAndrew Gallatin 10011d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 100275820005SJohn-Mark Gurney if (Bflag) 100375820005SJohn-Mark Gurney j = Bflag; 100475820005SJohn-Mark Gurney else { 10051d86b91cSPoul-Henning Kamp j = 0; 10061d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 10071d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 100875820005SJohn-Mark Gurney } 10091d86b91cSPoul-Henning Kamp 1010ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 1011ccf25977SRuslan Ermilov if (val == NULL) { 1012ccf25977SRuslan Ermilov warnx("malloc failed"); 10136b6b665bSBruce Evans return (1); 1014ccf25977SRuslan Ermilov } 10151d86b91cSPoul-Henning Kamp len = j; 10161d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 101704006eabSHans Petter Selasky if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) { 1018ccf25977SRuslan Ermilov free(oval); 10191d86b91cSPoul-Henning Kamp return (1); 1020ccf25977SRuslan Ermilov } 10211d86b91cSPoul-Henning Kamp 10221d86b91cSPoul-Henning Kamp if (bflag) { 10231d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 1024ccf25977SRuslan Ermilov free(oval); 10251d86b91cSPoul-Henning Kamp return (0); 10261d86b91cSPoul-Henning Kamp } 102776d3dc52SAndrey A. Chernov val[len] = '\0'; 10281d86b91cSPoul-Henning Kamp p = val; 1029cbc134adSMatthew D Fleming sign = ctl_sign[ctltype]; 1030cbc134adSMatthew D Fleming intlen = ctl_size[ctltype]; 1031cbc134adSMatthew D Fleming 1032f8e4b4efSMatthew D Fleming switch (ctltype) { 1033f8e4b4efSMatthew D Fleming case CTLTYPE_STRING: 10341d86b91cSPoul-Henning Kamp if (!nflag) 1035d0b8aabbSAnton Berezin printf("%s%s", name, sep); 10366d7a8f6cSUlrich Spörlein printf("%.*s", (int)len, p); 1037ccf25977SRuslan Ermilov free(oval); 10381d86b91cSPoul-Henning Kamp return (0); 10391d86b91cSPoul-Henning Kamp 1040f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1041f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1042f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1043f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 10442a71f1edSConrad Meyer case CTLTYPE_S8: 10452a71f1edSConrad Meyer case CTLTYPE_S16: 10462a71f1edSConrad Meyer case CTLTYPE_S32: 1047cbc134adSMatthew D Fleming case CTLTYPE_S64: 10482a71f1edSConrad Meyer case CTLTYPE_U8: 10492a71f1edSConrad Meyer case CTLTYPE_U16: 10502a71f1edSConrad Meyer case CTLTYPE_U32: 1051cbc134adSMatthew D Fleming case CTLTYPE_U64: 1052dbf9b92fSDoug Rabson if (!nflag) 1053d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1054e37d2b30SDavid Malone hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; 1055fd8c668aSDavid Malone sep1 = ""; 105641e419cbSDavid Malone while (len >= intlen) { 1057f8e4b4efSMatthew D Fleming switch (kind & CTLTYPE) { 1058f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1059f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1060e37d2b30SDavid Malone umv = *(u_int *)p; 1061e37d2b30SDavid Malone mv = *(int *)p; 106241e419cbSDavid Malone break; 1063f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1064f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 1065e37d2b30SDavid Malone umv = *(u_long *)p; 1066e37d2b30SDavid Malone mv = *(long *)p; 106741e419cbSDavid Malone break; 10682a71f1edSConrad Meyer case CTLTYPE_S8: 10692a71f1edSConrad Meyer case CTLTYPE_U8: 10702a71f1edSConrad Meyer umv = *(uint8_t *)p; 10712a71f1edSConrad Meyer mv = *(int8_t *)p; 10722a71f1edSConrad Meyer break; 10732a71f1edSConrad Meyer case CTLTYPE_S16: 10742a71f1edSConrad Meyer case CTLTYPE_U16: 10752a71f1edSConrad Meyer umv = *(uint16_t *)p; 10762a71f1edSConrad Meyer mv = *(int16_t *)p; 10772a71f1edSConrad Meyer break; 10782a71f1edSConrad Meyer case CTLTYPE_S32: 10792a71f1edSConrad Meyer case CTLTYPE_U32: 10802a71f1edSConrad Meyer umv = *(uint32_t *)p; 10812a71f1edSConrad Meyer mv = *(int32_t *)p; 10822a71f1edSConrad Meyer break; 1083cbc134adSMatthew D Fleming case CTLTYPE_S64: 1084cbc134adSMatthew D Fleming case CTLTYPE_U64: 1085cbc134adSMatthew D Fleming umv = *(uint64_t *)p; 1086cbc134adSMatthew D Fleming mv = *(int64_t *)p; 108741e419cbSDavid Malone break; 108841e419cbSDavid Malone } 1089fd8c668aSDavid Malone fputs(sep1, stdout); 1090f8e4b4efSMatthew D Fleming if (xflag) 1091e37d2b30SDavid Malone printf("%#0*jx", hexlen, umv); 1092f8e4b4efSMatthew D Fleming else if (!sign) 1093f8e4b4efSMatthew D Fleming printf(hflag ? "%'ju" : "%ju", umv); 109441e419cbSDavid Malone else if (fmt[1] == 'K') { 1095e37d2b30SDavid Malone if (mv < 0) 109621e1f596SDavid Malone printf("%jd", mv); 1097aa255ef6SWarner Losh else { 1098aa255ef6SWarner Losh /* 1099aa255ef6SWarner Losh * See strIKtoi for details on fmt. 1100aa255ef6SWarner Losh */ 1101aa255ef6SWarner Losh prec = 1; 1102aa255ef6SWarner Losh if (fmt[2] != '\0') 1103aa255ef6SWarner Losh prec = fmt[2] - '0'; 1104aa255ef6SWarner Losh base = 1.0; 1105aa255ef6SWarner Losh for (int i = 0; i < prec; i++) 1106aa255ef6SWarner Losh base *= 10.0; 1107aa255ef6SWarner Losh printf("%.*fC", prec, 1108aa255ef6SWarner Losh (float)mv / base - 273.15); 1109aa255ef6SWarner Losh } 1110c591d41fSPeter Wemm } else 1111fd8c668aSDavid Malone printf(hflag ? "%'jd" : "%jd", mv); 1112fd8c668aSDavid Malone sep1 = " "; 111341e419cbSDavid Malone len -= intlen; 111441e419cbSDavid Malone p += intlen; 1115aa02fb57SPoul-Henning Kamp } 1116ccf25977SRuslan Ermilov free(oval); 1117dbf9b92fSDoug Rabson return (0); 1118dbf9b92fSDoug Rabson 1119f8e4b4efSMatthew D Fleming case CTLTYPE_OPAQUE: 11201d86b91cSPoul-Henning Kamp i = 0; 11211d86b91cSPoul-Henning Kamp if (func) { 11221d86b91cSPoul-Henning Kamp if (!nflag) 1123d0b8aabbSAnton Berezin printf("%s%s", name, sep); 112448cd487aSHartmut Brandt i = (*func)(len, p); 1125ccf25977SRuslan Ermilov free(oval); 112648cd487aSHartmut Brandt return (i); 11271d86b91cSPoul-Henning Kamp } 11281d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 1129dea673e9SRodney W. Grimes default: 1130ccf25977SRuslan Ermilov if (!oflag && !xflag) { 1131ccf25977SRuslan Ermilov free(oval); 11321d86b91cSPoul-Henning Kamp return (1); 1133ccf25977SRuslan Ermilov } 11341d86b91cSPoul-Henning Kamp if (!nflag) 1135d0b8aabbSAnton Berezin printf("%s%s", name, sep); 11366d7a8f6cSUlrich Spörlein printf("Format:%s Length:%zu Dump:0x", fmt, len); 1137a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 11381d86b91cSPoul-Henning Kamp printf("%02x", *p++); 1139a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 11401d86b91cSPoul-Henning Kamp printf("..."); 1141ccf25977SRuslan Ermilov free(oval); 11421d86b91cSPoul-Henning Kamp return (0); 11431d86b91cSPoul-Henning Kamp } 1144ccf25977SRuslan Ermilov free(oval); 11451d86b91cSPoul-Henning Kamp return (1); 1146dea673e9SRodney W. Grimes } 1147dea673e9SRodney W. Grimes 11481d86b91cSPoul-Henning Kamp static int 11491d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len) 1150dea673e9SRodney W. Grimes { 11511d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 1152dbf9b92fSDoug Rabson int i, j; 1153dbf9b92fSDoug Rabson size_t l1, l2; 1154dea673e9SRodney W. Grimes 11551d86b91cSPoul-Henning Kamp name1[0] = 0; 11561d86b91cSPoul-Henning Kamp name1[1] = 2; 11571d86b91cSPoul-Henning Kamp l1 = 2; 11581d86b91cSPoul-Henning Kamp if (len) { 11591d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 11601d86b91cSPoul-Henning Kamp l1 += len; 11611d86b91cSPoul-Henning Kamp } else { 11621d86b91cSPoul-Henning Kamp name1[2] = 1; 11631d86b91cSPoul-Henning Kamp l1++; 11641d86b91cSPoul-Henning Kamp } 1165a89ab9bbSDag-Erling Smørgrav for (;;) { 116631fb4661SDima Dorfman l2 = sizeof(name2); 11671d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 1168c1160fe4SBill Fumerola if (j < 0) { 11691d86b91cSPoul-Henning Kamp if (errno == ENOENT) 117021e1f596SDavid Malone return (0); 11711d86b91cSPoul-Henning Kamp else 11726d7a8f6cSUlrich Spörlein err(1, "sysctl(getnext) %d %zu", j, l2); 1173c1160fe4SBill Fumerola } 11741d86b91cSPoul-Henning Kamp 11751d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 11761d86b91cSPoul-Henning Kamp 1177fd8c668aSDavid Malone if (len < 0 || l2 < (unsigned int)len) 117821e1f596SDavid Malone return (0); 11791d86b91cSPoul-Henning Kamp 11801d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 11811d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 118221e1f596SDavid Malone return (0); 11831d86b91cSPoul-Henning Kamp 11841d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 11851d86b91cSPoul-Henning Kamp if (!i && !bflag) 11861d86b91cSPoul-Henning Kamp putchar('\n'); 11871d86b91cSPoul-Henning Kamp 11881d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 11891d86b91cSPoul-Henning Kamp l1 = 2 + l2; 11901d86b91cSPoul-Henning Kamp } 1191dea673e9SRodney W. Grimes } 1192