exec: automatically determine right TERM= setting based on tty name

This commit is contained in:
Lennart Poettering 2010-11-15 23:49:02 +01:00
parent 96a8cbfae1
commit e3aa71c38c
12 changed files with 41 additions and 19 deletions

2
TODO
View File

@ -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

View 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,

View 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,

View 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;
}

View 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",

View 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)

View 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.'

View File

@ -14,7 +14,6 @@ Before=final.target
[Service]
Type=oneshot
Environment=TERM=linux
ExecStart=/sbin/halt.local
TimeoutSec=0
StandardOutput=tty

View File

@ -11,7 +11,6 @@ ConditionPathExists=/etc/rc.local
[Service]
Type=forking
Environment=TERM=linux
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty

View 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

View 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.'

View 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