mirror of
https://github.com/systemd/systemd.git
synced 2024-11-27 12:13:33 +08:00
exec: automatically determine right TERM= setting based on tty name
This commit is contained in:
parent
96a8cbfae1
commit
e3aa71c38c
2
TODO
2
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
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
15
src/util.c
15
src/util.c
@ -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",
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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.'
|
||||
|
@ -14,7 +14,6 @@ Before=final.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
Environment=TERM=linux
|
||||
ExecStart=/sbin/halt.local
|
||||
TimeoutSec=0
|
||||
StandardOutput=tty
|
||||
|
@ -11,7 +11,6 @@ ConditionPathExists=/etc/rc.local
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
Environment=TERM=linux
|
||||
ExecStart=/etc/rc.local start
|
||||
TimeoutSec=0
|
||||
StandardOutput=tty
|
||||
|
@ -22,7 +22,6 @@ After=rc-local.service
|
||||
Before=getty.target
|
||||
|
||||
[Service]
|
||||
Environment=TERM=linux
|
||||
ExecStart=-/sbin/agetty %I 38400
|
||||
Restart=always
|
||||
RestartSec=0
|
||||
|
@ -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.'
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user