X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsystemctl%2Fsystemctl.c;h=b11fee515cc67c4d8fcb3675d16369b563eea5a9;hb=93f1a06374e335e8508d89e1bdaadf45be6ab777;hp=e1e4640ae8f47ef6d3419360eb73ba5f157dae92;hpb=5bb75bc745557d5141066dee796b329507b0c634;p=elogind.git diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index e1e4640ae..b11fee515 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -319,12 +319,6 @@ static int compare_unit_info(const void *a, const void *b) { static bool output_show_unit(const UnitInfo *u, char **patterns) { const char *dot; - if (!strv_isempty(arg_states)) - return - strv_contains(arg_states, u->load_state) || - strv_contains(arg_states, u->sub_state) || - strv_contains(arg_states, u->active_state); - if (!strv_isempty(patterns)) { char **pattern; @@ -513,6 +507,7 @@ static int get_unit_list( int c, sd_bus_message **_reply) { + _cleanup_bus_message_unref_ sd_bus_message *m = NULL; _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_bus_message_unref_ sd_bus_message *reply = NULL; size_t size = c; @@ -523,15 +518,22 @@ static int get_unit_list( assert(unit_infos); assert(_reply); - r = sd_bus_call_method( + r = sd_bus_message_new_method_call( bus, + &m, "org.freedesktop.systemd1", "/org/freedesktop/systemd1", "org.freedesktop.systemd1.Manager", - "ListUnits", - &error, - &reply, - NULL); + "ListUnitsFiltered"); + + if (r < 0) + return bus_log_create_error(r); + + r = sd_bus_message_append_strv(m, arg_states); + if (r < 0) + return bus_log_create_error(r); + + r = sd_bus_call(bus, m, 0, &error, &reply); if (r < 0) { log_error("Failed to list units: %s", bus_error_message(&error, r)); return r; @@ -2305,6 +2307,7 @@ static int enable_wait_for_jobs(sd_bus *bus) { r = sd_bus_add_match( bus, + NULL, "type='signal'," "sender='org.freedesktop.systemd1'," "interface='org.freedesktop.systemd1.Manager'," @@ -2364,13 +2367,14 @@ static int check_wait_response(WaitData *d) { } static int wait_for_jobs(sd_bus *bus, Set *s) { + _cleanup_bus_slot_unref_ sd_bus_slot *slot = NULL; WaitData d = { .set = s }; int r = 0, q; assert(bus); assert(s); - q = sd_bus_add_filter(bus, wait_filter, &d); + q = sd_bus_add_filter(bus, &slot, wait_filter, &d); if (q < 0) return log_oom(); @@ -2398,10 +2402,6 @@ static int wait_for_jobs(sd_bus *bus, Set *s) { d.result = NULL; } - q = sd_bus_remove_filter(bus, wait_filter, &d); - if (q < 0 && r == 0) - r = q; - return r; } @@ -2886,8 +2886,8 @@ static int check_inhibitors(sd_bus *bus, enum action a) { get_process_comm(pid, &comm); user = uid_to_name(uid); - log_warning("Operation inhibited by \"%s\" (PID %lu \"%s\", user %s), reason is \"%s\".", - who, (unsigned long) pid, strna(comm), strna(user), why); + log_warning("Operation inhibited by \"%s\" (PID "PID_FMT" \"%s\", user %s), reason is \"%s\".", + who, pid, strna(comm), strna(user), why); c++; } @@ -4258,7 +4258,7 @@ static int get_unit_dbus_path_by_pid( &reply, "u", pid); if (r < 0) { - log_error("Failed to get unit for PID %lu: %s", (unsigned long) pid, bus_error_message(&error, r)); + log_error("Failed to get unit for PID "PID_FMT": %s", pid, bus_error_message(&error, r)); return r; } @@ -5004,18 +5004,18 @@ static int enable_sysv_units(const char *verb, char **args) { /* Processes all SysV units, and reshuffles the array so that * afterwards only the native units remain */ - r = lookup_paths_init(&paths, SYSTEMD_SYSTEM, false, NULL, NULL, NULL); + r = lookup_paths_init(&paths, SYSTEMD_SYSTEM, false, arg_root, NULL, NULL, NULL); if (r < 0) return r; r = 0; for (f = 0; args[f]; f++) { const char *name; - _cleanup_free_ char *p = NULL, *q = NULL; + _cleanup_free_ char *p = NULL, *q = NULL, *l = NULL; bool found_native = false, found_sysv; unsigned c = 1; const char *argv[6] = { "/sbin/chkconfig", NULL, NULL, NULL, NULL }; - char **k, *l; + char **k; int j; pid_t pid; siginfo_t status; @@ -5029,20 +5029,19 @@ static int enable_sysv_units(const char *verb, char **args) { continue; STRV_FOREACH(k, paths.unit_path) { + _cleanup_free_ char *path = NULL; + if (!isempty(arg_root)) - asprintf(&p, "%s/%s/%s", arg_root, *k, name); + asprintf(&path, "%s/%s/%s", arg_root, *k, name); else - asprintf(&p, "%s/%s", *k, name); + asprintf(&path, "%s/%s", *k, name); - if (!p) { + if (!path) { r = log_oom(); goto finish; } - found_native = access(p, F_OK) >= 0; - free(p); - p = NULL; - + found_native = access(path, F_OK) >= 0; if (found_native) break; } @@ -5059,9 +5058,8 @@ static int enable_sysv_units(const char *verb, char **args) { goto finish; } - p[strlen(p) - sizeof(".service") + 1] = 0; + p[strlen(p) - strlen(".service")] = 0; found_sysv = access(p, F_OK) >= 0; - if (!found_sysv) continue; @@ -5086,7 +5084,6 @@ static int enable_sysv_units(const char *verb, char **args) { } log_info("Executing %s", l); - free(l); pid = fork(); if (pid < 0) { @@ -5928,7 +5925,7 @@ static int systemctl_parse_argv(int argc, char *argv[]) { case 'r': if (geteuid() != 0) { - log_error("--recursive requires root priviliges."); + log_error("--recursive requires root privileges."); return -EPERM; }