From 27e98770126d5fec6d2320aa14a3f275b5d206d1 Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Sun, 16 Nov 2003 17:57:29 +0000 Subject: [PATCH] Add preliminary sysfs support. Two entries added to struct sensors_chip_feature. chips.c support added only for w83781d as an example. Advance library version to 3.0.0. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2059 7894878c-1315-0410-8ee3-d5d059ff63e0 --- lib/Module.mk | 4 +- lib/access.c | 42 ++++++++---- lib/chips.c | 80 +++++++++++------------ lib/data.h | 2 + lib/proc.c | 176 ++++++++++++++++++++++++++++++++++++++++---------- 5 files changed, 215 insertions(+), 89 deletions(-) diff --git a/lib/Module.mk b/lib/Module.mk index 215ebe98..f96ec077 100644 --- a/lib/Module.mk +++ b/lib/Module.mk @@ -28,8 +28,8 @@ LIBMAN5DIR := $(MANDIR)/man5 LIBMAN5FILES := $(MODULE_DIR)/sensors.conf.5 # The main and minor version of the library -LIBMAINVER := 2 -LIBMINORVER := 0.2 +LIBMAINVER := 3 +LIBMINORVER := 0.0 LIBVER := $(LIBMAINVER).$(LIBMINORVER) # The static lib name, the shared lib name, and the internal ('so') name of diff --git a/lib/access.c b/lib/access.c index 34043482..112f8f62 100644 --- a/lib/access.c +++ b/lib/access.c @@ -35,7 +35,7 @@ int sensors_match_chip(sensors_chip_name chip1, sensors_chip_name chip2) { if ((chip1.prefix != SENSORS_CHIP_NAME_PREFIX_ANY) && (chip2.prefix != SENSORS_CHIP_NAME_PREFIX_ANY) && - strcmp(chip1.prefix,chip2.prefix)) + strcasecmp(chip1.prefix,chip2.prefix)) return 0; if ((chip1.bus != SENSORS_CHIP_NAME_BUS_ANY) && (chip2.bus != SENSORS_CHIP_NAME_BUS_ANY) && @@ -87,7 +87,7 @@ const sensors_chip_feature *sensors_lookup_feature_nr(const char *prefix, int i,j; const sensors_chip_feature *features; for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcmp(sensors_chip_features_list[i].prefix,prefix)) { + if (!strcasecmp(sensors_chip_features_list[i].prefix,prefix)) { features = sensors_chip_features_list[i].feature; for (j=0; features[j].name; j++) if (features[j].number == feature) @@ -105,10 +105,10 @@ const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix, int i,j; const sensors_chip_feature *features; for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcmp(sensors_chip_features_list[i].prefix,prefix)) { + if (!strcasecmp(sensors_chip_features_list[i].prefix,prefix)) { features = sensors_chip_features_list[i].feature; for (j=0; features[j].name; j++) - if (!strcmp(features[j].name,feature)) + if (!strcasecmp(features[j].name,feature)) return features + j; } return NULL; @@ -120,6 +120,14 @@ const sensors_chip_feature *sensors_lookup_feature_name(const char *prefix, if there are wildcards. */ int sensors_chip_name_has_wildcards(sensors_chip_name chip) { + extern int foundsysfs; + + if(foundsysfs) { + if (chip.prefix == SENSORS_CHIP_NAME_PREFIX_ANY) + return 1; + else + return 0; + } if ((chip.prefix == SENSORS_CHIP_NAME_PREFIX_ANY) || (chip.bus == SENSORS_CHIP_NAME_BUS_ANY) || (chip.bus == SENSORS_CHIP_NAME_BUS_ANY_I2C) || @@ -154,14 +162,14 @@ int sensors_get_label(sensors_chip_name name, int feature, char **result) return -SENSORS_ERR_NO_ENTRY; for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));) for (i = 0; i < chip->labels_count; i++) - if (!strcmp(featureptr->name, chip->labels[i].name)) { + if (!strcasecmp(featureptr->name, chip->labels[i].name)) { if (*result) free(*result); if (! (*result = strdup(chip->labels[i].value))) sensors_fatal_error("sensors_get_label","Allocating label text"); return 0; /* Exact match always overrules! */ } else if (alt_featureptr && - !strcmp(alt_featureptr->name, chip->labels[i].name)) { + !strcasecmp(alt_featureptr->name, chip->labels[i].name)) { if (*result) free(*result); if (! (*result = strdup(chip->labels[i].value))) @@ -192,10 +200,10 @@ int sensors_get_ignored(sensors_chip_name name, int feature) return -SENSORS_ERR_NO_ENTRY; for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));) for (i = 0; i < chip->ignores_count; i++) - if (!strcmp(featureptr->name, chip->ignores[i].name)) + if (!strcasecmp(featureptr->name, chip->ignores[i].name)) return 0; /* Exact match always overrules! */ else if (alt_featureptr && - !strcmp(alt_featureptr->name, chip->ignores[i].name)) + !strcasecmp(alt_featureptr->name, chip->ignores[i].name)) res = 0; return res; } @@ -227,11 +235,11 @@ int sensors_get_feature(sensors_chip_name name, int feature, double *result) return -SENSORS_ERR_ACCESS_R; for (chip = NULL; !expr && (chip = sensors_for_all_config_chips(name,chip));) for (i = 0; !final_expr && (i < chip->computes_count); i++) { - if (!strcmp(main_feature->name,chip->computes[i].name)) { + if (!strcasecmp(main_feature->name,chip->computes[i].name)) { expr = chip->computes[i].from_proc; final_expr = 1; } else if (alt_feature && - !strcmp(alt_feature->name,chip->computes[i].name)) + !strcasecmp(alt_feature->name,chip->computes[i].name)) expr = chip->computes[i].from_proc; } if (sensors_read_proc(name,feature,&val)) @@ -270,11 +278,11 @@ int sensors_set_feature(sensors_chip_name name, int feature, double value) return -SENSORS_ERR_ACCESS_W; for (chip = NULL; !expr && (chip = sensors_for_all_config_chips(name,chip));) for (i = 0; !final_expr && (i < chip->computes_count); i++) - if (!strcmp(main_feature->name,chip->computes[i].name)) { + if (!strcasecmp(main_feature->name,chip->computes[i].name)) { expr = chip->computes->to_proc; final_expr = 1; } else if (alt_feature && - !strcmp(alt_feature->name,chip->computes[i].name)) + !strcasecmp(alt_feature->name,chip->computes[i].name)) expr = chip->computes[i].to_proc; to_write = value; @@ -296,7 +304,11 @@ const sensors_chip_name *sensors_get_detected_chips (int *nr) const char *sensors_get_adapter_name(int bus_nr) { + extern int foundsysfs; int i; + + if(foundsysfs) + return "Unavailable from sysfs"; if (bus_nr == SENSORS_CHIP_NAME_BUS_ISA) return "ISA adapter"; if (bus_nr == SENSORS_CHIP_NAME_BUS_DUMMY) @@ -309,7 +321,11 @@ const char *sensors_get_adapter_name(int bus_nr) const char *sensors_get_algorithm_name(int bus_nr) { + extern int foundsysfs; int i; + + if(foundsysfs) + return "Unavailable from sysfs"; if (bus_nr == SENSORS_CHIP_NAME_BUS_ISA) return "ISA algorithm"; if (bus_nr == SENSORS_CHIP_NAME_BUS_DUMMY) @@ -328,7 +344,7 @@ const sensors_feature_data *sensors_get_all_features (sensors_chip_name name, int i; for (i = 0; sensors_chip_features_list[i].prefix; i++) - if (!strcmp(sensors_chip_features_list[i].prefix,name.prefix)) { + if (!strcasecmp(sensors_chip_features_list[i].prefix,name.prefix)) { feature_list=sensors_chip_features_list[i].feature; if (!*nr1 && !*nr2) { /* Return the first entry */ if (!feature_list[0].name) /* The list may be empty */ diff --git a/lib/chips.c b/lib/chips.c index d466f8f2..76f3a3fa 100644 --- a/lib/chips.c +++ b/lib/chips.c @@ -740,114 +740,114 @@ static sensors_chip_feature lm90_features[] = static sensors_chip_feature w83781d_features[] = { { SENSORS_W83781D_IN0, "in0", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN0, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN0, VALUE(3), 2, "in_input0", 3 }, { SENSORS_W83781D_IN1, "in1", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN1, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN1, VALUE(3), 2, "in_input1", 3 }, { SENSORS_W83781D_IN2, "in2", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN2, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN2, VALUE(3), 2, "in_input2", 3 }, { SENSORS_W83781D_IN3, "in3", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN3, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN3, VALUE(3), 2, "in_input3", 3 }, { SENSORS_W83781D_IN4, "in4", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN4, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN4, VALUE(3), 2, "in_input4", 3 }, { SENSORS_W83781D_IN5, "in5", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN5, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN5, VALUE(3), 2, "in_input5", 3 }, { SENSORS_W83781D_IN6, "in6", NOMAP, NOMAP, - R, W83781D_SYSCTL_IN6, VALUE(3), 2 }, + R, W83781D_SYSCTL_IN6, VALUE(3), 2, "in_input6", 3 }, { SENSORS_W83781D_IN0_MIN, "in0_min", SENSORS_W83781D_IN0, SENSORS_W83781D_IN0, RW, - W83781D_SYSCTL_IN0, VALUE(1), 2 }, + W83781D_SYSCTL_IN0, VALUE(1), 2, "in_min0", 3 }, { SENSORS_W83781D_IN1_MIN, "in1_min", SENSORS_W83781D_IN1, SENSORS_W83781D_IN1, RW, - W83781D_SYSCTL_IN1, VALUE(1), 2 }, + W83781D_SYSCTL_IN1, VALUE(1), 2, "in_min1", 3 }, { SENSORS_W83781D_IN2_MIN, "in2_min", SENSORS_W83781D_IN2, SENSORS_W83781D_IN2, RW, - W83781D_SYSCTL_IN2, VALUE(1), 2 }, + W83781D_SYSCTL_IN2, VALUE(1), 2, "in_min2", 3 }, { SENSORS_W83781D_IN3_MIN, "in3_min", SENSORS_W83781D_IN3, SENSORS_W83781D_IN3, RW, - W83781D_SYSCTL_IN3, VALUE(1), 2 }, + W83781D_SYSCTL_IN3, VALUE(1), 2, "in_min3", 3 }, { SENSORS_W83781D_IN4_MIN, "in4_min", SENSORS_W83781D_IN4, SENSORS_W83781D_IN4, RW, - W83781D_SYSCTL_IN4, VALUE(1), 2 }, + W83781D_SYSCTL_IN4, VALUE(1), 2, "in_min4", 3 }, /* swap 5 and 6 min/max because compute lines will be inverting */ { SENSORS_W83781D_IN5_MIN, "in5_min", SENSORS_W83781D_IN5, SENSORS_W83781D_IN5, RW, - W83781D_SYSCTL_IN5, VALUE(2), 2 }, + W83781D_SYSCTL_IN5, VALUE(2), 2, "in_min5", 3 }, { SENSORS_W83781D_IN6_MIN, "in6_min", SENSORS_W83781D_IN6, SENSORS_W83781D_IN6, RW, - W83781D_SYSCTL_IN6, VALUE(2), 2 }, + W83781D_SYSCTL_IN6, VALUE(2), 2, "in_min6", 3 }, { SENSORS_W83781D_IN0_MAX, "in0_max", SENSORS_W83781D_IN0, SENSORS_W83781D_IN0, RW, - W83781D_SYSCTL_IN0, VALUE(2), 2 }, + W83781D_SYSCTL_IN0, VALUE(2), 2, "in_max0", 3 }, { SENSORS_W83781D_IN1_MAX, "in1_max", SENSORS_W83781D_IN1, SENSORS_W83781D_IN1, RW, - W83781D_SYSCTL_IN1, VALUE(2), 2 }, + W83781D_SYSCTL_IN1, VALUE(2), 2, "in_max1", 3 }, { SENSORS_W83781D_IN2_MAX, "in2_max", SENSORS_W83781D_IN2, SENSORS_W83781D_IN2, RW, - W83781D_SYSCTL_IN2, VALUE(2), 2 }, + W83781D_SYSCTL_IN2, VALUE(2), 2, "in_max2", 3 }, { SENSORS_W83781D_IN3_MAX, "in3_max", SENSORS_W83781D_IN3, SENSORS_W83781D_IN3, RW, - W83781D_SYSCTL_IN3, VALUE(2), 2 }, + W83781D_SYSCTL_IN3, VALUE(2), 2, "in_max3", 3 }, { SENSORS_W83781D_IN4_MAX, "in4_max", SENSORS_W83781D_IN4, SENSORS_W83781D_IN4, RW, - W83781D_SYSCTL_IN4, VALUE(2), 2 }, + W83781D_SYSCTL_IN4, VALUE(2), 2, "in_max4", 3 }, { SENSORS_W83781D_IN5_MAX, "in5_max", SENSORS_W83781D_IN5, SENSORS_W83781D_IN5, RW, - W83781D_SYSCTL_IN5, VALUE(1), 2 }, + W83781D_SYSCTL_IN5, VALUE(1), 2, "in_max5", 3 }, { SENSORS_W83781D_IN6_MAX, "in6_max", SENSORS_W83781D_IN6, SENSORS_W83781D_IN6, RW, - W83781D_SYSCTL_IN6, VALUE(1), 2 }, + W83781D_SYSCTL_IN6, VALUE(1), 2, "in_max6", 3 }, { SENSORS_W83781D_FAN1, "fan1", NOMAP, NOMAP, - R, W83781D_SYSCTL_FAN1, VALUE(2), 0 }, + R, W83781D_SYSCTL_FAN1, VALUE(2), 0, "fan_input1" }, { SENSORS_W83781D_FAN2, "fan2", NOMAP, NOMAP, - R, W83781D_SYSCTL_FAN2, VALUE(2), 0 }, + R, W83781D_SYSCTL_FAN2, VALUE(2), 0, "fan_input2" }, { SENSORS_W83781D_FAN3, "fan3", NOMAP, NOMAP, - R, W83781D_SYSCTL_FAN3, VALUE(2), 0 }, + R, W83781D_SYSCTL_FAN3, VALUE(2), 0, "fan_input3" }, { SENSORS_W83781D_FAN1_MIN, "fan1_min", SENSORS_W83781D_FAN1, SENSORS_W83781D_FAN1, RW, - W83781D_SYSCTL_FAN1, VALUE(1), 0 }, + W83781D_SYSCTL_FAN1, VALUE(1), 0, "fan_min1" }, { SENSORS_W83781D_FAN2_MIN, "fan2_min", SENSORS_W83781D_FAN2, SENSORS_W83781D_FAN2, RW, - W83781D_SYSCTL_FAN2, VALUE(1), 0 }, + W83781D_SYSCTL_FAN2, VALUE(1), 0, "fan_min2" }, { SENSORS_W83781D_FAN3_MIN, "fan3_min", SENSORS_W83781D_FAN3, SENSORS_W83781D_FAN3, RW, - W83781D_SYSCTL_FAN3, VALUE(1), 0 }, + W83781D_SYSCTL_FAN3, VALUE(1), 0, "fan_min3" }, { SENSORS_W83781D_TEMP1, "temp1", NOMAP, NOMAP, - R, W83781D_SYSCTL_TEMP1, VALUE(3), 1 }, + R, W83781D_SYSCTL_TEMP1, VALUE(3), 1, "temp_input1", 2 }, { SENSORS_W83781D_TEMP1_HYST, "temp1_hyst", SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1, RW, - W83781D_SYSCTL_TEMP1, VALUE(2), 1 }, + W83781D_SYSCTL_TEMP1, VALUE(2), 1, "temp_min1", 2 }, { SENSORS_W83781D_TEMP1_OVER, "temp1_over", SENSORS_W83781D_TEMP1, SENSORS_W83781D_TEMP1, RW, - W83781D_SYSCTL_TEMP1, VALUE(1), 1 }, + W83781D_SYSCTL_TEMP1, VALUE(1), 1, "temp_max1", 2 }, { SENSORS_W83781D_TEMP2, "temp2", NOMAP, NOMAP, - R, W83781D_SYSCTL_TEMP2, VALUE(3), 1 }, + R, W83781D_SYSCTL_TEMP2, VALUE(3), 1, "temp_input2", 2 }, { SENSORS_W83781D_TEMP2_HYST, "temp2_hyst", SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2, RW, - W83781D_SYSCTL_TEMP2, VALUE(2), 1 }, + W83781D_SYSCTL_TEMP2, VALUE(2), 1, "temp_min2", 2 }, { SENSORS_W83781D_TEMP2_OVER, "temp2_over", SENSORS_W83781D_TEMP2, SENSORS_W83781D_TEMP2, RW, - W83781D_SYSCTL_TEMP2, VALUE(1), 1 }, + W83781D_SYSCTL_TEMP2, VALUE(1), 1, "temp_max2", 2 }, { SENSORS_W83781D_TEMP3, "temp3", NOMAP, NOMAP, - R, W83781D_SYSCTL_TEMP3, VALUE(3), 1 }, + R, W83781D_SYSCTL_TEMP3, VALUE(3), 1, "temp_input3", 2 }, { SENSORS_W83781D_TEMP3_HYST, "temp3_hyst", SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3, RW, - W83781D_SYSCTL_TEMP3, VALUE(2), 1 }, + W83781D_SYSCTL_TEMP3, VALUE(2), 1, "temp_min3", 2 }, { SENSORS_W83781D_TEMP3_OVER, "temp3_over", SENSORS_W83781D_TEMP3, SENSORS_W83781D_TEMP3, RW, - W83781D_SYSCTL_TEMP3, VALUE(1), 1 }, + W83781D_SYSCTL_TEMP3, VALUE(1), 1, "temp_max3", 2 }, { SENSORS_W83781D_VID, "vid", NOMAP, NOMAP, R, W83781D_SYSCTL_VID, VALUE(1), 3 }, { SENSORS_W83781D_VRM, "vrm", NOMAP, NOMAP, RW, W83781D_SYSCTL_VRM, VALUE(1), 1 }, { SENSORS_W83781D_FAN1_DIV, "fan1_div", SENSORS_W83781D_FAN1, NOMAP, RW, - W83781D_SYSCTL_FAN_DIV, VALUE(1), 0 }, + W83781D_SYSCTL_FAN_DIV, VALUE(1), 0, "fan_div1" }, { SENSORS_W83781D_FAN2_DIV, "fan2_div", SENSORS_W83781D_FAN2, NOMAP, RW, - W83781D_SYSCTL_FAN_DIV, VALUE(2), 0 }, + W83781D_SYSCTL_FAN_DIV, VALUE(2), 0, "fan_div2" }, { SENSORS_W83781D_FAN3_DIV, "fan3_div", SENSORS_W83781D_FAN3, NOMAP, RW, - W83781D_SYSCTL_FAN_DIV, VALUE(3), 0 }, + W83781D_SYSCTL_FAN_DIV, VALUE(3), 0, "fan_div3" }, { SENSORS_W83781D_ALARMS, "alarms", NOMAP, NOMAP, R, W83781D_SYSCTL_ALARMS, VALUE(1), 0 }, { SENSORS_W83781D_BEEP_ENABLE, "beep_enable", SENSORS_W83781D_ALARMS, @@ -855,7 +855,7 @@ static sensors_chip_feature w83781d_features[] = W83781D_SYSCTL_BEEP, VALUE(1), 0 }, { SENSORS_W83781D_BEEPS, "beeps", SENSORS_W83781D_ALARMS, SENSORS_W83781D_ALARMS, RW, - W83781D_SYSCTL_BEEP, VALUE(2), 0 }, + W83781D_SYSCTL_BEEP, VALUE(2), 0, "beep_mask" }, { 0 } }; diff --git a/lib/data.h b/lib/data.h index 402835d5..9f5455cb 100644 --- a/lib/data.h +++ b/lib/data.h @@ -159,6 +159,8 @@ typedef struct sensors_chip_feature { int sysctl; int offset; int scaling; + const char *sysname; + int sysscaling; } sensors_chip_feature; /* Internal data about all features of a type of chip */ diff --git a/lib/proc.c b/lib/proc.c index a058338a..c0077a31 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -38,35 +38,105 @@ static char buf[BUF_LEN]; sensors_proc_chips_entry *sensors_proc_chips; -int sensors_proc_chips_count; -int sensors_proc_chips_max; +int sensors_proc_chips_count, sensors_proc_chips_max; +int sensors_sys_chips_count, sensors_sys_chips_max; +sensors_bus *sensors_sys_bus; +int sensors_sys_bus_count, sensors_sys_bus_max; sensors_bus *sensors_proc_bus; -int sensors_proc_bus_count; -int sensors_proc_bus_max; +int sensors_proc_bus_count, sensors_proc_bus_max; static int sensors_get_chip_id(sensors_chip_name name); +int foundsysfs=0; + #define add_proc_chips(el) sensors_add_array_el(el,\ (void **) &sensors_proc_chips,\ &sensors_proc_chips_count,\ &sensors_proc_chips_max,\ sizeof(struct sensors_proc_chips_entry)) -#define add_bus(el) sensors_add_array_el(el,\ +#define add_proc_bus(el) sensors_add_array_el(el,\ (void **) &sensors_proc_bus,\ &sensors_proc_bus_count,\ &sensors_proc_bus_max,\ sizeof(struct sensors_bus)) +#include +#include /* This reads /proc/sys/dev/sensors/chips into memory */ int sensors_read_proc_chips(void) { - int name[3] = { CTL_DEV, DEV_SENSORS, SENSORS_CHIPS }; - int buflen = BUF_LEN; - char *bufptr = buf; - sensors_proc_chips_entry entry; - int res,lineno; + struct dirent *de; + DIR *dir; + FILE *f; + char dev[NAME_MAX], fstype[NAME_MAX], sysfs[NAME_MAX], n[NAME_MAX]; + char dirname[NAME_MAX]; + int res; + + int name[3] = { CTL_DEV, DEV_SENSORS, SENSORS_CHIPS }; + int buflen = BUF_LEN; + char *bufptr = buf; + sensors_proc_chips_entry entry; + int lineno; + + /* First figure out where sysfs was mounted */ + if ((f = fopen("/proc/mounts", "r")) == NULL) + goto proc; + while (fgets(n, NAME_MAX, f)) { + sscanf(n, "%[^ ] %[^ ] %[^ ] %*s\n", dev, sysfs, fstype); + if (strcasecmp(fstype, "sysfs") == 0) { + foundsysfs++; + break; + } + } + fclose(f); + if (! foundsysfs) + goto proc; + strcat(sysfs, "/bus/i2c/devices"); + + /* Then read from it */ + dir = opendir(sysfs); /* Might just be "/sys/bus/i2c/devices" */ + if (! dir) + goto proc; + + while ((de = readdir(dir)) != NULL) { + if (de->d_name[0] == '.' && de->d_name[1] == '\0') + continue; + if (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0') + continue; +/* + if (de->d_type != DT_DIR && de->d_type != DT_LNK) + continue; +*/ + + strcpy(n, sysfs); + strcat(n, "/"); + strcat(n, de->d_name); + strcpy(dirname, n); + strcat(n, "/name"); + + if ((f = fopen(n, "r")) != NULL) { + char x[120]; + fscanf(f, "%[a-zA-z0-9_]", &x); + /* HACK */ strcat(x, "-*"); + if ((res = sensors_parse_chip_name(x, &entry.name))) { + char em[NAME_MAX + 20]; + strcpy(em, "Parsing "); + strcat(em, n); + sensors_parse_error(em, 0); + return res; + } + entry.name.busname = strdup(dirname); + sscanf(de->d_name, "%x-%x", &entry.name.bus, &entry.name.addr); + add_proc_chips(&entry); + fclose(f); + } + } + closedir(dir); + return 0; + +proc: if (sysctl(name, 3, bufptr, &buflen, NULL, 0)) return -SENSORS_ERR_PROC; @@ -90,11 +160,22 @@ int sensors_read_proc_chips(void) int sensors_read_proc_bus(void) { - FILE *f; - char line[255]; - char *border; - sensors_bus entry; - int lineno; + FILE *f; + char line[255]; + char *border; + sensors_bus entry; + int lineno; + + if(foundsysfs) { + /* I don't have a clue what to read here. */ + entry.adapter = 0; /* ?? */ + entry.algorithm = 0; /* ?? */ + entry.number = SENSORS_CHIP_NAME_BUS_ISA; + add_proc_bus(&entry); + entry.number = SENSORS_CHIP_NAME_BUS_DUMMY; + add_proc_bus(&entry); + return 0; + } f = fopen("/proc/bus/i2c","r"); if (!f) @@ -122,7 +203,7 @@ int sensors_read_proc_bus(void) goto ERROR; sensors_strip_of_spaces(entry.algorithm); sensors_strip_of_spaces(entry.adapter); - add_bus(&entry); + add_proc_bus(&entry); lineno++; } fclose(f); @@ -149,24 +230,51 @@ int sensors_get_chip_id(sensors_chip_name name) /* This reads a feature /proc file */ int sensors_read_proc(sensors_chip_name name, int feature, double *value) { - int sysctl_name[4] = { CTL_DEV, DEV_SENSORS }; - const sensors_chip_feature *the_feature; - int buflen = BUF_LEN; - int mag; - - if ((sysctl_name[2] = sensors_get_chip_id(name)) < 0) - return sysctl_name[2]; - if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature))) - return -SENSORS_ERR_NO_ENTRY; - sysctl_name[3] = the_feature->sysctl; - if (sysctl(sysctl_name, 4, buf, &buflen, NULL, 0)) - return -SENSORS_ERR_PROC; - *value = *((long *) (buf + the_feature->offset)); - for (mag = the_feature->scaling; mag > 0; mag --) - *value /= 10.0; - for (; mag < 0; mag ++) - *value *= 10.0; - return 0; + int sysctl_name[4] = { CTL_DEV, DEV_SENSORS }; + const sensors_chip_feature *the_feature; + int buflen = BUF_LEN; + int mag; + char n[NAME_MAX]; + FILE *f; + + if(!foundsysfs) + if ((sysctl_name[2] = sensors_get_chip_id(name)) < 0) + return sysctl_name[2]; + if (! (the_feature = sensors_lookup_feature_nr(name.prefix,feature))) + return -SENSORS_ERR_NO_ENTRY; + if(foundsysfs) { + strcpy(n, name.busname); + strcat(n, "/"); + if(the_feature->sysname != NULL) + strcat(n, the_feature->sysname); + else + strcat(n, the_feature->name); + if ((f = fopen(n, "r")) != NULL) { + fscanf(f, "%lf", value); + fclose(f); + if(the_feature->sysscaling) + mag = the_feature->sysscaling; + else + mag = the_feature->scaling; + for (; mag > 0; mag --) + *value /= 10.0; + // fprintf(stderr, "Feature %s value %lf scale %d offset %d\n", + // the_feature->name, *value, + // the_feature->scaling, the_feature->offset); + return 0; + } else + return -SENSORS_ERR_PROC; + } else { + sysctl_name[3] = the_feature->sysctl; + if (sysctl(sysctl_name, 4, buf, &buflen, NULL, 0)) + return -SENSORS_ERR_PROC; + *value = *((long *) (buf + the_feature->offset)); + for (mag = the_feature->scaling; mag > 0; mag --) + *value /= 10.0; + for (; mag < 0; mag ++) + *value *= 10.0; + } + return 0; } int sensors_write_proc(sensors_chip_name name, int feature, double value)