From 6179ede1c55c0b7b31b8f71e17d68ec2318ef2d5 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Mon, 27 Aug 2018 22:33:44 +0200 Subject: [PATCH] terminal-util: introduce vt_restore() helper --- src/basic/terminal-util.c | 34 ++++++++++++++++++++++++++++++++++ src/basic/terminal-util.h | 1 + src/login/logind-session.c | 16 ++++------------ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 2c7b4508ce9..aefa7cd4ef9 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -1271,3 +1271,37 @@ int vt_reset_keyboard(int fd) { return 0; } + +int vt_restore(int fd) { + static const struct vt_mode mode = { + .mode = VT_AUTO, + }; + int r, q = 0; + + r = ioctl(fd, KDSETMODE, KD_TEXT); + if (r < 0) + q = log_debug_errno(errno, "Failed to set VT in text mode, ignoring: %m"); + + r = vt_reset_keyboard(fd); + if (r < 0) { + log_debug_errno(r, "Failed to reset keyboard mode, ignoring: %m"); + if (q >= 0) + q = r; + } + + r = ioctl(fd, VT_SETMODE, &mode); + if (r < 0) { + log_debug_errno(errno, "Failed to set VT_AUTO mode, ignoring: %m"); + if (q >= 0) + q = -errno; + } + + r = fchown(fd, 0, (gid_t) -1); + if (r < 0) { + log_debug_errno(errno, "Failed to chown VT, ignoring: %m"); + if (q >= 0) + q = -errno; + } + + return q; +} diff --git a/src/basic/terminal-util.h b/src/basic/terminal-util.h index 2d64afaee61..2d931114e49 100644 --- a/src/basic/terminal-util.h +++ b/src/basic/terminal-util.h @@ -154,3 +154,4 @@ int open_terminal_in_namespace(pid_t pid, const char *name, int mode); int vt_default_utf8(void); int vt_reset_keyboard(int fd); +int vt_restore(int fd); diff --git a/src/login/logind-session.c b/src/login/logind-session.c index b77431b449b..adbd8008faa 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1225,12 +1225,7 @@ error: } static void session_restore_vt(Session *s) { - - static const struct vt_mode mode = { - .mode = VT_AUTO, - }; - - int vt, old_fd; + int r, vt, old_fd; /* We need to get a fresh handle to the virtual terminal, * since the old file-descriptor is potentially in a hung-up @@ -1246,12 +1241,9 @@ static void session_restore_vt(Session *s) { if (vt < 0) return; - (void) ioctl(vt, KDSETMODE, KD_TEXT); - - (void) vt_reset_keyboard(vt); - - (void) ioctl(vt, VT_SETMODE, &mode); - (void) fchown(vt, 0, (gid_t) -1); + r = vt_restore(vt); + if (r < 0) + log_warning_errno(r, "Failed to restore VT, ignoring: %m"); s->vtfd = safe_close(s->vtfd); } -- 2.39.2