summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2021-04-15 14:34:55 -0400
committerTavian Barnes <tavianator@tavianator.com>2021-04-15 14:36:39 -0400
commit9870b77f9000c55bbe507bbb11d6d20fac2e8da0 (patch)
tree6dd24948300c2b1bd5cbca40ba52e4ac9178650c /util.c
parentb7111f2f01dce9516aea5250e765124300f2fa3a (diff)
downloadbfs-9870b77f9000c55bbe507bbb11d6d20fac2e8da0.tar.xz
util: Tweak the safe read/write functions
Diffstat (limited to 'util.c')
-rw-r--r--util.c71
1 files changed, 31 insertions, 40 deletions
diff --git a/util.c b/util.c
index 00f5b78..19656e9 100644
--- a/util.c
+++ b/util.c
@@ -369,57 +369,48 @@ int bfs_minor(dev_t dev) {
#endif
}
-ssize_t safe_read(int fd, void *buf, size_t nbytes) {
- for (;;) {
- ssize_t ret = read(fd, buf, nbytes);
- if (ret < 0 && errno == EINTR) {
- continue;
- }
- return ret;
- }
-}
-
-ssize_t safe_read_all(int fd, void *buf, size_t nbytes) {
+size_t xread(int fd, void *buf, size_t nbytes) {
size_t count = 0;
- for (;;) {
+
+ while (count < nbytes) {
ssize_t ret = read(fd, (char *)buf + count, nbytes - count);
- if (ret < 0 && errno == EINTR) {
- continue;
- }
if (ret < 0) {
- return ret; // always return error < 0
- }
- count += ret;
- if (ret == 0 || count == nbytes) { // EOF or success
- return count;
+ if (errno == EINTR) {
+ continue;
+ } else {
+ break;
+ }
+ } else if (ret == 0) {
+ // EOF
+ errno = 0;
+ break;
+ } else {
+ count += ret;
}
}
-}
-ssize_t safe_write(int fd, const void *buf, size_t nbytes) {
- for (;;) {
- ssize_t ret = write(fd, buf, nbytes);
- if (ret < 0 && errno == EINTR) {
- continue;
- }
- return ret;
- }
+ return count;
}
-ssize_t safe_write_all(int fd, const void *buf, size_t nbytes)
-{
+size_t xwrite(int fd, const void *buf, size_t nbytes) {
size_t count = 0;
- for (;;) {
+
+ while (count < nbytes) {
ssize_t ret = write(fd, (const char *)buf + count, nbytes - count);
- if (ret < 0 && errno == EINTR) {
- continue;
- }
if (ret < 0) {
- return ret; // always return error < 0
- }
- count += ret;
- if (ret == 0 || count == nbytes) { // EOF (should never happen with write) or success
- return count;
+ if (errno == EINTR) {
+ continue;
+ } else {
+ break;
+ }
+ } else if (ret == 0) {
+ // EOF?
+ errno = 0;
+ break;
+ } else {
+ count += ret;
}
}
+
+ return count;
}