[systemd-commits] src/main.c src/util.c src/util.h

Michal Schmidt michich at kemper.freedesktop.org
Sun Jan 29 12:57:44 PST 2012


 src/main.c |    8 ++++++--
 src/util.c |   10 ++++++----
 src/util.h |    2 +-
 3 files changed, 13 insertions(+), 7 deletions(-)

New commits:
commit 512947d46f9fd7daf74c059ac8548cc98b294807
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Sun Jan 29 21:55:51 2012 +0100

    main: don't force text mode in console_setup()
    
    When systemd starts, plymouth may be already displaying progress
    graphically. Do not switch the console to text mode at that time.
    All other users of reset_terminal_fd() do the switch as before.
    
    This avoids a graphical glitch with plymouth, especially visible with
    vesafb, but could be also seen as a sub-second blink with radeon.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=785548

diff --git a/src/main.c b/src/main.c
index cec9b49..94e6ec6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -200,12 +200,16 @@ static int console_setup(bool do_reset) {
         if (!do_reset)
                 return 0;
 
-        if ((tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) {
+        tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
+        if (tty_fd < 0) {
                 log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
                 return -tty_fd;
         }
 
-        if ((r = reset_terminal_fd(tty_fd)) < 0)
+        /* We don't want to force text mode.
+         * plymouth may be showing pictures already from initrd. */
+        r = reset_terminal_fd(tty_fd, false);
+        if (r < 0)
                 log_error("Failed to reset /dev/console: %s", strerror(-r));
 
         close_nointr_nofail(tty_fd);
diff --git a/src/util.c b/src/util.c
index 5fe22d2..ce7f1c9 100644
--- a/src/util.c
+++ b/src/util.c
@@ -2544,7 +2544,7 @@ int ask(char *ret, const char *replies, const char *text, ...) {
         }
 }
 
-int reset_terminal_fd(int fd) {
+int reset_terminal_fd(int fd, bool switch_to_text) {
         struct termios termios;
         int r = 0;
 
@@ -2560,7 +2560,8 @@ int reset_terminal_fd(int fd) {
         ioctl(fd, TIOCNXCL);
 
         /* Switch to text mode */
-        ioctl(fd, KDSETMODE, KD_TEXT);
+        if (switch_to_text)
+                ioctl(fd, KDSETMODE, KD_TEXT);
 
         /* Enable console unicode mode */
         ioctl(fd, KDSKBMODE, K_UNICODE);
@@ -2614,7 +2615,7 @@ int reset_terminal(const char *name) {
         if (fd < 0)
                 return fd;
 
-        r = reset_terminal_fd(fd);
+        r = reset_terminal_fd(fd, true);
         close_nointr_nofail(fd);
 
         return r;
@@ -2808,7 +2809,8 @@ int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocst
         if (notify >= 0)
                 close_nointr_nofail(notify);
 
-        if ((r = reset_terminal_fd(fd)) < 0)
+        r = reset_terminal_fd(fd, true);
+        if (r < 0)
                 log_warning("Failed to reset terminal: %s", strerror(-r));
 
         return fd;
diff --git a/src/util.h b/src/util.h
index dcfc16d..890a3b5 100644
--- a/src/util.h
+++ b/src/util.h
@@ -330,7 +330,7 @@ int chvt(int vt);
 int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
 int ask(char *ret, const char *replies, const char *text, ...);
 
-int reset_terminal_fd(int fd);
+int reset_terminal_fd(int fd, bool switch_to_text);
 int reset_terminal(const char *name);
 
 int open_terminal(const char *name, int mode);



More information about the systemd-commits mailing list