src/Makefile: Don't unnecessarily set plugin specific CXXFLAGS.
[collectd.git] / src / sensors.c
index 8391346..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)
  *   - honor sensors.conf's ignored
  *   - config Sensor option
  *   - config IgnoreSelected option
+ *
+ *   Henrique de Moraes Holschuh <hmh at debian.org>
+ *   - use default libsensors config file on API 0x400
+ *   - config SensorConfigFile option
  **/
 
 #include "collectd.h"
@@ -58,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
 };
 
@@ -70,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 },
@@ -123,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 */
@@ -132,7 +139,9 @@ static int known_features_num = STATIC_ARRAY_SIZE (known_features);
 static const char *config_keys[] =
 {
        "Sensor",
-       "IgnoreSelected"
+       "IgnoreSelected",
+       "SensorConfigFile",
+       "UseLabels"
 };
 static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
@@ -148,6 +157,7 @@ typedef struct featurelist
 # ifndef SENSORS_CONF_PATH
 #  define SENSORS_CONF_PATH "/etc/sensors.conf"
 # endif
+static char *conffile = SENSORS_CONF_PATH;
 /* #endif SENSORS_API_VERSION < 0x400 */
 
 #elif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500)
@@ -159,9 +169,8 @@ typedef struct featurelist
        struct featurelist         *next;
 } featurelist_t;
 
-# ifndef SENSORS_CONF_PATH
-#  define SENSORS_CONF_PATH "/etc/sensors3.conf"
-# endif
+static char *conffile = NULL;
+static _Bool use_labels = 0;
 /* #endif (SENSORS_API_VERSION >= 0x400) && (SENSORS_API_VERSION < 0x500) */
 
 #else /* if SENSORS_API_VERSION >= 0x500 */
@@ -169,10 +178,8 @@ typedef struct featurelist
        "as bug."
 #endif
 
-static const char *conffile = SENSORS_CONF_PATH;
-featurelist_t *first_feature = NULL;
+static featurelist_t *first_feature = NULL;
 static ignorelist_t *sensor_list;
-static time_t sensors_config_mtime = 0;
 
 #if SENSORS_API_VERSION < 0x400
 /* full chip name logic borrowed from lm_sensors */
@@ -225,7 +232,19 @@ static int sensors_config (const char *key, const char *value)
        if (sensor_list == NULL)
                sensor_list = ignorelist_create (1);
 
-       if (strcasecmp (key, "Sensor") == 0)
+       /* TODO: This setting exists for compatibility with old versions of
+        * lm-sensors. Remove support for those ancient versions in the next
+        * major release. */
+       if (strcasecmp (key, "SensorConfigFile") == 0)
+       {
+               char *tmp = strdup (value);
+               if (tmp != NULL)
+               {
+                       sfree (conffile);
+                       conffile = tmp;
+               }
+       }
+       else if (strcasecmp (key, "Sensor") == 0)
        {
                if (ignorelist_add (sensor_list, value))
                {
@@ -240,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);
@@ -248,7 +273,7 @@ static int sensors_config (const char *key, const char *value)
        return (0);
 }
 
-void sensors_free_features (void)
+static void sensors_free_features (void)
 {
        featurelist_t *thisft;
        featurelist_t *nextft;
@@ -268,47 +293,37 @@ void sensors_free_features (void)
 
 static int sensors_load_conf (void)
 {
-       FILE *fh;
+       static int call_once = 0;
+
+       FILE *fh = NULL;
        featurelist_t *last_feature = NULL;
-       
+
        const sensors_chip_name *chip;
        int chip_num;
 
-       struct stat statbuf;
        int status;
-       
-       status = stat (conffile, &statbuf);
-       if (status != 0)
-       {
-               char errbuf[1024];
-               ERROR ("sensors plugin: stat (%s) failed: %s", conffile,
-                               sstrerror (errno, errbuf, sizeof (errbuf)));
-               sensors_config_mtime = 0;
-       }
 
-       if ((sensors_config_mtime != 0)
-                       && (sensors_config_mtime == statbuf.st_mtime))
-               return (0);
+       if (call_once)
+               return 0;
 
-       if (sensors_config_mtime != 0)
-       {
-               NOTICE ("sensors plugin: Reloading config from %s",
-                               conffile);
-               sensors_free_features ();
-               sensors_config_mtime = 0;
-       }
+       call_once = 1;
 
-       fh = fopen (conffile, "r");
-       if (fh == NULL)
+       if (conffile != NULL)
        {
-               char errbuf[1024];
-               ERROR ("sensors plugin: fopen(%s) failed: %s", conffile,
-                               sstrerror (errno, errbuf, sizeof (errbuf)));
-               return (-1);
+               fh = fopen (conffile, "r");
+               if (fh == NULL)
+               {
+                       char errbuf[1024];
+                       ERROR ("sensors plugin: fopen(%s) failed: %s", conffile,
+                                       sstrerror (errno, errbuf, sizeof (errbuf)));
+                       return (-1);
+               }
        }
 
        status = sensors_init (fh);
-       fclose (fh);
+       if (fh)
+               fclose (fh);
+
        if (status != 0)
        {
                ERROR ("sensors plugin: Cannot initialize sensors. "
@@ -316,8 +331,6 @@ static int sensors_load_conf (void)
                return (-1);
        }
 
-       sensors_config_mtime = statbuf.st_mtime;
-
 #if SENSORS_API_VERSION < 0x400
        chip_num = 0;
        while ((chip = sensors_get_detected_chips (&chip_num)) != NULL)
@@ -373,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;
@@ -409,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', "
@@ -425,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;
@@ -548,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,
@@ -560,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";
@@ -571,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;