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
This commit is contained in:
Mark D. Studebaker committed 2003-11-16 17:57:29 +00:00
1 parent 9876834233
commit 27e9877012
5 files changed
+215 -89

No files matched your search

+2 -2
View File
@@ -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
+29 -13
View File
@@ -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 */
+40 -40
View File
@@ -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 }
};
+2
View File
@@ -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 */
+142 -34
View File
@@ -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 <limits.h>
#include <dirent.h>
/* 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)