Merge pull request #1743 from rubenk/apcups-coverity
[collectd.git] / src / sensors.c
index 37d335c..63a1c8e 100644 (file)
@@ -17,8 +17,8 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  *
  * Authors:
- *   Florian octo Forster <octo at verplant.org>
- *   
+ *   Florian octo Forster <octo at collectd.org>
+ *
  *   Lubos Stanek <lubek at users.sourceforge.net> Wed Oct 27, 2006
  *   - config ExtendedSensorNaming option
  *   - precise sensor feature selection (chip-bus-address/type-feature)
@@ -62,7 +62,9 @@ static char *sensor_type_name_map[] =
        "fanspeed",
 # define SENSOR_TYPE_TEMPERATURE 2
        "temperature",
-# define SENSOR_TYPE_UNKNOWN     3
+# define SENSOR_TYPE_POWER       3
+       "power",
+# define SENSOR_TYPE_UNKNOWN     4
        NULL
 };
 
@@ -74,7 +76,7 @@ struct sensors_labeltypes_s
 typedef struct sensors_labeltypes_s sensors_labeltypes_t;
 
 /* finite list of known labels extracted from lm_sensors */
-static sensors_labeltypes_t known_features[] = 
+static sensors_labeltypes_t known_features[] =
 {
        { "fan1", SENSOR_TYPE_FANSPEED },
        { "fan2", SENSOR_TYPE_FANSPEED },
@@ -127,7 +129,8 @@ static sensors_labeltypes_t known_features[] =
        { "3.3V", SENSOR_TYPE_VOLTAGE },
        { "2.5V", SENSOR_TYPE_VOLTAGE },
        { "2.0V", SENSOR_TYPE_VOLTAGE },
-       { "12V", SENSOR_TYPE_VOLTAGE }
+       { "12V", SENSOR_TYPE_VOLTAGE },
+       { "power1", SENSOR_TYPE_POWER }
 };
 static int known_features_num = STATIC_ARRAY_SIZE (known_features);
 /* end new naming */
@@ -137,7 +140,8 @@ static const char *config_keys[] =
 {
        "Sensor",
        "IgnoreSelected",
-       "SensorConfigFile"
+       "SensorConfigFile",
+       "UseLabels"
 };
 static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
@@ -166,6 +170,7 @@ typedef struct featurelist
 } featurelist_t;
 
 static char *conffile = NULL;
+static _Bool use_labels = 0;
 /* #endif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
 
 #else /* if SENSORS_API_VERSION >= 0x500 */
@@ -173,7 +178,7 @@ static char *conffile = NULL;
        "as bug."
 #endif
 
-featurelist_t *first_feature = NULL;
+static featurelist_t *first_feature = NULL;
 static ignorelist_t *sensor_list;
 
 #if SENSORS_API_VERSION < 0x400
@@ -254,6 +259,12 @@ static int sensors_config (const char *key, const char *value)
                if (IS_TRUE (value))
                        ignorelist_set_invert (sensor_list, 0);
        }
+#if (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
+       else if (strcasecmp (key, "UseLabels") == 0)
+       {
+               use_labels = IS_TRUE (value) ? 1 : 0;
+       }
+#endif
        else
        {
                return (-1);
@@ -286,7 +297,7 @@ static int sensors_load_conf (void)
 
        FILE *fh = NULL;
        featurelist_t *last_feature = NULL;
-       
+
        const sensors_chip_name *chip;
        int chip_num;
 
@@ -375,13 +386,12 @@ static int sensors_load_conf (void)
                                continue;
                        }
 
-                       fl = (featurelist_t *) malloc (sizeof (featurelist_t));
+                       fl = calloc (1, sizeof (*fl));
                        if (fl == NULL)
                        {
-                               ERROR ("sensors plugin: malloc failed.");
+                               ERROR ("sensors plugin: calloc failed.");
                                continue;
                        }
-                       memset (fl, '\0', sizeof (featurelist_t));
 
                        fl->chip = chip;
                        fl->data = feature;
@@ -411,7 +421,8 @@ static int sensors_load_conf (void)
                        /* Only handle voltage, fanspeeds and temperatures */
                        if ((feature->type != SENSORS_FEATURE_IN)
                                        && (feature->type != SENSORS_FEATURE_FAN)
-                                       && (feature->type != SENSORS_FEATURE_TEMP))
+                                       && (feature->type != SENSORS_FEATURE_TEMP)
+                                       && (feature->type != SENSORS_FEATURE_POWER))
                        {
                                DEBUG ("sensors plugin: sensors_load_conf: "
                                                "Ignoring feature `%s', "
@@ -427,16 +438,16 @@ static int sensors_load_conf (void)
 
                                if ((subfeature->type != SENSORS_SUBFEATURE_IN_INPUT)
                                                && (subfeature->type != SENSORS_SUBFEATURE_FAN_INPUT)
-                                               && (subfeature->type != SENSORS_SUBFEATURE_TEMP_INPUT))
+                                               && (subfeature->type != SENSORS_SUBFEATURE_TEMP_INPUT)
+                                               && (subfeature->type != SENSORS_SUBFEATURE_POWER_INPUT))
                                        continue;
 
-                               fl = (featurelist_t *) malloc (sizeof (featurelist_t));
+                               fl = calloc (1, sizeof (*fl));
                                if (fl == NULL)
                                {
-                                       ERROR ("sensors plugin: malloc failed.");
+                                       ERROR ("sensors plugin: calloc failed.");
                                        continue;
                                }
-                               memset (fl, '\0', sizeof (featurelist_t));
 
                                fl->chip = chip;
                                fl->feature = feature;
@@ -550,6 +561,7 @@ static int sensors_read (void)
                int status;
                char plugin_instance[DATA_MAX_NAME_LEN];
                char type_instance[DATA_MAX_NAME_LEN];
+               char *sensor_label;
                const char *type;
 
                status = sensors_get_value (fl->chip,
@@ -562,8 +574,17 @@ static int sensors_read (void)
                if (status < 0)
                        continue;
 
-               sstrncpy (type_instance, fl->feature->name,
-                               sizeof (type_instance));
+               if (use_labels)
+               {
+                       sensor_label = sensors_get_label (fl->chip, fl->feature);
+                       sstrncpy (type_instance, sensor_label, sizeof (type_instance));
+                       free (sensor_label);
+               }
+               else
+               {
+                       sstrncpy (type_instance, fl->feature->name,
+                                       sizeof (type_instance));
+               }
 
                if (fl->feature->type == SENSORS_FEATURE_IN)
                        type = "voltage";
@@ -573,6 +594,9 @@ static int sensors_read (void)
                else if (fl->feature->type
                                == SENSORS_FEATURE_TEMP)
                        type = "temperature";
+               else if (fl->feature->type
+                               == SENSORS_FEATURE_POWER)
+                       type = "power";
                else
                        continue;