logsave: Fix warn_unused_result warnings from gcc

Fixed a potential bug where by partial returns from the write(2)
system call could some bytes to be lost when writing to the log file.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
diff --git a/misc/logsave.c b/misc/logsave.c
index f0011f8..81ac9f6 100644
--- a/misc/logsave.c
+++ b/misc/logsave.c
@@ -49,6 +49,29 @@
 #define SEND_CONSOLE	0x02
 #define SEND_BOTH	0x03
 
+/*
+ * Helper function that does the right thing if write returns a
+ * partial write, or an EGAIN/EINTR error.
+ */
+static int write_all(int fd, const char *buf, size_t count)
+{
+	ssize_t ret;
+	int c = 0;
+
+	while (count > 0) {
+		ret = write(fd, buf, count);
+		if (ret < 0) {
+			if ((errno == EAGAIN) || (errno == EINTR))
+				continue;
+			return -1;
+		}
+		count -= ret;
+		buf += ret;
+		c += ret;
+	}
+	return c;
+}
+
 static void send_output(const char *buffer, int c, int flag)
 {
 	char	*n;
@@ -57,11 +80,11 @@
 		c = strlen(buffer);
 
 	if (flag & SEND_CONSOLE)
-		write(1, buffer, c);
+		write_all(1, buffer, c);
 	if (!(flag & SEND_LOG))
 		return;
 	if (outfd > 0)
-		write(outfd, buffer, c);
+		write_all(outfd, buffer, c);
 	else {
 		n = realloc(outbuf, outbufsize + c);
 		if (n) {
@@ -280,7 +303,7 @@
 			outfd = open(outfn, openflags, 0644);
 			sleep(1);
 		}
-		write(outfd, outbuf, outbufsize);
+		write_all(outfd, outbuf, outbufsize);
 		free(outbuf);
 	}
 	close(outfd);