]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
bus-unit-util: add common code for reloading PID 1
authorLennart Poettering <lennart@poettering.net>
Wed, 5 Jul 2023 15:54:01 +0000 (17:54 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 10 Jul 2023 14:39:16 +0000 (16:39 +0200)
We have this very similar code in various places, and it#s not entirely
obvious (since we want a prolonged timeout for the reload), hence unify
this at one place.

src/firstboot/firstboot.c
src/fstab-generator/fstab-generator.c
src/locale/localed.c
src/machine/machinectl.c
src/portable/portablectl.c
src/shared/bus-unit-util.c
src/shared/bus-unit-util.h
src/sulogin-shell/sulogin-shell.c

index b993739083fa0b84f56ea28ef594882c34e70fc9..1956ab3b1356fc2dc098b9e858637320e3dd585e 100644 (file)
@@ -12,6 +12,7 @@
 #include "build.h"
 #include "bus-error.h"
 #include "bus-locator.h"
+#include "bus-unit-util.h"
 #include "bus-util.h"
 #include "bus-wait-for-jobs.h"
 #include "chase.h"
@@ -1574,7 +1575,6 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 static int reload_system_manager(sd_bus **bus) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
         assert(bus);
@@ -1585,9 +1585,10 @@ static int reload_system_manager(sd_bus **bus) {
                         return bus_log_connect_error(r, BUS_TRANSPORT_LOCAL);
         }
 
-        r = bus_call_method(*bus, bus_systemd_mgr, "Reload", &error, NULL, NULL);
+        r = bus_service_manager_reload(*bus);
         if (r < 0)
-                return log_error_errno(r, "Failed to issue method call: %s", bus_error_message(&error, r));
+                return r;
+
         log_info("Requested manager reload to apply locale configuration.");
         return 0;
 }
index b39d93195ab8ca80ab85728a2769a23a703576e3..660a98ab92e502c04acbdd66c139d5b401c508f9 100644 (file)
@@ -7,6 +7,7 @@
 #include "alloc-util.h"
 #include "bus-error.h"
 #include "bus-locator.h"
+#include "bus-unit-util.h"
 #include "chase.h"
 #include "creds-util.h"
 #include "efi-loader.h"
