Imported Upstream version 1.2.0
[psensor-pkg-debian.git] / src / lib / lmsensor.c
index 1708f18..6f3845d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2014 jeanfi@gmail.com
+ * Copyright (C) 2010-2016 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
 #include <sensors/sensors.h>
 #include <sensors/error.h>
 
-#include "psensor.h"
+#include <lmsensor.h>
 
 static int init_done;
 
+static const char *PROVIDER_NAME = "lmsensor";
+
+struct lmsensor_data {
+       const sensors_chip_name *chip;
+
+       const sensors_feature *feature;
+};
+
+static const sensors_chip_name *get_chip_name(struct psensor *s)
+{
+       return ((struct lmsensor_data *)s->provider_data)->chip;
+}
+
+static const sensors_feature *get_feature(struct psensor *s)
+{
+       return ((struct lmsensor_data *)s->provider_data)->feature;
+}
+
+static void lmsensor_data_set(struct psensor *s,
+                             const struct sensors_chip_name *chip,
+                             const struct sensors_feature *feature)
+{
+       struct lmsensor_data *data;
+
+       data = malloc(sizeof(struct lmsensor_data));
+       data->chip = chip;
+       data->feature = feature;
+
+       s->provider_data = data;
+}
+
 static double get_value(const sensors_chip_name *name,
                        const sensors_subfeature *sub)
 {
@@ -39,8 +70,10 @@ static double get_value(const sensors_chip_name *name,
 
        err = sensors_get_value(name, sub->number, &val);
        if (err) {
-               log_err(_("lmsensor: cannot get value of subfeature %s: %s."),
-                       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;
@@ -48,54 +81,68 @@ 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;
 
+       const sensors_chip_name *chip;
+
+       const sensors_feature *feature;
+
+       chip = get_chip_name(sensor);
+       feature = get_feature(sensor);
+
        sf = sensors_get_subfeature(chip,
-                                   feature, SENSORS_SUBFEATURE_TEMP_INPUT);
+                                   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)
 {
-       const sensors_chip_name *chip = sensor->iname;
-       const sensors_feature *feature = sensor->feature;
+       const sensors_chip_name *chip;
+       const sensors_feature *feature;
 
        const sensors_subfeature *sf;
 
+       chip = get_chip_name(sensor);
+       feature = get_feature(sensor);
+
        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 ;
+       if (!init_done || !sensors)
+               return;
 
-       while (*s_ptr) {
-               struct psensor *s = *s_ptr;
+       while (*sensors) {
+               s = *sensors;
 
                if (!(s->type & SENSOR_TYPE_REMOTE)
                    && s->type & SENSOR_TYPE_LMSENSOR) {
+
                        if (s->type & SENSOR_TYPE_TEMP)
-                               psensor_set_current_value(s,
-                                                         get_temp_input(s));
-                       else if (s->type & SENSOR_TYPE_RPM)
-                               psensor_set_current_value(s, get_fan_input(s));
+                               v = get_temp_input(s);
+                       else /* s->type & SENSOR_TYPE_RPM */
+                               v = get_fan_input(s);
+
+                       if (v != UNKNOWN_DBL_VALUE)
+                               psensor_set_current_value(s, v);
                }
 
-               s_ptr++;
+               sensors++;
        }
 }
 
@@ -109,18 +156,22 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
        int type;
        char *id, *label, *cname;
        struct psensor *psensor;
-       sensors_subfeature_type fault_subfeature;
+       sensors_subfeature_type fault_subfeature, min_subfeature,
+               max_subfeature;
 
        if (sensors_snprintf_chip_name(name, 200, chip) < 0)
                return NULL;
 
        if (feature->type == SENSORS_FEATURE_TEMP) {
                fault_subfeature = SENSORS_SUBFEATURE_TEMP_FAULT;
+               max_subfeature = SENSORS_SUBFEATURE_TEMP_MAX;
+               min_subfeature = SENSORS_SUBFEATURE_TEMP_MIN;
        } else if (feature->type == SENSORS_FEATURE_FAN) {
                fault_subfeature = SENSORS_SUBFEATURE_FAN_FAULT;
+               max_subfeature = SENSORS_SUBFEATURE_FAN_MAX;
+               min_subfeature = SENSORS_SUBFEATURE_FAN_MIN;
        } else {
-               log_err(_(
-"lmsensor: lmsensor_psensor_create failure: wrong feature type."));
+               log_err(_("%s: Wrong feature type."), PROVIDER_NAME);
                return NULL;
        }
 
@@ -140,9 +191,13 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
        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"));
@@ -154,13 +209,22 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
                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, cname, type, values_max_length);
 
-       psensor->iname = chip;
-       psensor->feature = feature;
+       sf = sensors_get_subfeature(chip, feature, max_subfeature);
+       if (sf)
+               psensor->max = get_value(chip, sf);
+
+       sf = sensors_get_subfeature(chip, feature, min_subfeature);
+       if (sf)
+               psensor->min = get_value(chip, sf);
+
+       lmsensor_data_set(psensor, chip, feature);
 
        if (feature->type == SENSORS_FEATURE_TEMP
            && (get_temp_input(psensor) == UNKNOWN_DBL_VALUE)) {
@@ -171,59 +235,53 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
        return psensor;
 }
 
-struct psensor **lmsensor_psensor_list_add(struct psensor **sensors,
-                                          int vn)
+static void lmsensor_init(void)
+{
+       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();
+
+       if (!init_done)
+               return;
 
-       result = sensors;
+       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) {
-               log_err(_("lmsensor: initialization failure: %s."),
-                       sensors_strerror(err));
-               init_done = 0;
-       } else {
-               init_done = 1;
-       }
 }
 
-void lmsensor_cleanup()
+void lmsensor_cleanup(void)
 {
        if (init_done)
                sensors_cleanup();