--- src/cpufreqd_sensors.c.orig 2009-03-21 07:17:15.000000000 -0400 +++ src/cpufreqd_sensors.c 2010-01-10 00:28:50.000000000 -0500 @@ -23,10 +23,22 @@ #include #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,73 @@ 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 nr1 = 0, nr2; +#if SENSORS_API_VERSION >= 0x400 + const sensors_subfeature *sub_feat; +#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, &nr1)) != NULL) { + nr2 = 0; + while ((feat = sensors_get_features(chip, &nr2)) != 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 +222,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 +283,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);