execute: set TERM even if we don't open the tty on our own

This way, when a tty path is configured TERM is set, which is nice to
set a useful term for gettys.
This commit is contained in:
Lennart Poettering 2013-12-18 17:41:16 +01:00
parent ddae67fa1b
commit 7cae38c4fa
1 changed files with 78 additions and 20 deletions

View File

@ -1017,6 +1017,81 @@ static void do_idle_pipe_dance(int idle_pipe[4]) {
close_nointr_nofail(idle_pipe[3]);
}
static int build_environment(
ExecContext *c,
unsigned n_fds,
const char *home,
const char *username,
const char *shell,
char ***ret) {
_cleanup_strv_free_ char **our_env = NULL;
unsigned n_env = 0;
char *x;
assert(c);
assert(ret);
our_env = new(char*, 8);
if (!our_env)
return -ENOMEM;
if (n_fds > 0) {
if (asprintf(&x, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0)
return -ENOMEM;
our_env[n_env++] = x;
if (asprintf(&x, "LISTEN_FDS=%u", n_fds) < 0)
return -ENOMEM;
our_env[n_env++] = x;
}
if (home) {
x = strappend("HOME=", home);
if (!x)
return -ENOMEM;
our_env[n_env++] = x;
}
if (username) {
x = strappend("LOGNAME=", username);
if (!x)
return -ENOMEM;
our_env[n_env++] = x;
x = strappend("USER=", username);
if (!x)
return -ENOMEM;
our_env[n_env++] = x;
}
if (shell) {
x = strappend("SHELL=", shell);
if (!x)
return -ENOMEM;
our_env[n_env++] = x;
}
if (is_terminal_input(c->std_input) ||
c->std_output == EXEC_OUTPUT_TTY ||
c->std_error == EXEC_OUTPUT_TTY ||
c->tty_path) {
x = strdup(default_term_for_tty(tty_path(c)));
if (!x)
return -ENOMEM;
our_env[n_env++] = x;
}
our_env[n_env++] = NULL;
assert(n_env <= 8);
*ret = our_env;
our_env = NULL;
return 0;
}
int exec_spawn(ExecCommand *command,
char **argv,
ExecContext *context,
@ -1089,7 +1164,7 @@ int exec_spawn(ExecCommand *command,
if (pid == 0) {
_cleanup_strv_free_ char **our_env = NULL, **pam_env = NULL, **final_env = NULL, **final_argv = NULL;
const char *username = NULL, *home = NULL, *shell = NULL;
unsigned n_dont_close = 0, n_env = 0;
unsigned n_dont_close = 0;
int dont_close[n_fds + 3];
uid_t uid = (uid_t) -1;
gid_t gid = (gid_t) -1;
@ -1485,29 +1560,12 @@ int exec_spawn(ExecCommand *command,
}
}
our_env = new(char*, 8);
if (!our_env ||
(n_fds > 0 && (
asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 ||
asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0)) ||
(home && asprintf(our_env + n_env++, "HOME=%s", home) < 0) ||
(username && (
asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 ||
asprintf(our_env + n_env++, "USER=%s", username) < 0)) ||
(shell && asprintf(our_env + n_env++, "SHELL=%s", shell) < 0) ||
((is_terminal_input(context->std_input) ||
context->std_output == EXEC_OUTPUT_TTY ||
context->std_error == EXEC_OUTPUT_TTY) && (
!(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))))) {
err = -ENOMEM;
err = build_environment(context, n_fds, home, username, shell, &our_env);
if (r < 0) {
r = EXIT_MEMORY;
goto fail_child;
}
our_env[n_env++] = NULL;
assert(n_env <= 8);
final_env = strv_env_merge(5,
environment,
our_env,