diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-09-06 12:34:09 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-09-06 12:34:09 +0200 |
commit | 480a4b9777d6ad525090c7e0ff6ee9e867c4ebb0 (patch) | |
tree | a22885a5cdf6e9abc5dbfb9b46b0a8a188a0f82b /src/analyze | |
parent | 25b31f2fbdc4866433e675ff5dd3073f4d56cf08 (diff) | |
parent | 83efb7c22722bd8d07091d2cb6545cdef003cc90 (diff) |
Merge pull request #1153 from evverx/dot-alias-handling
analyze: add "alias" handling to dot subcommand
Diffstat (limited to 'src/analyze')
-rw-r--r-- | src/analyze/analyze.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index db1e7f3f37..ab7fb53269 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -1092,12 +1092,59 @@ static int graph_one(sd_bus *bus, const UnitInfo *u, char *patterns[]) { return 0; } +static int expand_patterns(sd_bus *bus, char **patterns, char ***ret) { + _cleanup_strv_free_ char **expanded_patterns = NULL; + char **pattern; + int r; + + STRV_FOREACH(pattern, patterns) { + _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_free_ char *unit = NULL, *unit_id = NULL; + + if (strv_extend(&expanded_patterns, *pattern) < 0) + return log_oom(); + + if (string_is_glob(*pattern)) + continue; + + unit = unit_dbus_path_from_name(*pattern); + if (!unit) + return log_oom(); + + r = sd_bus_get_property_string( + bus, + "org.freedesktop.systemd1", + unit, + "org.freedesktop.systemd1.Unit", + "Id", + &error, + &unit_id); + if (r < 0) + return log_error_errno(r, "Failed to get ID: %s", bus_error_message(&error, r)); + + if (!streq(*pattern, unit_id)) { + if (strv_extend(&expanded_patterns, unit_id) < 0) + return log_oom(); + } + } + + *ret = expanded_patterns; + expanded_patterns = NULL; /* do not free */ + + return 0; +} + static int dot(sd_bus *bus, char* patterns[]) { _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_strv_free_ char **expanded_patterns = NULL; int r; UnitInfo u; + r = expand_patterns(bus, patterns, &expanded_patterns); + if (r < 0) + return r; + r = sd_bus_call_method( bus, "org.freedesktop.systemd1", @@ -1120,7 +1167,7 @@ static int dot(sd_bus *bus, char* patterns[]) { while ((r = bus_parse_unit_info(reply, &u)) > 0) { - r = graph_one(bus, &u, patterns); + r = graph_one(bus, &u, expanded_patterns); if (r < 0) return r; } |