-static int thermal_procfs_device_read (const char *dir, const char *name,
- void *user_data)
-{
- const char str_temp[] = "temperature:";
- char filename[256];
- char data[1024];
- int len;
-
- if (device_list && ignorelist_match (device_list, name))
- return -1;
-
- /**
- * rechot ~ # cat /proc/acpi/thermal_zone/THRM/temperature
- * temperature: 55 C
- */
-
- len = snprintf (filename, sizeof (filename), "%s/%s/temperature", dirname_procfs, name);
- if ((len < 0) || ((unsigned int)len >= sizeof (filename)))
- return -1;
-
- len = read_file_contents (filename, data, sizeof(data));
- if (len > sizeof(str_temp) && data[--len] == '\n' && !strncmp(data, str_temp, sizeof(str_temp)-1)) {
- char *endptr = NULL;
- double temp;
- double celsius, add;
-
- if (data[--len] == 'C') {
- add = 0;
- celsius = 1;
- } else if (data[len] == 'F') {
- add = -32;
- celsius = 5/9;
- } else if (data[len] == 'K') {
- add = -273.15;
- celsius = 1;
- } else
- return -1;
-
- while (len > 0 && data[--len] == ' ')
- ;
- data[len + 1] = 0;
-
- while (len > 0 && data[--len] != ' ')
- ;
- ++len;
-
- errno = 0;
- temp = (strtod (data + len, &endptr) + add) * celsius;
-
- if (endptr != data + len && errno == 0) {
- thermal_submit(name, TEMP, temp);
- return 0;
- }
- }
-
- return -1;
+static int thermal_sysfs_device_read(const char __attribute__((unused)) * dir,
+ const char *name,
+ void __attribute__((unused)) * user_data) {
+ char filename[256];
+ char data[1024];
+ int len;
+ _Bool success = 0;
+
+ if (device_list && ignorelist_match(device_list, name))
+ return -1;
+
+ len =
+ ssnprintf(filename, sizeof(filename), "%s/%s/temp", dirname_sysfs, name);
+ if ((len < 0) || ((size_t)len >= sizeof(filename)))
+ return -1;
+
+ len = (ssize_t)read_file_contents(filename, data, sizeof(data));
+ if (len > 1 && data[--len] == '\n') {
+ char *endptr = NULL;
+ double temp;
+
+ data[len] = 0;
+ errno = 0;
+ temp = strtod(data, &endptr) / 1000.0;
+
+ if (endptr == data + len && errno == 0) {
+ thermal_submit(name, TEMP, temp);
+ success = 1;
+ }
+ }
+
+ len = ssnprintf(filename, sizeof(filename), "%s/%s/cur_state", dirname_sysfs,
+ name);
+ if ((len < 0) || ((size_t)len >= sizeof(filename)))
+ return -1;
+
+ len = (ssize_t)read_file_contents(filename, data, sizeof(data));
+ if (len > 1 && data[--len] == '\n') {
+ char *endptr = NULL;
+ double state;
+
+ data[len] = 0;
+ errno = 0;
+ state = strtod(data, &endptr);
+
+ if (endptr == data + len && errno == 0) {
+ thermal_submit(name, COOLING_DEV, state);
+ success = 1;
+ }
+ }
+
+ return (success ? 0 : -1);