139 lines
4.9 KiB
C
139 lines
4.9 KiB
C
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
|
|
#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;
|
|
}
|