From 063f4b91d4b13bc44027e92c654bf58f135777f1 Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Thu, 28 Jun 2007 12:09:00 +0000 Subject: [PATCH] Use complete chip names (prefix + bus + address) as the keys of sensors_chip_features_list[]. Using only the prefix (as was done before) makes it impossible to properly support multiple chips with the same prefix but a different feature set. git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@4508 7894878c-1315-0410-8ee3-d5d059ff63e0 --- lib/access.c | 34 +++++++++++++++++----------------- lib/access.h | 4 ++-- lib/data.c | 4 ++-- lib/data.h | 2 +- lib/proc.c | 4 ++-- lib/sysfs.c | 17 ++++++----------- 6 files changed, 30 insertions(+), 35 deletions(-) diff --git a/lib/access.c b/lib/access.c index 6d4b67ab..17ee7768 100644 --- a/lib/access.c +++ b/lib/access.c @@ -99,14 +99,14 @@ sensors_chip *sensors_for_all_config_chips(sensors_chip_name chip_name, /* Look up a resource in the intern chip list, and return a pointer to it. Do not modify the struct the return value points to! Returns NULL if not found.*/ -const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix, +const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *chip, int feature) { int i, j; const sensors_chip_feature *features; - for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcasecmp(sensors_chip_features_list[i].prefix, prefix)) { + for (i = 0; sensors_chip_features_list[i].chip.prefix; i++) + if (sensors_match_chip(sensors_chip_features_list[i].chip, *chip)) { features = sensors_chip_features_list[i].feature; for (j = 0; features[j].data.name; j++) if (features[j].data.number == feature) @@ -118,14 +118,14 @@ const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix, /* Look up a resource in the intern chip list, and return a pointer to it. Do not modify the struct the return value points to! Returns NULL if not found.*/ -const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix, +const sensors_chip_feature *sensors_lookup_feature_name(const sensors_chip_name *chip, const char *feature) { int i, j; const sensors_chip_feature *features; - for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcasecmp(sensors_chip_features_list[i].prefix, prefix)) { + for (i = 0; sensors_chip_features_list[i].chip.prefix; i++) + if (sensors_match_chip(sensors_chip_features_list[i].chip, *chip)) { features = sensors_chip_features_list[i].feature; for (j = 0; features[j].data.name; j++) if (!strcasecmp(features[j].data.name, feature)) @@ -161,7 +161,7 @@ int sensors_get_label(sensors_chip_name name, int feature, char **result) *result = NULL; if (sensors_chip_name_has_wildcards(name)) return -SENSORS_ERR_WILDCARDS; - if (!(featureptr = sensors_lookup_feature_nr(name.prefix, feature))) + if (!(featureptr = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) @@ -193,12 +193,12 @@ int sensors_get_ignored(sensors_chip_name name, int feature) res = 1; if (sensors_chip_name_has_wildcards(name)) return -SENSORS_ERR_WILDCARDS; - if (!(featureptr = sensors_lookup_feature_nr(name.prefix, feature))) + if (!(featureptr = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; if (featureptr->data.mapping == SENSORS_NO_MAPPING) alt_featureptr = NULL; else if (!(alt_featureptr = - sensors_lookup_feature_nr(name.prefix, + sensors_lookup_feature_nr(&name, featureptr->data.mapping))) return -SENSORS_ERR_NO_ENTRY; for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) @@ -227,11 +227,11 @@ int sensors_get_feature(sensors_chip_name name, int feature, double *result) if (sensors_chip_name_has_wildcards(name)) return -SENSORS_ERR_WILDCARDS; - if (!(main_feature = sensors_lookup_feature_nr(name.prefix, feature))) + if (!(main_feature = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; if (main_feature->data.compute_mapping == SENSORS_NO_MAPPING) alt_feature = NULL; - else if (!(alt_feature = sensors_lookup_feature_nr(name.prefix, + else if (!(alt_feature = sensors_lookup_feature_nr(&name, main_feature->data.compute_mapping))) return -SENSORS_ERR_NO_ENTRY; if (!(main_feature->data.mode & SENSORS_MODE_R)) @@ -271,11 +271,11 @@ int sensors_set_feature(sensors_chip_name name, int feature, double value) if (sensors_chip_name_has_wildcards(name)) return -SENSORS_ERR_WILDCARDS; - if (!(main_feature = sensors_lookup_feature_nr(name.prefix, feature))) + if (!(main_feature = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; if (main_feature->data.compute_mapping == SENSORS_NO_MAPPING) alt_feature = NULL; - else if (!(alt_feature = sensors_lookup_feature_nr(name.prefix, + else if (!(alt_feature = sensors_lookup_feature_nr(&name, main_feature->data.compute_mapping))) return -SENSORS_ERR_NO_ENTRY; if (!(main_feature->data.mode & SENSORS_MODE_W)) @@ -332,8 +332,8 @@ const sensors_feature_data *sensors_get_all_features(sensors_chip_name name, sensors_chip_feature *feature_list; int i; - for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcasecmp(sensors_chip_features_list[i].prefix, name.prefix)) { + for (i = 0; sensors_chip_features_list[i].chip.prefix; i++) + if (sensors_match_chip(sensors_chip_features_list[i].chip, name)) { feature_list = sensors_chip_features_list[i].feature; if (!*nr1 && !*nr2) { /* Return the first entry */ if (!feature_list[0].data.name) /* The list may be empty */ @@ -373,7 +373,7 @@ int sensors_eval_expr(sensors_chip_name chipname, const sensors_expr * expr, return 0; } if (expr->kind == sensors_kind_var) { - if (!(feature = sensors_lookup_feature_name(chipname.prefix, + if (!(feature = sensors_lookup_feature_name(&chipname, expr->data.var))) return SENSORS_ERR_NO_ENTRY; if (!(res = sensors_get_feature(chipname, feature->data.number, result))) @@ -432,7 +432,7 @@ int sensors_do_this_chip_sets(sensors_chip_name name) for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) for (i = 0; i < chip->sets_count; i++) { - feature = sensors_lookup_feature_name(name.prefix, + feature = sensors_lookup_feature_name(&name, chip->sets[i].name); if (!feature) { sensors_parse_error("Unknown feature name", diff --git a/lib/access.h b/lib/access.h index 3c92f636..0ed55e17 100644 --- a/lib/access.h +++ b/lib/access.h @@ -36,14 +36,14 @@ extern sensors_chip *sensors_for_all_config_chips(sensors_chip_name chip_name, /* Look up a resource in the intern chip list, and return a pointer to it. Do not modify the struct the return value points to! Returns NULL if not found. */ -extern const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix, +extern const sensors_chip_feature *sensors_lookup_feature_nr(const sensors_chip_name *chip, int feature); /* Look up a resource in the intern chip list, and return a pointer to it. Do not modify the struct the return value points to! Returns NULL if not found.*/ extern const sensors_chip_feature *sensors_lookup_feature_name - (const char *prefix, const char *feature); + (const sensors_chip_name *chip, const char *feature); /* Substitute configuration bus numbers with real-world /proc bus numbers in the chips lists */ diff --git a/lib/data.c b/lib/data.c index d4e0396b..b618f994 100644 --- a/lib/data.c +++ b/lib/data.c @@ -44,11 +44,11 @@ sensors_bus *sensors_proc_bus = NULL; int sensors_proc_bus_count = 0; int sensors_proc_bus_max = 0; -#define PLACEHOLDER_ELEMENTS {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0}, {0} +#define PLACEHOLDER_ELEMENTS {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}}, {{0}} sensors_chip_features sensors_chip_features_list[] = { PLACEHOLDER_ELEMENTS, - { 0 } + { { 0 } } }; static int sensors_substitute_chip(sensors_chip_name *name,int lineno); diff --git a/lib/data.h b/lib/data.h index 2fd0519a..b6ad36fe 100644 --- a/lib/data.h +++ b/lib/data.h @@ -147,7 +147,7 @@ typedef struct sensors_chip_feature { /* Internal data about all features of a type of chip */ typedef struct sensors_chip_features { - const char *prefix; + struct sensors_chip_name chip; struct sensors_chip_feature *feature; } sensors_chip_features; diff --git a/lib/proc.c b/lib/proc.c index 74a09483..08c52aee 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -39,7 +39,7 @@ int sensors_read_proc(sensors_chip_name name, int feature, double *value) char n[NAME_MAX], altn[NAME_MAX]; FILE *f; - if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature))) + if (!(the_feature = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; strcpy(n, name.busname); @@ -68,7 +68,7 @@ int sensors_write_proc(sensors_chip_name name, int feature, double value) char n[NAME_MAX], altn[NAME_MAX]; FILE *f; - if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature))) + if (!(the_feature = sensors_lookup_feature_nr(&name, feature))) return -SENSORS_ERR_NO_ENTRY; strcpy(n, name.busname); diff --git a/lib/sysfs.c b/lib/sysfs.c index f1fdbea5..e4d8fb67 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -67,7 +67,7 @@ sensors_chip_features sensors_read_dynamic_chip(struct sysfs_device *sysdir) int i, type, fnum = 1; struct sysfs_attribute *attr; struct dlist *attrs; - sensors_chip_features ret = {0, 0}; + sensors_chip_features ret = {{0}, 0}; /* room for all 3 (in, fan, temp) types, with all their subfeatures + misc features. We use a large sparse table at first to store all found features, so that we can store them sorted at type and index @@ -90,7 +90,7 @@ sensors_chip_features sensors_read_dynamic_chip(struct sysfs_device *sysdir) name = attr->name; if (!strcmp(name, "name")) { - ret.prefix = strndup(attr->value, strlen(attr->value) - 1); + ret.chip.prefix = strndup(attr->value, strlen(attr->value) - 1); continue; } @@ -269,18 +269,13 @@ static int sensors_read_one_sysfs_chip(struct sysfs_device *dev) } else return -SENSORS_ERR_PARSE; - /* check whether this chip is known in the static list */ - for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcasecmp(sensors_chip_features_list[i].prefix, name.prefix)) - break; - - /* if no chip definition matches */ - if (!sensors_chip_features_list[i].prefix && - total_dynamic < N_PLACEHOLDER_ELEMENTS) { + if (total_dynamic < N_PLACEHOLDER_ELEMENTS) { sensors_chip_features n_entry = sensors_read_dynamic_chip(dev); + n_entry.chip.addr = name.addr; + n_entry.chip.bus = name.bus; /* skip to end of list */ - for(i = 0; sensors_chip_features_list[i].prefix; i++); + for(i = 0; sensors_chip_features_list[i].chip.prefix; i++); sensors_chip_features_list[i] = n_entry;