From 4a6fe5f05e6735a0f3ca331a5deec0544c13ec94 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 16 Jan 2024 11:01:28 +0100 Subject: [PATCH] varlink: also honour new env var $SYSTEMD_VARLINK_LISTEN in varlink_server_listen_auto() varlink_server_listen_auto() is supposed to be the one-stop solution for turning simple command line tools into IPC services. They aren't easy to test/debug however, since you have to invoke them through a service manager. Let's make this easier: if the SYSTEMD_VARLINK_LISTEN env var is set, let's listen on the socket specified therein. This makes things easier to gdb: just run the service from the cmdline. --- docs/ENVIRONMENT.md | 5 +++++ src/shared/varlink.c | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/docs/ENVIRONMENT.md b/docs/ENVIRONMENT.md index c96e6db85ea..454a02991d9 100644 --- a/docs/ENVIRONMENT.md +++ b/docs/ENVIRONMENT.md @@ -616,3 +616,8 @@ Tools using the Varlink protocol (such as `varlinkctl`) or sd-bus (such as * `$SYSTEMD_SSH` – the ssh binary to invoke when the `ssh:` transport is used. May be a filename (which is searched for in `$PATH`) or absolute path. + +* `$SYSTEMD_VARLINK_LISTEN` – interpreted by some tools that provide a Varlink + service. Takes a file system path: if specified the tool will listen on an + `AF_UNIX` stream socket on the specified path in addition to whatever else it + would listen on. diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 67ed7652336..699d21745f1 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -3477,6 +3477,14 @@ int varlink_server_listen_auto(VarlinkServer *s) { n++; } + /* For debug purposes let's listen on an explicitly specified address */ + const char *e = secure_getenv("SYSTEMD_VARLINK_LISTEN"); + if (e) { + r = varlink_server_listen_address(s, e, FLAGS_SET(s->flags, VARLINK_SERVER_ROOT_ONLY) ? 0600 : 0666); + if (r < 0) + return r; + } + return n; } @@ -3922,6 +3930,10 @@ int varlink_invocation(VarlinkInvocationFlags flags) { /* Returns true if this is a "pure" varlink server invocation, i.e. with one fd passed. */ + const char *e = secure_getenv("SYSTEMD_VARLINK_LISTEN"); /* Permit a manual override for testing purposes */ + if (e) + return true; + r = sd_listen_fds_with_names(/* unset_environment= */ false, &names); if (r < 0) return r;