X-Git-Url: http://wpitchoune.net/gitweb/?p=psensor-pkg-debian.git;a=blobdiff_plain;f=src%2Flib%2Flmsensor.c;h=baa97efb5c23af41b744309759f54b6d78e963b9;hp=c33dfb2ff58b7cd7b1d93c1d0c79b159c488c843;hb=48da1ac5531838d157762882ee455cec4da05728;hpb=f055e7507526592d3a74c652f5f053701614c9c0 diff --git a/src/lib/lmsensor.c b/src/lib/lmsensor.c index c33dfb2..baa97ef 100644 --- a/src/lib/lmsensor.c +++ b/src/lib/lmsensor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2012 jeanfi@gmail.com + * Copyright (C) 2010-2014 jeanfi@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -27,10 +27,12 @@ #include #include -#include "psensor.h" +#include static int init_done; +static const char *PROVIDER_NAME = "lmsensor"; + static double get_value(const sensors_chip_name *name, const sensors_subfeature *sub) { @@ -39,9 +41,10 @@ static double get_value(const sensors_chip_name *name, err = sensors_get_value(name, sub->number, &val); if (err) { - fprintf(stderr, - _("ERROR: Can't get value of subfeature %s: %s\n"), - sub->name, sensors_strerror(err)); + log_err(_("%s: Cannot get value of subfeature %s: %s."), + PROVIDER_NAME, + sub->name, + sensors_strerror(err)); val = UNKNOWN_DBL_VALUE; } return val; @@ -49,17 +52,22 @@ static double get_value(const sensors_chip_name *name, static double get_temp_input(struct psensor *sensor) { - const sensors_chip_name *chip = sensor->iname; - const sensors_feature *feature = sensor->feature; - const sensors_subfeature *sf; - sf = sensors_get_subfeature(chip, - feature, SENSORS_SUBFEATURE_TEMP_INPUT); + const sensors_chip_name *chip; + + const sensors_feature *feature; + + chip = sensor->iname; + feature = sensor->feature; + + sf = sensors_get_subfeature(sensor->iname, + feature, + SENSORS_SUBFEATURE_TEMP_INPUT); if (sf) return get_value(chip, sf); - else - return UNKNOWN_DBL_VALUE; + + return UNKNOWN_DBL_VALUE; } static double get_fan_input(struct psensor *sensor) @@ -70,31 +78,39 @@ static double get_fan_input(struct psensor *sensor) const sensors_subfeature *sf; sf = sensors_get_subfeature(chip, - feature, SENSORS_SUBFEATURE_FAN_INPUT); + feature, + SENSORS_SUBFEATURE_FAN_INPUT); + if (sf) return get_value(chip, sf); - else - return UNKNOWN_DBL_VALUE; + + return UNKNOWN_DBL_VALUE; } void lmsensor_psensor_list_update(struct psensor **sensors) { - struct psensor **s_ptr = sensors; + struct psensor *s; + double v; if (!init_done) - return ; + return; + + while (*sensors) { + s = *sensors; - while (*s_ptr) { - struct psensor *sensor = *s_ptr; + if (!(s->type & SENSOR_TYPE_REMOTE) + && s->type & SENSOR_TYPE_LMSENSOR) { - if (sensor->type == SENSOR_TYPE_LMSENSOR_TEMP) - psensor_set_current_value - (sensor, get_temp_input(sensor)); - else if (sensor->type == SENSOR_TYPE_LMSENSOR_FAN) - psensor_set_current_value(sensor, - get_fan_input(sensor)); + if (s->type & SENSOR_TYPE_TEMP) + v = get_temp_input(s); + else /* s->type & SENSOR_TYPE_RPM */ + v = get_fan_input(s); - s_ptr++; + if (v != UNKNOWN_DBL_VALUE) + psensor_set_current_value(s, v); + } + + sensors++; } } @@ -105,9 +121,8 @@ lmsensor_psensor_create(const sensors_chip_name *chip, { char name[200]; const sensors_subfeature *sf; - char *label; int type; - char *id; + char *id, *label, *cname; struct psensor *psensor; sensors_subfeature_type fault_subfeature; @@ -116,13 +131,10 @@ lmsensor_psensor_create(const sensors_chip_name *chip, if (feature->type == SENSORS_FEATURE_TEMP) { fault_subfeature = SENSORS_SUBFEATURE_TEMP_FAULT; - } else if (feature->type == SENSORS_FEATURE_FAN) { fault_subfeature = SENSORS_SUBFEATURE_FAN_FAULT; - } else { - fprintf(stderr, - _("ERROR: create_sensor, wrong feature type\n")); + log_err(_("%s: Wrong feature type."), PROVIDER_NAME); return NULL; } @@ -134,19 +146,38 @@ lmsensor_psensor_create(const sensors_chip_name *chip, if (!label) return NULL; - type = 0; + type = SENSOR_TYPE_LMSENSOR; if (feature->type == SENSORS_FEATURE_TEMP) - type = SENSOR_TYPE_LMSENSOR_TEMP; + type |= SENSOR_TYPE_TEMP; else if (feature->type == SENSORS_FEATURE_FAN) - type = SENSOR_TYPE_LMSENSOR_FAN; + type |= (SENSOR_TYPE_RPM|SENSOR_TYPE_FAN); else return NULL; - id = malloc(strlen("lmsensor ") + 1 + strlen(name) + 1 + strlen(label) + - 1); - sprintf(id, "lmsensor %s %s", name, label); + id = malloc(strlen(PROVIDER_NAME) + + 1 + + strlen(name) + + 1 + + strlen(label) + + 1); + sprintf(id, "%s %s %s", PROVIDER_NAME, name, label); + + if (!strcmp(chip->prefix, "coretemp")) + cname = strdup(_("Intel CPU")); + else if (!strcmp(chip->prefix, "k10temp") + || !strcmp(chip->prefix, "k8temp") + || !strcmp(chip->prefix, "fam15h_power")) + cname = strdup(_("AMD CPU")); + else if (!strcmp(chip->prefix, "nouveau")) + cname = strdup(_("NVIDIA GPU")); + else if (!strcmp(chip->prefix, "via-cputemp")) + cname = strdup(_("VIA CPU")); + else if (!strcmp(chip->prefix, "acpitz")) + cname = strdup(_("ACPI")); + else + cname = strdup(chip->prefix); - psensor = psensor_create(id, label, type, values_max_length); + psensor = psensor_create(id, label, cname, type, values_max_length); psensor->iname = chip; psensor->feature = feature; @@ -160,57 +191,50 @@ lmsensor_psensor_create(const sensors_chip_name *chip, return psensor; } -struct psensor **lmsensor_psensor_list_add(struct psensor **sensors, - int vn) +void lmsensor_init() +{ + int err; + + err = sensors_init(NULL); + + if (err) { + log_err(_("%s: initialization failure: %s."), + PROVIDER_NAME, + sensors_strerror(err)); + init_done = 0; + } else { + init_done = 1; + } +} + +void lmsensor_psensor_list_append(struct psensor ***sensors, int vn) { const sensors_chip_name *chip; - int chip_nr = 0; - struct psensor **tmp, **result; + int chip_nr, i; const sensors_feature *feature; struct psensor *s; - int i; if (!init_done) - return NULL; + lmsensor_init(); - result = sensors; + if (!init_done) + return; + + chip_nr = 0; while ((chip = sensors_get_detected_chips(NULL, &chip_nr))) { i = 0; while ((feature = sensors_get_features(chip, &i))) { - if (feature->type == SENSORS_FEATURE_TEMP || feature->type == SENSORS_FEATURE_FAN) { s = lmsensor_psensor_create(chip, feature, vn); - if (s) { - tmp = psensor_list_add(result, s); - - if (tmp != sensors) - free(result); - - result = tmp; - } + if (s) + psensor_list_append(sensors, s); } } } - - return result; -} - -void lmsensor_init() -{ - int err = sensors_init(NULL); - - if (err) { - fprintf(stderr, - _("ERROR: lm-sensors initialization failure: %s\n"), - sensors_strerror(err)); - init_done = 0; - } else { - init_done = 1; - } } void lmsensor_cleanup()