chiark / gitweb /
exec: automatically determine right TERM= setting based on tty name
authorLennart Poettering <lennart@poettering.net>
Mon, 15 Nov 2010 22:49:02 +0000 (23:49 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 15 Nov 2010 22:49:02 +0000 (23:49 +0100)
12 files changed:
TODO
src/execute.c
src/service.c
src/test-strv.c
src/util.c
src/util.h
units/emergency.service
units/fedora/halt-local.service
units/fedora/rc-local.service
units/getty@.service.m4
units/rescue.service.m4
units/serial-getty@.service.m4

diff --git a/TODO b/TODO
index 945f8d9..8853dab 100644 (file)
--- a/TODO
+++ b/TODO
@@ -73,7 +73,7 @@
 
 * in the PAM module rely on loginuid to figure out XDG_RUNTIME_DIR
 
-* automatically determine TERM= based on tty name. (TERM=linux vs. TERM=vt100-nav)
+* automatically determine TERM= based on tty name even for /dev/console
 
 * declare /etc/os-release cross-distro standard
 
index 48e55ea..05abd5a 100644 (file)
@@ -1252,7 +1252,7 @@ int exec_spawn(ExecCommand *command,
                                 }
                 }
 
-                if (!(our_env = new0(char*, 6))) {
+                if (!(our_env = new0(char*, 7))) {
                         r = EXIT_MEMORY;
                         goto fail;
                 }
@@ -1277,7 +1277,15 @@ int exec_spawn(ExecCommand *command,
                                 goto fail;
                         }
 
-                assert(n_env <= 6);
+                if (is_terminal_input(context->std_input) ||
+                    context->std_output == EXEC_OUTPUT_TTY ||
+                    context->std_error == EXEC_OUTPUT_TTY)
+                        if (!(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))) {
+                                r = EXIT_MEMORY;
+                                goto fail;
+                        }
+
+                assert(n_env <= 7);
 
                 if (!(final_env = strv_env_merge(
                                       4,
index 184ddf9..0234151 100644 (file)
@@ -1609,16 +1609,6 @@ static int service_spawn(
                         goto fail;
                 }
 
-#ifdef HAVE_SYSV_COMPAT
-        /* Make sure we set TERM=linux for SysV scripts, since some
-         * require it to be set from the kernel */
-        if (s->sysv_path && !strv_env_get(s->meta.manager->environment, "TERM"))
-                if (!(our_env[n_env++] = strdup("TERM=linux"))) {
-                        r = -ENOMEM;
-                        goto fail;
-                }
-#endif
-
         if (!(final_env = strv_env_merge(2,
                                          s->meta.manager->environment,
                                          our_env,
index 5734368..cfbf7fd 100644 (file)
@@ -37,5 +37,18 @@ int main(int argc, char *argv[]) {
                 free(t);
         }
 
+        printf("%s\n", default_term_for_tty("/dev/tty23"));
+        printf("%s\n", default_term_for_tty("/dev/ttyS23"));
+        printf("%s\n", default_term_for_tty("/dev/tty0"));
+        printf("%s\n", default_term_for_tty("/dev/pty0"));
+        printf("%s\n", default_term_for_tty("/dev/pts/0"));
+        printf("%s\n", default_term_for_tty("/dev/console"));
+        printf("%s\n", default_term_for_tty("tty23"));
+        printf("%s\n", default_term_for_tty("ttyS23"));
+        printf("%s\n", default_term_for_tty("tty0"));
+        printf("%s\n", default_term_for_tty("pty0"));
+        printf("%s\n", default_term_for_tty("pts/0"));
+        printf("%s\n", default_term_for_tty("console"));
+
         return 0;
 }
index 7f9f2b3..fb2eea3 100644 (file)
@@ -3470,6 +3470,21 @@ void filter_environ(const char *prefix) {
         environ[j] = NULL;
 }
 
+const char *default_term_for_tty(const char *tty) {
+        assert(tty);
+
+        if (startswith(tty, "/dev/"))
+                tty += 5;
+
+        if (startswith(tty, "tty") &&
+            tty[3] >= '0' && tty[3] <= '9')
+                return "TERM=linux";
+
+        /* FIXME: Proper handling of /dev/console would be cool */
+
+        return "TERM=vt100-nav";
+}
+
 static const char *const ioprio_class_table[] = {
         [IOPRIO_CLASS_NONE] = "none",
         [IOPRIO_CLASS_RT] = "realtime",
index 63538fe..7e1eacc 100644 (file)
@@ -372,6 +372,8 @@ char *fstab_node_to_udev_node(const char *p);
 
 void filter_environ(const char *prefix);
 
+const char *default_term_for_tty(const char *tty);
+
 #define NULSTR_FOREACH(i, l)                                    \
         for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
 
index 52f875c..aa3d985 100644 (file)
@@ -15,7 +15,6 @@ Before=shutdown.target
 
 [Service]
 Environment=HOME=/root
-Environment=TERM=vt100-nav
 WorkingDirectory=/root
 ExecStartPre=-/bin/plymouth --hide-splash
 ExecStartPre=-/bin/echo 'Welcome to emergency mode. Use "systemctl default" or ^D to activate default mode.'
index 855924a..79f8f12 100644 (file)
@@ -14,7 +14,6 @@ Before=final.target
 
 [Service]
 Type=oneshot
-Environment=TERM=linux
 ExecStart=/sbin/halt.local
 TimeoutSec=0
 StandardOutput=tty
index 88846c1..a21a557 100644 (file)
@@ -11,7 +11,6 @@ ConditionPathExists=/etc/rc.local
 
 [Service]
 Type=forking
-Environment=TERM=linux
 ExecStart=/etc/rc.local start
 TimeoutSec=0
 StandardOutput=tty
index 11a71d7..d6bd9a9 100644 (file)
@@ -22,7 +22,6 @@ After=rc-local.service
 Before=getty.target
 
 [Service]
-Environment=TERM=linux
 ExecStart=-/sbin/agetty %I 38400
 Restart=always
 RestartSec=0
index d31282d..6e03c20 100644 (file)
@@ -16,7 +16,6 @@ Before=shutdown.target
 
 [Service]
 Environment=HOME=/root
-Environment=TERM=vt100-nav
 WorkingDirectory=/root
 ExecStartPre=-/bin/plymouth --hide-splash
 ExecStartPre=-/bin/echo 'Welcome to rescue mode. Use "systemctl default" or ^D to activate default mode.'
index da9bd19..d454dce 100644 (file)
@@ -22,7 +22,6 @@ After=rc-local.service
 Before=getty.target
 
 [Service]
-Environment=TERM=vt100-nav
 m4_ifdef(`TARGET_FEDORA',
 ExecStartPre=-/sbin/securetty %I
 )m4_dnl