Zbigniew Jędrzejewski-Szmek 126222
From 21804157ff0e60508fd128310505381f7b3ec2b0 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 126222
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 126222
Date: Wed, 18 Dec 2013 16:49:15 +0100
Zbigniew Jędrzejewski-Szmek 126222
Subject: [PATCH] log: when we log to /dev/console and got disconnected (maybe
Zbigniew Jędrzejewski-Szmek 126222
 due to vhangup) reconnect
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
---
Zbigniew Jędrzejewski-Szmek 126222
 src/shared/log.c | 21 +++++++++++++++++++--
Zbigniew Jędrzejewski-Szmek 126222
 1 file changed, 19 insertions(+), 2 deletions(-)
Zbigniew Jędrzejewski-Szmek 126222
Zbigniew Jędrzejewski-Szmek 126222
diff --git a/src/shared/log.c b/src/shared/log.c
Zbigniew Jędrzejewski-Szmek 126222
index bd918fb..de770ca 100644
Zbigniew Jędrzejewski-Szmek 126222
--- a/src/shared/log.c
Zbigniew Jędrzejewski-Szmek 126222
+++ b/src/shared/log.c
Zbigniew Jędrzejewski-Szmek 126222
@@ -335,8 +335,25 @@ static int write_to_console(
Zbigniew Jędrzejewski-Szmek 126222
                 IOVEC_SET_STRING(iovec[n++], ANSI_HIGHLIGHT_OFF);
Zbigniew Jędrzejewski-Szmek 126222
         IOVEC_SET_STRING(iovec[n++], "\n");
Zbigniew Jędrzejewski-Szmek 126222
 
Zbigniew Jędrzejewski-Szmek 126222
-        if (writev(console_fd, iovec, n) < 0)
Zbigniew Jędrzejewski-Szmek 126222
-                return -errno;
Zbigniew Jędrzejewski-Szmek 126222
+        if (writev(console_fd, iovec, n) < 0) {
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+                if (errno == EIO && getpid() == 1) {
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+                        /* If somebody tried to kick us from our
Zbigniew Jędrzejewski-Szmek 126222
+                         * console tty (via vhangup() or suchlike),
Zbigniew Jędrzejewski-Szmek 126222
+                         * try to reconnect */
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+                        log_close_console();
Zbigniew Jędrzejewski-Szmek 126222
+                        log_open_console();
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+                        if (console_fd < 0)
Zbigniew Jędrzejewski-Szmek 126222
+                                return 0;
Zbigniew Jędrzejewski-Szmek 126222
+
Zbigniew Jędrzejewski-Szmek 126222
+                        if (writev(console_fd, iovec, n) < 0)
Zbigniew Jędrzejewski-Szmek 126222
+                                return -errno;
Zbigniew Jędrzejewski-Szmek 126222
+                } else
Zbigniew Jędrzejewski-Szmek 126222
+                        return -errno;
Zbigniew Jędrzejewski-Szmek 126222
+        }
Zbigniew Jędrzejewski-Szmek 126222
 
Zbigniew Jędrzejewski-Szmek 126222
         return 1;
Zbigniew Jędrzejewski-Szmek 126222
 }