summaryrefslogtreecommitdiff
path: root/lib/sysfs.c
diff options
context:
space:
mode:
authorkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2007-09-29 18:48:20 +0000
committerkhali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0>2007-09-29 18:48:20 +0000
commit92759967eeab7d96a14de7696145e9c528ab57d8 (patch)
treef03f006f80eefbe1b924e4ab477e3fbee6687020 /lib/sysfs.c
parentd9647490d1394554ea9e26daa4408709526e5adf (diff)
downloadlm-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.c40
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;