X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fanalyze%2Fanalyze.c;h=591b4ab14e74a73a1681f9ce4ae681f0b9811cba;hp=d0bf01468a36b0f46d1aed412a51a428b0da23fa;hb=2404701e679904979751816930101511d8ec5d49;hpb=601185b43da638b1c74153deae01dbd518680889 diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index d0bf01468..591b4ab14 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -25,7 +25,6 @@ #include #include #include -#include #include "sd-bus.h" #include "bus-util.h" @@ -277,7 +276,8 @@ static int acquire_time_data(sd_bus *bus, struct unit_times **out) { return c; fail: - free_unit_times(unit_times, (unsigned) c); + if (unit_times) + free_unit_times(unit_times, (unsigned) c); return r; } @@ -847,7 +847,8 @@ static int list_dependencies(sd_bus *bus, const char *name) { char ts[FORMAT_TIMESPAN_MAX]; struct unit_times *times; int r; - const char *path, *id; + const char *id; + _cleanup_free_ char *path = NULL; _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; struct boot_times *boot; @@ -905,7 +906,7 @@ static int analyze_critical_chain(sd_bus *bus, char *names[]) { if (n <= 0) return n; - h = hashmap_new(string_hash_func, string_compare_func); + h = hashmap_new(&string_hash_ops); if (!h) return -ENOMEM; @@ -973,56 +974,35 @@ static int graph_one_property(sd_bus *bus, const UnitInfo *u, const char* prop, _cleanup_strv_free_ char **units = NULL; char **unit; int r; + bool match_patterns; assert(u); assert(prop); assert(color); + match_patterns = strv_fnmatch(patterns, u->id, 0); + + if (!strv_isempty(arg_dot_from_patterns) && + !match_patterns && + !strv_fnmatch(arg_dot_from_patterns, u->id, 0)) + return 0; + r = bus_get_unit_property_strv(bus, u->unit_path, prop, &units); if (r < 0) return r; STRV_FOREACH(unit, units) { - char **p; - bool match_found; - - if (!strv_isempty(arg_dot_from_patterns)) { - match_found = false; - - STRV_FOREACH(p, arg_dot_from_patterns) - if (fnmatch(*p, u->id, 0) == 0) { - match_found = true; - break; - } - - if (!match_found) - continue; - } - - if (!strv_isempty(arg_dot_to_patterns)) { - match_found = false; + bool match_patterns2; - STRV_FOREACH(p, arg_dot_to_patterns) - if (fnmatch(*p, *unit, 0) == 0) { - match_found = true; - break; - } - - if (!match_found) - continue; - } + match_patterns2 = strv_fnmatch(patterns, *unit, 0); - if (!strv_isempty(patterns)) { - match_found = false; + if (!strv_isempty(arg_dot_to_patterns) && + !match_patterns2 && + !strv_fnmatch(arg_dot_to_patterns, *unit, 0)) + continue; - STRV_FOREACH(p, patterns) - if (fnmatch(*p, u->id, 0) == 0 || fnmatch(*p, *unit, 0) == 0) { - match_found = true; - break; - } - if (!match_found) - continue; - } + if (!strv_isempty(patterns) && !match_patterns && !match_patterns2) + continue; printf("\t\"%s\"->\"%s\" [color=\"%s\"];\n", u->id, *unit, color); } @@ -1193,25 +1173,22 @@ static void help(void) { " --user Operate on user systemd instance\n" " -H --host=[USER@]HOST Operate on remote host\n" " -M --machine=CONTAINER Operate on local container\n" - " --order When generating a dependency graph, show only order\n" - " --require When generating a dependency graph, show only requirement\n" - " --from-pattern=GLOB, --to-pattern=GLOB\n" - " When generating a dependency graph, filter only origins\n" - " or destinations, respectively\n" - " --fuzz=TIMESPAN When printing the tree of the critical chain, print also\n" - " services, which finished TIMESPAN earlier, than the\n" - " latest in the branch. The unit of TIMESPAN is seconds\n" - " unless specified with a different unit, i.e. 50ms\n\n" - " --no-man Do not check for existence of man pages\n" + " --order Show only order in the graph\n" + " --require Show only requirement in the graph\n" + " --from-pattern=GLOB Show only origins in the graph\n" + " --to-pattern=GLOB Show only destinations in the graph\n" + " --fuzz=SECONDS Also print also services which finished SECONDS\n" + " earlier than the latest in the branch\n" + " --man[=BOOL] Do [not] check for existence of man pages\n\n" "Commands:\n" - " time Print time spent in the kernel before reaching userspace\n" + " time Print time spent in the kernel\n" " blame Print list of running units ordered by time to init\n" " critical-chain Print a tree of the time critical chain of units\n" " plot Output SVG graphic showing service initialization\n" " dot Output dependency graph in dot(1) format\n" " set-log-level LEVEL Set logging threshold for systemd\n" " dump Output state serialization of service manager\n" - " verify Check unit files for correctness\n" + " verify FILE... Check unit files for correctness\n" , program_invocation_short_name); /* When updating this list, including descriptions, apply @@ -1230,7 +1207,7 @@ static int parse_argv(int argc, char *argv[]) { ARG_DOT_TO_PATTERN, ARG_FUZZ, ARG_NO_PAGER, - ARG_NO_MAN, + ARG_MAN, }; static const struct option options[] = { @@ -1244,7 +1221,7 @@ static int parse_argv(int argc, char *argv[]) { { "to-pattern", required_argument, NULL, ARG_DOT_TO_PATTERN }, { "fuzz", required_argument, NULL, ARG_FUZZ }, { "no-pager", no_argument, NULL, ARG_NO_PAGER }, - { "no-man", no_argument, NULL, ARG_NO_MAN }, + { "man", optional_argument, NULL, ARG_MAN }, { "host", required_argument, NULL, 'H' }, { "machine", required_argument, NULL, 'M' }, {} @@ -1311,12 +1288,22 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_CONTAINER; + arg_transport = BUS_TRANSPORT_MACHINE; arg_host = optarg; break; - case ARG_NO_MAN: - arg_man = false; + case ARG_MAN: + if (optarg) { + r = parse_boolean(optarg); + if (r < 0) { + log_error("Failed to parse --man= argument."); + return -EINVAL; + } + + arg_man = !!r; + } else + arg_man = true; + break; case '?': @@ -1346,11 +1333,11 @@ int main(int argc, char *argv[]) { arg_user ? SYSTEMD_USER : SYSTEMD_SYSTEM, arg_man); else { - _cleanup_bus_unref_ sd_bus *bus = NULL; + _cleanup_bus_close_unref_ sd_bus *bus = NULL; r = bus_open_transport_systemd(arg_transport, arg_host, arg_user, &bus); if (r < 0) { - log_error("Failed to create bus connection: %s", strerror(-r)); + log_error_errno(r, "Failed to create bus connection: %m"); goto finish; }