Use bp_sys aliases to write from log
authorDavin McCall <davmac@davmac.org>
Sun, 29 Dec 2019 04:17:09 +0000 (14:17 +1000)
committerDavin McCall <davmac@davmac.org>
Sun, 29 Dec 2019 04:17:09 +0000 (14:17 +1000)
This allows for future unit testing of the log infrastructure.

src/dinit-log.cc
src/includes/baseproc-sys.h
src/tests/test-bpsys.cc
src/tests/test-includes/baseproc-sys.h

index 9d86913858b1fef68eb700a861559c709060eb24..e0ee69a369e635ba374f05f05312a9d185db1b19 100644 (file)
@@ -169,7 +169,7 @@ rearm buffered_log_stream::fd_event(eventloop_t &loop, int fd, int flags) noexce
         const char * start = special_buf + msg_index;
         const char * end = start;
         while (*end != '\n') end++;
-        int r = write(fd, start, end - start + 1);
+        int r = bp_sys::write(fd, start, end - start + 1);
         if (r >= 0) {
             if (start + r > end) {
                 // All written: go on to next message in queue
@@ -239,7 +239,7 @@ rearm buffered_log_stream::fd_event(eventloop_t &loop, int fd, int flags) noexce
             iovs_to_write = 2;
         }
         
-        ssize_t r = writev(fd, logiov, iovs_to_write);
+        ssize_t r = bp_sys::writev(fd, logiov, iovs_to_write);
 
         if (r >= 0) {
             bool complete = (r == len) && will_complete;
index 4c655139f79f57d812b77a68812145d14a201098..fcf50565c1d9d469ee4ea23f6bee7e45a63cca60 100644 (file)
@@ -8,7 +8,11 @@
 #ifndef BPSYS_INCLUDED
 #define BPSYS_INCLUDED
 
-#include "dasynq.h"
+#include "dasynq.h" // for pipe2
+
+#include <sys/uio.h> // writev
+#include <unistd.h>
+#include <fcntl.h>
 
 namespace bp_sys {
 
@@ -22,6 +26,7 @@ using ::tcsetpgrp;
 using ::getpgrp;
 using ::read;
 using ::write;
+using ::writev;
 
 // Wrapper around a POSIX exit status
 class exit_status
index 9f9ada27b90d963d46d39bab23c152c8ea1dbee5..21e9b469a012e181fd42c31c80946550f7166ec0 100644 (file)
@@ -150,4 +150,23 @@ ssize_t write(int fd, const void *buf, size_t count)
        return count;
 }
 
+ssize_t writev(int fd, const struct iovec *iov, int iovcnt)
+{
+    ssize_t r = 0;
+    for (int i = 0; i < iovcnt; i++) {
+        ssize_t wr = write(fd, iov[i].iov_base, iov[i].iov_len);
+        if (wr < 0) {
+            if (r > 0) {
+                return r;
+            }
+            return wr;
+        }
+        r += wr;
+        if (size_t(wr) < iov[i].iov_len) {
+            return r;
+        }
+    }
+    return r;
+}
+
 }
index 78e3408d19c820a7362afc47381e9fa61bdcba66..c8e2441877479a50d05247792a22b27381d6b79a 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <sys/types.h>
 #include <unistd.h>
+#include <sys/uio.h>
 
 // Mock system functions for testing.
 
@@ -108,6 +109,7 @@ inline pid_t waitpid(pid_t p, exit_status *statusp, int flags)
 
 ssize_t read(int fd, void *buf, size_t count);
 ssize_t write(int fd, const void *buf, size_t count);
+ssize_t writev (int fd, const struct iovec *iovec, int count);
 
 }