diff options
author | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2007-09-29 18:48:20 +0000 |
---|---|---|
committer | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2007-09-29 18:48:20 +0000 |
commit | 92759967eeab7d96a14de7696145e9c528ab57d8 (patch) | |
tree | f03f006f80eefbe1b924e4ab477e3fbee6687020 /lib/sysfs.c | |
parent | d9647490d1394554ea9e26daa4408709526e5adf (diff) | |
download | lm-sensors-92759967eeab7d96a14de7696145e9c528ab57d8.tar.gz |
libsensors: Report I/O errors as such.
git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@4899 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'lib/sysfs.c')
-rw-r--r-- | lib/sysfs.c | 40 |
1 files changed, 34 insertions, 6 deletions
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; |