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 32ce685842SBruce Evans #include <sys/param.h> 33ce685842SBruce Evans #include <sys/time.h> 34ce685842SBruce Evans #include <sys/resource.h> 35dea673e9SRodney W. Grimes #include <sys/stat.h> 36dea673e9SRodney W. Grimes #include <sys/sysctl.h> 37f7550ecfSMatthew Dillon #include <sys/vmmeter.h> 38f99e7b1aSVladimir Kondratyev #include <dev/evdev/input.h> 39dea673e9SRodney W. Grimes 407d8312ccSJohn Baldwin #ifdef __amd64__ 417d8312ccSJohn Baldwin #include <sys/efi.h> 427d8312ccSJohn Baldwin #include <machine/metadata.h> 437d8312ccSJohn Baldwin #endif 447d8312ccSJohn Baldwin 4589871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 4689871cdeSJohn Baldwin #include <machine/pc/bios.h> 4789871cdeSJohn Baldwin #endif 4889871cdeSJohn Baldwin 49e267e00eSXin LI #include <assert.h> 50d9b1bc77SPhilippe Charnier #include <ctype.h> 51d9b1bc77SPhilippe Charnier #include <err.h> 52dea673e9SRodney W. Grimes #include <errno.h> 5341e419cbSDavid Malone #include <inttypes.h> 5445817aaaSDag-Erling Smørgrav #include <locale.h> 552365fe56SJohn Baldwin #include <stdbool.h> 56dea673e9SRodney W. Grimes #include <stdio.h> 57dea673e9SRodney W. Grimes #include <stdlib.h> 58dea673e9SRodney W. Grimes #include <string.h> 59da178c77SXin LI #include <sysexits.h> 60d9b1bc77SPhilippe Charnier #include <unistd.h> 61dea673e9SRodney W. Grimes 62da178c77SXin LI static const char *conffile; 63da178c77SXin LI 6475820005SJohn-Mark Gurney static int aflag, bflag, Bflag, dflag, eflag, hflag, iflag; 658020192dSMarcelo Araujo static int Nflag, nflag, oflag, qflag, tflag, Tflag, Wflag, xflag; 665ec83c66SZhenlei Huang static bool Fflag, Jflag, lflag, Vflag; 67dea673e9SRodney W. Grimes 681d86b91cSPoul-Henning Kamp static int oidfmt(int *, int, char *, u_int *); 69*6193855fSZhenlei Huang static int parsefile(FILE *); 70da178c77SXin LI static int parse(const char *, int); 7192e17803SRyan Moeller static int show_var(int *, int, bool); 72401f82dfSRyan Moeller static int sysctl_all(int *, int); 73c58f8df6SXin LI static int name2oid(const char *, int *); 74dea673e9SRodney W. Grimes 75aa255ef6SWarner Losh static int strIKtoi(const char *, char **, const char *); 76e267e00eSXin LI 77e267e00eSXin LI static int ctl_sign[CTLTYPE+1] = { 78e267e00eSXin LI [CTLTYPE_INT] = 1, 79e267e00eSXin LI [CTLTYPE_LONG] = 1, 802a71f1edSConrad Meyer [CTLTYPE_S8] = 1, 812a71f1edSConrad Meyer [CTLTYPE_S16] = 1, 822a71f1edSConrad Meyer [CTLTYPE_S32] = 1, 83e267e00eSXin LI [CTLTYPE_S64] = 1, 84e267e00eSXin LI }; 85e267e00eSXin LI 86e267e00eSXin LI static int ctl_size[CTLTYPE+1] = { 87e267e00eSXin LI [CTLTYPE_INT] = sizeof(int), 88e267e00eSXin LI [CTLTYPE_UINT] = sizeof(u_int), 89e267e00eSXin LI [CTLTYPE_LONG] = sizeof(long), 90e267e00eSXin LI [CTLTYPE_ULONG] = sizeof(u_long), 912a71f1edSConrad Meyer [CTLTYPE_S8] = sizeof(int8_t), 922a71f1edSConrad Meyer [CTLTYPE_S16] = sizeof(int16_t), 932a71f1edSConrad Meyer [CTLTYPE_S32] = sizeof(int32_t), 94e267e00eSXin LI [CTLTYPE_S64] = sizeof(int64_t), 952a71f1edSConrad Meyer [CTLTYPE_U8] = sizeof(uint8_t), 962a71f1edSConrad Meyer [CTLTYPE_U16] = sizeof(uint16_t), 972a71f1edSConrad Meyer [CTLTYPE_U32] = sizeof(uint32_t), 98e267e00eSXin LI [CTLTYPE_U64] = sizeof(uint64_t), 99e267e00eSXin LI }; 100e267e00eSXin LI 101e267e00eSXin LI static const char *ctl_typename[CTLTYPE+1] = { 102e267e00eSXin LI [CTLTYPE_INT] = "integer", 103e267e00eSXin LI [CTLTYPE_UINT] = "unsigned integer", 104e267e00eSXin LI [CTLTYPE_LONG] = "long integer", 105e267e00eSXin LI [CTLTYPE_ULONG] = "unsigned long", 1062a71f1edSConrad Meyer [CTLTYPE_U8] = "uint8_t", 1072a71f1edSConrad Meyer [CTLTYPE_U16] = "uint16_t", 1083ddb14a5SAndriy Voskoboinyk [CTLTYPE_U32] = "uint32_t", 109e267e00eSXin LI [CTLTYPE_U64] = "uint64_t", 1102a71f1edSConrad Meyer [CTLTYPE_S8] = "int8_t", 1112a71f1edSConrad Meyer [CTLTYPE_S16] = "int16_t", 1122a71f1edSConrad Meyer [CTLTYPE_S32] = "int32_t", 1132a71f1edSConrad Meyer [CTLTYPE_S64] = "int64_t", 1148020192dSMarcelo Araujo [CTLTYPE_NODE] = "node", 1158020192dSMarcelo Araujo [CTLTYPE_STRING] = "string", 1168020192dSMarcelo Araujo [CTLTYPE_OPAQUE] = "opaque", 117e267e00eSXin LI }; 118d58f0054SPoul-Henning Kamp 1191d86b91cSPoul-Henning Kamp static void 1201d86b91cSPoul-Henning Kamp usage(void) 1211d86b91cSPoul-Henning Kamp { 122dea673e9SRodney W. Grimes 1239a2402bcSDag-Erling Smørgrav (void)fprintf(stderr, "%s\n%s\n", 1240ee3e29eSZhenlei Huang "usage: sysctl [-bdeFhiJlNnoqTtVWx] [ -B <bufsize> ] [-f filename] name[=value] ...", 1250ee3e29eSZhenlei Huang " sysctl [-bdeFhJlNnoqTtVWx] [ -B <bufsize> ] -a"); 1261d86b91cSPoul-Henning Kamp exit(1); 1271d86b91cSPoul-Henning Kamp } 128dea673e9SRodney W. Grimes 129dea673e9SRodney W. Grimes int 1301d86b91cSPoul-Henning Kamp main(int argc, char **argv) 131dea673e9SRodney W. Grimes { 1321d86b91cSPoul-Henning Kamp int ch; 133da178c77SXin LI int warncount = 0; 134*6193855fSZhenlei Huang FILE *file = NULL; 13545817aaaSDag-Erling Smørgrav 13645817aaaSDag-Erling Smørgrav setlocale(LC_NUMERIC, ""); 1371d86b91cSPoul-Henning Kamp setbuf(stdout,0); 1381d86b91cSPoul-Henning Kamp setbuf(stderr,0); 139dea673e9SRodney W. Grimes 140c294ecb2SZhenlei Huang while ((ch = getopt(argc, argv, "AaB:bdeFf:hiJlNnoqTtVWwXx")) != -1) { 141dea673e9SRodney W. Grimes switch (ch) { 142ca5fac55SDag-Erling Smørgrav case 'A': 1439a2402bcSDag-Erling Smørgrav /* compatibility */ 1449a2402bcSDag-Erling Smørgrav aflag = oflag = 1; 145ca5fac55SDag-Erling Smørgrav break; 146ca5fac55SDag-Erling Smørgrav case 'a': 147ca5fac55SDag-Erling Smørgrav aflag = 1; 148ca5fac55SDag-Erling Smørgrav break; 14975820005SJohn-Mark Gurney case 'B': 15075820005SJohn-Mark Gurney Bflag = strtol(optarg, NULL, 0); 15175820005SJohn-Mark Gurney break; 152c294ecb2SZhenlei Huang case 'b': 153c294ecb2SZhenlei Huang bflag = 1; 154c294ecb2SZhenlei Huang break; 1556105f815SLuigi Rizzo case 'd': 1566105f815SLuigi Rizzo dflag = 1; 1576105f815SLuigi Rizzo break; 158d0b8aabbSAnton Berezin case 'e': 159d0b8aabbSAnton Berezin eflag = 1; 160d0b8aabbSAnton Berezin break; 161f126d349SKirk McKusick case 'F': 162f126d349SKirk McKusick Fflag = true; 163f126d349SKirk McKusick break; 164c294ecb2SZhenlei Huang case 'f': 165c294ecb2SZhenlei Huang conffile = optarg; 166c294ecb2SZhenlei Huang break; 16745817aaaSDag-Erling Smørgrav case 'h': 16845817aaaSDag-Erling Smørgrav hflag = 1; 16945817aaaSDag-Erling Smørgrav break; 17024b2aa32SGavin Atkinson case 'i': 17124b2aa32SGavin Atkinson iflag = 1; 17224b2aa32SGavin Atkinson break; 1735ec83c66SZhenlei Huang case 'J': 1745ec83c66SZhenlei Huang Jflag = true; 1755ec83c66SZhenlei Huang break; 176f126d349SKirk McKusick case 'l': 177f126d349SKirk McKusick lflag = true; 178f126d349SKirk McKusick break; 179ca5fac55SDag-Erling Smørgrav case 'N': 180ca5fac55SDag-Erling Smørgrav Nflag = 1; 181ca5fac55SDag-Erling Smørgrav break; 182ca5fac55SDag-Erling Smørgrav case 'n': 183ca5fac55SDag-Erling Smørgrav nflag = 1; 184ca5fac55SDag-Erling Smørgrav break; 1859a2402bcSDag-Erling Smørgrav case 'o': 1869a2402bcSDag-Erling Smørgrav oflag = 1; 1879a2402bcSDag-Erling Smørgrav break; 188f93d36fdSRobert Watson case 'q': 189f93d36fdSRobert Watson qflag = 1; 190f93d36fdSRobert Watson break; 1919ecd2e32SAlfred Perlstein case 'T': 1929ecd2e32SAlfred Perlstein Tflag = 1; 1939ecd2e32SAlfred Perlstein break; 194c294ecb2SZhenlei Huang case 't': 195c294ecb2SZhenlei Huang tflag = 1; 196c294ecb2SZhenlei Huang break; 1975ec83c66SZhenlei Huang case 'V': 1985ec83c66SZhenlei Huang Vflag = true; 1995ec83c66SZhenlei Huang break; 200c294ecb2SZhenlei Huang case 'W': 201c294ecb2SZhenlei Huang Wflag = 1; 202c294ecb2SZhenlei Huang break; 203ca5fac55SDag-Erling Smørgrav case 'w': 2049a2402bcSDag-Erling Smørgrav /* compatibility */ 2059a2402bcSDag-Erling Smørgrav /* ignored */ 206ca5fac55SDag-Erling Smørgrav break; 207ca5fac55SDag-Erling Smørgrav case 'X': 2089a2402bcSDag-Erling Smørgrav /* compatibility */ 2099a2402bcSDag-Erling Smørgrav aflag = xflag = 1; 2109a2402bcSDag-Erling Smørgrav break; 2119a2402bcSDag-Erling Smørgrav case 'x': 2129a2402bcSDag-Erling Smørgrav xflag = 1; 213ca5fac55SDag-Erling Smørgrav break; 214ca5fac55SDag-Erling Smørgrav default: 215ca5fac55SDag-Erling Smørgrav usage(); 216dea673e9SRodney W. Grimes } 217dea673e9SRodney W. Grimes } 218dea673e9SRodney W. Grimes argc -= optind; 219dea673e9SRodney W. Grimes argv += optind; 220dea673e9SRodney W. Grimes 2212e8ad2b6SHao-Yu Hou /* Nflag is name only and doesn't make sense to combine with these */ 222f126d349SKirk McKusick /* TODO: few other combinations do not make sense but come back later */ 223f126d349SKirk McKusick if (Nflag && (lflag || nflag)) 22481e7454aSDag-Erling Smørgrav usage(); 2259a2402bcSDag-Erling Smørgrav if (aflag && argc == 0) 2268077b9bcSRyan Moeller exit(sysctl_all(NULL, 0)); 227da178c77SXin LI if (argc == 0 && conffile == NULL) 228dea673e9SRodney W. Grimes usage(); 229d9fcd86cSMike Makonnen 230*6193855fSZhenlei Huang if (conffile != NULL) { 231*6193855fSZhenlei Huang file = fopen(conffile, "r"); 232*6193855fSZhenlei Huang if (file == NULL) 233*6193855fSZhenlei Huang err(EX_NOINPUT, "%s", conffile); 234*6193855fSZhenlei Huang warncount += parsefile(file); 235*6193855fSZhenlei Huang fclose(file); 236*6193855fSZhenlei Huang } 237da178c77SXin LI 238dea673e9SRodney W. Grimes while (argc-- > 0) 239da178c77SXin LI warncount += parse(*argv++, 0); 240da178c77SXin LI 241da178c77SXin LI return (warncount); 242dea673e9SRodney W. Grimes } 243dea673e9SRodney W. Grimes 244dea673e9SRodney W. Grimes /* 2452365fe56SJohn Baldwin * Parse a single numeric value, append it to 'newbuf', and update 2462365fe56SJohn Baldwin * 'newsize'. Returns true if the value was parsed and false if the 2472365fe56SJohn Baldwin * value was invalid. Non-numeric types (strings) are handled 2482365fe56SJohn Baldwin * directly in parse(). 249dea673e9SRodney W. Grimes */ 2502365fe56SJohn Baldwin static bool 2512365fe56SJohn Baldwin parse_numeric(const char *newvalstr, const char *fmt, u_int kind, 2522365fe56SJohn Baldwin void **newbufp, size_t *newsizep) 253dea673e9SRodney W. Grimes { 2542365fe56SJohn Baldwin void *newbuf; 255e267e00eSXin LI const void *newval; 2562a71f1edSConrad Meyer int8_t i8val; 257c3220d0bSConrad Meyer uint8_t u8val; 2582a71f1edSConrad Meyer int16_t i16val; 259c3220d0bSConrad Meyer uint16_t u16val; 2602a71f1edSConrad Meyer int32_t i32val; 2612a71f1edSConrad Meyer uint32_t u32val; 2621ce1a53dSJim Pirzyk int intval; 2631ce1a53dSJim Pirzyk unsigned int uintval; 2641ce1a53dSJim Pirzyk long longval; 2651ce1a53dSJim Pirzyk unsigned long ulongval; 266cbc134adSMatthew D Fleming int64_t i64val; 267cbc134adSMatthew D Fleming uint64_t u64val; 2682365fe56SJohn Baldwin size_t valsize; 2692365fe56SJohn Baldwin char *endptr = NULL; 2702365fe56SJohn Baldwin 2712365fe56SJohn Baldwin errno = 0; 2722365fe56SJohn Baldwin 2732365fe56SJohn Baldwin switch (kind & CTLTYPE) { 2742365fe56SJohn Baldwin case CTLTYPE_INT: 2752365fe56SJohn Baldwin if (strncmp(fmt, "IK", 2) == 0) 2762365fe56SJohn Baldwin intval = strIKtoi(newvalstr, &endptr, fmt); 2772365fe56SJohn Baldwin else 2782365fe56SJohn Baldwin intval = (int)strtol(newvalstr, &endptr, 0); 2792365fe56SJohn Baldwin newval = &intval; 2802365fe56SJohn Baldwin valsize = sizeof(intval); 2812365fe56SJohn Baldwin break; 2822365fe56SJohn Baldwin case CTLTYPE_UINT: 2832365fe56SJohn Baldwin uintval = (int) strtoul(newvalstr, &endptr, 0); 2842365fe56SJohn Baldwin newval = &uintval; 2852365fe56SJohn Baldwin valsize = sizeof(uintval); 2862365fe56SJohn Baldwin break; 2872365fe56SJohn Baldwin case CTLTYPE_LONG: 2882365fe56SJohn Baldwin longval = strtol(newvalstr, &endptr, 0); 2892365fe56SJohn Baldwin newval = &longval; 2902365fe56SJohn Baldwin valsize = sizeof(longval); 2912365fe56SJohn Baldwin break; 2922365fe56SJohn Baldwin case CTLTYPE_ULONG: 2932365fe56SJohn Baldwin ulongval = strtoul(newvalstr, &endptr, 0); 2942365fe56SJohn Baldwin newval = &ulongval; 2952365fe56SJohn Baldwin valsize = sizeof(ulongval); 2962365fe56SJohn Baldwin break; 2972365fe56SJohn Baldwin case CTLTYPE_S8: 2982365fe56SJohn Baldwin i8val = (int8_t)strtol(newvalstr, &endptr, 0); 2992365fe56SJohn Baldwin newval = &i8val; 3002365fe56SJohn Baldwin valsize = sizeof(i8val); 3012365fe56SJohn Baldwin break; 3022365fe56SJohn Baldwin case CTLTYPE_S16: 3032365fe56SJohn Baldwin i16val = (int16_t)strtol(newvalstr, &endptr, 0); 3042365fe56SJohn Baldwin newval = &i16val; 3052365fe56SJohn Baldwin valsize = sizeof(i16val); 3062365fe56SJohn Baldwin break; 3072365fe56SJohn Baldwin case CTLTYPE_S32: 3082365fe56SJohn Baldwin i32val = (int32_t)strtol(newvalstr, &endptr, 0); 3092365fe56SJohn Baldwin newval = &i32val; 3102365fe56SJohn Baldwin valsize = sizeof(i32val); 3112365fe56SJohn Baldwin break; 3122365fe56SJohn Baldwin case CTLTYPE_S64: 3132365fe56SJohn Baldwin i64val = strtoimax(newvalstr, &endptr, 0); 3142365fe56SJohn Baldwin newval = &i64val; 3152365fe56SJohn Baldwin valsize = sizeof(i64val); 3162365fe56SJohn Baldwin break; 3172365fe56SJohn Baldwin case CTLTYPE_U8: 3182365fe56SJohn Baldwin u8val = (uint8_t)strtoul(newvalstr, &endptr, 0); 3192365fe56SJohn Baldwin newval = &u8val; 3202365fe56SJohn Baldwin valsize = sizeof(u8val); 3212365fe56SJohn Baldwin break; 3222365fe56SJohn Baldwin case CTLTYPE_U16: 3232365fe56SJohn Baldwin u16val = (uint16_t)strtoul(newvalstr, &endptr, 0); 3242365fe56SJohn Baldwin newval = &u16val; 3252365fe56SJohn Baldwin valsize = sizeof(u16val); 3262365fe56SJohn Baldwin break; 3272365fe56SJohn Baldwin case CTLTYPE_U32: 3282365fe56SJohn Baldwin u32val = (uint32_t)strtoul(newvalstr, &endptr, 0); 3292365fe56SJohn Baldwin newval = &u32val; 3302365fe56SJohn Baldwin valsize = sizeof(u32val); 3312365fe56SJohn Baldwin break; 3322365fe56SJohn Baldwin case CTLTYPE_U64: 3332365fe56SJohn Baldwin u64val = strtoumax(newvalstr, &endptr, 0); 3342365fe56SJohn Baldwin newval = &u64val; 3352365fe56SJohn Baldwin valsize = sizeof(u64val); 3362365fe56SJohn Baldwin break; 3372365fe56SJohn Baldwin default: 3382365fe56SJohn Baldwin /* NOTREACHED */ 3392365fe56SJohn Baldwin abort(); 3402365fe56SJohn Baldwin } 3412365fe56SJohn Baldwin 3422365fe56SJohn Baldwin if (errno != 0 || endptr == newvalstr || 3432365fe56SJohn Baldwin (endptr != NULL && *endptr != '\0')) 3442365fe56SJohn Baldwin return (false); 3452365fe56SJohn Baldwin 3462365fe56SJohn Baldwin newbuf = realloc(*newbufp, *newsizep + valsize); 3472365fe56SJohn Baldwin if (newbuf == NULL) 3482365fe56SJohn Baldwin err(1, "out of memory"); 3492365fe56SJohn Baldwin memcpy((char *)newbuf + *newsizep, newval, valsize); 3502365fe56SJohn Baldwin *newbufp = newbuf; 3512365fe56SJohn Baldwin *newsizep += valsize; 3522365fe56SJohn Baldwin 3532365fe56SJohn Baldwin return (true); 3542365fe56SJohn Baldwin } 3552365fe56SJohn Baldwin 3562365fe56SJohn Baldwin /* 3572365fe56SJohn Baldwin * Parse a name into a MIB entry. 3582365fe56SJohn Baldwin * Lookup and print out the MIB entry if it exists. 3592365fe56SJohn Baldwin * Set a new value if requested. 3602365fe56SJohn Baldwin */ 3612365fe56SJohn Baldwin static int 3622365fe56SJohn Baldwin parse(const char *string, int lineno) 3632365fe56SJohn Baldwin { 364b64b636dSJohn Baldwin int len, i, j, save_errno; 3652365fe56SJohn Baldwin const void *newval; 3662365fe56SJohn Baldwin char *newvalstr = NULL; 3672365fe56SJohn Baldwin void *newbuf; 3682365fe56SJohn Baldwin size_t newsize = Bflag; 369dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 370b64b636dSJohn Baldwin char *cp, *bufp, *buf, fmt[BUFSIZ], line[BUFSIZ]; 3711d86b91cSPoul-Henning Kamp u_int kind; 372dea673e9SRodney W. Grimes 373da178c77SXin LI if (lineno) 374da178c77SXin LI snprintf(line, sizeof(line), " at line %d", lineno); 375da178c77SXin LI else 376da178c77SXin LI line[0] = '\0'; 377da178c77SXin LI 3788077b9bcSRyan Moeller /* 3798077b9bcSRyan Moeller * Split the string into name and value. 3808077b9bcSRyan Moeller * 3818077b9bcSRyan Moeller * Either = or : may be used as the delimiter. 3828077b9bcSRyan Moeller * Whitespace surrounding the delimiter is trimmed. 3838077b9bcSRyan Moeller * Quotes around the value are stripped. 3848077b9bcSRyan Moeller */ 385b64b636dSJohn Baldwin cp = buf = strdup(string); 386da178c77SXin LI bufp = strsep(&cp, "=:"); 387aae75101SXin LI if (cp != NULL) { 3889ecd2e32SAlfred Perlstein /* Tflag just lists tunables, do not allow assignment */ 3899ecd2e32SAlfred Perlstein if (Tflag || Wflag) { 3909ecd2e32SAlfred Perlstein warnx("Can't set variables when using -T or -W"); 3919ecd2e32SAlfred Perlstein usage(); 3929ecd2e32SAlfred Perlstein } 3938077b9bcSRyan Moeller /* Trim whitespace before the value. */ 394dea673e9SRodney W. Grimes while (isspace(*cp)) 395dea673e9SRodney W. Grimes cp++; 396da178c77SXin LI /* Strip a pair of " or ' if any. */ 397da178c77SXin LI switch (*cp) { 398da178c77SXin LI case '\"': 399da178c77SXin LI case '\'': 400da178c77SXin LI if (cp[strlen(cp) - 1] == *cp) 401da178c77SXin LI cp[strlen(cp) - 1] = '\0'; 402da178c77SXin LI cp++; 403da178c77SXin LI } 404e267e00eSXin LI newvalstr = cp; 405dea673e9SRodney W. Grimes newsize = strlen(cp); 406dea673e9SRodney W. Grimes } 4078077b9bcSRyan Moeller /* Trim whitespace after the name. */ 408ca587fdaSBaptiste Daroussin cp = bufp + strlen(bufp) - 1; 409ca587fdaSBaptiste Daroussin while (cp >= bufp && isspace((int)*cp)) { 410ca587fdaSBaptiste Daroussin *cp = '\0'; 411ca587fdaSBaptiste Daroussin cp--; 412ca587fdaSBaptiste Daroussin } 4131d86b91cSPoul-Henning Kamp 4148077b9bcSRyan Moeller /* 4158077b9bcSRyan Moeller * Check the name is a useable oid. 4168077b9bcSRyan Moeller */ 4178077b9bcSRyan Moeller len = name2oid(bufp, mib); 418f93d36fdSRobert Watson if (len < 0) { 419b64b636dSJohn Baldwin if (iflag) { 420b64b636dSJohn Baldwin free(buf); 421da178c77SXin LI return (0); 422b64b636dSJohn Baldwin } 423b64b636dSJohn Baldwin if (!qflag) { 424e1619d12SBaptiste Daroussin if (errno == ENOENT) { 425e1619d12SBaptiste Daroussin warnx("unknown oid '%s'%s", bufp, line); 426e1619d12SBaptiste Daroussin } else { 427da178c77SXin LI warn("unknown oid '%s'%s", bufp, line); 428e1619d12SBaptiste Daroussin } 429da178c77SXin LI } 430b64b636dSJohn Baldwin free(buf); 431b64b636dSJohn Baldwin return (1); 432f93d36fdSRobert Watson } 4331d86b91cSPoul-Henning Kamp 434da178c77SXin LI if (oidfmt(mib, len, fmt, &kind)) { 435da178c77SXin LI warn("couldn't find format of oid '%s'%s", bufp, line); 436b64b636dSJohn Baldwin free(buf); 437da178c77SXin LI if (iflag) 438da178c77SXin LI return (1); 439da178c77SXin LI else 440da178c77SXin LI exit(1); 441da178c77SXin LI } 4421d86b91cSPoul-Henning Kamp 4438077b9bcSRyan Moeller /* 4448077b9bcSRyan Moeller * We have a useable oid to work with. If there is no value given, 4458077b9bcSRyan Moeller * show the node and its children. Otherwise, set the new value. 4468077b9bcSRyan Moeller */ 447e267e00eSXin LI if (newvalstr == NULL || dflag) { 448b64b636dSJohn Baldwin free(buf); 4491d86b91cSPoul-Henning Kamp if ((kind & CTLTYPE) == CTLTYPE_NODE) { 450b2680e20SMatthew N. Dodd if (dflag) { 45192e17803SRyan Moeller i = show_var(mib, len, false); 452b2680e20SMatthew N. Dodd if (!i && !bflag) 453b2680e20SMatthew N. Dodd putchar('\n'); 454b2680e20SMatthew N. Dodd } 4551d86b91cSPoul-Henning Kamp sysctl_all(mib, len); 4561d86b91cSPoul-Henning Kamp } else { 45792e17803SRyan Moeller i = show_var(mib, len, false); 4581d86b91cSPoul-Henning Kamp if (!i && !bflag) 4591d86b91cSPoul-Henning Kamp putchar('\n'); 460dea673e9SRodney W. Grimes } 4618077b9bcSRyan Moeller return (0); 4628077b9bcSRyan Moeller } 4638077b9bcSRyan Moeller 4648077b9bcSRyan Moeller /* 4658077b9bcSRyan Moeller * We have a new value to set. Check its validity and parse if numeric. 4668077b9bcSRyan Moeller */ 467da178c77SXin LI if ((kind & CTLTYPE) == CTLTYPE_NODE) { 468c6919e7fSEdward Tomasz Napierala warnx("oid '%s' isn't a leaf node%s", bufp, line); 469b64b636dSJohn Baldwin free(buf); 470da178c77SXin LI return (1); 471da178c77SXin LI } 472dea673e9SRodney W. Grimes 473ac8711d2SMike Silbersack if (!(kind & CTLFLAG_WR)) { 4749b4b73b7SMike Silbersack if (kind & CTLFLAG_TUN) { 4756f361351SXin LI warnx("oid '%s' is a read only tunable%s", bufp, line); 476da178c77SXin LI warnx("Tunable values are set in /boot/loader.conf"); 477da178c77SXin LI } else 478da178c77SXin LI warnx("oid '%s' is read only%s", bufp, line); 479b64b636dSJohn Baldwin free(buf); 480da178c77SXin LI return (1); 481ac8711d2SMike Silbersack } 482dea673e9SRodney W. Grimes 483e267e00eSXin LI switch (kind & CTLTYPE) { 484e267e00eSXin LI case CTLTYPE_INT: 485e267e00eSXin LI case CTLTYPE_UINT: 486e267e00eSXin LI case CTLTYPE_LONG: 487e267e00eSXin LI case CTLTYPE_ULONG: 4882a71f1edSConrad Meyer case CTLTYPE_S8: 4892a71f1edSConrad Meyer case CTLTYPE_S16: 4902a71f1edSConrad Meyer case CTLTYPE_S32: 491e267e00eSXin LI case CTLTYPE_S64: 4922a71f1edSConrad Meyer case CTLTYPE_U8: 4932a71f1edSConrad Meyer case CTLTYPE_U16: 4942a71f1edSConrad Meyer case CTLTYPE_U32: 495e267e00eSXin LI case CTLTYPE_U64: 496e267e00eSXin LI if (strlen(newvalstr) == 0) { 497da178c77SXin LI warnx("empty numeric value"); 498b64b636dSJohn Baldwin free(buf); 499da178c77SXin LI return (1); 500da178c77SXin LI } 501e267e00eSXin LI /* FALLTHROUGH */ 502e267e00eSXin LI case CTLTYPE_STRING: 503e267e00eSXin LI break; 504e267e00eSXin LI default: 5058077b9bcSRyan Moeller warnx("oid '%s' is type %d, cannot set that%s", 5068077b9bcSRyan Moeller bufp, kind & CTLTYPE, line); 507b64b636dSJohn Baldwin free(buf); 508e267e00eSXin LI return (1); 509a78d3eafSRobert Watson } 510a78d3eafSRobert Watson 5112365fe56SJohn Baldwin newbuf = NULL; 5124b8740cdSXin LI 5131d86b91cSPoul-Henning Kamp switch (kind & CTLTYPE) { 5141d86b91cSPoul-Henning Kamp case CTLTYPE_STRING: 515e267e00eSXin LI newval = newvalstr; 5161d86b91cSPoul-Henning Kamp break; 5171d86b91cSPoul-Henning Kamp default: 5182365fe56SJohn Baldwin newsize = 0; 5192365fe56SJohn Baldwin while ((cp = strsep(&newvalstr, " ,")) != NULL) { 5202365fe56SJohn Baldwin if (*cp == '\0') 5212365fe56SJohn Baldwin continue; 5228077b9bcSRyan Moeller if (!parse_numeric(cp, fmt, kind, &newbuf, &newsize)) { 5232365fe56SJohn Baldwin warnx("invalid %s '%s'%s", 5248077b9bcSRyan Moeller ctl_typename[kind & CTLTYPE], cp, line); 5252365fe56SJohn Baldwin free(newbuf); 526b64b636dSJohn Baldwin free(buf); 527da178c77SXin LI return (1); 528dea673e9SRodney W. Grimes } 5292365fe56SJohn Baldwin } 5302365fe56SJohn Baldwin newval = newbuf; 5312365fe56SJohn Baldwin break; 5322365fe56SJohn Baldwin } 5331d86b91cSPoul-Henning Kamp 5348077b9bcSRyan Moeller /* 5358077b9bcSRyan Moeller * Show the current value, then set and show the new value. 5368077b9bcSRyan Moeller */ 53792e17803SRyan Moeller i = show_var(mib, len, false); 5381d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 539b64b636dSJohn Baldwin save_errno = errno; 5402365fe56SJohn Baldwin free(newbuf); 541b64b636dSJohn Baldwin free(buf); 5421d86b91cSPoul-Henning Kamp if (!i && !bflag) 5431d86b91cSPoul-Henning Kamp putchar('\n'); 544b64b636dSJohn Baldwin switch (save_errno) { 545dea673e9SRodney W. Grimes case EOPNOTSUPP: 546da178c77SXin LI warnx("%s: value is not available%s", 547da178c77SXin LI string, line); 548da178c77SXin LI return (1); 549dea673e9SRodney W. Grimes case ENOTDIR: 550da178c77SXin LI warnx("%s: specification is incomplete%s", 551da178c77SXin LI string, line); 552da178c77SXin LI return (1); 553dea673e9SRodney W. Grimes case ENOMEM: 554da178c77SXin LI warnx("%s: type is unknown to this program%s", 555da178c77SXin LI string, line); 556da178c77SXin LI return (1); 557dea673e9SRodney W. Grimes default: 558b64b636dSJohn Baldwin warnc(save_errno, "%s%s", string, line); 559da178c77SXin LI return (1); 560dea673e9SRodney W. Grimes } 561dea673e9SRodney W. Grimes } 5622365fe56SJohn Baldwin free(newbuf); 563b64b636dSJohn Baldwin free(buf); 5641d86b91cSPoul-Henning Kamp if (!bflag) 5651d86b91cSPoul-Henning Kamp printf(" -> "); 5661d86b91cSPoul-Henning Kamp i = nflag; 5671d86b91cSPoul-Henning Kamp nflag = 1; 56892e17803SRyan Moeller j = show_var(mib, len, false); 5691d86b91cSPoul-Henning Kamp if (!j && !bflag) 5701d86b91cSPoul-Henning Kamp putchar('\n'); 5711d86b91cSPoul-Henning Kamp nflag = i; 572da178c77SXin LI 573da178c77SXin LI return (0); 574da178c77SXin LI } 575da178c77SXin LI 576da178c77SXin LI static int 577*6193855fSZhenlei Huang parsefile(FILE *file) 578da178c77SXin LI { 579da178c77SXin LI char line[BUFSIZ], *p, *pq, *pdq; 580da178c77SXin LI int warncount = 0, lineno = 0; 581da178c77SXin LI 582da178c77SXin LI while (fgets(line, sizeof(line), file) != NULL) { 583da178c77SXin LI lineno++; 584da178c77SXin LI p = line; 585da178c77SXin LI pq = strchr(line, '\''); 586da178c77SXin LI pdq = strchr(line, '\"'); 587da178c77SXin LI /* Replace the first # with \0. */ 588da178c77SXin LI while((p = strchr(p, '#')) != NULL) { 589da178c77SXin LI if (pq != NULL && p > pq) { 590da178c77SXin LI if ((p = strchr(pq+1, '\'')) != NULL) 591da178c77SXin LI *(++p) = '\0'; 592da178c77SXin LI break; 593da178c77SXin LI } else if (pdq != NULL && p > pdq) { 594da178c77SXin LI if ((p = strchr(pdq+1, '\"')) != NULL) 595da178c77SXin LI *(++p) = '\0'; 596da178c77SXin LI break; 597da178c77SXin LI } else if (p == line || *(p-1) != '\\') { 598da178c77SXin LI *p = '\0'; 599da178c77SXin LI break; 600da178c77SXin LI } 601da178c77SXin LI p++; 602da178c77SXin LI } 603da178c77SXin LI /* Trim spaces */ 604da178c77SXin LI p = line + strlen(line) - 1; 605da178c77SXin LI while (p >= line && isspace((int)*p)) { 606da178c77SXin LI *p = '\0'; 607da178c77SXin LI p--; 608da178c77SXin LI } 609da178c77SXin LI p = line; 610da178c77SXin LI while (isspace((int)*p)) 611da178c77SXin LI p++; 612da178c77SXin LI if (*p == '\0') 613da178c77SXin LI continue; 614da178c77SXin LI else 615da178c77SXin LI warncount += parse(p, lineno); 616da178c77SXin LI } 617da178c77SXin LI 618da178c77SXin LI return (warncount); 619dea673e9SRodney W. Grimes } 620dea673e9SRodney W. Grimes 6211d86b91cSPoul-Henning Kamp /* These functions will dump out various interesting structures. */ 622dea673e9SRodney W. Grimes 6231d86b91cSPoul-Henning Kamp static int 62459101c5dSJohn Baldwin S_clockinfo(size_t l2, void *p) 6251d86b91cSPoul-Henning Kamp { 6261d86b91cSPoul-Henning Kamp struct clockinfo *ci = (struct clockinfo*)p; 62721e1f596SDavid Malone 628996076bbSAlfred Perlstein if (l2 != sizeof(*ci)) { 62959101c5dSJohn Baldwin warnx("S_clockinfo %zu != %zu", l2, sizeof(*ci)); 6306b6b665bSBruce Evans return (1); 631996076bbSAlfred Perlstein } 63245817aaaSDag-Erling Smørgrav printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 63345817aaaSDag-Erling Smørgrav "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 634b35c8f28SPoul-Henning Kamp ci->hz, ci->tick, ci->profhz, ci->stathz); 6351d86b91cSPoul-Henning Kamp return (0); 636dea673e9SRodney W. Grimes } 637dea673e9SRodney W. Grimes 6381d86b91cSPoul-Henning Kamp static int 63959101c5dSJohn Baldwin S_loadavg(size_t l2, void *p) 6401d86b91cSPoul-Henning Kamp { 6411d86b91cSPoul-Henning Kamp struct loadavg *tv = (struct loadavg*)p; 6421d86b91cSPoul-Henning Kamp 643996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 64459101c5dSJohn Baldwin warnx("S_loadavg %zu != %zu", l2, sizeof(*tv)); 6456b6b665bSBruce Evans return (1); 646996076bbSAlfred Perlstein } 64745817aaaSDag-Erling Smørgrav printf(hflag ? "{ %'.2f %'.2f %'.2f }" : "{ %.2f %.2f %.2f }", 6481d86b91cSPoul-Henning Kamp (double)tv->ldavg[0]/(double)tv->fscale, 6491d86b91cSPoul-Henning Kamp (double)tv->ldavg[1]/(double)tv->fscale, 6501d86b91cSPoul-Henning Kamp (double)tv->ldavg[2]/(double)tv->fscale); 6511d86b91cSPoul-Henning Kamp return (0); 652dea673e9SRodney W. Grimes } 653dea673e9SRodney W. Grimes 6541d86b91cSPoul-Henning Kamp static int 65559101c5dSJohn Baldwin S_timeval(size_t l2, void *p) 6561d86b91cSPoul-Henning Kamp { 6571d86b91cSPoul-Henning Kamp struct timeval *tv = (struct timeval*)p; 658c2deb608SBruce Evans time_t tv_sec; 6591d86b91cSPoul-Henning Kamp char *p1, *p2; 660dea673e9SRodney W. Grimes 661996076bbSAlfred Perlstein if (l2 != sizeof(*tv)) { 66259101c5dSJohn Baldwin warnx("S_timeval %zu != %zu", l2, sizeof(*tv)); 6636b6b665bSBruce Evans return (1); 664996076bbSAlfred Perlstein } 665db87e2dcSJohn Hay printf(hflag ? "{ sec = %'jd, usec = %'ld } " : 666db87e2dcSJohn Hay "{ sec = %jd, usec = %ld } ", 667db87e2dcSJohn Hay (intmax_t)tv->tv_sec, tv->tv_usec); 668c2deb608SBruce Evans tv_sec = tv->tv_sec; 669c2deb608SBruce Evans p1 = strdup(ctime(&tv_sec)); 6701d86b91cSPoul-Henning Kamp for (p2=p1; *p2 ; p2++) 6711d86b91cSPoul-Henning Kamp if (*p2 == '\n') 6721d86b91cSPoul-Henning Kamp *p2 = '\0'; 6731d86b91cSPoul-Henning Kamp fputs(p1, stdout); 674f2359a24SRebecca Cran free(p1); 6751d86b91cSPoul-Henning Kamp return (0); 6761d86b91cSPoul-Henning Kamp } 6771d86b91cSPoul-Henning Kamp 6781d86b91cSPoul-Henning Kamp static int 67959101c5dSJohn Baldwin S_vmtotal(size_t l2, void *p) 680f7550ecfSMatthew Dillon { 68141c0f8d3SKonstantin Belousov struct vmtotal *v; 68241c0f8d3SKonstantin Belousov int pageKilo; 683f7550ecfSMatthew Dillon 684f7550ecfSMatthew Dillon if (l2 != sizeof(*v)) { 68559101c5dSJohn Baldwin warnx("S_vmtotal %zu != %zu", l2, sizeof(*v)); 6866b6b665bSBruce Evans return (1); 687f7550ecfSMatthew Dillon } 688f7550ecfSMatthew Dillon 68941c0f8d3SKonstantin Belousov v = p; 69041c0f8d3SKonstantin Belousov pageKilo = getpagesize() / 1024; 69141c0f8d3SKonstantin Belousov 69241c0f8d3SKonstantin Belousov #define pg2k(a) ((uintmax_t)(a) * pageKilo) 69341c0f8d3SKonstantin Belousov printf("\nSystem wide totals computed every five seconds:" 694654e22e7SMatthew Dillon " (values in kilobytes)\n"); 695f7550ecfSMatthew Dillon printf("===============================================\n"); 69641c0f8d3SKonstantin Belousov printf("Processes:\t\t(RUNQ: %d Disk Wait: %d Page Wait: " 69741c0f8d3SKonstantin Belousov "%d Sleep: %d)\n", 698f7550ecfSMatthew Dillon v->t_rq, v->t_dw, v->t_pw, v->t_sl); 69941c0f8d3SKonstantin Belousov printf("Virtual Memory:\t\t(Total: %juK Active: %juK)\n", 70041c0f8d3SKonstantin Belousov pg2k(v->t_vm), pg2k(v->t_avm)); 70141c0f8d3SKonstantin Belousov printf("Real Memory:\t\t(Total: %juK Active: %juK)\n", 70241c0f8d3SKonstantin Belousov pg2k(v->t_rm), pg2k(v->t_arm)); 70341c0f8d3SKonstantin Belousov printf("Shared Virtual Memory:\t(Total: %juK Active: %juK)\n", 70441c0f8d3SKonstantin Belousov pg2k(v->t_vmshr), pg2k(v->t_avmshr)); 70541c0f8d3SKonstantin Belousov printf("Shared Real Memory:\t(Total: %juK Active: %juK)\n", 70641c0f8d3SKonstantin Belousov pg2k(v->t_rmshr), pg2k(v->t_armshr)); 70741c0f8d3SKonstantin Belousov printf("Free Memory:\t%juK", pg2k(v->t_free)); 708f7550ecfSMatthew Dillon return (0); 709f7550ecfSMatthew Dillon } 710f7550ecfSMatthew Dillon 711f99e7b1aSVladimir Kondratyev static int 712f99e7b1aSVladimir Kondratyev S_input_id(size_t l2, void *p) 713f99e7b1aSVladimir Kondratyev { 714f99e7b1aSVladimir Kondratyev struct input_id *id = p; 715f99e7b1aSVladimir Kondratyev 716f99e7b1aSVladimir Kondratyev if (l2 != sizeof(*id)) { 717f99e7b1aSVladimir Kondratyev warnx("S_input_id %zu != %zu", l2, sizeof(*id)); 718f99e7b1aSVladimir Kondratyev return (1); 719f99e7b1aSVladimir Kondratyev } 720f99e7b1aSVladimir Kondratyev 721f99e7b1aSVladimir Kondratyev printf("{ bustype = 0x%04x, vendor = 0x%04x, " 722f99e7b1aSVladimir Kondratyev "product = 0x%04x, version = 0x%04x }", 723f99e7b1aSVladimir Kondratyev id->bustype, id->vendor, id->product, id->version); 724f99e7b1aSVladimir Kondratyev return (0); 725f99e7b1aSVladimir Kondratyev } 726f99e7b1aSVladimir Kondratyev 727a0efcf64SMark Johnston static int 728a0efcf64SMark Johnston S_pagesizes(size_t l2, void *p) 729a0efcf64SMark Johnston { 730a0efcf64SMark Johnston char buf[256]; 731a0efcf64SMark Johnston u_long *ps; 732a0efcf64SMark Johnston size_t l; 733a0efcf64SMark Johnston int i; 734a0efcf64SMark Johnston 735a0efcf64SMark Johnston l = snprintf(buf, sizeof(buf), "{ "); 736a0efcf64SMark Johnston ps = p; 737a0efcf64SMark Johnston for (i = 0; i * sizeof(*ps) < l2 && ps[i] != 0 && l < sizeof(buf); 738a0efcf64SMark Johnston i++) { 739a0efcf64SMark Johnston l += snprintf(&buf[l], sizeof(buf) - l, 740a0efcf64SMark Johnston "%s%lu", i == 0 ? "" : ", ", ps[i]); 741a0efcf64SMark Johnston } 742a0efcf64SMark Johnston if (l < sizeof(buf)) 743a0efcf64SMark Johnston (void)snprintf(&buf[l], sizeof(buf) - l, " }"); 744a0efcf64SMark Johnston 745a0efcf64SMark Johnston printf("%s", buf); 746a0efcf64SMark Johnston 747a0efcf64SMark Johnston return (0); 748a0efcf64SMark Johnston } 749a0efcf64SMark Johnston 7507d8312ccSJohn Baldwin #ifdef __amd64__ 7517d8312ccSJohn Baldwin static int 7527d8312ccSJohn Baldwin S_efi_map(size_t l2, void *p) 7537d8312ccSJohn Baldwin { 7547d8312ccSJohn Baldwin struct efi_map_header *efihdr; 7557d8312ccSJohn Baldwin struct efi_md *map; 7567d8312ccSJohn Baldwin const char *type; 7577d8312ccSJohn Baldwin size_t efisz; 7587d8312ccSJohn Baldwin int ndesc, i; 7597d8312ccSJohn Baldwin 7607404ab5bSKonstantin Belousov static const char * const types[] = { 7617404ab5bSKonstantin Belousov [EFI_MD_TYPE_NULL] = "Reserved", 7627404ab5bSKonstantin Belousov [EFI_MD_TYPE_CODE] = "LoaderCode", 7637404ab5bSKonstantin Belousov [EFI_MD_TYPE_DATA] = "LoaderData", 7647404ab5bSKonstantin Belousov [EFI_MD_TYPE_BS_CODE] = "BootServicesCode", 7657404ab5bSKonstantin Belousov [EFI_MD_TYPE_BS_DATA] = "BootServicesData", 7667404ab5bSKonstantin Belousov [EFI_MD_TYPE_RT_CODE] = "RuntimeServicesCode", 7677404ab5bSKonstantin Belousov [EFI_MD_TYPE_RT_DATA] = "RuntimeServicesData", 7687404ab5bSKonstantin Belousov [EFI_MD_TYPE_FREE] = "ConventionalMemory", 7697404ab5bSKonstantin Belousov [EFI_MD_TYPE_BAD] = "UnusableMemory", 7707404ab5bSKonstantin Belousov [EFI_MD_TYPE_RECLAIM] = "ACPIReclaimMemory", 7717404ab5bSKonstantin Belousov [EFI_MD_TYPE_FIRMWARE] = "ACPIMemoryNVS", 7727404ab5bSKonstantin Belousov [EFI_MD_TYPE_IOMEM] = "MemoryMappedIO", 7737404ab5bSKonstantin Belousov [EFI_MD_TYPE_IOPORT] = "MemoryMappedIOPortSpace", 7747404ab5bSKonstantin Belousov [EFI_MD_TYPE_PALCODE] = "PalCode", 7757404ab5bSKonstantin Belousov [EFI_MD_TYPE_PERSISTENT] = "PersistentMemory", 7767d8312ccSJohn Baldwin }; 7777d8312ccSJohn Baldwin 7787d8312ccSJohn Baldwin /* 7797d8312ccSJohn Baldwin * Memory map data provided by UEFI via the GetMemoryMap 7807d8312ccSJohn Baldwin * Boot Services API. 7817d8312ccSJohn Baldwin */ 7827d8312ccSJohn Baldwin if (l2 < sizeof(*efihdr)) { 7837d8312ccSJohn Baldwin warnx("S_efi_map length less than header"); 7847d8312ccSJohn Baldwin return (1); 7857d8312ccSJohn Baldwin } 7867d8312ccSJohn Baldwin efihdr = p; 7877d8312ccSJohn Baldwin efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf; 7887d8312ccSJohn Baldwin map = (struct efi_md *)((uint8_t *)efihdr + efisz); 7897d8312ccSJohn Baldwin 7907d8312ccSJohn Baldwin if (efihdr->descriptor_size == 0) 7917d8312ccSJohn Baldwin return (0); 7927d8312ccSJohn Baldwin if (l2 != efisz + efihdr->memory_size) { 7937d8312ccSJohn Baldwin warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz + 7947d8312ccSJohn Baldwin efihdr->memory_size); 7957d8312ccSJohn Baldwin return (1); 7967d8312ccSJohn Baldwin } 7977d8312ccSJohn Baldwin ndesc = efihdr->memory_size / efihdr->descriptor_size; 7987d8312ccSJohn Baldwin 7997d8312ccSJohn Baldwin printf("\n%23s %12s %12s %8s %4s", 8007d8312ccSJohn Baldwin "Type", "Physical", "Virtual", "#Pages", "Attr"); 8017d8312ccSJohn Baldwin 8027d8312ccSJohn Baldwin for (i = 0; i < ndesc; i++, 8037d8312ccSJohn Baldwin map = efi_next_descriptor(map, efihdr->descriptor_size)) { 8047404ab5bSKonstantin Belousov type = NULL; 8057404ab5bSKonstantin Belousov if (map->md_type < nitems(types)) 8067d8312ccSJohn Baldwin type = types[map->md_type]; 8077404ab5bSKonstantin Belousov if (type == NULL) 8087d8312ccSJohn Baldwin type = "<INVALID>"; 809f1957db4SAndrew Turner printf("\n%23s %012jx %012jx %08jx ", type, 810f1957db4SAndrew Turner (uintmax_t)map->md_phys, (uintmax_t)map->md_virt, 81141c0f8d3SKonstantin Belousov (uintmax_t)map->md_pages); 8127d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UC) 8137d8312ccSJohn Baldwin printf("UC "); 8147d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WC) 8157d8312ccSJohn Baldwin printf("WC "); 8167d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WT) 8177d8312ccSJohn Baldwin printf("WT "); 8187d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WB) 8197d8312ccSJohn Baldwin printf("WB "); 8207d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UCE) 8217d8312ccSJohn Baldwin printf("UCE "); 8227d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WP) 8237d8312ccSJohn Baldwin printf("WP "); 8247d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RP) 8257d8312ccSJohn Baldwin printf("RP "); 8267d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_XP) 8277d8312ccSJohn Baldwin printf("XP "); 8287d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RT) 8297d8312ccSJohn Baldwin printf("RUNTIME"); 8307d8312ccSJohn Baldwin } 8317d8312ccSJohn Baldwin return (0); 8327d8312ccSJohn Baldwin } 8337d8312ccSJohn Baldwin #endif 8347d8312ccSJohn Baldwin 83589871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 83689871cdeSJohn Baldwin static int 83759101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p) 83889871cdeSJohn Baldwin { 83989871cdeSJohn Baldwin struct bios_smap_xattr *smap, *end; 84089871cdeSJohn Baldwin 84189871cdeSJohn Baldwin if (l2 % sizeof(*smap) != 0) { 84259101c5dSJohn Baldwin warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2, 84389871cdeSJohn Baldwin sizeof(*smap)); 84489871cdeSJohn Baldwin return (1); 84589871cdeSJohn Baldwin } 84689871cdeSJohn Baldwin 84789871cdeSJohn Baldwin end = (struct bios_smap_xattr *)((char *)p + l2); 84889871cdeSJohn Baldwin for (smap = p; smap < end; smap++) 84989871cdeSJohn Baldwin printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx", 85089871cdeSJohn Baldwin smap->type, smap->xattr, (uintmax_t)smap->base, 85189871cdeSJohn Baldwin (uintmax_t)smap->length); 85289871cdeSJohn Baldwin return (0); 85389871cdeSJohn Baldwin } 85489871cdeSJohn Baldwin #endif 85589871cdeSJohn Baldwin 856f7550ecfSMatthew Dillon static int 857aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt) 858d45564dcSHajimu UMEMOTO { 859e267e00eSXin LI int kelv; 860d45564dcSHajimu UMEMOTO float temp; 861e267e00eSXin LI size_t len; 862a7b5ad27SEd Schouten const char *p; 863aa255ef6SWarner Losh int prec, i; 864d45564dcSHajimu UMEMOTO 865e267e00eSXin LI assert(errno == 0); 866e267e00eSXin LI 867e267e00eSXin LI len = strlen(str); 868e267e00eSXin LI /* caller already checked this */ 869e267e00eSXin LI assert(len > 0); 870e267e00eSXin LI 871aa255ef6SWarner Losh /* 872aa255ef6SWarner Losh * A format of "IK" is in deciKelvin. A format of "IK3" is in 873aa255ef6SWarner Losh * milliKelvin. The single digit following IK is log10 of the 874aa255ef6SWarner Losh * multiplying factor to convert Kelvin into the untis of this sysctl, 875aa255ef6SWarner Losh * or the dividing factor to convert the sysctl value to Kelvin. Numbers 876aa255ef6SWarner Losh * larger than 6 will run into precision issues with 32-bit integers. 877aa255ef6SWarner Losh * Characters that aren't ASCII digits after the 'K' are ignored. No 878aa255ef6SWarner Losh * localization is present because this is an interface from the kernel 879aa255ef6SWarner Losh * to this program (eg not an end-user interface), so isdigit() isn't 880aa255ef6SWarner Losh * used here. 881aa255ef6SWarner Losh */ 882aa255ef6SWarner Losh if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9') 883aa255ef6SWarner Losh prec = fmt[2] - '0'; 884aa255ef6SWarner Losh else 885aa255ef6SWarner Losh prec = 1; 886d45564dcSHajimu UMEMOTO p = &str[len - 1]; 887aa255ef6SWarner Losh if (*p == 'C' || *p == 'F' || *p == 'K') { 888e267e00eSXin LI temp = strtof(str, endptrp); 889689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 890d45564dcSHajimu UMEMOTO if (*p == 'F') 891d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 892689c8e8bSXin LI *endptrp = NULL; 893aa255ef6SWarner Losh if (*p != 'K') 894aa255ef6SWarner Losh temp += 273.15; 895aa255ef6SWarner Losh for (i = 0; i < prec; i++) 896aa255ef6SWarner Losh temp *= 10.0; 897aa255ef6SWarner Losh return ((int)(temp + 0.5)); 898d45564dcSHajimu UMEMOTO } 899e267e00eSXin LI } else { 900aa255ef6SWarner Losh /* No unit specified -> treat it as a raw number */ 901e267e00eSXin LI kelv = (int)strtol(str, endptrp, 10); 902689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 903689c8e8bSXin LI *endptrp = NULL; 904e267e00eSXin LI return (kelv); 905e267e00eSXin LI } 906689c8e8bSXin LI } 907e267e00eSXin LI 908e267e00eSXin LI errno = ERANGE; 909e267e00eSXin LI return (0); 910d45564dcSHajimu UMEMOTO } 911d45564dcSHajimu UMEMOTO 9121d86b91cSPoul-Henning Kamp /* 9131d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 9141d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 9151d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 9161d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 9171d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 9181d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 9191d86b91cSPoul-Henning Kamp */ 9201d86b91cSPoul-Henning Kamp 9211d86b91cSPoul-Henning Kamp static int 922c58f8df6SXin LI name2oid(const char *name, int *oidp) 9231d86b91cSPoul-Henning Kamp { 9241d86b91cSPoul-Henning Kamp int oid[2]; 925dbf9b92fSDoug Rabson int i; 926dbf9b92fSDoug Rabson size_t j; 9271d86b91cSPoul-Henning Kamp 9288077b9bcSRyan Moeller oid[0] = CTL_SYSCTL; 9298077b9bcSRyan Moeller oid[1] = CTL_SYSCTL_NAME2OID; 9301d86b91cSPoul-Henning Kamp 9311d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 9321d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 9331d86b91cSPoul-Henning Kamp if (i < 0) 93421e1f596SDavid Malone return (i); 9351d86b91cSPoul-Henning Kamp j /= sizeof(int); 9361d86b91cSPoul-Henning Kamp return (j); 9371d86b91cSPoul-Henning Kamp } 9381d86b91cSPoul-Henning Kamp 9391d86b91cSPoul-Henning Kamp static int 9401d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 9411d86b91cSPoul-Henning Kamp { 9421d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 9431d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 944dbf9b92fSDoug Rabson int i; 945dbf9b92fSDoug Rabson size_t j; 9461d86b91cSPoul-Henning Kamp 9478077b9bcSRyan Moeller qoid[0] = CTL_SYSCTL; 9488077b9bcSRyan Moeller qoid[1] = CTL_SYSCTL_OIDFMT; 9491d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 9501d86b91cSPoul-Henning Kamp 95131fb4661SDima Dorfman j = sizeof(buf); 9521d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 9531d86b91cSPoul-Henning Kamp if (i) 9546d7a8f6cSUlrich Spörlein err(1, "sysctl fmt %d %zu %d", i, j, errno); 9551d86b91cSPoul-Henning Kamp 9561d86b91cSPoul-Henning Kamp if (kind) 9571d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 9581d86b91cSPoul-Henning Kamp 9591d86b91cSPoul-Henning Kamp if (fmt) 9601d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 96121e1f596SDavid Malone return (0); 9621d86b91cSPoul-Henning Kamp } 9631d86b91cSPoul-Henning Kamp 96460cf2c12SLuigi Rizzo /* 965f126d349SKirk McKusick * This displays a combination of name, type, format, and/or description. 966f126d349SKirk McKusick * 967f126d349SKirk McKusick * Returns zero if anything was actually output. 968f126d349SKirk McKusick * Returns one if there is an error. 969f126d349SKirk McKusick */ 970f126d349SKirk McKusick static int 971f126d349SKirk McKusick show_info(char *name, const char *sep, int ctltype, char *fmt, int *qoid, int nlen) 972f126d349SKirk McKusick { 973f126d349SKirk McKusick u_char buf[BUFSIZ]; 974f126d349SKirk McKusick const char *prntype; 975f126d349SKirk McKusick int error = 0, i; 976f126d349SKirk McKusick size_t j; 977f126d349SKirk McKusick 978f126d349SKirk McKusick if (!nflag) 979f126d349SKirk McKusick printf("%s%s", name, sep); 980f126d349SKirk McKusick if (tflag) { 981f126d349SKirk McKusick if (ctl_typename[ctltype] != NULL) 982f126d349SKirk McKusick prntype = ctl_typename[ctltype]; 983f126d349SKirk McKusick else { 984f126d349SKirk McKusick prntype = "unknown"; 985f126d349SKirk McKusick error++; 986f126d349SKirk McKusick } 987f126d349SKirk McKusick if (Fflag || dflag) 988f126d349SKirk McKusick printf("%s%s", prntype, sep); 989f126d349SKirk McKusick else 990f126d349SKirk McKusick fputs(prntype, stdout); 991f126d349SKirk McKusick } 992f126d349SKirk McKusick if (Fflag) { 993f126d349SKirk McKusick if (!isprint(fmt[0])) /* Few codes doesn't have formats */ 994f126d349SKirk McKusick fmt = ""; 995f126d349SKirk McKusick if (dflag) 996f126d349SKirk McKusick printf("%s%s", fmt, sep); 997f126d349SKirk McKusick else 998f126d349SKirk McKusick fputs(fmt, stdout); 999f126d349SKirk McKusick } 1000f126d349SKirk McKusick if (!dflag) 1001f126d349SKirk McKusick return (error); 1002f126d349SKirk McKusick 1003f126d349SKirk McKusick qoid[1] = CTL_SYSCTL_OIDDESCR; 1004f126d349SKirk McKusick bzero(buf, BUFSIZ); 1005f126d349SKirk McKusick j = sizeof(buf); 1006f126d349SKirk McKusick i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 100775be7e30SEd Maste if (i < 0) { 100875be7e30SEd Maste putchar('\n'); 1009f126d349SKirk McKusick return (1); 101075be7e30SEd Maste } 1011f126d349SKirk McKusick fputs(buf, stdout); 1012f126d349SKirk McKusick return (error); 1013f126d349SKirk McKusick } 1014f126d349SKirk McKusick 1015f126d349SKirk McKusick /* 10161d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 10171d86b91cSPoul-Henning Kamp * 10181d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 10191d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 10201d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 10211d86b91cSPoul-Henning Kamp */ 10221d86b91cSPoul-Henning Kamp static int 102392e17803SRyan Moeller show_var(int *oid, int nlen, bool honor_skip) 10241d86b91cSPoul-Henning Kamp { 1025e58483c4SRyan Moeller static int skip_len = 0, skip_oid[CTL_MAXNAME]; 1026f126d349SKirk McKusick u_char *val, *oval, *p; 1027403c7f59SAlfred Perlstein char name[BUFSIZ], fmt[BUFSIZ]; 1028f126d349SKirk McKusick const char *sep, *sep1; 10291d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 103021e1f596SDavid Malone uintmax_t umv; 103121e1f596SDavid Malone intmax_t mv; 1032f8e4b4efSMatthew D Fleming int i, hexlen, sign, ctltype; 103341e419cbSDavid Malone size_t intlen; 1034dbf9b92fSDoug Rabson size_t j, len; 10351d86b91cSPoul-Henning Kamp u_int kind; 1036aa255ef6SWarner Losh float base; 103759101c5dSJohn Baldwin int (*func)(size_t, void *); 1038aa255ef6SWarner Losh int prec; 10391d86b91cSPoul-Henning Kamp 10406d7a8f6cSUlrich Spörlein /* Silence GCC. */ 10416d7a8f6cSUlrich Spörlein umv = mv = intlen = 0; 10426d7a8f6cSUlrich Spörlein 1043403c7f59SAlfred Perlstein bzero(fmt, BUFSIZ); 10449f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 10458077b9bcSRyan Moeller qoid[0] = CTL_SYSCTL; 10468077b9bcSRyan Moeller qoid[1] = CTL_SYSCTL_NAME; 10474de76195SWarner Losh memcpy(qoid + 2, oid, nlen * sizeof(int)); 104831fb4661SDima Dorfman j = sizeof(name); 104981e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 105081e7454aSDag-Erling Smørgrav if (i || !j) 10516d7a8f6cSUlrich Spörlein err(1, "sysctl name %d %zu %d", i, j, errno); 105281e7454aSDag-Erling Smørgrav 1053403c7f59SAlfred Perlstein oidfmt(oid, nlen, fmt, &kind); 1054403c7f59SAlfred Perlstein /* if Wflag then only list sysctls that are writeable and not stats. */ 1055403c7f59SAlfred Perlstein if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) 105692e17803SRyan Moeller return (1); 1057403c7f59SAlfred Perlstein 10585ec83c66SZhenlei Huang /* if Jflag then only list sysctls that are prison variables. */ 10595ec83c66SZhenlei Huang if (Jflag && (kind & CTLFLAG_PRISON) == 0) 10605ec83c66SZhenlei Huang return (1); 10615ec83c66SZhenlei Huang 1062403c7f59SAlfred Perlstein /* if Tflag then only list sysctls that are tuneables. */ 1063403c7f59SAlfred Perlstein if (Tflag && (kind & CTLFLAG_TUN) == 0) 106492e17803SRyan Moeller return (1); 1065403c7f59SAlfred Perlstein 10665ec83c66SZhenlei Huang /* if Vflag then only list sysctls that are vnet variables. */ 10675ec83c66SZhenlei Huang if (Vflag && (kind & CTLFLAG_VNET) == 0) 10685ec83c66SZhenlei Huang return (1); 10695ec83c66SZhenlei Huang 1070ca5fac55SDag-Erling Smørgrav if (Nflag) { 1071ca5fac55SDag-Erling Smørgrav printf("%s", name); 1072ca5fac55SDag-Erling Smørgrav return (0); 1073ca5fac55SDag-Erling Smørgrav } 1074ca5fac55SDag-Erling Smørgrav 1075d0b8aabbSAnton Berezin if (eflag) 1076d0b8aabbSAnton Berezin sep = "="; 1077d0b8aabbSAnton Berezin else 1078d0b8aabbSAnton Berezin sep = ": "; 1079d0b8aabbSAnton Berezin 10808020192dSMarcelo Araujo ctltype = (kind & CTLTYPE); 1081f126d349SKirk McKusick if (tflag || Fflag || dflag) 1082f126d349SKirk McKusick return show_info(name, sep, ctltype, fmt, qoid, nlen); 1083a18f34feSAndrew Gallatin 1084e58483c4SRyan Moeller /* keep track of encountered skip nodes, ignoring descendants */ 108565efb73fSRyan Moeller if ((skip_len == 0 || skip_len >= nlen * (int)sizeof(int)) && 108665efb73fSRyan Moeller (kind & CTLFLAG_SKIP) != 0) { 1087e58483c4SRyan Moeller /* Save this oid so we can skip descendants. */ 1088e58483c4SRyan Moeller skip_len = nlen * sizeof(int); 1089e58483c4SRyan Moeller memcpy(skip_oid, oid, skip_len); 1090e58483c4SRyan Moeller } 1091e58483c4SRyan Moeller 109292e17803SRyan Moeller /* bail before fetching the value if we're honoring skip */ 1093e58483c4SRyan Moeller if (honor_skip) { 1094e58483c4SRyan Moeller if (0 < skip_len && skip_len <= nlen * (int)sizeof(int) && 1095e58483c4SRyan Moeller memcmp(skip_oid, oid, skip_len) == 0) 109692e17803SRyan Moeller return (1); 1097e58483c4SRyan Moeller /* Not a skip node or descendant of a skip node. */ 1098e58483c4SRyan Moeller skip_len = 0; 1099e58483c4SRyan Moeller } 110092e17803SRyan Moeller 1101a18f34feSAndrew Gallatin /* don't fetch opaques that we don't know how to print */ 1102a18f34feSAndrew Gallatin if (ctltype == CTLTYPE_OPAQUE) { 1103a18f34feSAndrew Gallatin if (strcmp(fmt, "S,clockinfo") == 0) 1104a18f34feSAndrew Gallatin func = S_clockinfo; 1105a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,timeval") == 0) 1106a18f34feSAndrew Gallatin func = S_timeval; 1107a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,loadavg") == 0) 1108a18f34feSAndrew Gallatin func = S_loadavg; 1109a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,vmtotal") == 0) 1110a18f34feSAndrew Gallatin func = S_vmtotal; 1111f99e7b1aSVladimir Kondratyev else if (strcmp(fmt, "S,input_id") == 0) 1112f99e7b1aSVladimir Kondratyev func = S_input_id; 1113a0efcf64SMark Johnston else if (strcmp(fmt, "S,pagesizes") == 0) 1114a0efcf64SMark Johnston func = S_pagesizes; 1115a18f34feSAndrew Gallatin #ifdef __amd64__ 1116a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,efi_map_header") == 0) 1117a18f34feSAndrew Gallatin func = S_efi_map; 1118a18f34feSAndrew Gallatin #endif 1119a18f34feSAndrew Gallatin #if defined(__amd64__) || defined(__i386__) 1120a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,bios_smap_xattr") == 0) 1121a18f34feSAndrew Gallatin func = S_bios_smap_xattr; 1122a18f34feSAndrew Gallatin #endif 1123a18f34feSAndrew Gallatin else { 1124a18f34feSAndrew Gallatin func = NULL; 1125a18f34feSAndrew Gallatin if (!bflag && !oflag && !xflag) 1126a18f34feSAndrew Gallatin return (1); 1127a18f34feSAndrew Gallatin } 1128a18f34feSAndrew Gallatin } 1129a18f34feSAndrew Gallatin 11301d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 113175820005SJohn-Mark Gurney if (Bflag) 113275820005SJohn-Mark Gurney j = Bflag; 113375820005SJohn-Mark Gurney else { 11341d86b91cSPoul-Henning Kamp j = 0; 11351d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 11361d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 113775820005SJohn-Mark Gurney } 11381d86b91cSPoul-Henning Kamp 1139ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 1140ccf25977SRuslan Ermilov if (val == NULL) { 1141ccf25977SRuslan Ermilov warnx("malloc failed"); 11426b6b665bSBruce Evans return (1); 1143ccf25977SRuslan Ermilov } 11441d86b91cSPoul-Henning Kamp len = j; 11451d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 114604006eabSHans Petter Selasky if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) { 1147ccf25977SRuslan Ermilov free(oval); 11481d86b91cSPoul-Henning Kamp return (1); 1149ccf25977SRuslan Ermilov } 11501d86b91cSPoul-Henning Kamp 11511d86b91cSPoul-Henning Kamp if (bflag) { 11521d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 1153ccf25977SRuslan Ermilov free(oval); 11541d86b91cSPoul-Henning Kamp return (0); 11551d86b91cSPoul-Henning Kamp } 115676d3dc52SAndrey A. Chernov val[len] = '\0'; 11571d86b91cSPoul-Henning Kamp p = val; 1158cbc134adSMatthew D Fleming sign = ctl_sign[ctltype]; 1159cbc134adSMatthew D Fleming intlen = ctl_size[ctltype]; 1160cbc134adSMatthew D Fleming 1161f8e4b4efSMatthew D Fleming switch (ctltype) { 1162f8e4b4efSMatthew D Fleming case CTLTYPE_STRING: 11631d86b91cSPoul-Henning Kamp if (!nflag) 1164d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1165f126d349SKirk McKusick if (lflag) 1166f126d349SKirk McKusick printf("%zd%s", len, sep); 11676d7a8f6cSUlrich Spörlein printf("%.*s", (int)len, p); 1168ccf25977SRuslan Ermilov free(oval); 11691d86b91cSPoul-Henning Kamp return (0); 11701d86b91cSPoul-Henning Kamp 1171f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1172f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1173f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1174f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 11752a71f1edSConrad Meyer case CTLTYPE_S8: 11762a71f1edSConrad Meyer case CTLTYPE_S16: 11772a71f1edSConrad Meyer case CTLTYPE_S32: 1178cbc134adSMatthew D Fleming case CTLTYPE_S64: 11792a71f1edSConrad Meyer case CTLTYPE_U8: 11802a71f1edSConrad Meyer case CTLTYPE_U16: 11812a71f1edSConrad Meyer case CTLTYPE_U32: 1182cbc134adSMatthew D Fleming case CTLTYPE_U64: 1183dbf9b92fSDoug Rabson if (!nflag) 1184d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1185f126d349SKirk McKusick if (lflag) 1186f126d349SKirk McKusick printf("%zd%s", len, sep); 1187e37d2b30SDavid Malone hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; 1188fd8c668aSDavid Malone sep1 = ""; 118941e419cbSDavid Malone while (len >= intlen) { 1190f8e4b4efSMatthew D Fleming switch (kind & CTLTYPE) { 1191f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1192f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1193e37d2b30SDavid Malone umv = *(u_int *)p; 1194e37d2b30SDavid Malone mv = *(int *)p; 119541e419cbSDavid Malone break; 1196f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1197f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 1198e37d2b30SDavid Malone umv = *(u_long *)p; 1199e37d2b30SDavid Malone mv = *(long *)p; 120041e419cbSDavid Malone break; 12012a71f1edSConrad Meyer case CTLTYPE_S8: 12022a71f1edSConrad Meyer case CTLTYPE_U8: 12032a71f1edSConrad Meyer umv = *(uint8_t *)p; 12042a71f1edSConrad Meyer mv = *(int8_t *)p; 12052a71f1edSConrad Meyer break; 12062a71f1edSConrad Meyer case CTLTYPE_S16: 12072a71f1edSConrad Meyer case CTLTYPE_U16: 12082a71f1edSConrad Meyer umv = *(uint16_t *)p; 12092a71f1edSConrad Meyer mv = *(int16_t *)p; 12102a71f1edSConrad Meyer break; 12112a71f1edSConrad Meyer case CTLTYPE_S32: 12122a71f1edSConrad Meyer case CTLTYPE_U32: 12132a71f1edSConrad Meyer umv = *(uint32_t *)p; 12142a71f1edSConrad Meyer mv = *(int32_t *)p; 12152a71f1edSConrad Meyer break; 1216cbc134adSMatthew D Fleming case CTLTYPE_S64: 1217cbc134adSMatthew D Fleming case CTLTYPE_U64: 1218cbc134adSMatthew D Fleming umv = *(uint64_t *)p; 1219cbc134adSMatthew D Fleming mv = *(int64_t *)p; 122041e419cbSDavid Malone break; 122141e419cbSDavid Malone } 1222fd8c668aSDavid Malone fputs(sep1, stdout); 1223f8e4b4efSMatthew D Fleming if (xflag) 1224e37d2b30SDavid Malone printf("%#0*jx", hexlen, umv); 1225f8e4b4efSMatthew D Fleming else if (!sign) 1226f8e4b4efSMatthew D Fleming printf(hflag ? "%'ju" : "%ju", umv); 122741e419cbSDavid Malone else if (fmt[1] == 'K') { 1228e37d2b30SDavid Malone if (mv < 0) 122921e1f596SDavid Malone printf("%jd", mv); 1230aa255ef6SWarner Losh else { 1231aa255ef6SWarner Losh /* 1232aa255ef6SWarner Losh * See strIKtoi for details on fmt. 1233aa255ef6SWarner Losh */ 1234aa255ef6SWarner Losh prec = 1; 1235aa255ef6SWarner Losh if (fmt[2] != '\0') 1236aa255ef6SWarner Losh prec = fmt[2] - '0'; 1237aa255ef6SWarner Losh base = 1.0; 1238aa255ef6SWarner Losh for (int i = 0; i < prec; i++) 1239aa255ef6SWarner Losh base *= 10.0; 1240aa255ef6SWarner Losh printf("%.*fC", prec, 1241aa255ef6SWarner Losh (float)mv / base - 273.15); 1242aa255ef6SWarner Losh } 1243c591d41fSPeter Wemm } else 1244fd8c668aSDavid Malone printf(hflag ? "%'jd" : "%jd", mv); 1245fd8c668aSDavid Malone sep1 = " "; 124641e419cbSDavid Malone len -= intlen; 124741e419cbSDavid Malone p += intlen; 1248aa02fb57SPoul-Henning Kamp } 1249ccf25977SRuslan Ermilov free(oval); 1250dbf9b92fSDoug Rabson return (0); 1251dbf9b92fSDoug Rabson 1252f8e4b4efSMatthew D Fleming case CTLTYPE_OPAQUE: 12531d86b91cSPoul-Henning Kamp i = 0; 12541d86b91cSPoul-Henning Kamp if (func) { 12551d86b91cSPoul-Henning Kamp if (!nflag) 1256d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1257f126d349SKirk McKusick if (lflag) 1258f126d349SKirk McKusick printf("%zd%s", len, sep); 125948cd487aSHartmut Brandt i = (*func)(len, p); 1260ccf25977SRuslan Ermilov free(oval); 126148cd487aSHartmut Brandt return (i); 12621d86b91cSPoul-Henning Kamp } 12631d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 1264dea673e9SRodney W. Grimes default: 1265ccf25977SRuslan Ermilov if (!oflag && !xflag) { 1266ccf25977SRuslan Ermilov free(oval); 12671d86b91cSPoul-Henning Kamp return (1); 1268ccf25977SRuslan Ermilov } 12691d86b91cSPoul-Henning Kamp if (!nflag) 1270d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1271f126d349SKirk McKusick if (lflag) 1272f126d349SKirk McKusick printf("%zd%s", len, sep); 12736d7a8f6cSUlrich Spörlein printf("Format:%s Length:%zu Dump:0x", fmt, len); 1274a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 12751d86b91cSPoul-Henning Kamp printf("%02x", *p++); 1276a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 12771d86b91cSPoul-Henning Kamp printf("..."); 1278ccf25977SRuslan Ermilov free(oval); 12791d86b91cSPoul-Henning Kamp return (0); 12801d86b91cSPoul-Henning Kamp } 1281ccf25977SRuslan Ermilov free(oval); 12821d86b91cSPoul-Henning Kamp return (1); 1283dea673e9SRodney W. Grimes } 1284dea673e9SRodney W. Grimes 12851d86b91cSPoul-Henning Kamp static int 12861d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len) 1287dea673e9SRodney W. Grimes { 12881d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 1289dbf9b92fSDoug Rabson int i, j; 1290dbf9b92fSDoug Rabson size_t l1, l2; 1291dea673e9SRodney W. Grimes 129292e17803SRyan Moeller name1[0] = CTL_SYSCTL; 129392e17803SRyan Moeller name1[1] = (oid != NULL || Nflag || dflag || tflag) ? 129492e17803SRyan Moeller CTL_SYSCTL_NEXTNOSKIP : CTL_SYSCTL_NEXT; 12951d86b91cSPoul-Henning Kamp l1 = 2; 12961d86b91cSPoul-Henning Kamp if (len) { 12971d86b91cSPoul-Henning Kamp memcpy(name1 + 2, oid, len * sizeof(int)); 12981d86b91cSPoul-Henning Kamp l1 += len; 12991d86b91cSPoul-Henning Kamp } else { 130092e17803SRyan Moeller name1[2] = CTL_KERN; 13011d86b91cSPoul-Henning Kamp l1++; 13021d86b91cSPoul-Henning Kamp } 1303a89ab9bbSDag-Erling Smørgrav for (;;) { 130431fb4661SDima Dorfman l2 = sizeof(name2); 13051d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 1306c1160fe4SBill Fumerola if (j < 0) { 13071d86b91cSPoul-Henning Kamp if (errno == ENOENT) 130821e1f596SDavid Malone return (0); 13091d86b91cSPoul-Henning Kamp else 13106d7a8f6cSUlrich Spörlein err(1, "sysctl(getnext) %d %zu", j, l2); 1311c1160fe4SBill Fumerola } 13121d86b91cSPoul-Henning Kamp 13131d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 13141d86b91cSPoul-Henning Kamp 1315fd8c668aSDavid Malone if (len < 0 || l2 < (unsigned int)len) 131621e1f596SDavid Malone return (0); 13171d86b91cSPoul-Henning Kamp 13188077b9bcSRyan Moeller if (memcmp(name2, oid, len * sizeof(int)) != 0) 131921e1f596SDavid Malone return (0); 13201d86b91cSPoul-Henning Kamp 1321a5ec1dd4SRyan Moeller i = show_var(name2, l2, true); 13221d86b91cSPoul-Henning Kamp if (!i && !bflag) 13231d86b91cSPoul-Henning Kamp putchar('\n'); 13241d86b91cSPoul-Henning Kamp 13251d86b91cSPoul-Henning Kamp memcpy(name1 + 2, name2, l2 * sizeof(int)); 13261d86b91cSPoul-Henning Kamp l1 = 2 + l2; 13271d86b91cSPoul-Henning Kamp } 1328dea673e9SRodney W. Grimes } 1329