|| u->following[0]) || u->job_id > 0);
}
-static void output_units_list(const UnitInfo *unit_infos, unsigned c, char** patterns) {
+static void output_units_list(const UnitInfo *unit_infos, unsigned c) {
unsigned id_len, max_id_len, load_len, active_len, sub_len, job_len, desc_len;
const UnitInfo *u;
unsigned n_shown = 0;
desc_len = 0;
for (u = unit_infos; u < unit_infos + c; u++) {
- if (!output_show_unit(u, patterns))
- continue;
-
max_id_len = MAX(max_id_len, strlen(u->id));
load_len = MAX(load_len, strlen(u->load_state));
active_len = MAX(active_len, strlen(u->active_state));
const char *on_loaded, *off_loaded, *on = "";
const char *on_active, *off_active, *off = "";
- if (!output_show_unit(u, patterns))
- continue;
-
if (!n_shown && !arg_no_legend) {
printf("%-*s %-*s %-*s %-*s ",
id_len, "UNIT",
static int get_unit_list(
sd_bus *bus,
sd_bus_message **_reply,
- UnitInfo **_unit_infos) {
+ UnitInfo **_unit_infos,
+ char **patterns) {
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
return bus_log_parse_error(r);
while ((r = bus_parse_unit_info(reply, &u)) > 0) {
+ if (!output_show_unit(&u, patterns))
+ continue;
if (!GREEDY_REALLOC(unit_infos, size, c+1))
return log_oom();
pager_open_if_enabled();
- r = get_unit_list(bus, &reply, &unit_infos);
+ r = get_unit_list(bus, &reply, &unit_infos, strv_skip_first(args));
if (r < 0)
return r;
qsort_safe(unit_infos, r, sizeof(UnitInfo), compare_unit_info);
- output_units_list(unit_infos, r, strv_skip_first(args));
+ output_units_list(unit_infos, r);
return 0;
}
static int list_sockets(sd_bus *bus, char **args) {
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_free_ UnitInfo *unit_infos = NULL;
- struct socket_info *socket_infos = NULL;
+ _cleanup_free_ struct socket_info *socket_infos = NULL;
const UnitInfo *u;
struct socket_info *s;
unsigned cs = 0;
pager_open_if_enabled();
- n = get_unit_list(bus, &reply, &unit_infos);
+ n = get_unit_list(bus, &reply, &unit_infos, strv_skip_first(args));
if (n < 0)
return n;
_cleanup_strv_free_ char **listening = NULL, **triggered = NULL;
int i, c;
- if (!output_show_unit(u, strv_skip_first(args)))
- continue;
-
if (!endswith(u->id, ".socket"))
continue;
if (s->own_triggered)
strv_free(s->triggered);
}
- free(socket_infos);
return r;
}
pager_open_if_enabled();
- n = get_unit_list(bus, &reply, &unit_infos);
+ n = get_unit_list(bus, &reply, &unit_infos, strv_skip_first(args));
if (n < 0)
return n;
dual_timestamp next;
usec_t m;
- if (!output_show_unit(u, strv_skip_first(args)))
- continue;
-
if (!endswith(u->id, ".timer"))
continue;
return !arg_types || ((dot = strrchr(u->path, '.')) && strv_find(arg_types, dot+1));
}
-static void output_unit_file_list(const UnitFileList *units, unsigned c, char **patterns) {
+static void output_unit_file_list(const UnitFileList *units, unsigned c) {
unsigned max_id_len, id_cols, state_cols, n_shown = 0;
const UnitFileList *u;
state_cols = sizeof("STATE")-1;
for (u = units; u < units + c; u++) {
- if (!output_show_unit_file(u, patterns))
- continue;
-
max_id_len = MAX(max_id_len, strlen(basename(u->path)));
state_cols = MAX(state_cols, strlen(unit_file_state_to_string(u->state)));
}
const char *on, *off;
const char *id;
- if (!output_show_unit_file(u, patterns))
- continue;
-
n_shown++;
if (u->state == UNIT_FILE_MASKED ||
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_free_ UnitFileList *units = NULL;
+ UnitFileList *unit;
+ size_t size = 0;
unsigned c = 0;
const char *state;
char *path;
}
HASHMAP_FOREACH(u, h, i) {
- memcpy(units + c++, u, sizeof(UnitFileList));
+ if (!output_show_unit_file(u, strv_skip_first(args)))
+ continue;
+
+ units[c++] = *u;
free(u);
}
- assert(c == n_units);
+ assert(c <= n_units);
hashmap_free(h);
} else {
- size_t size = 0;
-
r = sd_bus_call_method(
bus,
"org.freedesktop.systemd1",
if (!GREEDY_REALLOC(units, size, c + 1))
return log_oom();
- units[c++] = (struct UnitFileList) {
+ units[c] = (struct UnitFileList) {
path,
unit_file_state_from_string(state)
};
+
+ if (output_show_unit_file(&units[c], strv_skip_first(args)))
+ c ++;
+
}
if (r < 0)
return bus_log_parse_error(r);
if (c > 0) {
qsort(units, c, sizeof(UnitFileList), compare_unit_file_list);
- output_unit_file_list(units, c, strv_skip_first(args));
+ output_unit_file_list(units, c);
}
+ if (avoid_bus())
+ for (unit = units; unit < units + c; unit++)
+ free(unit->path);
+
return 0;
}
unsigned c;
int r;
- r = get_unit_list(bus, &reply, &unit_infos);
+ r = get_unit_list(bus, &reply, &unit_infos, NULL);
if (r < 0)
return r;
for (u = unit_infos; u < unit_infos + c; u++) {
_cleanup_free_ char *p = NULL;
- if (!output_show_unit(u, NULL))
- continue;
-
p = unit_dbus_path_from_name(u->id);
if (!p)
return log_oom();