]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
terminal-util: introduce vt_restore() helper
authorFranck Bui <fbui@suse.com>
Mon, 27 Aug 2018 20:33:44 +0000 (22:33 +0200)
committerFranck Bui <fbui@suse.com>
Wed, 21 Nov 2018 13:25:10 +0000 (14:25 +0100)
src/basic/terminal-util.c
src/basic/terminal-util.h
src/login/logind-session.c

index 2c7b4508ce9ff9298dcf9b8817fccf82b5e3a8c4..aefa7cd4ef96e4c3db84f0f356833d39668751a8 100644 (file)
@@ -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;
+}
index 2d64afaee6143395bbdfb880cb421ffaf3b08826..2d931114e498e1fb358683809123a4dc4ee41216 100644 (file)
@@ -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);
index b77431b449b20f746518e6ca1c05403c83f58fb0..adbd8008faa3bf9d77468eab40879c4dc8e82946 100644 (file)
@@ -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);
 }