blob: e15b0bbee37a0a57a4a9b6446246ae0af764c731 [file] [log] [blame]
--- src/cpufreqd_sensors.c.orig 2009-03-21 12:17:15.000000000 +0100
+++ src/cpufreqd_sensors.c 2009-08-14 14:39:52.894513594 +0200
@@ -23,10 +23,22 @@
#include <string.h>
#include "cpufreqd_plugin.h"
+#if !defined __GNUC__ || __GNUC__ < 3
+#define __attribute__(x)
+#endif
+
+#if SENSORS_API_VERSION < 0x400
+typedef sensors_feature_data sensors_feature;
+#endif
+
/* to hold monitored feature list and avoid reading all sensors */
struct sensors_monitor {
const sensors_chip_name *chip;
- const sensors_feature_data *feat;
+ char chip_string[MAX_STRING_LEN];
+ const sensors_feature *feat;
+#if SENSORS_API_VERSION >= 0x400
+ const sensors_subfeature *sub_feat;
+#endif
double value;
struct sensors_monitor *next;
};
@@ -133,27 +145,74 @@
struct sensors_monitor *list = monitor_list;
while (list) {
- sensors_get_feature(*(list->chip), list->feat->number, &list->value);
- clog(LOG_INFO, "%s: %.3f\n", list->feat->name, list->value);
+#if SENSORS_API_VERSION >= 0x400
+ if(sensors_get_value(list->chip, list->sub_feat->number, &list->value) < 0) {
+#else
+ if(sensors_get_feature(*(list->chip), list->feat->number, &list->value) < 0) {
+#endif
+ clog(LOG_ERR,"could not read value for %s\n",list->feat->name);
+ return -1;
+ }
+ clog(LOG_INFO, "%s:%s: %.3f\n", list->chip_string, list->feat->name, list->value);
list = list->next;
}
return 0;
}
+
+#if SENSORS_API_VERSION < 0x400
+/* Adapted from lm-sensors 2.10.8 prog/sensors/main.c */
+static int sensors_snprintf_chip_name(char *str, size_t size,
+ const sensors_chip_name *chip)
+{
+ switch(chip->bus) {
+ case SENSORS_CHIP_NAME_BUS_ISA:
+ return snprintf(str,size,"%s-isa-%04x",chip->prefix,chip->addr);
+ case SENSORS_CHIP_NAME_BUS_PCI:
+ return snprintf(str,size,"%s-pci-%04x",chip->prefix,chip->addr);
+ case SENSORS_CHIP_NAME_BUS_DUMMY:
+ return snprintf(str,size,"%s-%s-%04x",chip->prefix,chip->busname,chip->addr);
+ default:
+ return snprintf(str,size,"%s-i2c-%d-%02x",chip->prefix,chip->bus,chip->addr);
+ }
+}
+#endif
+
+__attribute__((unused)) static const char* sensors_get_chip_name(const sensors_chip_name *chip);
+static const char* sensors_get_chip_name(const sensors_chip_name *chip) {
+ static char name[MAX_STRING_LEN];
+ sensors_snprintf_chip_name(name, MAX_STRING_LEN, chip);
+ return name;
+}
+
/* this function can be pretty expensive (CPU time)?? */
static struct sensors_monitor * validate_feature_name(const char *name) {
/* get all sensors from first chip */
const sensors_chip_name *chip;
- const sensors_feature_data *feat;
- int nr = 0, nr1 = 0, nr2 = 0;
+ const sensors_feature *feat;
+ int nr = 0;
+#if SENSORS_API_VERSION >= 0x400
+ const sensors_subfeature *sub_feat;
+#else
+ int nr1 = 0, nr2 = 0;
+#endif
struct sensors_monitor *list = monitor_list;
struct sensors_monitor *ret = NULL;
/* scan the full thing */
+#if SENSORS_API_VERSION >= 0x400
+ while ( (chip = sensors_get_detected_chips(NULL, &nr)) != NULL) {
+ while ((feat = sensors_get_features(chip, &nr)) != NULL) {
+ /* sensor input? */
+ if((sub_feat = sensors_get_subfeature(chip, feat, feat->type << 8)) == NULL) {
+ clog(LOG_DEBUG, "Input subfeature not found for %s, skipping\n", feat->name);
+ continue;
+ }
+#else
while ( (chip = sensors_get_detected_chips(&nr)) != NULL) {
- nr1 = nr2 = 0;
+ nr1 = nr2 = 0;
char *label = NULL;
clog(LOG_DEBUG, "Examining chip %s(%d)\n", chip->prefix, nr);
while ((feat = sensors_get_all_features(*chip, &nr1, &nr2)) != NULL) {
@@ -164,22 +223,33 @@
if (sensors_get_label(*chip, feat->number, &label) != 0)
clog(LOG_DEBUG, "Couldn't get label for %s (%s)\n",
feat->name, strerror(errno));
+ }
+#endif
/* is it the one we are looking for? */
- if (strncmp(feat->name, name, MAX_STRING_LEN) != 0 &&
- (label && strncmp(label, name, MAX_STRING_LEN) != 0)) {
- free(label);
+ if (strncmp(feat->name, name, MAX_STRING_LEN) != 0) {
+ continue;
+
+/* libsensors4 does this in sensors_get_features() */
+#if SENSORS_API_VERSION < 0x400
+ /* not ignored? */
+ } else if(sensors_get_ignored(*chip, feat->number) == 0) {
+ clog(LOG_INFO, "feature %s on chip %s set to ignore in %s, skipping\n",
+ feat->name, sensors_get_chip_name(chip), sensors_conffile);
continue;
+#endif
/* cache it */
} else if ((ret = calloc(1, sizeof(struct sensors_monitor))) != NULL) {
- clog(LOG_DEBUG, "Creating new sensors_monitor for %s (%s)\n",
- label, feat->name);
+ sensors_snprintf_chip_name(ret->chip_string, MAX_STRING_LEN, chip);
+ clog(LOG_DEBUG, "Creating new sensors_monitor for %s on chip %s\n",
+ name, ret->chip_string);
ret->chip = chip;
ret->feat = feat;
+#if SENSORS_API_VERSION >= 0x400
+ ret->sub_feat = sub_feat;
+#endif
ret->next = NULL;
- /* free the label here, we are not using it anymore */
- free(label);
/* append monitor to the cache list */
list = monitor_list;
if (list != NULL) {
@@ -214,7 +284,7 @@
clog(LOG_DEBUG, "called with %s\n", ev);
/* try to parse the %[a-zA-Z0-9]:%d-%d format first */
- if (sscanf(ev, "%32[^:]:%lf-%lf", ret->name, &ret->min, &ret->max) == 3) {
+ if (sscanf(ev, "%32[a-zA-Z0-9]:%lf-%lf", ret->name, &ret->min, &ret->max) == 3) {
/* validate feature name */
if ((ret->monitor = validate_feature_name(ret->name)) != NULL) {
clog(LOG_INFO, "parsed %s %.3f-%.3f\n", ret->name, ret->min, ret->max);