diff --git a/CHANGES b/CHANGES index 82af4b7f..0b813022 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ SVN Makefile: Add sensors-conf-convert to make install libsensors: Notify the caller when writing a value fails Differentiate between different read error types + Report I/O errors as such sensord: Log the error code on failure sensors: Fix spurious critical temperature alarm Print error messages to stderr diff --git a/lib/error.c b/lib/error.c index cf3fa9a7..cbb94a34 100644 --- a/lib/error.c +++ b/lib/error.c @@ -42,6 +42,7 @@ static const char *errorlist[] = { /* SENSORS_ERR_BUS_NAME */ "Can't parse bus name", /* SENSORS_ERR_PARSE */ "General parse error", /* SENSORS_ERR_ACCESS_W */ "Can't write", + /* SENSORS_ERR_IO */ "I/O error", }; const char *sensors_strerror(int errnum) diff --git a/lib/error.h b/lib/error.h index 66dd1294..4684173e 100644 --- a/lib/error.h +++ b/lib/error.h @@ -30,6 +30,7 @@ #define SENSORS_ERR_BUS_NAME 7 /* Can't parse bus name */ #define SENSORS_ERR_PARSE 8 /* General parse error */ #define SENSORS_ERR_ACCESS_W 9 /* Can't write */ +#define SENSORS_ERR_IO 10 /* I/O error */ #ifdef __cplusplus extern "C" { diff --git a/lib/sysfs.c b/lib/sysfs.c index dbcd505a..daad9d02 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -557,9 +557,24 @@ int sensors_read_sysfs_attr(const sensors_chip_name *name, snprintf(n, NAME_MAX, "%s/%s", name->path, subfeature->name); if ((f = fopen(n, "r"))) { - int res = fscanf(f, "%lf", value); - if (fclose(f) || res != 1) - return -SENSORS_ERR_ACCESS_R; + int res, err = 0; + + errno = 0; + res = fscanf(f, "%lf", value); + if (res == EOF && errno == EIO) + err = -SENSORS_ERR_IO; + else if (res != 1) + err = -SENSORS_ERR_ACCESS_R; + res = fclose(f); + if (err) + return err; + + if (res == EOF) { + if (errno == EIO) + return -SENSORS_ERR_IO; + else + return -SENSORS_ERR_ACCESS_R; + } *value /= get_type_scaling(subfeature->type); } else return -SENSORS_ERR_KERNEL; @@ -576,11 +591,24 @@ int sensors_write_sysfs_attr(const sensors_chip_name *name, snprintf(n, NAME_MAX, "%s/%s", name->path, subfeature->name); if ((f = fopen(n, "w"))) { - int res; + int res, err = 0; + value *= get_type_scaling(subfeature->type); res = fprintf(f, "%d", (int) value); - if (fclose(f) || res < 0) - return -SENSORS_ERR_ACCESS_W; + if (res == -EIO) + err = -SENSORS_ERR_IO; + else if (res < 0) + err = -SENSORS_ERR_ACCESS_W; + res = fclose(f); + if (err) + return err; + + if (res == EOF) { + if (errno == EIO) + return -SENSORS_ERR_IO; + else + return -SENSORS_ERR_ACCESS_W; + } } else return -SENSORS_ERR_KERNEL;