From 86a6cdbb069086a65f0d24379fd371ec17ecdd3d Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Sun, 16 Nov 2003 19:43:05 +0000 Subject: [PATCH] retrieve i2c adapter name from sysfs git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2060 7894878c-1315-0410-8ee3-d5d059ff63e0 --- lib/access.c | 6 ----- lib/proc.c | 67 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/lib/access.c b/lib/access.c index 112f8f62..566bb384 100644 --- a/lib/access.c +++ b/lib/access.c @@ -304,11 +304,8 @@ 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) @@ -321,11 +318,8 @@ 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) diff --git a/lib/proc.c b/lib/proc.c index c0077a31..4b6620ae 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -26,6 +26,8 @@ #include "error.h" #include "access.h" #include "general.h" +#include +#include /* OK, this proves one thing: if there are too many chips detected, we get in trouble. The limit is around 4096/sizeof(struct sensors_chip_data), which @@ -49,6 +51,7 @@ int sensors_proc_bus_count, sensors_proc_bus_max; static int sensors_get_chip_id(sensors_chip_name name); int foundsysfs=0; +char sysfsmount[NAME_MAX]; #define add_proc_chips(el) sensors_add_array_el(el,\ (void **) &sensors_proc_chips,\ @@ -62,8 +65,6 @@ int foundsysfs=0; &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) { @@ -93,17 +94,18 @@ int sensors_read_proc_chips(void) fclose(f); if (! foundsysfs) goto proc; + strcpy(sysfsmount, sysfs); strcat(sysfs, "/bus/i2c/devices"); /* Then read from it */ - dir = opendir(sysfs); /* Might just be "/sys/bus/i2c/devices" */ + dir = opendir(sysfs); if (! dir) goto proc; while ((de = readdir(dir)) != NULL) { - if (de->d_name[0] == '.' && de->d_name[1] == '\0') + if (!strcmp(de->d_name, ".")) continue; - if (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0') + if (!strcmp(de->d_name, "..")) continue; /* if (de->d_type != DT_DIR && de->d_type != DT_LNK) @@ -118,7 +120,7 @@ int sensors_read_proc_chips(void) if ((f = fopen(n, "r")) != NULL) { char x[120]; - fscanf(f, "%[a-zA-z0-9_]", &x); + fscanf(f, "%[a-zA-z0-9_]", x); /* HACK */ strcat(x, "-*"); if ((res = sensors_parse_chip_name(x, &entry.name))) { char em[NAME_MAX + 20]; @@ -160,23 +162,62 @@ proc: int sensors_read_proc_bus(void) { + struct dirent *de; + DIR *dir; FILE *f; char line[255]; char *border; sensors_bus entry; int lineno; + char sysfs[NAME_MAX], n[NAME_MAX]; + char dirname[NAME_MAX]; 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); + strcpy(sysfs, sysfsmount); + strcat(sysfs, "/class/i2c-adapter"); + /* Then read from it */ + dir = opendir(sysfs); + if (! dir) + goto proc; + + while ((de = readdir(dir)) != NULL) { + if (!strcmp(de->d_name, ".")) + continue; + if (!strcmp(de->d_name, "..")) + continue; + + strcpy(n, sysfs); + strcat(n, "/"); + strcat(n, de->d_name); + strcpy(dirname, n); + strcat(n, "/device/name"); + +printf("opening %s\n", n); + if ((f = fopen(n, "r")) != NULL) { + char x[120]; + fgets(x, 120, f); + fclose(f); + if((border = index(x, '\n')) != NULL) + *border = 0; + entry.adapter=strdup(x); + if(!strncmp(x, "ISA ", 4)) { + entry.number = SENSORS_CHIP_NAME_BUS_ISA; + entry.algorithm = "ISA bus algorithm"; + } else if(!sscanf(de->d_name, "i2c-%x", &entry.number)) { + entry.number = SENSORS_CHIP_NAME_BUS_DUMMY; + entry.algorithm = "Dummy bus algorithm"; + } else + entry.algorithm = "Unavailable from sysfs"; +printf("adding bus adap %s algo %s number %d\n", entry.adapter, entry.algorithm, entry.number); + add_proc_bus(&entry); + } + } + closedir(dir); return 0; } +proc: + f = fopen("/proc/bus/i2c","r"); if (!f) return -SENSORS_ERR_PROC;