diff options
Diffstat (limited to 'src/io.cc')
| -rw-r--r-- | src/io.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/io.cc b/src/io.cc new file mode 100644 index 0000000..0fb31d9 --- /dev/null +++ b/src/io.cc @@ -0,0 +1,41 @@ +#include "common.hh" + +#include "io.hh" + +#include <errno.h> +#include <unistd.h> + +namespace io { + +bool read_all(int fd, std::string* out) { + char buf[32768]; + while (true) { + auto ret = read(fd, buf, sizeof(buf)); + if (ret == 0) + return true; + if (ret < 0) { + if (errno == EINTR) + continue; + return false; + } + out->append(buf, ret); + } +} + +bool write_all(int fd, std::string const& in) { + size_t offset = 0; + while (offset < in.size()) { + auto ret = write(fd, in.data() + offset, in.size() - offset); + if (ret == 0) + return false; + if (ret < 0) { + if (errno == EINTR) + continue; + return false; + } + offset += ret; + } + return true; +} + +} // namespace io |
