sysctl.c (170287) | sysctl.c (170512) |
---|---|
1/* 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33 The Regents of the University of California. All rights reserved.\n"; 34#endif /* not lint */ 35 36#ifndef lint 37#if 0 38static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; 39#endif 40static const char rcsid[] = | 1/* 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33 The Regents of the University of California. All rights reserved.\n"; 34#endif /* not lint */ 35 36#ifndef lint 37#if 0 38static char sccsid[] = "@(#)from: sysctl.c 8.1 (Berkeley) 6/6/93"; 39#endif 40static const char rcsid[] = |
41 "$FreeBSD: head/sbin/sysctl/sysctl.c 170287 2007-06-04 18:02:23Z dwmalone $"; | 41 "$FreeBSD: head/sbin/sysctl/sysctl.c 170512 2007-06-10 19:13:40Z dwmalone $"; |
42#endif /* not lint */ 43 | 42#endif /* not lint */ 43 |
44#ifdef __i386__ 45#include <sys/reboot.h> /* used for bootdev parsing */ 46#endif | |
47#include <sys/param.h> 48#include <sys/time.h> 49#include <sys/resource.h> 50#include <sys/stat.h> 51#include <sys/sysctl.h> 52#include <sys/vmmeter.h> 53 54#include <ctype.h> --- 7 unchanged lines hidden (view full) --- 62#include <unistd.h> 63 64static int aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag; 65static int qflag, xflag; 66 67static int oidfmt(int *, int, char *, u_int *); 68static void parse(char *); 69static int show_var(int *, int); | 44#include <sys/param.h> 45#include <sys/time.h> 46#include <sys/resource.h> 47#include <sys/stat.h> 48#include <sys/sysctl.h> 49#include <sys/vmmeter.h> 50 51#include <ctype.h> --- 7 unchanged lines hidden (view full) --- 59#include <unistd.h> 60 61static int aflag, bflag, dflag, eflag, hflag, Nflag, nflag, oflag; 62static int qflag, xflag; 63 64static int oidfmt(int *, int, char *, u_int *); 65static void parse(char *); 66static int show_var(int *, int); |
70static int sysctl_all (int *oid, int len); | 67static int sysctl_all(int *oid, int len); |
71static int name2oid(char *, int *); 72 | 68static int name2oid(char *, int *); 69 |
73static void set_T_dev_t (char *, void **, size_t *); | 70static void set_T_dev_t(char *, void **, size_t *); |
74static int set_IK(char *, int *); 75 76static void 77usage(void) 78{ 79 80 (void)fprintf(stderr, "%s\n%s\n", 81 "usage: sysctl [-bdehNnoqx] name[=value] ...", --- 148 unchanged lines hidden (view full) --- 230 (kind & CTLTYPE) == CTLTYPE_QUAD) { 231 if (strlen(newval) == 0) 232 errx(1, "empty numeric value"); 233 } 234 235 switch (kind & CTLTYPE) { 236 case CTLTYPE_INT: 237 if (strcmp(fmt, "IK") == 0) { | 71static int set_IK(char *, int *); 72 73static void 74usage(void) 75{ 76 77 (void)fprintf(stderr, "%s\n%s\n", 78 "usage: sysctl [-bdehNnoqx] name[=value] ...", --- 148 unchanged lines hidden (view full) --- 227 (kind & CTLTYPE) == CTLTYPE_QUAD) { 228 if (strlen(newval) == 0) 229 errx(1, "empty numeric value"); 230 } 231 232 switch (kind & CTLTYPE) { 233 case CTLTYPE_INT: 234 if (strcmp(fmt, "IK") == 0) { |
238 if (!set_IK((char*)newval, &intval)) | 235 if (!set_IK(newval, &intval)) |
239 errx(1, "invalid value '%s'", 240 newval); 241 } else { 242 intval = (int)strtol(newval, &endptr, 243 0); 244 if (endptr == newval || *endptr != '\0') 245 errx(1, "invalid integer '%s'", 246 newval); 247 } 248 newval = &intval; 249 newsize = sizeof(intval); 250 break; 251 case CTLTYPE_UINT: 252 uintval = (int) strtoul(newval, &endptr, 0); 253 if (endptr == newval || *endptr != '\0') 254 errx(1, "invalid unsigned integer '%s'", 255 newval); 256 newval = &uintval; | 236 errx(1, "invalid value '%s'", 237 newval); 238 } else { 239 intval = (int)strtol(newval, &endptr, 240 0); 241 if (endptr == newval || *endptr != '\0') 242 errx(1, "invalid integer '%s'", 243 newval); 244 } 245 newval = &intval; 246 newsize = sizeof(intval); 247 break; 248 case CTLTYPE_UINT: 249 uintval = (int) strtoul(newval, &endptr, 0); 250 if (endptr == newval || *endptr != '\0') 251 errx(1, "invalid unsigned integer '%s'", 252 newval); 253 newval = &uintval; |
257 newsize = sizeof uintval; | 254 newsize = sizeof(uintval); |
258 break; 259 case CTLTYPE_LONG: 260 longval = strtol(newval, &endptr, 0); 261 if (endptr == newval || *endptr != '\0') 262 errx(1, "invalid long integer '%s'", 263 newval); 264 newval = &longval; | 255 break; 256 case CTLTYPE_LONG: 257 longval = strtol(newval, &endptr, 0); 258 if (endptr == newval || *endptr != '\0') 259 errx(1, "invalid long integer '%s'", 260 newval); 261 newval = &longval; |
265 newsize = sizeof longval; | 262 newsize = sizeof(longval); |
266 break; 267 case CTLTYPE_ULONG: 268 ulongval = strtoul(newval, &endptr, 0); 269 if (endptr == newval || *endptr != '\0') 270 errx(1, "invalid unsigned long integer" 271 " '%s'", newval); 272 newval = &ulongval; | 263 break; 264 case CTLTYPE_ULONG: 265 ulongval = strtoul(newval, &endptr, 0); 266 if (endptr == newval || *endptr != '\0') 267 errx(1, "invalid unsigned long integer" 268 " '%s'", newval); 269 newval = &ulongval; |
273 newsize = sizeof ulongval; | 270 newsize = sizeof(ulongval); |
274 break; 275 case CTLTYPE_STRING: 276 break; 277 case CTLTYPE_QUAD: 278 sscanf(newval, "%qd", &quadval); 279 newval = &quadval; 280 newsize = sizeof(quadval); 281 break; 282 case CTLTYPE_OPAQUE: 283 if (strcmp(fmt, "T,dev_t") == 0) { | 271 break; 272 case CTLTYPE_STRING: 273 break; 274 case CTLTYPE_QUAD: 275 sscanf(newval, "%qd", &quadval); 276 newval = &quadval; 277 newsize = sizeof(quadval); 278 break; 279 case CTLTYPE_OPAQUE: 280 if (strcmp(fmt, "T,dev_t") == 0) { |
284 set_T_dev_t ((char*)newval, &newval, &newsize); | 281 set_T_dev_t (newval, &newval, &newsize); |
285 break; 286 } 287 /* FALLTHROUGH */ 288 default: 289 errx(1, "oid '%s' is type %d," 290 " cannot set that", bufp, 291 kind & CTLTYPE); 292 } --- 29 unchanged lines hidden (view full) --- 322} 323 324/* These functions will dump out various interesting structures. */ 325 326static int 327S_clockinfo(int l2, void *p) 328{ 329 struct clockinfo *ci = (struct clockinfo*)p; | 282 break; 283 } 284 /* FALLTHROUGH */ 285 default: 286 errx(1, "oid '%s' is type %d," 287 " cannot set that", bufp, 288 kind & CTLTYPE); 289 } --- 29 unchanged lines hidden (view full) --- 319} 320 321/* These functions will dump out various interesting structures. */ 322 323static int 324S_clockinfo(int l2, void *p) 325{ 326 struct clockinfo *ci = (struct clockinfo*)p; |
327 |
|
330 if (l2 != sizeof(*ci)) { 331 warnx("S_clockinfo %d != %d", l2, sizeof(*ci)); 332 return (0); 333 } 334 printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 335 "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 336 ci->hz, ci->tick, ci->profhz, ci->stathz); 337 return (0); --- 70 unchanged lines hidden (view full) --- 408 409 return (0); 410} 411 412static int 413T_dev_t(int l2, void *p) 414{ 415 dev_t *d = (dev_t *)p; | 328 if (l2 != sizeof(*ci)) { 329 warnx("S_clockinfo %d != %d", l2, sizeof(*ci)); 330 return (0); 331 } 332 printf(hflag ? "{ hz = %'d, tick = %'d, profhz = %'d, stathz = %'d }" : 333 "{ hz = %d, tick = %d, profhz = %d, stathz = %d }", 334 ci->hz, ci->tick, ci->profhz, ci->stathz); 335 return (0); --- 70 unchanged lines hidden (view full) --- 406 407 return (0); 408} 409 410static int 411T_dev_t(int l2, void *p) 412{ 413 dev_t *d = (dev_t *)p; |
414 |
|
416 if (l2 != sizeof(*d)) { 417 warnx("T_dev_T %d != %d", l2, sizeof(*d)); 418 return (0); 419 } 420 if ((int)(*d) != -1) { 421 if (minor(*d) > 255 || minor(*d) < 0) 422 printf("{ major = %d, minor = 0x%x }", 423 major(*d), minor(*d)); 424 else 425 printf("{ major = %d, minor = %d }", 426 major(*d), minor(*d)); 427 } 428 return (0); 429} 430 431static void | 415 if (l2 != sizeof(*d)) { 416 warnx("T_dev_T %d != %d", l2, sizeof(*d)); 417 return (0); 418 } 419 if ((int)(*d) != -1) { 420 if (minor(*d) > 255 || minor(*d) < 0) 421 printf("{ major = %d, minor = 0x%x }", 422 major(*d), minor(*d)); 423 else 424 printf("{ major = %d, minor = %d }", 425 major(*d), minor(*d)); 426 } 427 return (0); 428} 429 430static void |
432set_T_dev_t (char *path, void **val, size_t *size) | 431set_T_dev_t(char *path, void **val, size_t *size) |
433{ 434 static struct stat statb; 435 436 if (strcmp(path, "none") && strcmp(path, "off")) { 437 int rc = stat (path, &statb); 438 if (rc) { 439 err(1, "cannot stat %s", path); 440 } 441 442 if (!S_ISCHR(statb.st_mode)) { 443 errx(1, "must specify a device special file."); 444 } 445 } else { 446 statb.st_rdev = NODEV; 447 } | 432{ 433 static struct stat statb; 434 435 if (strcmp(path, "none") && strcmp(path, "off")) { 436 int rc = stat (path, &statb); 437 if (rc) { 438 err(1, "cannot stat %s", path); 439 } 440 441 if (!S_ISCHR(statb.st_mode)) { 442 errx(1, "must specify a device special file."); 443 } 444 } else { 445 statb.st_rdev = NODEV; 446 } |
448 *val = (char*) &statb.st_rdev; 449 *size = sizeof statb.st_rdev; | 447 *val = (void *) &statb.st_rdev; 448 *size = sizeof(statb.st_rdev); |
450} 451 452static int 453set_IK(char *str, int *val) 454{ 455 float temp; 456 int len, kelv; 457 char *p, *endptr; --- 35 unchanged lines hidden (view full) --- 493 size_t j; 494 495 oid[0] = 0; 496 oid[1] = 3; 497 498 j = CTL_MAXNAME * sizeof(int); 499 i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 500 if (i < 0) | 449} 450 451static int 452set_IK(char *str, int *val) 453{ 454 float temp; 455 int len, kelv; 456 char *p, *endptr; --- 35 unchanged lines hidden (view full) --- 492 size_t j; 493 494 oid[0] = 0; 495 oid[1] = 3; 496 497 j = CTL_MAXNAME * sizeof(int); 498 i = sysctl(oid, 2, oidp, &j, name, strlen(name)); 499 if (i < 0) |
501 return i; | 500 return (i); |
502 j /= sizeof(int); 503 return (j); 504} 505 506static int 507oidfmt(int *oid, int len, char *fmt, u_int *kind) 508{ 509 int qoid[CTL_MAXNAME+2]; --- 10 unchanged lines hidden (view full) --- 520 if (i) 521 err(1, "sysctl fmt %d %d %d", i, j, errno); 522 523 if (kind) 524 *kind = *(u_int *)buf; 525 526 if (fmt) 527 strcpy(fmt, (char *)(buf + sizeof(u_int))); | 501 j /= sizeof(int); 502 return (j); 503} 504 505static int 506oidfmt(int *oid, int len, char *fmt, u_int *kind) 507{ 508 int qoid[CTL_MAXNAME+2]; --- 10 unchanged lines hidden (view full) --- 519 if (i) 520 err(1, "sysctl fmt %d %d %d", i, j, errno); 521 522 if (kind) 523 *kind = *(u_int *)buf; 524 525 if (fmt) 526 strcpy(fmt, (char *)(buf + sizeof(u_int))); |
528 return 0; | 527 return (0); |
529} 530 531/* 532 * This formats and outputs the value of one variable 533 * 534 * Returns zero if anything was actually output. 535 * Returns one if didn't know what to do with this. 536 * Return minus one if we had errors. 537 */ 538 539static int 540show_var(int *oid, int nlen) 541{ 542 u_char buf[BUFSIZ], *val, *oval, *p; 543 char name[BUFSIZ], *fmt, *sep; 544 int qoid[CTL_MAXNAME+2]; | 528} 529 530/* 531 * This formats and outputs the value of one variable 532 * 533 * Returns zero if anything was actually output. 534 * Returns one if didn't know what to do with this. 535 * Return minus one if we had errors. 536 */ 537 538static int 539show_var(int *oid, int nlen) 540{ 541 u_char buf[BUFSIZ], *val, *oval, *p; 542 char name[BUFSIZ], *fmt, *sep; 543 int qoid[CTL_MAXNAME+2]; |
545 int i, flen, iv; 546 unsigned int uiv; 547 long lv; 548 unsigned long ulv; 549 quad_t qv; | 544 uintmax_t umv; 545 intmax_t mv; |
550 u_quad_t uqv; | 546 u_quad_t uqv; |
547 quad_t qv; 548 u_long ulv; 549 long lv; 550 u_int uiv; 551 int i, flen, iv; |
|
551 size_t intlen; | 552 size_t intlen; |
552 intmax_t v; 553 uintmax_t uv; | |
554 size_t j, len; 555 u_int kind; 556 int (*func)(int, void *); 557 558 bzero(buf, BUFSIZ); 559 bzero(name, BUFSIZ); 560 qoid[0] = 0; 561 memcpy(qoid + 2, oid, nlen * sizeof(int)); --- 66 unchanged lines hidden (view full) --- 628 case 'I': intlen = sizeof(int); flen = 10; break; 629 case 'L': intlen = sizeof(long); flen = 18; break; 630 case 'Q': intlen = sizeof(quad_t); flen = 18; break; 631 } 632 val = ""; 633 while (len >= intlen) { 634 switch (*fmt) { 635 case 'I': | 553 size_t j, len; 554 u_int kind; 555 int (*func)(int, void *); 556 557 bzero(buf, BUFSIZ); 558 bzero(name, BUFSIZ); 559 qoid[0] = 0; 560 memcpy(qoid + 2, oid, nlen * sizeof(int)); --- 66 unchanged lines hidden (view full) --- 627 case 'I': intlen = sizeof(int); flen = 10; break; 628 case 'L': intlen = sizeof(long); flen = 18; break; 629 case 'Q': intlen = sizeof(quad_t); flen = 18; break; 630 } 631 val = ""; 632 while (len >= intlen) { 633 switch (*fmt) { 634 case 'I': |
636 memcpy(&uiv, p, intlen); uv = uiv; 637 memcpy(&iv, p, intlen); v = iv; | 635 memcpy(&uiv, p, intlen); umv = uiv; 636 memcpy(&iv, p, intlen); mv = iv; |
638 break; 639 case 'L': | 637 break; 638 case 'L': |
640 memcpy(&ulv, p, intlen); uv = ulv; 641 memcpy(&lv, p, intlen); v = lv; | 639 memcpy(&ulv, p, intlen); umv = ulv; 640 memcpy(&lv, p, intlen); mv = lv; |
642 break; 643 case 'Q': | 641 break; 642 case 'Q': |
644 memcpy(&uqv, p, intlen); uv = uqv; 645 memcpy(&qv, p, intlen); v = qv; | 643 memcpy(&uqv, p, intlen); umv = uqv; 644 memcpy(&qv, p, intlen); mv = qv; |
646 break; 647 } 648 fputs(val, stdout); 649 if (fmt[1] == 'U') | 645 break; 646 } 647 fputs(val, stdout); 648 if (fmt[1] == 'U') |
650 printf(hflag ? "%'ju" : "%ju", uv); | 649 printf(hflag ? "%'ju" : "%ju", umv); |
651 else if (fmt[1] == 'X') | 650 else if (fmt[1] == 'X') |
652 printf(hflag ? "%'#0*jx" : "%#0*jx", flen, uv); | 651 printf(hflag ? "%'#0*jx" : "%#0*jx", flen, umv); |
653 else if (fmt[1] == 'K') { 654 if (*(int *)p < 0) | 652 else if (fmt[1] == 'K') { 653 if (*(int *)p < 0) |
655 printf("%jd", v); | 654 printf("%jd", mv); |
656 else | 655 else |
657 printf("%.1fC", (v - 2732.0) / 10); | 656 printf("%.1fC", (mv - 2732.0) / 10); |
658 } else | 657 } else |
659 printf(hflag ? "%'d" : "%d", v); | 658 printf(hflag ? "%'d" : "%d", mv); |
660 val = " "; 661 len -= intlen; 662 p += intlen; 663 } 664 free(oval); 665 return (0); 666 667 case 'P': --- 41 unchanged lines hidden (view full) --- 709 free(oval); 710 return (0); 711 } 712 free(oval); 713 return (1); 714} 715 716static int | 659 val = " "; 660 len -= intlen; 661 p += intlen; 662 } 663 free(oval); 664 return (0); 665 666 case 'P': --- 41 unchanged lines hidden (view full) --- 708 free(oval); 709 return (0); 710 } 711 free(oval); 712 return (1); 713} 714 715static int |
717sysctl_all (int *oid, int len) | 716sysctl_all(int *oid, int len) |
718{ 719 int name1[22], name2[22]; 720 int i, j; 721 size_t l1, l2; 722 723 name1[0] = 0; 724 name1[1] = 2; 725 l1 = 2; --- 4 unchanged lines hidden (view full) --- 730 name1[2] = 1; 731 l1++; 732 } 733 for (;;) { 734 l2 = sizeof(name2); 735 j = sysctl(name1, l1, name2, &l2, 0, 0); 736 if (j < 0) { 737 if (errno == ENOENT) | 717{ 718 int name1[22], name2[22]; 719 int i, j; 720 size_t l1, l2; 721 722 name1[0] = 0; 723 name1[1] = 2; 724 l1 = 2; --- 4 unchanged lines hidden (view full) --- 729 name1[2] = 1; 730 l1++; 731 } 732 for (;;) { 733 l2 = sizeof(name2); 734 j = sysctl(name1, l1, name2, &l2, 0, 0); 735 if (j < 0) { 736 if (errno == ENOENT) |
738 return 0; | 737 return (0); |
739 else 740 err(1, "sysctl(getnext) %d %d", j, l2); 741 } 742 743 l2 /= sizeof(int); 744 745 if (l2 < len) | 738 else 739 err(1, "sysctl(getnext) %d %d", j, l2); 740 } 741 742 l2 /= sizeof(int); 743 744 if (l2 < len) |
746 return 0; | 745 return (0); |
747 748 for (i = 0; i < len; i++) 749 if (name2[i] != oid[i]) | 746 747 for (i = 0; i < len; i++) 748 if (name2[i] != oid[i]) |
750 return 0; | 749 return (0); |
751 752 i = show_var(name2, l2); 753 if (!i && !bflag) 754 putchar('\n'); 755 756 memcpy(name1+2, name2, l2 * sizeof(int)); 757 l1 = 2 + l2; 758 } 759} | 750 751 i = show_var(name2, l2); 752 if (!i && !bflag) 753 putchar('\n'); 754 755 memcpy(name1+2, name2, l2 * sizeof(int)); 756 l1 = 2 + l2; 757 } 758} |