Handle write errors correctly
authorJonathan Dieter <jdieter@gmail.com>
Sat, 18 Jan 2020 21:21:53 +0000 (21:21 +0000)
committerJonathan Dieter <jdieter@gmail.com>
Sat, 18 Jan 2020 21:28:47 +0000 (21:28 +0000)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
src/lib/io.c

index c81317cfd78e2f25cc5bb9959884f21d19c105db..5925d513743ab06be944b6a627b1f0387e95bb78 100644 (file)
@@ -62,11 +62,19 @@ int write_data(zckCtx *zck, int fd, const char *data, size_t length) {
     }
     ssize_t write_bytes = write(fd, data, length);
     if(write_bytes == -1) {
-        set_error(zck, "Error write data: %s", strerror(errno));
-        return false;
-    } else if(write_bytes != length) {
-        set_fatal_error(zck, "Short write");
+        set_fatal_error(zck, "Error writing data: %s", strerror(errno));
         return false;
+    } else if(write_bytes < length) {
+        // According to man page, if write is less than full amount, we should try again
+        length -= write_bytes;
+        write_bytes = write(fd, data+write_bytes, length);
+        if(write_bytes == -1) {
+            set_fatal_error(zck, "Error writing data: %s", strerror(errno));
+            return false;
+        } else if(write_bytes < length) {
+            set_fatal_error(zck, "Short write (after two attempts)");
+            return false;
+        }
     }
     return true;
 }