From: Luca Boccassi Date: Thu, 6 Nov 2025 14:54:47 +0000 (+0000) Subject: core: prepare reload/reexec for varlink X-Git-Tag: v259-rc1~53^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=00c084fe0276b664bc28cdbf0bb11c8e1302c82d;p=thirdparty%2Fsystemd.git core: prepare reload/reexec for varlink --- diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 26104423844..3f3d0f2d62f 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -1513,23 +1513,14 @@ static void log_caller(sd_bus_message *message, Manager *manager, const char *me assert(manager); assert(method); - if (sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT|SD_BUS_CREDS_COMM, &creds) < 0) + if (sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT, &creds) < 0) return; /* We need at least the PID, otherwise there's nothing to log, the rest is optional. */ if (bus_creds_get_pidref(creds, &pidref) < 0) return; - const char *comm = NULL; - Unit *caller; - - (void) sd_bus_creds_get_comm(creds, &comm); - caller = manager_get_unit_by_pidref(manager, &pidref); - - log_notice("%s requested from client PID " PID_FMT "%s%s%s%s%s%s...", - method, pidref.pid, - comm ? " ('" : "", strempty(comm), comm ? "')" : "", - caller ? " (unit " : "", caller ? caller->id : "", caller ? ")" : ""); + manager_log_caller(manager, &pidref, method); } static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error *error) { @@ -1564,8 +1555,8 @@ static int method_reload(sd_bus_message *message, void *userdata, sd_bus_error * * is finished. That way the caller knows when the reload * finished. */ - assert(!m->pending_reload_message); - r = sd_bus_message_new_method_return(message, &m->pending_reload_message); + assert(!m->pending_reload_message_dbus); + r = sd_bus_message_new_method_return(message, &m->pending_reload_message_dbus); if (r < 0) return r; diff --git a/src/core/dbus.c b/src/core/dbus.c index e29354fd740..4d6623502d0 100644 --- a/src/core/dbus.c +++ b/src/core/dbus.c @@ -56,17 +56,17 @@ void bus_send_pending_reload_message(Manager *m) { assert(m); - if (!m->pending_reload_message) + if (!m->pending_reload_message_dbus) return; /* If we cannot get rid of this message we won't dispatch any D-Bus messages, so that we won't end up wanting * to queue another message. */ - r = sd_bus_message_send(m->pending_reload_message); + r = sd_bus_message_send(m->pending_reload_message_dbus); if (r < 0) log_warning_errno(r, "Failed to send queued reload message, ignoring: %m"); - m->pending_reload_message = sd_bus_message_unref(m->pending_reload_message); + m->pending_reload_message_dbus = sd_bus_message_unref(m->pending_reload_message_dbus); return; } @@ -1004,8 +1004,8 @@ static void destroy_bus(Manager *m, sd_bus **bus) { } /* Get rid of queued message on this bus */ - if (m->pending_reload_message && sd_bus_message_get_bus(m->pending_reload_message) == *bus) - m->pending_reload_message = sd_bus_message_unref(m->pending_reload_message); + if (m->pending_reload_message_dbus && sd_bus_message_get_bus(m->pending_reload_message_dbus) == *bus) + m->pending_reload_message_dbus = sd_bus_message_unref(m->pending_reload_message_dbus); /* Possibly flush unwritten data, but only if we are * unprivileged, since we don't want to sync here */ diff --git a/src/core/manager.c b/src/core/manager.c index b501d3f1c5b..f8b748a4acd 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2570,7 +2570,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) { /* When we are reloading, let's not wait with generating signals, since we need to exit the manager as quickly * as we can. There's no point in throttling generation of signals in that case. */ - if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message) + if (MANAGER_IS_RELOADING(m) || m->send_reloading_done || m->pending_reload_message_dbus) budget = UINT_MAX; /* infinite budget in this case */ else { /* Anything to do at all? */ @@ -2623,7 +2623,7 @@ static unsigned manager_dispatch_dbus_queue(Manager *m) { n++; } - if (m->pending_reload_message) { + if (m->pending_reload_message_dbus) { bus_send_pending_reload_message(m); n++; } @@ -5197,6 +5197,22 @@ LogTarget manager_get_executor_log_target(Manager *m) { return log_get_target(); } +void manager_log_caller(Manager *manager, PidRef *caller, const char *method) { + _cleanup_free_ char *comm = NULL; + + assert(manager); + assert(pidref_is_set(caller)); + assert(method); + + (void) pidref_get_comm(caller, &comm); + Unit *caller_unit = manager_get_unit_by_pidref(manager, caller); + + log_notice("%s requested from client PID " PID_FMT "%s%s%s%s%s%s...", + method, caller->pid, + comm ? " ('" : "", strempty(comm), comm ? "')" : "", + caller_unit ? " (unit " : "", caller_unit ? caller_unit->id : "", caller_unit ? ")" : ""); +} + static const char* const manager_state_table[_MANAGER_STATE_MAX] = { [MANAGER_INITIALIZING] = "initializing", [MANAGER_STARTING] = "starting", diff --git a/src/core/manager.h b/src/core/manager.h index b7ee766b05d..8c57c1d9a25 100644 --- a/src/core/manager.h +++ b/src/core/manager.h @@ -317,7 +317,7 @@ typedef struct Manager { /* This is used during reloading: before the reload we queue * the reply message here, and afterwards we send it */ - sd_bus_message *pending_reload_message; + sd_bus_message *pending_reload_message_dbus; Hashmap *watch_bus; /* D-Bus names => Unit object n:1 */ @@ -636,6 +636,8 @@ int manager_override_watchdog_pretimeout_governor(Manager *m, const char *govern LogTarget manager_get_executor_log_target(Manager *m); +void manager_log_caller(Manager *manager, PidRef *caller, const char *method); + int manager_allocate_idle_pipe(Manager *m); void unit_defaults_init(UnitDefaults *defaults, RuntimeScope scope);