summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
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;
}