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
|
* 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
|
* 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;
|
r = EXIT_MEMORY;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@ -1277,7 +1277,15 @@ int exec_spawn(ExecCommand *command,
|
|||||||
goto fail;
|
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(
|
if (!(final_env = strv_env_merge(
|
||||||
4,
|
4,
|
||||||
|
@ -1609,16 +1609,6 @@ static int service_spawn(
|
|||||||
goto fail;
|
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,
|
if (!(final_env = strv_env_merge(2,
|
||||||
s->meta.manager->environment,
|
s->meta.manager->environment,
|
||||||
our_env,
|
our_env,
|
||||||
|
@ -37,5 +37,18 @@ int main(int argc, char *argv[]) {
|
|||||||
free(t);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
15
src/util.c
15
src/util.c
@ -3470,6 +3470,21 @@ void filter_environ(const char *prefix) {
|
|||||||
environ[j] = NULL;
|
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[] = {
|
static const char *const ioprio_class_table[] = {
|
||||||
[IOPRIO_CLASS_NONE] = "none",
|
[IOPRIO_CLASS_NONE] = "none",
|
||||||
[IOPRIO_CLASS_RT] = "realtime",
|
[IOPRIO_CLASS_RT] = "realtime",
|
||||||
|
@ -372,6 +372,8 @@ char *fstab_node_to_udev_node(const char *p);
|
|||||||
|
|
||||||
void filter_environ(const char *prefix);
|
void filter_environ(const char *prefix);
|
||||||
|
|
||||||
|
const char *default_term_for_tty(const char *tty);
|
||||||
|
|
||||||
#define NULSTR_FOREACH(i, l) \
|
#define NULSTR_FOREACH(i, l) \
|
||||||
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
|
for ((i) = (l); (i) && *(i); (i) = strchr((i), 0)+1)
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ Before=shutdown.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=HOME=/root
|
Environment=HOME=/root
|
||||||
Environment=TERM=vt100-nav
|
|
||||||
WorkingDirectory=/root
|
WorkingDirectory=/root
|
||||||
ExecStartPre=-/bin/plymouth --hide-splash
|
ExecStartPre=-/bin/plymouth --hide-splash
|
||||||
ExecStartPre=-/bin/echo 'Welcome to emergency mode. Use "systemctl default" or ^D to activate default mode.'
|
ExecStartPre=-/bin/echo 'Welcome to emergency mode. Use "systemctl default" or ^D to activate default mode.'
|
||||||
|
@ -14,7 +14,6 @@ Before=final.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
Environment=TERM=linux
|
|
||||||
ExecStart=/sbin/halt.local
|
ExecStart=/sbin/halt.local
|
||||||
TimeoutSec=0
|
TimeoutSec=0
|
||||||
StandardOutput=tty
|
StandardOutput=tty
|
||||||
|
@ -11,7 +11,6 @@ ConditionPathExists=/etc/rc.local
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=forking
|
||||||
Environment=TERM=linux
|
|
||||||
ExecStart=/etc/rc.local start
|
ExecStart=/etc/rc.local start
|
||||||
TimeoutSec=0
|
TimeoutSec=0
|
||||||
StandardOutput=tty
|
StandardOutput=tty
|
||||||
|
@ -22,7 +22,6 @@ After=rc-local.service
|
|||||||
Before=getty.target
|
Before=getty.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=TERM=linux
|
|
||||||
ExecStart=-/sbin/agetty %I 38400
|
ExecStart=-/sbin/agetty %I 38400
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=0
|
RestartSec=0
|
||||||
|
@ -16,7 +16,6 @@ Before=shutdown.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=HOME=/root
|
Environment=HOME=/root
|
||||||
Environment=TERM=vt100-nav
|
|
||||||
WorkingDirectory=/root
|
WorkingDirectory=/root
|
||||||
ExecStartPre=-/bin/plymouth --hide-splash
|
ExecStartPre=-/bin/plymouth --hide-splash
|
||||||
ExecStartPre=-/bin/echo 'Welcome to rescue mode. Use "systemctl default" or ^D to activate default mode.'
|
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
|
Before=getty.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Environment=TERM=vt100-nav
|
|
||||||
m4_ifdef(`TARGET_FEDORA',
|
m4_ifdef(`TARGET_FEDORA',
|
||||||
ExecStartPre=-/sbin/securetty %I
|
ExecStartPre=-/sbin/securetty %I
|
||||||
)m4_dnl
|
)m4_dnl
|
||||||
|
Loading…
Reference in New Issue
Block a user