From 8496b938ab28e039a37fad820d788eef82517d9c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 1 Feb 2024 10:43:44 +0100 Subject: [PATCH] run: set window title In interactive terminal mode, let's set a window title that reflects our change of context to the target. Let's prefix it it with red/yellow emoji dot in case we changed privileges. --- src/run/run.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/run/run.c b/src/run/run.c index a695fea0f07..b42ed442310 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -22,6 +22,7 @@ #include "exit-status.h" #include "fd-util.h" #include "format-util.h" +#include "hostname-util.h" #include "main-func.h" #include "parse-argument.h" #include "parse-util.h" @@ -188,6 +189,13 @@ static int help_sudo_mode(void) { return 0; } +static bool privileged_execution(void) { + if (arg_runtime_scope != RUNTIME_SCOPE_SYSTEM) + return false; + + return !arg_exec_user || STR_IN_SET(arg_exec_user, "root", "0"); +} + static int add_timer_property(const char *name, const char *val) { char *p; @@ -941,7 +949,7 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { if (!arg_background && arg_stdio == ARG_STDIO_PTY) { double hue; - if (!arg_exec_user || STR_IN_SET(arg_exec_user, "root", "0")) + if (privileged_execution()) hue = 0; /* red */ else hue = 60 /* yellow */; @@ -1584,6 +1592,26 @@ static int acquire_invocation_id(sd_bus *bus, const char *unit, sd_id128_t *ret) return !sd_id128_is_null(*ret); } +static void set_window_title(PTYForward *f) { + _cleanup_free_ char *hn = NULL, *cl = NULL, *dot = NULL; + assert(f); + + if (!arg_host) + (void) gethostname_strict(&hn); + + cl = strv_join(arg_cmdline, " "); + if (!cl) + return (void) log_oom(); + + if (emoji_enabled()) + dot = strjoin(special_glyph(privileged_execution() ? SPECIAL_GLYPH_RED_CIRCLE : SPECIAL_GLYPH_YELLOW_CIRCLE), " "); + + if (arg_host || hn) + (void) pty_forward_set_titlef(f, "%s%s on %s", strempty(dot), cl, arg_host ?: hn); + else + (void) pty_forward_set_titlef(f, "%s%s", strempty(dot), cl); +} + static int start_transient_service(sd_bus *bus) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -1739,6 +1767,8 @@ static int start_transient_service(sd_bus *bus) { if (!isempty(arg_background)) (void) pty_forward_set_background_color(c.forward, arg_background); + + set_window_title(c.forward); } path = unit_dbus_path_from_name(service); -- 2.47.3