]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bsod: normalize VT indexes
authorLennart Poettering <lennart@poettering.net>
Wed, 21 Feb 2024 08:53:58 +0000 (09:53 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 21 Feb 2024 14:11:27 +0000 (15:11 +0100)
The 1-based VT indexes are what people usually expect, since the primary
name of VTs uses them (i.e. /dev/tty1, /dev/tty2, …). Hence, let's
always use 1-based VT indexes, and early on convert 0-based VT indexes
to minimize confusion.

src/journal/bsod.c

index 30f790dbbe36543c1f5fd1eb4e10b4c330116b2e..c4022cdf6ea2a3d04fdbb8f7e47d2d03643dab9e 100644 (file)
@@ -131,7 +131,7 @@ static int find_next_free_vt(int fd, int *ret_free_vt, int *ret_original_vt) {
 
         for (size_t i = 0; i < sizeof(terminal_status.v_state) * 8; i++)
                 if ((terminal_status.v_state & (1 << i)) == 0) {
-                        *ret_free_vt = i;
+                        *ret_free_vt = i + 1;
                         *ret_original_vt = terminal_status.v_active;
                         return 0;
                 }
@@ -140,7 +140,7 @@ static int find_next_free_vt(int fd, int *ret_free_vt, int *ret_original_vt) {
 }
 
 static int display_emergency_message_fullscreen(const char *message) {
-        int r, ret = 0, free_vt = -1, original_vt = 0;
+        int r, ret = 0, free_vt = 0, original_vt = 0;
         unsigned qr_code_start_row = 1, qr_code_start_column = 1;
         char ttybuf[STRLEN("/dev/tty") + DECIMAL_STR_MAX(int) + 1];
         _cleanup_close_ int fd = -EBADF;
@@ -165,7 +165,7 @@ static int display_emergency_message_fullscreen(const char *message) {
                 if (r < 0)
                         return log_error_errno(r, "Failed to find a free VT: %m");
 
-                xsprintf(ttybuf, "/dev/tty%d", free_vt + 1);
+                xsprintf(ttybuf, "/dev/tty%d", free_vt);
                 tty = ttybuf;
 
                 fd = safe_close(fd);
@@ -178,8 +178,8 @@ static int display_emergency_message_fullscreen(const char *message) {
         if (ioctl(fd, TIOCGWINSZ, &w) < 0)
                 log_warning_errno(errno, "Failed to fetch tty size, ignoring: %m");
 
-        if (free_vt >= 0 && ioctl(fd, VT_ACTIVATE, free_vt + 1) < 0)
-                return log_error_errno(errno, "Failed to activate tty, ignoring: %m");
+        if (free_vt > 0 && ioctl(fd, VT_ACTIVATE, free_vt) < 0)
+                return log_error_errno(errno, "Failed to activate /dev/tty%i, ignoring: %m", free_vt);
 
         r = loop_write(fd, ANSI_BACKGROUND_BLUE ANSI_HOME_CLEAR, SIZE_MAX);
         if (r < 0)
@@ -233,7 +233,7 @@ static int display_emergency_message_fullscreen(const char *message) {
 
 cleanup:
         if (original_vt > 0 && ioctl(fd, VT_ACTIVATE, original_vt) < 0)
-                return log_error_errno(errno, "Failed to switch back to original VT: %m");
+                return log_error_errno(errno, "Failed to switch back to original VT /dev/tty%i: %m", original_vt);
 
         return ret;
 }