summaryrefslogtreecommitdiffstats
path: root/sbin/sysctl
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/sysctl')
-rw-r--r--sbin/sysctl/sysctl.c43
1 files changed, 39 insertions, 4 deletions
diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c
index 1c5fc9d..3b40689 100644
--- a/sbin/sysctl/sysctl.c
+++ b/sbin/sysctl/sysctl.c
@@ -70,6 +70,7 @@ 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(char *, int *);
static void
usage(void)
@@ -232,10 +233,17 @@ parse(char *string)
switch (kind & CTLTYPE) {
case CTLTYPE_INT:
- intval = (int)strtol(newval, &endptr, 0);
- if (endptr == newval || *endptr != '\0')
- errx(1, "invalid integer '%s'",
- newval);
+ if (strcmp(fmt, "IK") == 0) {
+ if (!set_IK((char*)newval, &intval))
+ errx(1, "invalid value '%s'",
+ newval);
+ } else {
+ intval = (int)strtol(newval, &endptr,
+ 0);
+ if (endptr == newval || *endptr != '\0')
+ errx(1, "invalid integer '%s'",
+ newval);
+ }
newval = &intval;
newsize = sizeof(intval);
break;
@@ -443,6 +451,33 @@ set_T_dev_t (char *path, void **val, size_t *size)
*size = sizeof statb.st_rdev;
}
+static int
+set_IK(char *str, int *val)
+{
+ float temp;
+ int len, kelv;
+ char *p, *endptr;
+
+ if ((len = strlen(str)) == 0)
+ return (0);
+ p = &str[len - 1];
+ if (*p == 'C' || *p == 'F') {
+ *p = '\0';
+ temp = strtof(str, &endptr);
+ if (endptr == str || *endptr != '\0')
+ return (0);
+ if (*p == 'F')
+ temp = (temp - 32) * 5 / 9;
+ kelv = temp * 10 + 2732;
+ } else {
+ kelv = (int)strtol(str, &endptr, 10);
+ if (endptr == str || *endptr != '\0')
+ return (0);
+ }
+ *val = kelv;
+ return (1);
+}
+
/*
* These functions uses a presently undocumented interface to the kernel
* to walk the tree and get the type so it can print the value.
OpenPOWER on IntegriCloud