]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
terminal-util: make resolve_dev_console() less weird
authorLennart Poettering <lennart@poettering.net>
Wed, 14 Feb 2018 16:30:37 +0000 (17:30 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 14 Feb 2018 16:30:37 +0000 (17:30 +0100)
Let's normalize the behaviour: return a negative errno style error code,
and return the resolved string directly as argument.

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

index 34878d3192f4df1c3eb4bdb6040117dc25d62d0b..a897a6367d4015ec0ca6a9148a87ccb5934323f2 100644 (file)
@@ -672,37 +672,55 @@ int vtnr_from_tty(const char *tty) {
         return i;
 }
 
-char *resolve_dev_console(char **active) {
+ int resolve_dev_console(char **ret) {
+        _cleanup_free_ char *active = NULL;
         char *tty;
+        int r;
+
+        assert(ret);
 
-        /* Resolve where /dev/console is pointing to, if /sys is actually ours
-         * (i.e. not read-only-mounted which is a sign for container setups) */
+        /* Resolve where /dev/console is pointing to, if /sys is actually ours (i.e. not read-only-mounted which is a
+         * sign for container setups) */
 
         if (path_is_read_only_fs("/sys") > 0)
-                return NULL;
+                return -ENOMEDIUM;
 
-        if (read_one_line_file("/sys/class/tty/console/active", active) < 0)
-                return NULL;
+        r = read_one_line_file("/sys/class/tty/console/active", &active);
+        if (r < 0)
+                return r;
 
-        /* If multiple log outputs are configured the last one is what
-         * /dev/console points to */
-        tty = strrchr(*active, ' ');
+        /* If multiple log outputs are configured the last one is what /dev/console points to */
+        tty = strrchr(active, ' ');
         if (tty)
                 tty++;
         else
-                tty = *active;
+                tty = active;
 
         if (streq(tty, "tty0")) {
-                char *tmp;
+                active = mfree(active);
 
                 /* Get the active VC (e.g. tty1) */
-                if (read_one_line_file("/sys/class/tty/tty0/active", &tmp) >= 0) {
-                        free(*active);
-                        tty = *active = tmp;
-                }
+                r = read_one_line_file("/sys/class/tty/tty0/active", &active);
+                if (r < 0)
+                        return r;
+
+                tty = active;
         }
 
-        return tty;
+        if (tty == active) {
+                *ret = active;
+                active = NULL;
+        } else {
+                char *tmp;
+
+                tmp = strdup(tty);
+                if (!tmp)
+                        return -ENOMEM;
+
+                *ret = tmp;
+        }
+
+        return 0;
 }
 
 int get_kernel_consoles(char ***ret) {
@@ -777,16 +795,17 @@ fallback:
 }
 
 bool tty_is_vc_resolve(const char *tty) {
-        _cleanup_free_ char *active = NULL;
+        _cleanup_free_ char *resolved = NULL;
 
         assert(tty);
 
         tty = skip_dev_prefix(tty);
 
         if (streq(tty, "console")) {
-                tty = resolve_dev_console(&active);
-                if (!tty)
+                if (resolve_dev_console(&resolved) < 0)
                         return false;
+
+                tty = resolved;
         }
 
         return tty_is_vc(tty);
index e13d441a252001efe3739e6fe6b0f29440f8f316..f6e6020b66e078b4896b4198acb0fb758001a969 100644 (file)
@@ -82,7 +82,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 resolve_dev_console(char **ret);
 int get_kernel_consoles(char ***ret);
 bool tty_is_vc(const char *tty);
 bool tty_is_vc_resolve(const char *tty);
index 1381ab4091ac129c7cfe53aa27e12a062119e154..bebd4eca805eaa030b9f422922330be729032f83 100644 (file)
@@ -3871,8 +3871,7 @@ static int exec_context_load_environment(const Unit *unit, const ExecContext *c,
 }
 
 static bool tty_may_match_dev_console(const char *tty) {
-        _cleanup_free_ char *active = NULL;
-        char *console;
+        _cleanup_free_ char *resolved = NULL;
 
         if (!tty)
                 return true;
@@ -3883,13 +3882,11 @@ static bool tty_may_match_dev_console(const char *tty) {
         if (streq(tty, "console"))
                 return true;
 
-        console = resolve_dev_console(&active);
-        /* if we could not resolve, assume it may */
-        if (!console)
-                return true;
+        if (resolve_dev_console(&resolved) < 0)
+                return true; /* if we could not resolve, assume it may */
 
         /* "tty0" means the active VC, so it may be the same sometimes */
-        return streq(console, tty) || (streq(console, "tty0") && tty_is_vc(tty));
+        return streq(resolved, tty) || (streq(resolved, "tty0") && tty_is_vc(tty));
 }
 
 bool exec_context_may_touch_console(const ExecContext *ec) {