X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fthermal.c;h=9da8fa5fbb1d92c7a9d80b9defbce04b3f10fdf0;hp=09d9157efca218771b6c491eb1e4c9d90ebb4b6d;hb=da11ce02eb202b3e01d3e2d1b40f248a84430973;hpb=8c5927c52f4eefebaad3a6ecadc253ee9007ebb5 diff --git a/src/thermal.c b/src/thermal.c index 09d9157e..9da8fa5f 100644 --- a/src/thermal.c +++ b/src/thermal.c @@ -26,14 +26,11 @@ #include "utils_ignorelist.h" #if !KERNEL_LINUX -# error "This module is for Linux only." +#error "This module is for Linux only." #endif -static const char *config_keys[] = { - "Device", - "IgnoreSelected", - "ForceUseProcfs" -}; +static const char *config_keys[] = {"Device", "IgnoreSelected", + "ForceUseProcfs"}; static const char *const dirname_sysfs = "/sys/class/thermal"; static const char *const dirname_procfs = "/proc/acpi/thermal_zone"; @@ -41,190 +38,164 @@ static const char *const dirname_procfs = "/proc/acpi/thermal_zone"; static _Bool force_procfs = 0; static ignorelist_t *device_list; -enum dev_type { - TEMP = 0, - COOLING_DEV -}; +enum dev_type { TEMP = 0, COOLING_DEV }; -static void thermal_submit (const char *plugin_instance, enum dev_type dt, - value_t value) -{ - value_list_t vl = VALUE_LIST_INIT; +static void thermal_submit(const char *plugin_instance, enum dev_type dt, + value_t value) { + value_list_t vl = VALUE_LIST_INIT; - vl.values = &value; - vl.values_len = 1; + vl.values = &value; + vl.values_len = 1; - sstrncpy (vl.plugin, "thermal", sizeof(vl.plugin)); - if (plugin_instance != NULL) - sstrncpy (vl.plugin_instance, plugin_instance, - sizeof (vl.plugin_instance)); - sstrncpy (vl.type, - (dt == TEMP) ? "temperature" : "gauge", - sizeof (vl.type)); + sstrncpy(vl.plugin, "thermal", sizeof(vl.plugin)); + if (plugin_instance != NULL) + sstrncpy(vl.plugin_instance, plugin_instance, sizeof(vl.plugin_instance)); + sstrncpy(vl.type, (dt == TEMP) ? "temperature" : "gauge", sizeof(vl.type)); - plugin_dispatch_values (&vl); + plugin_dispatch_values(&vl); } -static int thermal_sysfs_device_read (const char __attribute__((unused)) *dir, - const char *name, void __attribute__((unused)) *user_data) -{ - char filename[PATH_MAX]; - _Bool success = 0; - value_t value; - - if (device_list && ignorelist_match (device_list, name)) - return -1; - - ssnprintf (filename, sizeof (filename), "%s/%s/temp", dirname_sysfs, name); - if (parse_value_file (filename, &value, DS_TYPE_GAUGE) == 0) - { - value.gauge /= 1000.0; - thermal_submit(name, TEMP, value); - success = 1; - } - - ssnprintf (filename, sizeof (filename), "%s/%s/cur_state", dirname_sysfs, name); - if (parse_value_file (filename, &value, DS_TYPE_GAUGE) == 0) - { - thermal_submit(name, COOLING_DEV, value); - success = 1; - } - - return (success ? 0 : -1); +static int thermal_sysfs_device_read(const char __attribute__((unused)) * dir, + const char *name, + void __attribute__((unused)) * user_data) { + char filename[PATH_MAX]; + _Bool success = 0; + value_t value; + + if (device_list && ignorelist_match(device_list, name)) + return -1; + + snprintf(filename, sizeof(filename), "%s/%s/temp", dirname_sysfs, name); + if (parse_value_file(filename, &value, DS_TYPE_GAUGE) == 0) { + value.gauge /= 1000.0; + thermal_submit(name, TEMP, value); + success = 1; + } + + snprintf(filename, sizeof(filename), "%s/%s/cur_state", dirname_sysfs, name); + if (parse_value_file(filename, &value, DS_TYPE_GAUGE) == 0) { + thermal_submit(name, COOLING_DEV, value); + success = 1; + } + + return success ? 0 : -1; } -static int thermal_procfs_device_read (const char __attribute__((unused)) *dir, - const char *name, void __attribute__((unused)) *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 = ssnprintf (filename, sizeof (filename), - "%s/%s/temperature", dirname_procfs, name); - if ((len < 0) || ((size_t) len >= sizeof (filename))) - return -1; - - len = (ssize_t) read_file_contents (filename, data, sizeof(data)); - if ((len > 0) && ((size_t) len > sizeof(str_temp)) - && (data[--len] == '\n') - && (! strncmp(data, str_temp, sizeof(str_temp)-1))) { - char *endptr = NULL; - double temp; - double factor, add; - - if (data[--len] == 'C') { - add = 0; - factor = 1.0; - } else if (data[len] == 'F') { - add = -32; - factor = 5.0/9.0; - } else if (data[len] == 'K') { - add = -273.15; - factor = 1.0; - } 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) * factor; - - if (endptr != data + len && errno == 0) { - thermal_submit(name, TEMP, (value_t) { .gauge = temp }); - return 0; - } - } - - return -1; +static int thermal_procfs_device_read(const char __attribute__((unused)) * dir, + const char *name, + void __attribute__((unused)) * + 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) || ((size_t)len >= sizeof(filename))) + return -1; + + len = (ssize_t)read_file_contents(filename, data, sizeof(data)); + if ((len > 0) && ((size_t)len > sizeof(str_temp)) && (data[--len] == '\n') && + (!strncmp(data, str_temp, sizeof(str_temp) - 1))) { + char *endptr = NULL; + double temp; + double factor, add; + + if (data[--len] == 'C') { + add = 0; + factor = 1.0; + } else if (data[len] == 'F') { + add = -32; + factor = 5.0 / 9.0; + } else if (data[len] == 'K') { + add = -273.15; + factor = 1.0; + } 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) * factor; + + if (endptr != data + len && errno == 0) { + thermal_submit(name, TEMP, (value_t){.gauge = temp}); + return 0; + } + } + + return -1; } -static int thermal_config (const char *key, const char *value) -{ - if (device_list == NULL) - device_list = ignorelist_create (1); - - if (strcasecmp (key, "Device") == 0) - { - if (ignorelist_add (device_list, value)) - { - ERROR ("thermal plugin: " - "Cannot add value to ignorelist."); - return 1; - } - } - else if (strcasecmp (key, "IgnoreSelected") == 0) - { - ignorelist_set_invert (device_list, 1); - if (IS_TRUE (value)) - ignorelist_set_invert (device_list, 0); - } - else if (strcasecmp (key, "ForceUseProcfs") == 0) - { - force_procfs = 0; - if (IS_TRUE (value)) - force_procfs = 1; - } - else - { - return -1; - } - - return 0; +static int thermal_config(const char *key, const char *value) { + if (device_list == NULL) + device_list = ignorelist_create(1); + + if (strcasecmp(key, "Device") == 0) { + if (ignorelist_add(device_list, value)) { + ERROR("thermal plugin: " + "Cannot add value to ignorelist."); + return 1; + } + } else if (strcasecmp(key, "IgnoreSelected") == 0) { + ignorelist_set_invert(device_list, 1); + if (IS_TRUE(value)) + ignorelist_set_invert(device_list, 0); + } else if (strcasecmp(key, "ForceUseProcfs") == 0) { + force_procfs = 0; + if (IS_TRUE(value)) + force_procfs = 1; + } else { + return -1; + } + + return 0; } -static int thermal_sysfs_read (void) -{ - return walk_directory (dirname_sysfs, thermal_sysfs_device_read, - /* user_data = */ NULL, /* include hidden */ 0); +static int thermal_sysfs_read(void) { + return walk_directory(dirname_sysfs, thermal_sysfs_device_read, NULL, 0); } -static int thermal_procfs_read (void) -{ - return walk_directory (dirname_procfs, thermal_procfs_device_read, - /* user_data = */ NULL, /* include hidden */ 0); +static int thermal_procfs_read(void) { + return walk_directory(dirname_procfs, thermal_procfs_device_read, NULL, 0); } -static int thermal_init (void) -{ - int ret = -1; +static int thermal_init(void) { + int ret = -1; - if (!force_procfs && access (dirname_sysfs, R_OK | X_OK) == 0) { - ret = plugin_register_read ("thermal", thermal_sysfs_read); - } else if (access (dirname_procfs, R_OK | X_OK) == 0) { - ret = plugin_register_read ("thermal", thermal_procfs_read); - } + if (!force_procfs && access(dirname_sysfs, R_OK | X_OK) == 0) { + ret = plugin_register_read("thermal", thermal_sysfs_read); + } else if (access(dirname_procfs, R_OK | X_OK) == 0) { + ret = plugin_register_read("thermal", thermal_procfs_read); + } - return ret; + return ret; } -static int thermal_shutdown (void) -{ - ignorelist_free (device_list); +static int thermal_shutdown(void) { + ignorelist_free(device_list); - return 0; + return 0; } -void module_register (void) -{ - plugin_register_config ("thermal", thermal_config, - config_keys, STATIC_ARRAY_SIZE(config_keys)); - plugin_register_init ("thermal", thermal_init); - plugin_register_shutdown ("thermal", thermal_shutdown); +void module_register(void) { + plugin_register_config("thermal", thermal_config, config_keys, + STATIC_ARRAY_SIZE(config_keys)); + plugin_register_init("thermal", thermal_init); + plugin_register_shutdown("thermal", thermal_shutdown); } -