1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "bus-error.h"
#include "bus-locator.h"
#include "systemctl-daemon-reload.h"
#include "systemctl-util.h"
#include "systemctl.h"
int daemon_reload(enum action action, bool graceful) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
const char *method;
sd_bus *bus;
int r;
r = acquire_bus(BUS_MANAGER, &bus);
if (r < 0)
return r;
polkit_agent_open_maybe();
switch (action) {
case ACTION_RELOAD:
method = "Reload";
break;
case ACTION_REEXEC:
method = "Reexecute";
break;
default:
return -EINVAL;
}
r = bus_message_new_method_call(bus, &m, bus_systemd_mgr, method);
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);
/* On reexecution, we expect a disconnect, not a reply */
if (IN_SET(r, -ETIMEDOUT, -ECONNRESET) && action == ACTION_REEXEC)
return 1;
if (r < 0) {
if (graceful) { /* If graceful mode is selected, debug log, but don't fail */
log_debug_errno(r, "%s daemon failed via the bus, ignoring: %s",
method, bus_error_message(&error, r));
return 0;
}
return log_error_errno(r, "%s daemon failed: %s",
method, bus_error_message(&error, r));
}
return 1;
}
int verb_daemon_reload(int argc, char *argv[], void *userdata) {
enum action a;
int r;
assert(argc >= 1);
if (streq(argv[0], "daemon-reexec"))
a = ACTION_REEXEC;
else if (streq(argv[0], "daemon-reload"))
a = ACTION_RELOAD;
else
assert_not_reached();
r = daemon_reload(a, /* graceful= */ false);
if (r < 0)
return r;
return 0;
}
|