diff options
author | ume <ume@FreeBSD.org> | 2006-09-03 15:10:04 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2006-09-03 15:10:04 +0000 |
commit | d5da60dc31891246f23ea639d20c8a7809fa27d0 (patch) | |
tree | 5b3d8abbdbd3ca7cd673703db30ae0b5ba7c0385 /sbin | |
parent | c5e1a3ed4ee445ca3455e7de3dbe576e1426fa7c (diff) | |
download | FreeBSD-src-d5da60dc31891246f23ea639d20c8a7809fa27d0.zip FreeBSD-src-d5da60dc31891246f23ea639d20c8a7809fa27d0.tar.gz |
Support Celsius (nn.nC), Fahrenheit (nn.nF) and Kelvin (nnnn) to
specify temperature.
Reviewed by: njl
MFC after: 3 days
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/sysctl/sysctl.c | 43 |
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. |