daf71ef61c
This is just some refactoring: shifting around of code, not change in codeflow. This splits up the way too huge systemctl.c in multiple more easily digestable files. It roughly follows the rule that each family of verbs gets its own .c/.h file pair, and so do all the compat executable names we support. Plus three extra files for sysv compat (which existed before already, but I renamed slightly, to get the systemctl- prefix lik everything else), a -util file with generic stuff everything uses, and a -logind file with everything that talks directly to logind instead of PID1. systemctl is still a bit too complex for my taste, but I think this way itc omes in a more digestable bits at least. No change of behaviour, just reshuffling of some code.
139 lines
4.9 KiB
C
139 lines
4.9 KiB
C
/* SPDX-License-Identifier: LGPL-2.1+ */
|
|
|
|
#include "bus-error.h"
|
|
#include "bus-locator.h"
|
|
#include "systemctl-is-enabled.h"
|
|
#include "systemctl-sysv-compat.h"
|
|
#include "systemctl-util.h"
|
|
#include "systemctl.h"
|
|
|
|
static int show_installation_targets_client_side(const char *name) {
|
|
UnitFileChange *changes = NULL;
|
|
size_t n_changes = 0, i;
|
|
UnitFileFlags flags;
|
|
char **p;
|
|
int r;
|
|
|
|
p = STRV_MAKE(name);
|
|
flags = UNIT_FILE_DRY_RUN |
|
|
(arg_runtime ? UNIT_FILE_RUNTIME : 0);
|
|
|
|
r = unit_file_disable(UNIT_FILE_SYSTEM, flags, NULL, p, &changes, &n_changes);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to get file links for %s: %m", name);
|
|
|
|
for (i = 0; i < n_changes; i++)
|
|
if (changes[i].type == UNIT_FILE_UNLINK)
|
|
printf(" %s\n", changes[i].path);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int show_installation_targets(sd_bus *bus, const char *name) {
|
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
const char *link;
|
|
int r;
|
|
|
|
r = bus_call_method(bus, bus_systemd_mgr, "GetUnitFileLinks", &error, &reply, "sb", name, arg_runtime);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to get unit file links for %s: %s", name, bus_error_message(&error, r));
|
|
|
|
r = sd_bus_message_enter_container(reply, SD_BUS_TYPE_ARRAY, "s");
|
|
if (r < 0)
|
|
return bus_log_parse_error(r);
|
|
|
|
while ((r = sd_bus_message_read(reply, "s", &link)) > 0)
|
|
printf(" %s\n", link);
|
|
|
|
if (r < 0)
|
|
return bus_log_parse_error(r);
|
|
|
|
r = sd_bus_message_exit_container(reply);
|
|
if (r < 0)
|
|
return bus_log_parse_error(r);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int unit_is_enabled(int argc, char *argv[], void *userdata) {
|
|
_cleanup_strv_free_ char **names = NULL;
|
|
bool enabled;
|
|
char **name;
|
|
int r;
|
|
|
|
r = mangle_names("to check", strv_skip(argv, 1), &names);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
r = enable_sysv_units(argv[0], names);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
enabled = r > 0;
|
|
|
|
if (install_client_side()) {
|
|
STRV_FOREACH(name, names) {
|
|
UnitFileState state;
|
|
|
|
r = unit_file_get_state(arg_scope, arg_root, *name, &state);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to get unit file state for %s: %m", *name);
|
|
|
|
if (IN_SET(state,
|
|
UNIT_FILE_ENABLED,
|
|
UNIT_FILE_ENABLED_RUNTIME,
|
|
UNIT_FILE_STATIC,
|
|
UNIT_FILE_ALIAS,
|
|
UNIT_FILE_INDIRECT,
|
|
UNIT_FILE_GENERATED))
|
|
enabled = true;
|
|
|
|
if (!arg_quiet) {
|
|
puts(unit_file_state_to_string(state));
|
|
if (arg_full) {
|
|
r = show_installation_targets_client_side(*name);
|
|
if (r < 0)
|
|
return r;
|
|
}
|
|
}
|
|
}
|
|
|
|
r = 0;
|
|
} else {
|
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
sd_bus *bus;
|
|
|
|
r = acquire_bus(BUS_MANAGER, &bus);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
STRV_FOREACH(name, names) {
|
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
|
const char *s;
|
|
|
|
r = bus_call_method(bus, bus_systemd_mgr, "GetUnitFileState", &error, &reply, "s", *name);
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to get unit file state for %s: %s", *name, bus_error_message(&error, r));
|
|
|
|
r = sd_bus_message_read(reply, "s", &s);
|
|
if (r < 0)
|
|
return bus_log_parse_error(r);
|
|
|
|
if (STR_IN_SET(s, "enabled", "enabled-runtime", "static", "indirect", "generated"))
|
|
enabled = true;
|
|
|
|
if (!arg_quiet) {
|
|
puts(s);
|
|
if (arg_full) {
|
|
r = show_installation_targets(bus, *name);
|
|
if (r < 0)
|
|
return r;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return enabled ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|