summaryrefslogtreecommitdiff
path: root/src/io.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/io.cc')
-rw-r--r--src/io.cc41
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