summaryrefslogtreecommitdiffstats
path: root/sbin/sysctl/sysctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/sysctl/sysctl.c')
-rw-r--r--sbin/sysctl/sysctl.c138
1 files changed, 59 insertions, 79 deletions
diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c
index 93ff8c6..608e1d9 100644
--- a/sbin/sysctl/sysctl.c
+++ b/sbin/sysctl/sysctl.c
@@ -67,7 +67,6 @@ static int show_var(int *, int);
static int sysctl_all(int *oid, int len);
static int name2oid(char *, int *);
-static void set_T_dev_t(char *, void **, size_t *);
static int set_IK(const char *, int *);
static void
@@ -171,7 +170,8 @@ parse(char *string)
long longval;
unsigned long ulongval;
size_t newsize = 0;
- quad_t quadval;
+ int64_t i64val;
+ uint64_t u64val;
int mib[CTL_MAXNAME];
char *cp, *bufp, buf[BUFSIZ], *endptr, fmt[BUFSIZ];
u_int kind;
@@ -231,7 +231,8 @@ parse(char *string)
(kind & CTLTYPE) == CTLTYPE_UINT ||
(kind & CTLTYPE) == CTLTYPE_LONG ||
(kind & CTLTYPE) == CTLTYPE_ULONG ||
- (kind & CTLTYPE) == CTLTYPE_QUAD) {
+ (kind & CTLTYPE) == CTLTYPE_S64 ||
+ (kind & CTLTYPE) == CTLTYPE_U64) {
if (strlen(newval) == 0)
errx(1, "empty numeric value");
}
@@ -278,19 +279,23 @@ parse(char *string)
break;
case CTLTYPE_STRING:
break;
- case CTLTYPE_QUAD:
- quadval = strtoq(newval, &endptr, 0);
+ case CTLTYPE_S64:
+ i64val = strtoimax(newval, &endptr, 0);
if (endptr == newval || *endptr != '\0')
- errx(1, "invalid quad integer"
- " '%s'", (char *)newval);
- newval = &quadval;
- newsize = sizeof(quadval);
+ errx(1, "invalid int64_t '%s'",
+ (char *)newval);
+ newval = &i64val;
+ newsize = sizeof(i64val);
+ break;
+ case CTLTYPE_U64:
+ u64val = strtoumax(newval, &endptr, 0);
+ if (endptr == newval || *endptr != '\0')
+ errx(1, "invalid uint64_t '%s'",
+ (char *)newval);
+ newval = &u64val;
+ newsize = sizeof(u64val);
break;
case CTLTYPE_OPAQUE:
- if (strcmp(fmt, "T,dev_t") == 0) {
- set_T_dev_t (newval, &newval, &newsize);
- break;
- }
/* FALLTHROUGH */
default:
errx(1, "oid '%s' is type %d,"
@@ -420,40 +425,6 @@ S_vmtotal(int l2, void *p)
}
static int
-T_dev_t(int l2, void *p)
-{
- dev_t *d = (dev_t *)p;
-
- if (l2 != sizeof(*d)) {
- warnx("T_dev_T %d != %zu", l2, sizeof(*d));
- return (1);
- }
- printf("%s", devname(*d, S_IFCHR));
- return (0);
-}
-
-static void
-set_T_dev_t(char *path, void **val, size_t *size)
-{
- static struct stat statb;
-
- if (strcmp(path, "none") && strcmp(path, "off")) {
- int rc = stat (path, &statb);
- if (rc) {
- err(1, "cannot stat %s", path);
- }
-
- if (!S_ISCHR(statb.st_mode)) {
- errx(1, "must specify a device special file.");
- }
- } else {
- statb.st_rdev = NODEV;
- }
- *val = (void *) &statb.st_rdev;
- *size = sizeof(statb.st_rdev);
-}
-
-static int
set_IK(const char *str, int *val)
{
float temp;
@@ -532,6 +503,21 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
return (0);
}
+static int ctl_sign[CTLTYPE+1] = {
+ [CTLTYPE_INT] = 1,
+ [CTLTYPE_LONG] = 1,
+ [CTLTYPE_S64] = 1,
+};
+
+static int ctl_size[CTLTYPE+1] = {
+ [CTLTYPE_INT] = sizeof(int),
+ [CTLTYPE_UINT] = sizeof(u_int),
+ [CTLTYPE_LONG] = sizeof(long),
+ [CTLTYPE_ULONG] = sizeof(u_long),
+ [CTLTYPE_S64] = sizeof(int64_t),
+ [CTLTYPE_U64] = sizeof(int64_t),
+};
+
/*
* This formats and outputs the value of one variable
*
@@ -539,7 +525,6 @@ oidfmt(int *oid, int len, char *fmt, u_int *kind)
* Returns one if didn't know what to do with this.
* Return minus one if we had errors.
*/
-
static int
show_var(int *oid, int nlen)
{
@@ -549,7 +534,7 @@ show_var(int *oid, int nlen)
int qoid[CTL_MAXNAME+2];
uintmax_t umv;
intmax_t mv;
- int i, hexlen;
+ int i, hexlen, sign, ctltype;
size_t intlen;
size_t j, len;
u_int kind;
@@ -614,46 +599,51 @@ show_var(int *oid, int nlen)
fmt = buf;
oidfmt(oid, nlen, fmt, &kind);
p = val;
- switch (*fmt) {
- case 'A':
+ ctltype = (kind & CTLTYPE);
+ sign = ctl_sign[ctltype];
+ intlen = ctl_size[ctltype];
+
+ switch (ctltype) {
+ case CTLTYPE_STRING:
if (!nflag)
printf("%s%s", name, sep);
printf("%.*s", (int)len, p);
free(oval);
return (0);
- case 'I':
- case 'L':
- case 'Q':
+ case CTLTYPE_INT:
+ case CTLTYPE_UINT:
+ case CTLTYPE_LONG:
+ case CTLTYPE_ULONG:
+ case CTLTYPE_S64:
+ case CTLTYPE_U64:
if (!nflag)
printf("%s%s", name, sep);
- switch (*fmt) {
- case 'I': intlen = sizeof(int); break;
- case 'L': intlen = sizeof(long); break;
- case 'Q': intlen = sizeof(quad_t); break;
- }
hexlen = 2 + (intlen * CHAR_BIT + 3) / 4;
sep1 = "";
while (len >= intlen) {
- switch (*fmt) {
- case 'I':
+ switch (kind & CTLTYPE) {
+ case CTLTYPE_INT:
+ case CTLTYPE_UINT:
umv = *(u_int *)p;
mv = *(int *)p;
break;
- case 'L':
+ case CTLTYPE_LONG:
+ case CTLTYPE_ULONG:
umv = *(u_long *)p;
mv = *(long *)p;
break;
- case 'Q':
- umv = *(u_quad_t *)p;
- mv = *(quad_t *)p;
+ case CTLTYPE_S64:
+ case CTLTYPE_U64:
+ umv = *(uint64_t *)p;
+ mv = *(int64_t *)p;
break;
}
fputs(sep1, stdout);
- if (fmt[1] == 'U')
- printf(hflag ? "%'ju" : "%ju", umv);
- else if (fmt[1] == 'X')
+ if (xflag)
printf("%#0*jx", hexlen, umv);
+ else if (!sign)
+ printf(hflag ? "%'ju" : "%ju", umv);
else if (fmt[1] == 'K') {
if (mv < 0)
printf("%jd", mv);
@@ -668,15 +658,7 @@ show_var(int *oid, int nlen)
free(oval);
return (0);
- case 'P':
- if (!nflag)
- printf("%s%s", name, sep);
- printf("%p", *(void **)p);
- free(oval);
- return (0);
-
- case 'T':
- case 'S':
+ case CTLTYPE_OPAQUE:
i = 0;
if (strcmp(fmt, "S,clockinfo") == 0)
func = S_clockinfo;
@@ -686,8 +668,6 @@ show_var(int *oid, int nlen)
func = S_loadavg;
else if (strcmp(fmt, "S,vmtotal") == 0)
func = S_vmtotal;
- else if (strcmp(fmt, "T,dev_t") == 0)
- func = T_dev_t;
else
func = NULL;
if (func) {
OpenPOWER on IntegriCloud