diff --git a/man/systemctl.xml b/man/systemctl.xml index ceec7b0479..e8d5f9f4d8 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -507,17 +507,17 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err list-dependencies - UNIT + UNIT... Shows units required and wanted by the specified - unit. This recursively lists units following the + units. This recursively lists units following the Requires=, Requisite=, ConsistsOf=, Wants=, BindsTo= - dependencies. If no unit is specified, + dependencies. If no units are specified, default.target is implied. By default, only target units are recursively diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index f44db4ffc3..146e2263f3 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -785,6 +785,8 @@ static int list_dependencies_get_dependencies(sd_bus *bus, const char *name, cha if (r < 0) return log_error_errno(r, "Failed to get properties of %s: %s", name, bus_error_message(&error, r)); + strv_uniq(deps); /* Sometimes a unit might have multiple deps on the other unit, + * but we still want to show it just once. */ *ret = TAKE_PTR(deps); return 0; @@ -1786,30 +1788,39 @@ static int list_dependencies_one( } static int list_dependencies(int argc, char *argv[], void *userdata) { - _cleanup_strv_free_ char **units = NULL; - _cleanup_free_ char *unit = NULL; - const char *u; + _cleanup_strv_free_ char **units = NULL, **done = NULL; + char **u, **patterns; sd_bus *bus; int r; - if (argv[1]) { - r = unit_name_mangle(argv[1], arg_quiet ? 0 : UNIT_NAME_MANGLE_WARN, &unit); - if (r < 0) - return log_error_errno(r, "Failed to mangle unit name: %m"); - - u = unit; - } else - u = SPECIAL_DEFAULT_TARGET; - r = acquire_bus(BUS_MANAGER, &bus); if (r < 0) return r; + patterns = strv_skip(argv, 1); + if (strv_isempty(patterns)) { + units = strv_new(SPECIAL_DEFAULT_TARGET); + if (!units) + return log_oom(); + } else { + r = expand_names(bus, patterns, NULL, &units, NULL); + if (r < 0) + return log_error_errno(r, "Failed to expand names: %m"); + } + (void) pager_open(arg_pager_flags); - puts(u); + STRV_FOREACH(u, units) { + if (u != units) + puts(""); - return list_dependencies_one(bus, u, 0, &units, 0); + puts(*u); + r = list_dependencies_one(bus, *u, 0, &done, 0); + if (r < 0) + return r; + } + + return 0; } struct machine_info { @@ -7815,9 +7826,9 @@ static int systemctl_help(void) { " help PATTERN...|PID... Show manual for one or more units\n" " reset-failed [PATTERN...] Reset failed state for all, one, or more\n" " units\n" - " list-dependencies [UNIT] Recursively show units which are required\n" - " or wanted by this unit or by which this\n" - " unit is required or wanted" + " list-dependencies [UNIT...] Recursively show units which are required\n" + " or wanted by the units or by which those\n" + " units are required or wanted" "\n%3$sUnit File Commands:%4$s\n" " list-unit-files [PATTERN...] List installed unit files\n" " enable [UNIT...|PATH...] Enable one or more unit files\n" @@ -9116,7 +9127,7 @@ static int systemctl_main(int argc, char *argv[]) { { "link", 2, VERB_ANY, 0, enable_unit }, { "revert", 2, VERB_ANY, 0, enable_unit }, { "switch-root", 2, VERB_ANY, VERB_ONLINE_ONLY, switch_root }, - { "list-dependencies", VERB_ANY, 2, VERB_ONLINE_ONLY, list_dependencies }, + { "list-dependencies", VERB_ANY, VERB_ANY, VERB_ONLINE_ONLY, list_dependencies }, { "set-default", 2, 2, 0, set_default }, { "get-default", VERB_ANY, 1, 0, get_default }, { "set-property", 3, VERB_ANY, VERB_ONLINE_ONLY, set_property },