]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/systemctl/systemctl-daemon-reload.c
Merge pull request #17549 from yuwata/tiny-fixes
[thirdparty/systemd.git] / src / systemctl / systemctl-daemon-reload.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
daf71ef6
LP
2
3#include "bus-error.h"
4#include "bus-locator.h"
5#include "systemctl-daemon-reload.h"
6#include "systemctl-util.h"
7#include "systemctl.h"
8
9int daemon_reload(int argc, char *argv[], void *userdata) {
10 _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
11 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
12 const char *method;
13 sd_bus *bus;
14 int r;
15
16 r = acquire_bus(BUS_MANAGER, &bus);
17 if (r < 0)
18 return r;
19
20 polkit_agent_open_maybe();
21
22 switch (arg_action) {
23
24 case ACTION_RELOAD:
25 method = "Reload";
26 break;
27
28 case ACTION_REEXEC:
29 method = "Reexecute";
30 break;
31
32 case ACTION_SYSTEMCTL:
33 method = streq(argv[0], "daemon-reexec") ? "Reexecute" :
34 /* "daemon-reload" */ "Reload";
35 break;
36
37 default:
38 assert_not_reached("Unexpected action");
39 }
40
41 r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, method);
42 if (r < 0)
43 return bus_log_create_error(r);
44
45 /* Note we use an extra-long timeout here. This is because a reload or reexec means generators are
46 * rerun which are timed out after DEFAULT_TIMEOUT_USEC. Let's use twice that time here, so that the
47 * generators can have their timeout, and for everything else there's the same time budget in
48 * place. */
49
50 r = sd_bus_call(bus, m, DEFAULT_TIMEOUT_USEC * 2, &error, NULL);
51
52 /* On reexecution, we expect a disconnect, not a reply */
53 if (IN_SET(r, -ETIMEDOUT, -ECONNRESET) && streq(method, "Reexecute"))
54 r = 0;
55
56 if (r < 0 && arg_action == ACTION_SYSTEMCTL)
57 return log_error_errno(r, "Failed to reload daemon: %s", bus_error_message(&error, r));
58
59 /* Note that for the legacy commands (i.e. those with action != ACTION_SYSTEMCTL) we support
60 * fallbacks to the old ways of doing things, hence don't log any error in that case here. */
61
62 return r < 0 ? r : 0;
63}