Deleted Added
full compact
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}