mirror of
https://github.com/systemd/systemd.git
synced 2024-11-01 09:21:26 +03:00
systemctl: drop uninteresting units immediately
Also properly free memory if list-unit-files --root=... is used.
This commit is contained in:
parent
b652054662
commit
8d5ba5a946
@ -311,7 +311,7 @@ static bool output_show_unit(const UnitInfo *u, char **patterns) {
|
|||||||
|| u->following[0]) || u->job_id > 0);
|
|| 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;
|
unsigned id_len, max_id_len, load_len, active_len, sub_len, job_len, desc_len;
|
||||||
const UnitInfo *u;
|
const UnitInfo *u;
|
||||||
unsigned n_shown = 0;
|
unsigned n_shown = 0;
|
||||||
@ -325,9 +325,6 @@ static void output_units_list(const UnitInfo *unit_infos, unsigned c, char** pat
|
|||||||
desc_len = 0;
|
desc_len = 0;
|
||||||
|
|
||||||
for (u = unit_infos; u < unit_infos + c; u++) {
|
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));
|
max_id_len = MAX(max_id_len, strlen(u->id));
|
||||||
load_len = MAX(load_len, strlen(u->load_state));
|
load_len = MAX(load_len, strlen(u->load_state));
|
||||||
active_len = MAX(active_len, strlen(u->active_state));
|
active_len = MAX(active_len, strlen(u->active_state));
|
||||||
@ -374,9 +371,6 @@ static void output_units_list(const UnitInfo *unit_infos, unsigned c, char** pat
|
|||||||
const char *on_loaded, *off_loaded, *on = "";
|
const char *on_loaded, *off_loaded, *on = "";
|
||||||
const char *on_active, *off_active, *off = "";
|
const char *on_active, *off_active, *off = "";
|
||||||
|
|
||||||
if (!output_show_unit(u, patterns))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!n_shown && !arg_no_legend) {
|
if (!n_shown && !arg_no_legend) {
|
||||||
printf("%-*s %-*s %-*s %-*s ",
|
printf("%-*s %-*s %-*s %-*s ",
|
||||||
id_len, "UNIT",
|
id_len, "UNIT",
|
||||||
@ -454,7 +448,8 @@ static void output_units_list(const UnitInfo *unit_infos, unsigned c, char** pat
|
|||||||
static int get_unit_list(
|
static int get_unit_list(
|
||||||
sd_bus *bus,
|
sd_bus *bus,
|
||||||
sd_bus_message **_reply,
|
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_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
||||||
@ -486,6 +481,8 @@ static int get_unit_list(
|
|||||||
return bus_log_parse_error(r);
|
return bus_log_parse_error(r);
|
||||||
|
|
||||||
while ((r = bus_parse_unit_info(reply, &u)) > 0) {
|
while ((r = bus_parse_unit_info(reply, &u)) > 0) {
|
||||||
|
if (!output_show_unit(&u, patterns))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (!GREEDY_REALLOC(unit_infos, size, c+1))
|
if (!GREEDY_REALLOC(unit_infos, size, c+1))
|
||||||
return log_oom();
|
return log_oom();
|
||||||
@ -515,12 +512,12 @@ static int list_units(sd_bus *bus, char **args) {
|
|||||||
|
|
||||||
pager_open_if_enabled();
|
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)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
qsort_safe(unit_infos, r, sizeof(UnitInfo), compare_unit_info);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -692,7 +689,7 @@ static int output_sockets_list(struct socket_info *socket_infos, unsigned cs) {
|
|||||||
static int list_sockets(sd_bus *bus, char **args) {
|
static int list_sockets(sd_bus *bus, char **args) {
|
||||||
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
||||||
_cleanup_free_ UnitInfo *unit_infos = NULL;
|
_cleanup_free_ UnitInfo *unit_infos = NULL;
|
||||||
struct socket_info *socket_infos = NULL;
|
_cleanup_free_ struct socket_info *socket_infos = NULL;
|
||||||
const UnitInfo *u;
|
const UnitInfo *u;
|
||||||
struct socket_info *s;
|
struct socket_info *s;
|
||||||
unsigned cs = 0;
|
unsigned cs = 0;
|
||||||
@ -701,7 +698,7 @@ static int list_sockets(sd_bus *bus, char **args) {
|
|||||||
|
|
||||||
pager_open_if_enabled();
|
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)
|
if (n < 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
@ -709,9 +706,6 @@ static int list_sockets(sd_bus *bus, char **args) {
|
|||||||
_cleanup_strv_free_ char **listening = NULL, **triggered = NULL;
|
_cleanup_strv_free_ char **listening = NULL, **triggered = NULL;
|
||||||
int i, c;
|
int i, c;
|
||||||
|
|
||||||
if (!output_show_unit(u, strv_skip_first(args)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!endswith(u->id, ".socket"))
|
if (!endswith(u->id, ".socket"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -758,7 +752,6 @@ static int list_sockets(sd_bus *bus, char **args) {
|
|||||||
if (s->own_triggered)
|
if (s->own_triggered)
|
||||||
strv_free(s->triggered);
|
strv_free(s->triggered);
|
||||||
}
|
}
|
||||||
free(socket_infos);
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -915,7 +908,7 @@ static int list_timers(sd_bus *bus, char **args) {
|
|||||||
|
|
||||||
pager_open_if_enabled();
|
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)
|
if (n < 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
@ -926,9 +919,6 @@ static int list_timers(sd_bus *bus, char **args) {
|
|||||||
dual_timestamp next;
|
dual_timestamp next;
|
||||||
usec_t m;
|
usec_t m;
|
||||||
|
|
||||||
if (!output_show_unit(u, strv_skip_first(args)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!endswith(u->id, ".timer"))
|
if (!endswith(u->id, ".timer"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1014,7 +1004,7 @@ static bool output_show_unit_file(const UnitFileList *u, char **patterns) {
|
|||||||
return !arg_types || ((dot = strrchr(u->path, '.')) && strv_find(arg_types, dot+1));
|
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;
|
unsigned max_id_len, id_cols, state_cols, n_shown = 0;
|
||||||
const UnitFileList *u;
|
const UnitFileList *u;
|
||||||
|
|
||||||
@ -1022,9 +1012,6 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c, char **
|
|||||||
state_cols = sizeof("STATE")-1;
|
state_cols = sizeof("STATE")-1;
|
||||||
|
|
||||||
for (u = units; u < units + c; u++) {
|
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)));
|
max_id_len = MAX(max_id_len, strlen(basename(u->path)));
|
||||||
state_cols = MAX(state_cols, strlen(unit_file_state_to_string(u->state)));
|
state_cols = MAX(state_cols, strlen(unit_file_state_to_string(u->state)));
|
||||||
}
|
}
|
||||||
@ -1049,9 +1036,6 @@ static void output_unit_file_list(const UnitFileList *units, unsigned c, char **
|
|||||||
const char *on, *off;
|
const char *on, *off;
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
||||||
if (!output_show_unit_file(u, patterns))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
n_shown++;
|
n_shown++;
|
||||||
|
|
||||||
if (u->state == UNIT_FILE_MASKED ||
|
if (u->state == UNIT_FILE_MASKED ||
|
||||||
@ -1083,6 +1067,8 @@ static int list_unit_files(sd_bus *bus, char **args) {
|
|||||||
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
_cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
|
||||||
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
_cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
_cleanup_free_ UnitFileList *units = NULL;
|
_cleanup_free_ UnitFileList *units = NULL;
|
||||||
|
UnitFileList *unit;
|
||||||
|
size_t size = 0;
|
||||||
unsigned c = 0;
|
unsigned c = 0;
|
||||||
const char *state;
|
const char *state;
|
||||||
char *path;
|
char *path;
|
||||||
@ -1115,15 +1101,16 @@ static int list_unit_files(sd_bus *bus, char **args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HASHMAP_FOREACH(u, h, i) {
|
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);
|
free(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(c == n_units);
|
assert(c <= n_units);
|
||||||
hashmap_free(h);
|
hashmap_free(h);
|
||||||
} else {
|
} else {
|
||||||
size_t size = 0;
|
|
||||||
|
|
||||||
r = sd_bus_call_method(
|
r = sd_bus_call_method(
|
||||||
bus,
|
bus,
|
||||||
"org.freedesktop.systemd1",
|
"org.freedesktop.systemd1",
|
||||||
@ -1147,10 +1134,14 @@ static int list_unit_files(sd_bus *bus, char **args) {
|
|||||||
if (!GREEDY_REALLOC(units, size, c + 1))
|
if (!GREEDY_REALLOC(units, size, c + 1))
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
units[c++] = (struct UnitFileList) {
|
units[c] = (struct UnitFileList) {
|
||||||
path,
|
path,
|
||||||
unit_file_state_from_string(state)
|
unit_file_state_from_string(state)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (output_show_unit_file(&units[c], strv_skip_first(args)))
|
||||||
|
c ++;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_parse_error(r);
|
return bus_log_parse_error(r);
|
||||||
@ -1162,9 +1153,13 @@ static int list_unit_files(sd_bus *bus, char **args) {
|
|||||||
|
|
||||||
if (c > 0) {
|
if (c > 0) {
|
||||||
qsort(units, c, sizeof(UnitFileList), compare_unit_file_list);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3714,7 +3709,7 @@ static int show_all(
|
|||||||
unsigned c;
|
unsigned c;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = get_unit_list(bus, &reply, &unit_infos);
|
r = get_unit_list(bus, &reply, &unit_infos, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
@ -3727,9 +3722,6 @@ static int show_all(
|
|||||||
for (u = unit_infos; u < unit_infos + c; u++) {
|
for (u = unit_infos; u < unit_infos + c; u++) {
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
|
|
||||||
if (!output_show_unit(u, NULL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
p = unit_dbus_path_from_name(u->id);
|
p = unit_dbus_path_from_name(u->id);
|
||||||
if (!p)
|
if (!p)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
Loading…
Reference in New Issue
Block a user