mirror of
https://github.com/morgan9e/systemd
synced 2026-04-15 00:47:10 +09:00
run: tweak logic how we set $TERM for activated services
There are two cases when we invoke a service on a TTY: 1. We ourselves are connected to a TTY and would intend to enable PTY forwarding. 2. We are allocating a TTY but are not ourselves connected to a TTY and just want to input/output to pipe or other non-TTY fd. Let's propagate $TERM only as-is in the first case. In the 2nd case, let's explicitly set $TERM to "dumb", so that invoked progams do not issue needless ansi sequences, since we are not propagating them to a terminal either. This should be a much safer result, for cases where people include invocations of systemd-nspawn with full TTY allocation in a shell pipeline or so. (of course, the user can always explicitly override this)
This commit is contained in:
@@ -1233,7 +1233,7 @@ static int transient_kill_set_properties(sd_bus_message *m) {
|
||||
}
|
||||
|
||||
static int transient_service_set_properties(sd_bus_message *m, const char *pty_path, int pty_fd) {
|
||||
bool send_term = false;
|
||||
int send_term = false; /* tri-state */
|
||||
int r;
|
||||
|
||||
/* We disable environment expansion on the server side via ExecStartEx=:.
|
||||
@@ -1312,14 +1312,22 @@ static int transient_service_set_properties(sd_bus_message *m, const char *pty_p
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
send_term = isatty_safe(STDIN_FILENO) || isatty_safe(STDOUT_FILENO) || isatty_safe(STDERR_FILENO);
|
||||
send_term = -1;
|
||||
}
|
||||
|
||||
if (send_term) {
|
||||
if (send_term != 0) {
|
||||
const char *e;
|
||||
|
||||
e = getenv("TERM");
|
||||
if (e) {
|
||||
/* Propagate $TERM only if we are actually connected to a TTY */
|
||||
if (isatty_safe(STDIN_FILENO) || isatty_safe(STDOUT_FILENO) || isatty_safe(STDERR_FILENO)) {
|
||||
e = getenv("TERM");
|
||||
send_term = true;
|
||||
} else
|
||||
/* If we are not connected to any TTY ourselves, then send TERM=dumb, but only if we
|
||||
* really need to (because we actually allocated a TTY for the service) */
|
||||
e = "dumb";
|
||||
|
||||
if (send_term > 0) {
|
||||
_cleanup_free_ char *n = NULL;
|
||||
|
||||
n = strjoin("TERM=", e);
|
||||
|
||||
Reference in New Issue
Block a user