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> 68*2365fe56SJohn 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 /* 238*2365fe56SJohn Baldwin * Parse a single numeric value, append it to 'newbuf', and update 239*2365fe56SJohn Baldwin * 'newsize'. Returns true if the value was parsed and false if the 240*2365fe56SJohn Baldwin * value was invalid. Non-numeric types (strings) are handled 241*2365fe56SJohn Baldwin * directly in parse(). 242dea673e9SRodney W. Grimes */ 243*2365fe56SJohn Baldwin static bool 244*2365fe56SJohn Baldwin parse_numeric(const char *newvalstr, const char *fmt, u_int kind, 245*2365fe56SJohn Baldwin void **newbufp, size_t *newsizep) 246dea673e9SRodney W. Grimes { 247*2365fe56SJohn 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; 261*2365fe56SJohn Baldwin size_t valsize; 262*2365fe56SJohn Baldwin char *endptr = NULL; 263*2365fe56SJohn Baldwin 264*2365fe56SJohn Baldwin errno = 0; 265*2365fe56SJohn Baldwin 266*2365fe56SJohn Baldwin switch (kind & CTLTYPE) { 267*2365fe56SJohn Baldwin case CTLTYPE_INT: 268*2365fe56SJohn Baldwin if (strncmp(fmt, "IK", 2) == 0) 269*2365fe56SJohn Baldwin intval = strIKtoi(newvalstr, &endptr, fmt); 270*2365fe56SJohn Baldwin else 271*2365fe56SJohn Baldwin intval = (int)strtol(newvalstr, &endptr, 0); 272*2365fe56SJohn Baldwin newval = &intval; 273*2365fe56SJohn Baldwin valsize = sizeof(intval); 274*2365fe56SJohn Baldwin break; 275*2365fe56SJohn Baldwin case CTLTYPE_UINT: 276*2365fe56SJohn Baldwin uintval = (int) strtoul(newvalstr, &endptr, 0); 277*2365fe56SJohn Baldwin newval = &uintval; 278*2365fe56SJohn Baldwin valsize = sizeof(uintval); 279*2365fe56SJohn Baldwin break; 280*2365fe56SJohn Baldwin case CTLTYPE_LONG: 281*2365fe56SJohn Baldwin longval = strtol(newvalstr, &endptr, 0); 282*2365fe56SJohn Baldwin newval = &longval; 283*2365fe56SJohn Baldwin valsize = sizeof(longval); 284*2365fe56SJohn Baldwin break; 285*2365fe56SJohn Baldwin case CTLTYPE_ULONG: 286*2365fe56SJohn Baldwin ulongval = strtoul(newvalstr, &endptr, 0); 287*2365fe56SJohn Baldwin newval = &ulongval; 288*2365fe56SJohn Baldwin valsize = sizeof(ulongval); 289*2365fe56SJohn Baldwin break; 290*2365fe56SJohn Baldwin case CTLTYPE_S8: 291*2365fe56SJohn Baldwin i8val = (int8_t)strtol(newvalstr, &endptr, 0); 292*2365fe56SJohn Baldwin newval = &i8val; 293*2365fe56SJohn Baldwin valsize = sizeof(i8val); 294*2365fe56SJohn Baldwin break; 295*2365fe56SJohn Baldwin case CTLTYPE_S16: 296*2365fe56SJohn Baldwin i16val = (int16_t)strtol(newvalstr, &endptr, 0); 297*2365fe56SJohn Baldwin newval = &i16val; 298*2365fe56SJohn Baldwin valsize = sizeof(i16val); 299*2365fe56SJohn Baldwin break; 300*2365fe56SJohn Baldwin case CTLTYPE_S32: 301*2365fe56SJohn Baldwin i32val = (int32_t)strtol(newvalstr, &endptr, 0); 302*2365fe56SJohn Baldwin newval = &i32val; 303*2365fe56SJohn Baldwin valsize = sizeof(i32val); 304*2365fe56SJohn Baldwin break; 305*2365fe56SJohn Baldwin case CTLTYPE_S64: 306*2365fe56SJohn Baldwin i64val = strtoimax(newvalstr, &endptr, 0); 307*2365fe56SJohn Baldwin newval = &i64val; 308*2365fe56SJohn Baldwin valsize = sizeof(i64val); 309*2365fe56SJohn Baldwin break; 310*2365fe56SJohn Baldwin case CTLTYPE_U8: 311*2365fe56SJohn Baldwin u8val = (uint8_t)strtoul(newvalstr, &endptr, 0); 312*2365fe56SJohn Baldwin newval = &u8val; 313*2365fe56SJohn Baldwin valsize = sizeof(u8val); 314*2365fe56SJohn Baldwin break; 315*2365fe56SJohn Baldwin case CTLTYPE_U16: 316*2365fe56SJohn Baldwin u16val = (uint16_t)strtoul(newvalstr, &endptr, 0); 317*2365fe56SJohn Baldwin newval = &u16val; 318*2365fe56SJohn Baldwin valsize = sizeof(u16val); 319*2365fe56SJohn Baldwin break; 320*2365fe56SJohn Baldwin case CTLTYPE_U32: 321*2365fe56SJohn Baldwin u32val = (uint32_t)strtoul(newvalstr, &endptr, 0); 322*2365fe56SJohn Baldwin newval = &u32val; 323*2365fe56SJohn Baldwin valsize = sizeof(u32val); 324*2365fe56SJohn Baldwin break; 325*2365fe56SJohn Baldwin case CTLTYPE_U64: 326*2365fe56SJohn Baldwin u64val = strtoumax(newvalstr, &endptr, 0); 327*2365fe56SJohn Baldwin newval = &u64val; 328*2365fe56SJohn Baldwin valsize = sizeof(u64val); 329*2365fe56SJohn Baldwin break; 330*2365fe56SJohn Baldwin default: 331*2365fe56SJohn Baldwin /* NOTREACHED */ 332*2365fe56SJohn Baldwin abort(); 333*2365fe56SJohn Baldwin } 334*2365fe56SJohn Baldwin 335*2365fe56SJohn Baldwin if (errno != 0 || endptr == newvalstr || 336*2365fe56SJohn Baldwin (endptr != NULL && *endptr != '\0')) 337*2365fe56SJohn Baldwin return (false); 338*2365fe56SJohn Baldwin 339*2365fe56SJohn Baldwin newbuf = realloc(*newbufp, *newsizep + valsize); 340*2365fe56SJohn Baldwin if (newbuf == NULL) 341*2365fe56SJohn Baldwin err(1, "out of memory"); 342*2365fe56SJohn Baldwin memcpy((char *)newbuf + *newsizep, newval, valsize); 343*2365fe56SJohn Baldwin *newbufp = newbuf; 344*2365fe56SJohn Baldwin *newsizep += valsize; 345*2365fe56SJohn Baldwin 346*2365fe56SJohn Baldwin return (true); 347*2365fe56SJohn Baldwin } 348*2365fe56SJohn Baldwin 349*2365fe56SJohn Baldwin /* 350*2365fe56SJohn Baldwin * Parse a name into a MIB entry. 351*2365fe56SJohn Baldwin * Lookup and print out the MIB entry if it exists. 352*2365fe56SJohn Baldwin * Set a new value if requested. 353*2365fe56SJohn Baldwin */ 354*2365fe56SJohn Baldwin static int 355*2365fe56SJohn Baldwin parse(const char *string, int lineno) 356*2365fe56SJohn Baldwin { 357*2365fe56SJohn Baldwin int len, i, j; 358*2365fe56SJohn Baldwin const void *newval; 359*2365fe56SJohn Baldwin char *newvalstr = NULL; 360*2365fe56SJohn Baldwin void *newbuf; 361*2365fe56SJohn Baldwin size_t newsize = Bflag; 362dea673e9SRodney W. Grimes int mib[CTL_MAXNAME]; 363*2365fe56SJohn 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 482*2365fe56SJohn 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: 489*2365fe56SJohn Baldwin newsize = 0; 490*2365fe56SJohn Baldwin while ((cp = strsep(&newvalstr, " ,")) != NULL) { 491*2365fe56SJohn Baldwin if (*cp == '\0') 492*2365fe56SJohn Baldwin continue; 493*2365fe56SJohn Baldwin if (!parse_numeric(cp, fmt, kind, &newbuf, 494*2365fe56SJohn Baldwin &newsize)) { 495*2365fe56SJohn Baldwin warnx("invalid %s '%s'%s", 496*2365fe56SJohn Baldwin ctl_typename[kind & CTLTYPE], 497*2365fe56SJohn Baldwin cp, line); 498*2365fe56SJohn Baldwin free(newbuf); 499da178c77SXin LI return (1); 500dea673e9SRodney W. Grimes } 501*2365fe56SJohn Baldwin } 502*2365fe56SJohn Baldwin newval = newbuf; 503*2365fe56SJohn Baldwin break; 504*2365fe56SJohn Baldwin } 5051d86b91cSPoul-Henning Kamp 5061d86b91cSPoul-Henning Kamp i = show_var(mib, len); 5071d86b91cSPoul-Henning Kamp if (sysctl(mib, len, 0, 0, newval, newsize) == -1) { 508*2365fe56SJohn 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 } 529*2365fe56SJohn 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 6937d8312ccSJohn Baldwin static const char *types[] = { 6947d8312ccSJohn Baldwin "Reserved", 6957d8312ccSJohn Baldwin "LoaderCode", 6967d8312ccSJohn Baldwin "LoaderData", 6977d8312ccSJohn Baldwin "BootServicesCode", 6987d8312ccSJohn Baldwin "BootServicesData", 6997d8312ccSJohn Baldwin "RuntimeServicesCode", 7007d8312ccSJohn Baldwin "RuntimeServicesData", 7017d8312ccSJohn Baldwin "ConventionalMemory", 7027d8312ccSJohn Baldwin "UnusableMemory", 7037d8312ccSJohn Baldwin "ACPIReclaimMemory", 7047d8312ccSJohn Baldwin "ACPIMemoryNVS", 7057d8312ccSJohn Baldwin "MemoryMappedIO", 7067d8312ccSJohn Baldwin "MemoryMappedIOPortSpace", 7077d8312ccSJohn Baldwin "PalCode" 7087d8312ccSJohn Baldwin }; 7097d8312ccSJohn Baldwin 7107d8312ccSJohn Baldwin /* 7117d8312ccSJohn Baldwin * Memory map data provided by UEFI via the GetMemoryMap 7127d8312ccSJohn Baldwin * Boot Services API. 7137d8312ccSJohn Baldwin */ 7147d8312ccSJohn Baldwin if (l2 < sizeof(*efihdr)) { 7157d8312ccSJohn Baldwin warnx("S_efi_map length less than header"); 7167d8312ccSJohn Baldwin return (1); 7177d8312ccSJohn Baldwin } 7187d8312ccSJohn Baldwin efihdr = p; 7197d8312ccSJohn Baldwin efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf; 7207d8312ccSJohn Baldwin map = (struct efi_md *)((uint8_t *)efihdr + efisz); 7217d8312ccSJohn Baldwin 7227d8312ccSJohn Baldwin if (efihdr->descriptor_size == 0) 7237d8312ccSJohn Baldwin return (0); 7247d8312ccSJohn Baldwin if (l2 != efisz + efihdr->memory_size) { 7257d8312ccSJohn Baldwin warnx("S_efi_map length mismatch %zu vs %zu", l2, efisz + 7267d8312ccSJohn Baldwin efihdr->memory_size); 7277d8312ccSJohn Baldwin return (1); 7287d8312ccSJohn Baldwin } 7297d8312ccSJohn Baldwin ndesc = efihdr->memory_size / efihdr->descriptor_size; 7307d8312ccSJohn Baldwin 7317d8312ccSJohn Baldwin printf("\n%23s %12s %12s %8s %4s", 7327d8312ccSJohn Baldwin "Type", "Physical", "Virtual", "#Pages", "Attr"); 7337d8312ccSJohn Baldwin 7347d8312ccSJohn Baldwin for (i = 0; i < ndesc; i++, 7357d8312ccSJohn Baldwin map = efi_next_descriptor(map, efihdr->descriptor_size)) { 7367d8312ccSJohn Baldwin if (map->md_type <= EFI_MD_TYPE_PALCODE) 7377d8312ccSJohn Baldwin type = types[map->md_type]; 7387d8312ccSJohn Baldwin else 7397d8312ccSJohn Baldwin type = "<INVALID>"; 74041c0f8d3SKonstantin Belousov printf("\n%23s %012jx %12p %08jx ", type, 74141c0f8d3SKonstantin Belousov (uintmax_t)map->md_phys, map->md_virt, 74241c0f8d3SKonstantin Belousov (uintmax_t)map->md_pages); 7437d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UC) 7447d8312ccSJohn Baldwin printf("UC "); 7457d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WC) 7467d8312ccSJohn Baldwin printf("WC "); 7477d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WT) 7487d8312ccSJohn Baldwin printf("WT "); 7497d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WB) 7507d8312ccSJohn Baldwin printf("WB "); 7517d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_UCE) 7527d8312ccSJohn Baldwin printf("UCE "); 7537d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_WP) 7547d8312ccSJohn Baldwin printf("WP "); 7557d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RP) 7567d8312ccSJohn Baldwin printf("RP "); 7577d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_XP) 7587d8312ccSJohn Baldwin printf("XP "); 7597d8312ccSJohn Baldwin if (map->md_attr & EFI_MD_ATTR_RT) 7607d8312ccSJohn Baldwin printf("RUNTIME"); 7617d8312ccSJohn Baldwin } 7627d8312ccSJohn Baldwin return (0); 7637d8312ccSJohn Baldwin } 7647d8312ccSJohn Baldwin #endif 7657d8312ccSJohn Baldwin 76689871cdeSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 76789871cdeSJohn Baldwin static int 76859101c5dSJohn Baldwin S_bios_smap_xattr(size_t l2, void *p) 76989871cdeSJohn Baldwin { 77089871cdeSJohn Baldwin struct bios_smap_xattr *smap, *end; 77189871cdeSJohn Baldwin 77289871cdeSJohn Baldwin if (l2 % sizeof(*smap) != 0) { 77359101c5dSJohn Baldwin warnx("S_bios_smap_xattr %zu is not a multiple of %zu", l2, 77489871cdeSJohn Baldwin sizeof(*smap)); 77589871cdeSJohn Baldwin return (1); 77689871cdeSJohn Baldwin } 77789871cdeSJohn Baldwin 77889871cdeSJohn Baldwin end = (struct bios_smap_xattr *)((char *)p + l2); 77989871cdeSJohn Baldwin for (smap = p; smap < end; smap++) 78089871cdeSJohn Baldwin printf("\nSMAP type=%02x, xattr=%02x, base=%016jx, len=%016jx", 78189871cdeSJohn Baldwin smap->type, smap->xattr, (uintmax_t)smap->base, 78289871cdeSJohn Baldwin (uintmax_t)smap->length); 78389871cdeSJohn Baldwin return (0); 78489871cdeSJohn Baldwin } 78589871cdeSJohn Baldwin #endif 78689871cdeSJohn Baldwin 787f7550ecfSMatthew Dillon static int 788aa255ef6SWarner Losh strIKtoi(const char *str, char **endptrp, const char *fmt) 789d45564dcSHajimu UMEMOTO { 790e267e00eSXin LI int kelv; 791d45564dcSHajimu UMEMOTO float temp; 792e267e00eSXin LI size_t len; 793a7b5ad27SEd Schouten const char *p; 794aa255ef6SWarner Losh int prec, i; 795d45564dcSHajimu UMEMOTO 796e267e00eSXin LI assert(errno == 0); 797e267e00eSXin LI 798e267e00eSXin LI len = strlen(str); 799e267e00eSXin LI /* caller already checked this */ 800e267e00eSXin LI assert(len > 0); 801e267e00eSXin LI 802aa255ef6SWarner Losh /* 803aa255ef6SWarner Losh * A format of "IK" is in deciKelvin. A format of "IK3" is in 804aa255ef6SWarner Losh * milliKelvin. The single digit following IK is log10 of the 805aa255ef6SWarner Losh * multiplying factor to convert Kelvin into the untis of this sysctl, 806aa255ef6SWarner Losh * or the dividing factor to convert the sysctl value to Kelvin. Numbers 807aa255ef6SWarner Losh * larger than 6 will run into precision issues with 32-bit integers. 808aa255ef6SWarner Losh * Characters that aren't ASCII digits after the 'K' are ignored. No 809aa255ef6SWarner Losh * localization is present because this is an interface from the kernel 810aa255ef6SWarner Losh * to this program (eg not an end-user interface), so isdigit() isn't 811aa255ef6SWarner Losh * used here. 812aa255ef6SWarner Losh */ 813aa255ef6SWarner Losh if (fmt[2] != '\0' && fmt[2] >= '0' && fmt[2] <= '9') 814aa255ef6SWarner Losh prec = fmt[2] - '0'; 815aa255ef6SWarner Losh else 816aa255ef6SWarner Losh prec = 1; 817d45564dcSHajimu UMEMOTO p = &str[len - 1]; 818aa255ef6SWarner Losh if (*p == 'C' || *p == 'F' || *p == 'K') { 819e267e00eSXin LI temp = strtof(str, endptrp); 820689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 821d45564dcSHajimu UMEMOTO if (*p == 'F') 822d45564dcSHajimu UMEMOTO temp = (temp - 32) * 5 / 9; 823689c8e8bSXin LI *endptrp = NULL; 824aa255ef6SWarner Losh if (*p != 'K') 825aa255ef6SWarner Losh temp += 273.15; 826aa255ef6SWarner Losh for (i = 0; i < prec; i++) 827aa255ef6SWarner Losh temp *= 10.0; 828aa255ef6SWarner Losh return ((int)(temp + 0.5)); 829d45564dcSHajimu UMEMOTO } 830e267e00eSXin LI } else { 831aa255ef6SWarner Losh /* No unit specified -> treat it as a raw number */ 832e267e00eSXin LI kelv = (int)strtol(str, endptrp, 10); 833689c8e8bSXin LI if (*endptrp != str && *endptrp == p && errno == 0) { 834689c8e8bSXin LI *endptrp = NULL; 835e267e00eSXin LI return (kelv); 836e267e00eSXin LI } 837689c8e8bSXin LI } 838e267e00eSXin LI 839e267e00eSXin LI errno = ERANGE; 840e267e00eSXin LI return (0); 841d45564dcSHajimu UMEMOTO } 842d45564dcSHajimu UMEMOTO 8431d86b91cSPoul-Henning Kamp /* 8441d86b91cSPoul-Henning Kamp * These functions uses a presently undocumented interface to the kernel 8451d86b91cSPoul-Henning Kamp * to walk the tree and get the type so it can print the value. 8461d86b91cSPoul-Henning Kamp * This interface is under work and consideration, and should probably 8471d86b91cSPoul-Henning Kamp * be killed with a big axe by the first person who can find the time. 8481d86b91cSPoul-Henning Kamp * (be aware though, that the proper interface isn't as obvious as it 8491d86b91cSPoul-Henning Kamp * may seem, there are various conflicting requirements. 8501d86b91cSPoul-Henning Kamp */ 8511d86b91cSPoul-Henning Kamp 8521d86b91cSPoul-Henning Kamp static int 853c58f8df6SXin LI name2oid(const char *name, int *oidp) 8541d86b91cSPoul-Henning Kamp { 8551d86b91cSPoul-Henning Kamp int oid[2]; 856dbf9b92fSDoug Rabson int i; 857dbf9b92fSDoug Rabson size_t j; 8581d86b91cSPoul-Henning Kamp 8591d86b91cSPoul-Henning Kamp oid[0] = 0; 8601d86b91cSPoul-Henning Kamp oid[1] = 3; 8611d86b91cSPoul-Henning Kamp 8621d86b91cSPoul-Henning Kamp j = CTL_MAXNAME * sizeof(int); 8631d86b91cSPoul-Henning Kamp i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 8641d86b91cSPoul-Henning Kamp if (i < 0) 86521e1f596SDavid Malone return (i); 8661d86b91cSPoul-Henning Kamp j /= sizeof(int); 8671d86b91cSPoul-Henning Kamp return (j); 8681d86b91cSPoul-Henning Kamp } 8691d86b91cSPoul-Henning Kamp 8701d86b91cSPoul-Henning Kamp static int 8711d86b91cSPoul-Henning Kamp oidfmt(int *oid, int len, char *fmt, u_int *kind) 8721d86b91cSPoul-Henning Kamp { 8731d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 8741d86b91cSPoul-Henning Kamp u_char buf[BUFSIZ]; 875dbf9b92fSDoug Rabson int i; 876dbf9b92fSDoug Rabson size_t j; 8771d86b91cSPoul-Henning Kamp 8781d86b91cSPoul-Henning Kamp qoid[0] = 0; 8791d86b91cSPoul-Henning Kamp qoid[1] = 4; 8801d86b91cSPoul-Henning Kamp memcpy(qoid + 2, oid, len * sizeof(int)); 8811d86b91cSPoul-Henning Kamp 88231fb4661SDima Dorfman j = sizeof(buf); 8831d86b91cSPoul-Henning Kamp i = sysctl(qoid, len + 2, buf, &j, 0, 0); 8841d86b91cSPoul-Henning Kamp if (i) 8856d7a8f6cSUlrich Spörlein err(1, "sysctl fmt %d %zu %d", i, j, errno); 8861d86b91cSPoul-Henning Kamp 8871d86b91cSPoul-Henning Kamp if (kind) 8881d86b91cSPoul-Henning Kamp *kind = *(u_int *)buf; 8891d86b91cSPoul-Henning Kamp 8901d86b91cSPoul-Henning Kamp if (fmt) 8911d86b91cSPoul-Henning Kamp strcpy(fmt, (char *)(buf + sizeof(u_int))); 89221e1f596SDavid Malone return (0); 8931d86b91cSPoul-Henning Kamp } 8941d86b91cSPoul-Henning Kamp 89560cf2c12SLuigi Rizzo /* 8961d86b91cSPoul-Henning Kamp * This formats and outputs the value of one variable 8971d86b91cSPoul-Henning Kamp * 8981d86b91cSPoul-Henning Kamp * Returns zero if anything was actually output. 8991d86b91cSPoul-Henning Kamp * Returns one if didn't know what to do with this. 9001d86b91cSPoul-Henning Kamp * Return minus one if we had errors. 9011d86b91cSPoul-Henning Kamp */ 9021d86b91cSPoul-Henning Kamp static int 9031d86b91cSPoul-Henning Kamp show_var(int *oid, int nlen) 9041d86b91cSPoul-Henning Kamp { 905ccf25977SRuslan Ermilov u_char buf[BUFSIZ], *val, *oval, *p; 906403c7f59SAlfred Perlstein char name[BUFSIZ], fmt[BUFSIZ]; 9078020192dSMarcelo Araujo const char *sep, *sep1, *prntype; 9081d86b91cSPoul-Henning Kamp int qoid[CTL_MAXNAME+2]; 90921e1f596SDavid Malone uintmax_t umv; 91021e1f596SDavid Malone intmax_t mv; 911f8e4b4efSMatthew D Fleming int i, hexlen, sign, ctltype; 91241e419cbSDavid Malone size_t intlen; 913dbf9b92fSDoug Rabson size_t j, len; 9141d86b91cSPoul-Henning Kamp u_int kind; 915aa255ef6SWarner Losh float base; 91659101c5dSJohn Baldwin int (*func)(size_t, void *); 917aa255ef6SWarner Losh int prec; 9181d86b91cSPoul-Henning Kamp 9196d7a8f6cSUlrich Spörlein /* Silence GCC. */ 9206d7a8f6cSUlrich Spörlein umv = mv = intlen = 0; 9216d7a8f6cSUlrich Spörlein 9229f98e452SMatthew N. Dodd bzero(buf, BUFSIZ); 923403c7f59SAlfred Perlstein bzero(fmt, BUFSIZ); 9249f98e452SMatthew N. Dodd bzero(name, BUFSIZ); 92581e7454aSDag-Erling Smørgrav qoid[0] = 0; 92681e7454aSDag-Erling Smørgrav memcpy(qoid + 2, oid, nlen * sizeof(int)); 92781e7454aSDag-Erling Smørgrav 92881e7454aSDag-Erling Smørgrav qoid[1] = 1; 92931fb4661SDima Dorfman j = sizeof(name); 93081e7454aSDag-Erling Smørgrav i = sysctl(qoid, nlen + 2, name, &j, 0, 0); 93181e7454aSDag-Erling Smørgrav if (i || !j) 9326d7a8f6cSUlrich Spörlein err(1, "sysctl name %d %zu %d", i, j, errno); 93381e7454aSDag-Erling Smørgrav 934403c7f59SAlfred Perlstein oidfmt(oid, nlen, fmt, &kind); 935403c7f59SAlfred Perlstein /* if Wflag then only list sysctls that are writeable and not stats. */ 936403c7f59SAlfred Perlstein if (Wflag && ((kind & CTLFLAG_WR) == 0 || (kind & CTLFLAG_STATS) != 0)) 937403c7f59SAlfred Perlstein return 1; 938403c7f59SAlfred Perlstein 939403c7f59SAlfred Perlstein /* if Tflag then only list sysctls that are tuneables. */ 940403c7f59SAlfred Perlstein if (Tflag && (kind & CTLFLAG_TUN) == 0) 941403c7f59SAlfred Perlstein return 1; 942403c7f59SAlfred Perlstein 943ca5fac55SDag-Erling Smørgrav if (Nflag) { 944ca5fac55SDag-Erling Smørgrav printf("%s", name); 945ca5fac55SDag-Erling Smørgrav return (0); 946ca5fac55SDag-Erling Smørgrav } 947ca5fac55SDag-Erling Smørgrav 948d0b8aabbSAnton Berezin if (eflag) 949d0b8aabbSAnton Berezin sep = "="; 950d0b8aabbSAnton Berezin else 951d0b8aabbSAnton Berezin sep = ": "; 952d0b8aabbSAnton Berezin 9538020192dSMarcelo Araujo ctltype = (kind & CTLTYPE); 9548020192dSMarcelo Araujo if (tflag || dflag) { 9558020192dSMarcelo Araujo if (!nflag) 9568020192dSMarcelo Araujo printf("%s%s", name, sep); 9578020192dSMarcelo Araujo if (ctl_typename[ctltype] != NULL) 9588020192dSMarcelo Araujo prntype = ctl_typename[ctltype]; 9598020192dSMarcelo Araujo else 9608020192dSMarcelo Araujo prntype = "unknown"; 9618020192dSMarcelo Araujo if (tflag && dflag) 9628020192dSMarcelo Araujo printf("%s%s", prntype, sep); 9638020192dSMarcelo Araujo else if (tflag) { 9648020192dSMarcelo Araujo printf("%s", prntype); 9658020192dSMarcelo Araujo return (0); 9668020192dSMarcelo Araujo } 9676105f815SLuigi Rizzo qoid[1] = 5; 9686105f815SLuigi Rizzo j = sizeof(buf); 9696105f815SLuigi Rizzo i = sysctl(qoid, nlen + 2, buf, &j, 0, 0); 9706105f815SLuigi Rizzo printf("%s", buf); 9716105f815SLuigi Rizzo return (0); 9726105f815SLuigi Rizzo } 973a18f34feSAndrew Gallatin 974a18f34feSAndrew Gallatin /* don't fetch opaques that we don't know how to print */ 975a18f34feSAndrew Gallatin if (ctltype == CTLTYPE_OPAQUE) { 976a18f34feSAndrew Gallatin if (strcmp(fmt, "S,clockinfo") == 0) 977a18f34feSAndrew Gallatin func = S_clockinfo; 978a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,timeval") == 0) 979a18f34feSAndrew Gallatin func = S_timeval; 980a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,loadavg") == 0) 981a18f34feSAndrew Gallatin func = S_loadavg; 982a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,vmtotal") == 0) 983a18f34feSAndrew Gallatin func = S_vmtotal; 984a18f34feSAndrew Gallatin #ifdef __amd64__ 985a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,efi_map_header") == 0) 986a18f34feSAndrew Gallatin func = S_efi_map; 987a18f34feSAndrew Gallatin #endif 988a18f34feSAndrew Gallatin #if defined(__amd64__) || defined(__i386__) 989a18f34feSAndrew Gallatin else if (strcmp(fmt, "S,bios_smap_xattr") == 0) 990a18f34feSAndrew Gallatin func = S_bios_smap_xattr; 991a18f34feSAndrew Gallatin #endif 992a18f34feSAndrew Gallatin else { 993a18f34feSAndrew Gallatin func = NULL; 994a18f34feSAndrew Gallatin if (!bflag && !oflag && !xflag) 995a18f34feSAndrew Gallatin return (1); 996a18f34feSAndrew Gallatin } 997a18f34feSAndrew Gallatin } 998a18f34feSAndrew Gallatin 9991d86b91cSPoul-Henning Kamp /* find an estimate of how much we need for this var */ 100075820005SJohn-Mark Gurney if (Bflag) 100175820005SJohn-Mark Gurney j = Bflag; 100275820005SJohn-Mark Gurney else { 10031d86b91cSPoul-Henning Kamp j = 0; 10041d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, 0, &j, 0, 0); 10051d86b91cSPoul-Henning Kamp j += j; /* we want to be sure :-) */ 100675820005SJohn-Mark Gurney } 10071d86b91cSPoul-Henning Kamp 1008ccf25977SRuslan Ermilov val = oval = malloc(j + 1); 1009ccf25977SRuslan Ermilov if (val == NULL) { 1010ccf25977SRuslan Ermilov warnx("malloc failed"); 10116b6b665bSBruce Evans return (1); 1012ccf25977SRuslan Ermilov } 10131d86b91cSPoul-Henning Kamp len = j; 10141d86b91cSPoul-Henning Kamp i = sysctl(oid, nlen, val, &len, 0, 0); 101504006eabSHans Petter Selasky if (i != 0 || (len == 0 && ctltype != CTLTYPE_STRING)) { 1016ccf25977SRuslan Ermilov free(oval); 10171d86b91cSPoul-Henning Kamp return (1); 1018ccf25977SRuslan Ermilov } 10191d86b91cSPoul-Henning Kamp 10201d86b91cSPoul-Henning Kamp if (bflag) { 10211d86b91cSPoul-Henning Kamp fwrite(val, 1, len, stdout); 1022ccf25977SRuslan Ermilov free(oval); 10231d86b91cSPoul-Henning Kamp return (0); 10241d86b91cSPoul-Henning Kamp } 102576d3dc52SAndrey A. Chernov val[len] = '\0'; 10261d86b91cSPoul-Henning Kamp p = val; 1027cbc134adSMatthew D Fleming sign = ctl_sign[ctltype]; 1028cbc134adSMatthew D Fleming intlen = ctl_size[ctltype]; 1029cbc134adSMatthew D Fleming 1030f8e4b4efSMatthew D Fleming switch (ctltype) { 1031f8e4b4efSMatthew D Fleming case CTLTYPE_STRING: 10321d86b91cSPoul-Henning Kamp if (!nflag) 1033d0b8aabbSAnton Berezin printf("%s%s", name, sep); 10346d7a8f6cSUlrich Spörlein printf("%.*s", (int)len, p); 1035ccf25977SRuslan Ermilov free(oval); 10361d86b91cSPoul-Henning Kamp return (0); 10371d86b91cSPoul-Henning Kamp 1038f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1039f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1040f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1041f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 10422a71f1edSConrad Meyer case CTLTYPE_S8: 10432a71f1edSConrad Meyer case CTLTYPE_S16: 10442a71f1edSConrad Meyer case CTLTYPE_S32: 1045cbc134adSMatthew D Fleming case CTLTYPE_S64: 10462a71f1edSConrad Meyer case CTLTYPE_U8: 10472a71f1edSConrad Meyer case CTLTYPE_U16: 10482a71f1edSConrad Meyer case CTLTYPE_U32: 1049cbc134adSMatthew D Fleming case CTLTYPE_U64: 1050dbf9b92fSDoug Rabson if (!nflag) 1051d0b8aabbSAnton Berezin printf("%s%s", name, sep); 1052e37d2b30SDavid Malone hexlen = 2 + (intlen * CHAR_BIT + 3) / 4; 1053fd8c668aSDavid Malone sep1 = ""; 105441e419cbSDavid Malone while (len >= intlen) { 1055f8e4b4efSMatthew D Fleming switch (kind & CTLTYPE) { 1056f8e4b4efSMatthew D Fleming case CTLTYPE_INT: 1057f8e4b4efSMatthew D Fleming case CTLTYPE_UINT: 1058e37d2b30SDavid Malone umv = *(u_int *)p; 1059e37d2b30SDavid Malone mv = *(int *)p; 106041e419cbSDavid Malone break; 1061f8e4b4efSMatthew D Fleming case CTLTYPE_LONG: 1062f8e4b4efSMatthew D Fleming case CTLTYPE_ULONG: 1063e37d2b30SDavid Malone umv = *(u_long *)p; 1064e37d2b30SDavid Malone mv = *(long *)p; 106541e419cbSDavid Malone break; 10662a71f1edSConrad Meyer case CTLTYPE_S8: 10672a71f1edSConrad Meyer case CTLTYPE_U8: 10682a71f1edSConrad Meyer umv = *(uint8_t *)p; 10692a71f1edSConrad Meyer mv = *(int8_t *)p; 10702a71f1edSConrad Meyer break; 10712a71f1edSConrad Meyer case CTLTYPE_S16: 10722a71f1edSConrad Meyer case CTLTYPE_U16: 10732a71f1edSConrad Meyer umv = *(uint16_t *)p; 10742a71f1edSConrad Meyer mv = *(int16_t *)p; 10752a71f1edSConrad Meyer break; 10762a71f1edSConrad Meyer case CTLTYPE_S32: 10772a71f1edSConrad Meyer case CTLTYPE_U32: 10782a71f1edSConrad Meyer umv = *(uint32_t *)p; 10792a71f1edSConrad Meyer mv = *(int32_t *)p; 10802a71f1edSConrad Meyer break; 1081cbc134adSMatthew D Fleming case CTLTYPE_S64: 1082cbc134adSMatthew D Fleming case CTLTYPE_U64: 1083cbc134adSMatthew D Fleming umv = *(uint64_t *)p; 1084cbc134adSMatthew D Fleming mv = *(int64_t *)p; 108541e419cbSDavid Malone break; 108641e419cbSDavid Malone } 1087fd8c668aSDavid Malone fputs(sep1, stdout); 1088f8e4b4efSMatthew D Fleming if (xflag) 1089e37d2b30SDavid Malone printf("%#0*jx", hexlen, umv); 1090f8e4b4efSMatthew D Fleming else if (!sign) 1091f8e4b4efSMatthew D Fleming printf(hflag ? "%'ju" : "%ju", umv); 109241e419cbSDavid Malone else if (fmt[1] == 'K') { 1093e37d2b30SDavid Malone if (mv < 0) 109421e1f596SDavid Malone printf("%jd", mv); 1095aa255ef6SWarner Losh else { 1096aa255ef6SWarner Losh /* 1097aa255ef6SWarner Losh * See strIKtoi for details on fmt. 1098aa255ef6SWarner Losh */ 1099aa255ef6SWarner Losh prec = 1; 1100aa255ef6SWarner Losh if (fmt[2] != '\0') 1101aa255ef6SWarner Losh prec = fmt[2] - '0'; 1102aa255ef6SWarner Losh base = 1.0; 1103aa255ef6SWarner Losh for (int i = 0; i < prec; i++) 1104aa255ef6SWarner Losh base *= 10.0; 1105aa255ef6SWarner Losh printf("%.*fC", prec, 1106aa255ef6SWarner Losh (float)mv / base - 273.15); 1107aa255ef6SWarner Losh } 1108c591d41fSPeter Wemm } else 1109fd8c668aSDavid Malone printf(hflag ? "%'jd" : "%jd", mv); 1110fd8c668aSDavid Malone sep1 = " "; 111141e419cbSDavid Malone len -= intlen; 111241e419cbSDavid Malone p += intlen; 1113aa02fb57SPoul-Henning Kamp } 1114ccf25977SRuslan Ermilov free(oval); 1115dbf9b92fSDoug Rabson return (0); 1116dbf9b92fSDoug Rabson 1117f8e4b4efSMatthew D Fleming case CTLTYPE_OPAQUE: 11181d86b91cSPoul-Henning Kamp i = 0; 11191d86b91cSPoul-Henning Kamp if (func) { 11201d86b91cSPoul-Henning Kamp if (!nflag) 1121d0b8aabbSAnton Berezin printf("%s%s", name, sep); 112248cd487aSHartmut Brandt i = (*func)(len, p); 1123ccf25977SRuslan Ermilov free(oval); 112448cd487aSHartmut Brandt return (i); 11251d86b91cSPoul-Henning Kamp } 11261d86b91cSPoul-Henning Kamp /* FALLTHROUGH */ 1127dea673e9SRodney W. Grimes default: 1128ccf25977SRuslan Ermilov if (!oflag && !xflag) { 1129ccf25977SRuslan Ermilov free(oval); 11301d86b91cSPoul-Henning Kamp return (1); 1131ccf25977SRuslan Ermilov } 11321d86b91cSPoul-Henning Kamp if (!nflag) 1133d0b8aabbSAnton Berezin printf("%s%s", name, sep); 11346d7a8f6cSUlrich Spörlein printf("Format:%s Length:%zu Dump:0x", fmt, len); 1135a89ab9bbSDag-Erling Smørgrav while (len-- && (xflag || p < val + 16)) 11361d86b91cSPoul-Henning Kamp printf("%02x", *p++); 1137a89ab9bbSDag-Erling Smørgrav if (!xflag && len > 16) 11381d86b91cSPoul-Henning Kamp printf("..."); 1139ccf25977SRuslan Ermilov free(oval); 11401d86b91cSPoul-Henning Kamp return (0); 11411d86b91cSPoul-Henning Kamp } 1142ccf25977SRuslan Ermilov free(oval); 11431d86b91cSPoul-Henning Kamp return (1); 1144dea673e9SRodney W. Grimes } 1145dea673e9SRodney W. Grimes 11461d86b91cSPoul-Henning Kamp static int 11471d86b91cSPoul-Henning Kamp sysctl_all(int *oid, int len) 1148dea673e9SRodney W. Grimes { 11491d86b91cSPoul-Henning Kamp int name1[22], name2[22]; 1150dbf9b92fSDoug Rabson int i, j; 1151dbf9b92fSDoug Rabson size_t l1, l2; 1152dea673e9SRodney W. Grimes 11531d86b91cSPoul-Henning Kamp name1[0] = 0; 11541d86b91cSPoul-Henning Kamp name1[1] = 2; 11551d86b91cSPoul-Henning Kamp l1 = 2; 11561d86b91cSPoul-Henning Kamp if (len) { 11571d86b91cSPoul-Henning Kamp memcpy(name1+2, oid, len * sizeof(int)); 11581d86b91cSPoul-Henning Kamp l1 += len; 11591d86b91cSPoul-Henning Kamp } else { 11601d86b91cSPoul-Henning Kamp name1[2] = 1; 11611d86b91cSPoul-Henning Kamp l1++; 11621d86b91cSPoul-Henning Kamp } 1163a89ab9bbSDag-Erling Smørgrav for (;;) { 116431fb4661SDima Dorfman l2 = sizeof(name2); 11651d86b91cSPoul-Henning Kamp j = sysctl(name1, l1, name2, &l2, 0, 0); 1166c1160fe4SBill Fumerola if (j < 0) { 11671d86b91cSPoul-Henning Kamp if (errno == ENOENT) 116821e1f596SDavid Malone return (0); 11691d86b91cSPoul-Henning Kamp else 11706d7a8f6cSUlrich Spörlein err(1, "sysctl(getnext) %d %zu", j, l2); 1171c1160fe4SBill Fumerola } 11721d86b91cSPoul-Henning Kamp 11731d86b91cSPoul-Henning Kamp l2 /= sizeof(int); 11741d86b91cSPoul-Henning Kamp 1175fd8c668aSDavid Malone if (len < 0 || l2 < (unsigned int)len) 117621e1f596SDavid Malone return (0); 11771d86b91cSPoul-Henning Kamp 11781d86b91cSPoul-Henning Kamp for (i = 0; i < len; i++) 11791d86b91cSPoul-Henning Kamp if (name2[i] != oid[i]) 118021e1f596SDavid Malone return (0); 11811d86b91cSPoul-Henning Kamp 11821d86b91cSPoul-Henning Kamp i = show_var(name2, l2); 11831d86b91cSPoul-Henning Kamp if (!i && !bflag) 11841d86b91cSPoul-Henning Kamp putchar('\n'); 11851d86b91cSPoul-Henning Kamp 11861d86b91cSPoul-Henning Kamp memcpy(name1+2, name2, l2 * sizeof(int)); 11871d86b91cSPoul-Henning Kamp l1 = 2 + l2; 11881d86b91cSPoul-Henning Kamp } 1189dea673e9SRodney W. Grimes } 1190