diff options
Diffstat (limited to 'lib/ccan/read_write_all/read_write_all.c')
-rw-r--r-- | lib/ccan/read_write_all/read_write_all.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/ccan/read_write_all/read_write_all.c b/lib/ccan/read_write_all/read_write_all.c new file mode 100644 index 0000000000..c66d521598 --- /dev/null +++ b/lib/ccan/read_write_all/read_write_all.c @@ -0,0 +1,38 @@ +/* Licensed under LGPLv2+ - see LICENSE file for details */ +#include "read_write_all.h" +#include <unistd.h> +#include <errno.h> + +bool write_all(int fd, const void *data, size_t size) +{ + while (size) { + ssize_t done; + + done = write(fd, data, size); + if (done < 0 && errno == EINTR) + continue; + if (done <= 0) + return false; + data = (const char *)data + done; + size -= done; + } + + return true; +} + +bool read_all(int fd, void *data, size_t size) +{ + while (size) { + ssize_t done; + + done = read(fd, data, size); + if (done < 0 && errno == EINTR) + continue; + if (done <= 0) + return false; + data = (char *)data + done; + size -= done; + } + + return true; +} |