@@ -712,7 +713,6 @@ static int add_mount(
 
 static int do_daemon_reload(void) {
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r, k;
 
@@ -722,13 +722,9 @@ static int do_daemon_reload(void) {
         if (r < 0)
                 return log_error_errno(r, "Failed to get D-Bus connection: %m");
 
-        r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, "Reload");
+        r = bus_service_manager_reload(bus);
         if (r < 0)
-                return bus_log_create_error(r);
-
-        r = sd_bus_call(bus, m, DAEMON_RELOAD_TIMEOUT_SEC, &error, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
+                return r;
 
         /* We need to requeue the two targets so that any new units which previously were not part of the
          * targets, and which we now added, will be started. */
index 9e5b7b03c031ee1bf46e891ed79035e6d54c4a30..f544a735804242c2b79d340353d30bf482aa7cae 100644 (file)
@@ -13,6 +13,7 @@
 #include "bus-log-control-api.h"
 #include "bus-message.h"
 #include "bus-polkit.h"
+#include "bus-unit-util.h"
 #include "constants.h"
 #include "kbd-util.h"
 #include "localed-util.h"
 #include "strv.h"
 #include "user-util.h"
 
-static int reload_system_manager(sd_bus *bus) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        int r;
-
-        assert(bus);
-
-        r = bus_call_method(bus, bus_systemd_mgr, "Reload", &error, NULL, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to reload system manager: %s", bus_error_message(&error, r));
-        return 0;
-}
-
 static int vconsole_reload(sd_bus *bus) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
@@ -326,7 +315,7 @@ static int method_set_locale(sd_bus_message *m, void *userdata, sd_bus_error *er
          * update its default locale settings. It's important to not use UnsetAndSetEnvironment or a similar
          * method because in this case unsetting variables means restoring them to PID1 default values, which
          * may be outdated, since locale.conf has just changed and PID1 hasn't read it */
-        (void) reload_system_manager(sd_bus_message_get_bus(m));
+        (void) bus_service_manager_reload(sd_bus_message_get_bus(m));
 
         if (!strv_isempty(l_set)) {
                 _cleanup_free_ char *line = NULL;
index 83ecfa7abaa068ad9997a8b6a05477f968b4162d..7746ecba1a13e954b84dd1fcf0597b8f0b294e2d 100644 (file)
@@ -1822,9 +1822,9 @@ static int enable_machine(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
-        r = bus_call_method(bus, bus_systemd_mgr, "Reload", &error, NULL, NULL);
+        r = bus_service_manager_reload(bus);
         if (r < 0)
-                return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
+                return r;
 
         if (arg_now) {
                 _cleanup_strv_free_ char **new_args = NULL;
index 8744ba75fe412e44ea7736c3977c6db68bcfdaba..e77ee50dab2f464978bd51979e1335f099c0a10f 100644 (file)
@@ -231,8 +231,6 @@ static int acquire_bus(sd_bus **bus) {
 }
 
 static int maybe_reload(sd_bus **bus) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
         int r;
 
         if (!arg_reload)
@@ -242,16 +240,7 @@ static int maybe_reload(sd_bus **bus) {
         if (r < 0)
                 return r;
 
-        r = bus_message_new_method_call(*bus, &m, bus_systemd_mgr, "Reload");
-        if (r < 0)
-                return bus_log_create_error(r);
-
-        /* Reloading the daemon may take long, hence set a longer timeout here */
-        r = sd_bus_call(*bus, m, DAEMON_RELOAD_TIMEOUT_SEC, &error, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
-
-        return 0;
+        return bus_service_manager_reload(*bus);
 }
 
 static int get_image_metadata(sd_bus *bus, const char *image, char **matches, sd_bus_message **reply) {
index 494484f0bf0db01c7d2357f0ce46dd8fd536bbe4..e7b44cc39bac7e552389143944e2cb0be294e625 100644 (file)
@@ -3,6 +3,7 @@
 #include "af-list.h"
 #include "alloc-util.h"
 #include "bus-error.h"
+#include "bus-locator.h"
 #include "bus-unit-util.h"
 #include "bus-util.h"
 #include "cap-list.h"
@@ -2811,3 +2812,22 @@ int unit_info_compare(const UnitInfo *a, const UnitInfo *b) {
         /* Third, order by name */
         return strcasecmp(a->id, b->id);
 }
+
+int bus_service_manager_reload(sd_bus *bus) {
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
+        int r;
+
+        assert(bus);
+
+        r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, "Reload");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        /* Reloading the daemon may take long, hence set a longer timeout here */
+        r = sd_bus_call(bus, m, DAEMON_RELOAD_TIMEOUT_SEC, &error, NULL);
+        if (r < 0)
+                return log_error_errno(r, "Failed to reload service manager: %s", bus_error_message(&error, r));
+
+        return 0;
+}
index 97d84708b429d68056716adfab2c9f12cfe69edd..267d516cbff920a5f47b9b947c61c905fe5dfffd 100644 (file)
@@ -30,3 +30,5 @@ int bus_deserialize_and_dump_unit_file_changes(sd_bus_message *m, bool quiet);
 int unit_load_state(sd_bus *bus, const char *name, char **load_state);
 
 int unit_info_compare(const UnitInfo *a, const UnitInfo *b);
+
+int bus_service_manager_reload(sd_bus *bus);
index e81bb527ff8a524aec1128d6ac99898abc0f0fd4..068ab3f4a0e96bdc154013c193e30678ae2da546 100644 (file)
@@ -8,43 +8,21 @@
 
 #include "sd-bus.h"
 
+#include "bus-error.h"
 #include "bus-locator.h"
+#include "bus-unit-util.h"
 #include "bus-util.h"
-#include "bus-error.h"
 #include "constants.h"
 #include "env-util.h"
 #include "initrd-util.h"
 #include "log.h"
 #include "main-func.h"
-#include "process-util.h"
 #include "proc-cmdline.h"
+#include "process-util.h"
 #include "signal-util.h"
 #include "special.h"
 #include "unit-def.h"
 
-static int reload_manager(sd_bus *bus) {
-        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
-        int r;
-
-        log_info("Reloading system manager configuration");
-
-        r = bus_message_new_method_call(
-                        bus,
-                        &m,
-                        bus_systemd_mgr,
-                        "Reload");
-        if (r < 0)
-                return bus_log_create_error(r);
-
-        /* Reloading the daemon may take long, hence set a longer timeout here */
-        r = sd_bus_call(bus, m, DAEMON_RELOAD_TIMEOUT_SEC, &error, NULL);
-        if (r < 0)
-                return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
-
-        return 0;
-}
-
 static int target_is_inactive(sd_bus *bus, const char *target) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_free_ char *path = NULL, *state = NULL;
@@ -151,7 +129,9 @@ static int run(int argc, char *argv[]) {
                         goto fallback;
                 }
 
-                if (reload_manager(bus) < 0)
+                log_info("Reloading system manager configuration.");
+                r = bus_service_manager_reload(bus);
+                if (r < 0)
                         goto fallback;
 
                 const char *target = in_initrd() ? SPECIAL_INITRD_TARGET : SPECIAL_DEFAULT_TARGET;