diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-03-05 20:54:58 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-05 20:54:58 +0900 |
commit | 412be51fe8f36d48a7d2930a7f51a3e6eec17029 (patch) | |
tree | 220f2f489c05767fd7e186e262e7757ae29b8282 | |
parent | c1817e2528258aa941e031fa6a075842d9694514 (diff) | |
parent | 94c3a838da69eb9add8867303c5ef7cc329f7c45 (diff) | |
download | systemd-412be51fe8f36d48a7d2930a7f51a3e6eec17029.tar.gz |
Merge pull request #15013 from systemd/systemctl-list-dependencies
systemctl list-dependencies: fix duplicate output and take multiple arguments
-rw-r--r-- | man/systemctl.xml | 6 | ||||
-rw-r--r-- | src/systemctl/systemctl.c | 47 |
2 files changed, 32 insertions, 21 deletions
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 <varlistentry> <term> <command>list-dependencies</command> - <optional><replaceable>UNIT</replaceable></optional> + <optional><replaceable>UNIT</replaceable>...</optional> </term> <listitem> <para>Shows units required and wanted by the specified - unit. This recursively lists units following the + units. This recursively lists units following the <varname>Requires=</varname>, <varname>Requisite=</varname>, <varname>ConsistsOf=</varname>, <varname>Wants=</varname>, <varname>BindsTo=</varname> - dependencies. If no unit is specified, + dependencies. If no units are specified, <filename>default.target</filename> is implied.</para> <para>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(""); + + puts(*u); + r = list_dependencies_one(bus, *u, 0, &done, 0); + if (r < 0) + return r; + } - return list_dependencies_one(bus, u, 0, &units, 0); + 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 }, |