From 9c3359f28ab7976ac5e2f19a2f32d3b43a70b6c1 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 20 Oct 2025 09:29:08 +0200 Subject: [PATCH] ptyfwd: Always prioritize $SYSTEMD_TINT_BACKGROUND By giving priority to --background= we prevent users from opting out of coloring if an explicit color is chosen by a tool wrapping one of our own tools. Instead, let's give priority to the environment variable, so that even if our tools are wrapped by another tool with a different background, users can still opt out of coloring just by setting the environment variable, which has a high chance of being forwarded to the invocation of our own tools which makes it easy to use to disable color tinting globally if requested by the user. --- docs/ENVIRONMENT.md | 13 ++++++------- src/nspawn/nspawn.c | 2 +- src/run/run.c | 2 +- src/shared/ptyfwd.c | 9 ++++++++- src/vmspawn/vmspawn.c | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index caf0e421037..7632552f120 100644 --- a/docs/ENVIRONMENT.md +++ b/docs/ENVIRONMENT.md @@ -783,15 +783,14 @@ Tools using the Varlink protocol (such as `varlinkctl`) or sd-bus (such as `systemd-run`, `run0`, `systemd-nspawn`, `systemd-vmspawn`: -* `$SYSTEMD_TINT_BACKGROUND` – Takes a boolean. When false the automatic - tinting of the background for containers, VMs, and interactive `systemd-run` - and `run0` invocations is turned off. Note that this environment variable has - no effect if the background color is explicitly selected via the relevant - `--background=` switch of the tool. +* `$SYSTEMD_TINT_BACKGROUND` – Takes a boolean. When false the automatic and + explicit tinting of the background (via `--background=`) for containers, VMs, + `systemd-pty-forward` and interactive `systemd-run` and `run0` invocations is + turned off. * `$SYSTEMD_ADJUST_TERMINAL_TITLE` – Takes a boolean. When false the terminal - window title will not be updated for interactive invocation of the mentioned - tools. + window title will not be updated for interactive invocation of the tools + mentioned above. `systemd-hostnamed`, `systemd-importd`, `systemd-localed`, `systemd-machined`, `systemd-portabled`, `systemd-timedated`: diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 69f134bb754..3e4565e4a28 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -5646,7 +5646,7 @@ static int run_container( arg_console_width, arg_console_height); - if (!arg_background && shall_tint_background()) { + if (!arg_background) { _cleanup_free_ char *bg = NULL; r = terminal_tint_color(220 /* blue */, &bg); diff --git a/src/run/run.c b/src/run/run.c index 9f9e56a3c19..ae2bd4115ec 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -1161,7 +1161,7 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { if (strv_extend(&arg_property, "IgnoreSIGPIPE=no") < 0) return log_oom(); - if (!arg_background && arg_stdio == ARG_STDIO_PTY && shall_tint_background()) { + if (!arg_background && arg_stdio == ARG_STDIO_PTY) { double hue; if (privileged_execution()) diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index 6d2b07d2b4d..b3b2acd0fb3 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -19,6 +19,7 @@ #include "hostname-setup.h" #include "io-util.h" #include "log.h" +#include "pretty-print.h" #include "ptyfwd.h" #include "stat-util.h" #include "string-util.h" @@ -318,6 +319,9 @@ static int insert_background_color(PTYForward *f, size_t offset) { if (!f->background_color) return 0; + if (!shall_tint_background()) + return 0; + s = background_color_sequence(f); if (!s) return -ENOMEM; @@ -403,6 +407,9 @@ static int insert_background_fix(PTYForward *f, size_t offset) { if (!f->background_color) return 0; + if (!shall_tint_background()) + return 0; + if (!is_csi_background_reset_sequence(strempty(f->csi_sequence))) return 0; @@ -605,7 +612,7 @@ static int do_shovel(PTYForward *f) { * shovelling. Hence, possibly send some initial ANSI sequences. But do so only if we are * talking to an actual TTY. */ - if (f->background_color) { + if (f->background_color && shall_tint_background()) { /* Erase the first line when we start */ f->out_buffer = background_color_sequence(f); if (!f->out_buffer) diff --git a/src/vmspawn/vmspawn.c b/src/vmspawn/vmspawn.c index 14ff13c328d..c6d52cccb7f 100644 --- a/src/vmspawn/vmspawn.c +++ b/src/vmspawn/vmspawn.c @@ -2745,7 +2745,7 @@ static int run_virtual_machine(int kvm_device_fd, int vhost_device_fd) { if (r < 0) return log_error_errno(r, "Failed to create PTY forwarder: %m"); - if (!arg_background && shall_tint_background()) { + if (!arg_background) { _cleanup_free_ char *bg = NULL; r = terminal_tint_color(130 /* green */, &bg); -- 2.47.3