]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
terminal-util: modernize get_kernel_consoles() a bit
authorLennart Poettering <lennart@poettering.net>
Wed, 14 Feb 2018 13:56:17 +0000 (14:56 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 14 Feb 2018 13:56:17 +0000 (14:56 +0100)
Also, make sure when we run in a container, we don't use the data from
/sys at all, but immediately fall back to /dev/console itself.

src/basic/terminal-util.c
src/basic/terminal-util.h

index ee540bb37fd744e429ae48ee7f58771d74378af6..34878d3192f4df1c3eb4bdb6040117dc25d62d0b 100644 (file)
@@ -705,24 +705,29 @@ char *resolve_dev_console(char **active) {
         return tty;
 }
 
-int get_kernel_consoles(char ***consoles) {
-        _cleanup_strv_free_ char **con = NULL;
+int get_kernel_consoles(char ***ret) {
+        _cleanup_strv_free_ char **l = NULL;
         _cleanup_free_ char *line = NULL;
-        const char *active;
+        const char *p;
         int r;
 
-        assert(consoles);
+        assert(ret);
+
+        /* If we /sys is mounted read-only this means we are running in some kind of container environment. In that
+         * case /sys would reflect the host system, not us, hence ignore the data we can read from it. */
+        if (path_is_read_only_fs("/sys") > 0)
+                goto fallback;
 
         r = read_one_line_file("/sys/class/tty/console/active", &line);
         if (r < 0)
                 return r;
 
-        active = line;
+        p = line;
         for (;;) {
                 _cleanup_free_ char *tty = NULL;
                 char *path;
 
-                r = extract_first_word(&active, &tty, NULL, 0);
+                r = extract_first_word(&p, &tty, NULL, 0);
                 if (r < 0)
                         return r;
                 if (r == 0)
@@ -745,21 +750,29 @@ int get_kernel_consoles(char ***consoles) {
                         continue;
                 }
 
-                r = strv_consume(&con, path);
+                r = strv_consume(&l, path);
                 if (r < 0)
                         return r;
         }
 
-        if (strv_isempty(con)) {
+        if (strv_isempty(l)) {
                 log_debug("No devices found for system console");
-
-                r = strv_extend(&con, "/dev/console");
-                if (r < 0)
-                        return r;
+                goto fallback;
         }
 
-        *consoles = con;
-        con = NULL;
+        *ret = l;
+        l = NULL;
+
+        return 0;
+
+fallback:
+        r = strv_extend(&l, "/dev/console");
+        if (r < 0)
+                return r;
+
+        *ret = l;
+        l = NULL;
+
         return 0;
 }
 
index 470892d38b7768808bb6d57da26f72c388a1a99e..e13d441a252001efe3739e6fe6b0f29440f8f316 100644 (file)
@@ -83,7 +83,7 @@ int ask_string(char **ret, const char *text, ...) _printf_(2, 3);
 int vt_disallocate(const char *name);
 
 char *resolve_dev_console(char **active);
-int get_kernel_consoles(char ***consoles);
+int get_kernel_consoles(char ***ret);
 bool tty_is_vc(const char *tty);
 bool tty_is_vc_resolve(const char *tty);
 bool tty_is_console(const char *tty) _pure_;