Support Celsius (nn.nC), Fahrenheit (nn.nF) and Kelvin (nnnn) to

specify temperature.

Reviewed by:	njl
MFC after:	3 days
This commit is contained in:
Hajimu UMEMOTO 2006-09-03 15:10:04 +00:00
parent 863ccba5d5
commit d45564dcfe
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=161951
2 changed files with 39 additions and 5 deletions

View File

@ -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.

View File

@ -733,7 +733,6 @@ acpi_tz_temp_sysctl(SYSCTL_HANDLER_ARGS)
return (EPERM);
/* Check user-supplied value for sanity. */
temp = (temp * 10) + TZ_ZEROC;
acpi_tz_sanity(sc, &temp, "user-supplied temp");
if (temp == -1)
return (EINVAL);