diff options
author | Michal Wajdeczko <michal.wajdeczko@intel.com> | 2017-12-07 16:52:46 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-12-15 11:26:57 +0000 |
commit | 417b29e2fbc97f99455a9e4bd22270bab0a4628f (patch) | |
tree | 372fa61cf28f8b913abf8a586dd9499f5a870487 | |
parent | e337f2bf378494083052288c7e65e7191ce9a921 (diff) |
lib/igt_sysfs: Let igt_sysfs_read|write return -errno
In some cases debugfs or sysfs may return errors that we
want to check. Return -errno from helper functions to make
asserts easier.
v2: don't forget about EOF ret=0 (Chris)
small re-write (Michal)
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | lib/igt_sysfs.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/lib/igt_sysfs.c b/lib/igt_sysfs.c index 030d1c6a..f8aae9d5 100644 --- a/lib/igt_sysfs.c +++ b/lib/igt_sysfs.c @@ -54,36 +54,34 @@ static int readN(int fd, char *buf, int len) { - int total = 0; + int ret, total = 0; do { - int ret = read(fd, buf + total, len - total); - if (ret < 0 && (errno == EINTR || errno == EAGAIN)) + ret = read(fd, buf + total, len - total); + if (ret < 0) + ret = -errno; + if (ret == -EINTR || ret == -EAGAIN) continue; - if (ret <= 0) - return total ?: ret; - + break; total += ret; - if (total == len) - return total; - } while (1); + } while (total != len); + return total ?: ret; } static int writeN(int fd, const char *buf, int len) { - int total = 0; + int ret, total = 0; do { - int ret = write(fd, buf + total, len - total); - if (ret < 0 && (errno == EINTR || errno == EAGAIN)) + ret = write(fd, buf + total, len - total); + if (ret < 0) + ret = -errno; + if (ret == -EINTR || ret == -EAGAIN) continue; - if (ret <= 0) - return total ?: ret; - + break; total += ret; - if (total == len) - return total; - } while (1); + } while (total != len); + return total ?: ret; } /** @@ -238,7 +236,7 @@ int igt_sysfs_open_parameters(int device) * This writes @len bytes from @data to the sysfs file. * * Returns: - * The number of bytes written, or -1 on error. + * The number of bytes written, or -errno on error. */ int igt_sysfs_write(int dir, const char *attr, const void *data, int len) { @@ -246,7 +244,7 @@ int igt_sysfs_write(int dir, const char *attr, const void *data, int len) fd = openat(dir, attr, O_WRONLY); if (fd < 0) - return false; + return -errno; len = writeN(fd, data, len); close(fd); @@ -264,7 +262,7 @@ int igt_sysfs_write(int dir, const char *attr, const void *data, int len) * This reads @len bytes from the sysfs file to @data * * Returns: - * The length read, -1 on failure. + * The length read, -errno on failure. */ int igt_sysfs_read(int dir, const char *attr, void *data, int len) { @@ -272,7 +270,7 @@ int igt_sysfs_read(int dir, const char *attr, void *data, int len) fd = openat(dir, attr, O_RDONLY); if (fd < 0) - return false; + return -errno; len = readN(fd, data, len); close(fd); @@ -338,7 +336,7 @@ char *igt_sysfs_get(int dir, const char *attr) rem = len - offset - 1; } - if (ret != -1) + if (ret > 0) offset += ret; buf[offset] = '\0'; while (offset > 0 && buf[offset-1] == '\n') |