Merge tag 'upstream/1.2.0'
[psensor-pkg-debian.git] / src / lib / lmsensor.c
index baa97ef..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)
 {
@@ -58,10 +87,10 @@ static double get_temp_input(struct psensor *sensor)
 
        const sensors_feature *feature;
 
-       chip = sensor->iname;
-       feature = sensor->feature;
+       chip = get_chip_name(sensor);
+       feature = get_feature(sensor);
 
-       sf = sensors_get_subfeature(sensor->iname,
+       sf = sensors_get_subfeature(chip,
                                    feature,
                                    SENSORS_SUBFEATURE_TEMP_INPUT);
        if (sf)
@@ -72,11 +101,14 @@ static double get_temp_input(struct psensor *sensor)
 
 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);
@@ -92,7 +124,7 @@ void lmsensor_psensor_list_update(struct psensor **sensors)
        struct psensor *s;
        double v;
 
-       if (!init_done)
+       if (!init_done || !sensors)
                return;
 
        while (*sensors) {
@@ -124,15 +156,20 @@ 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(_("%s: Wrong feature type."), PROVIDER_NAME);
                return NULL;
@@ -179,8 +216,15 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
 
        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)) {
@@ -191,7 +235,7 @@ lmsensor_psensor_create(const sensors_chip_name *chip,
        return psensor;
 }
 
-void lmsensor_init()
+static void lmsensor_init(void)
 {
        int err;
 
@@ -237,7 +281,7 @@ void lmsensor_psensor_list_append(struct psensor ***sensors, int vn)
        }
 }
 
-void lmsensor_cleanup()
+void lmsensor_cleanup(void)
 {
        if (init_done)
                sensors_cleanup();