mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
core: Filter by unit name behind the D-Bus, instead on the client side (#3142)
This commit improves systemd performance on the systems which have thousands of units.
This commit is contained in:
parent
3e39355a96
commit
313fe66fbd
@ -889,7 +889,7 @@ static int method_reset_failed(sd_bus_message *message, void *userdata, sd_bus_e
|
|||||||
return sd_bus_reply_method_return(message, NULL);
|
return sd_bus_reply_method_return(message, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states) {
|
static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
|
||||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
const char *k;
|
const char *k;
|
||||||
@ -929,6 +929,10 @@ static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_e
|
|||||||
!strv_contains(states, unit_sub_state_to_string(u)))
|
!strv_contains(states, unit_sub_state_to_string(u)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!strv_isempty(patterns) &&
|
||||||
|
!strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE))
|
||||||
|
continue;
|
||||||
|
|
||||||
unit_path = unit_dbus_path(u);
|
unit_path = unit_dbus_path(u);
|
||||||
if (!unit_path)
|
if (!unit_path)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -963,7 +967,7 @@ static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_e
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int method_list_units(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_list_units(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
return list_units_filtered(message, userdata, error, NULL);
|
return list_units_filtered(message, userdata, error, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int method_list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
@ -974,7 +978,23 @@ static int method_list_units_filtered(sd_bus_message *message, void *userdata, s
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
return list_units_filtered(message, userdata, error, states);
|
return list_units_filtered(message, userdata, error, states, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int method_list_units_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
|
_cleanup_strv_free_ char **states = NULL;
|
||||||
|
_cleanup_strv_free_ char **patterns = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = sd_bus_message_read_strv(message, &states);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = sd_bus_message_read_strv(message, &patterns);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return list_units_filtered(message, userdata, error, states, patterns);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int method_list_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_list_jobs(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
@ -1465,7 +1485,7 @@ static int method_set_exit_code(sd_bus_message *message, void *userdata, sd_bus_
|
|||||||
return sd_bus_reply_method_return(message, NULL);
|
return sd_bus_reply_method_return(message, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int method_list_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error, char **states, char **patterns) {
|
||||||
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
UnitFileList *item;
|
UnitFileList *item;
|
||||||
@ -1490,7 +1510,7 @@ static int method_list_unit_files(sd_bus_message *message, void *userdata, sd_bu
|
|||||||
if (!h)
|
if (!h)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
r = unit_file_get_list(m->unit_file_scope, NULL, h);
|
r = unit_file_get_list(m->unit_file_scope, NULL, h, states, patterns);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@ -1518,6 +1538,26 @@ fail:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int method_list_unit_files(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
|
return list_unit_files_by_patterns(message, userdata, error, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int method_list_unit_files_by_patterns(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
|
_cleanup_strv_free_ char **states = NULL;
|
||||||
|
_cleanup_strv_free_ char **patterns = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
r = sd_bus_message_read_strv(message, &states);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = sd_bus_message_read_strv(message, &patterns);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return list_unit_files_by_patterns(message, userdata, error, states, patterns);
|
||||||
|
}
|
||||||
|
|
||||||
static int method_get_unit_file_state(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
static int method_get_unit_file_state(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -2073,6 +2113,7 @@ const sd_bus_vtable bus_manager_vtable[] = {
|
|||||||
SD_BUS_METHOD("ResetFailed", NULL, NULL, method_reset_failed, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("ResetFailed", NULL, NULL, method_reset_failed, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("ListUnits", NULL, "a(ssssssouso)", method_list_units, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("ListUnits", NULL, "a(ssssssouso)", method_list_units, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("ListUnitsFiltered", "as", "a(ssssssouso)", method_list_units_filtered, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("ListUnitsFiltered", "as", "a(ssssssouso)", method_list_units_filtered, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
|
SD_BUS_METHOD("ListUnitsByPatterns", "asas", "a(ssssssouso)", method_list_units_by_patterns, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("ListJobs", NULL, "a(usssoo)", method_list_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("ListJobs", NULL, "a(usssoo)", method_list_jobs, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("Subscribe", NULL, NULL, method_subscribe, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("Subscribe", NULL, NULL, method_subscribe, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("Unsubscribe", NULL, NULL, method_unsubscribe, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("Unsubscribe", NULL, NULL, method_unsubscribe, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
@ -2091,6 +2132,7 @@ const sd_bus_vtable bus_manager_vtable[] = {
|
|||||||
SD_BUS_METHOD("UnsetEnvironment", "as", NULL, method_unset_environment, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("UnsetEnvironment", "as", NULL, method_unset_environment, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("UnsetAndSetEnvironment", "asas", NULL, method_unset_and_set_environment, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("UnsetAndSetEnvironment", "asas", NULL, method_unset_and_set_environment, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("ListUnitFiles", NULL, "a(ss)", method_list_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("ListUnitFiles", NULL, "a(ss)", method_list_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
|
SD_BUS_METHOD("ListUnitFilesByPatterns", "asas", "a(ss)", method_list_unit_files_by_patterns, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("GetUnitFileState", "s", "s", method_get_unit_file_state, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("GetUnitFileState", "s", "s", method_get_unit_file_state, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("EnableUnitFiles", "asbb", "ba(sss)", method_enable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("EnableUnitFiles", "asbb", "ba(sss)", method_enable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
SD_BUS_METHOD("DisableUnitFiles", "asb", "a(sss)", method_disable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
SD_BUS_METHOD("DisableUnitFiles", "asb", "a(sss)", method_disable_unit_files, SD_BUS_VTABLE_UNPRIVILEGED),
|
||||||
|
@ -68,10 +68,18 @@
|
|||||||
send_interface="org.freedesktop.systemd1.Manager"
|
send_interface="org.freedesktop.systemd1.Manager"
|
||||||
send_member="ListUnitsFiltered"/>
|
send_member="ListUnitsFiltered"/>
|
||||||
|
|
||||||
|
<allow send_destination="org.freedesktop.systemd1"
|
||||||
|
send_interface="org.freedesktop.systemd1.Manager"
|
||||||
|
send_member="ListUnitsByPatterns"/>
|
||||||
|
|
||||||
<allow send_destination="org.freedesktop.systemd1"
|
<allow send_destination="org.freedesktop.systemd1"
|
||||||
send_interface="org.freedesktop.systemd1.Manager"
|
send_interface="org.freedesktop.systemd1.Manager"
|
||||||
send_member="ListUnitFiles"/>
|
send_member="ListUnitFiles"/>
|
||||||
|
|
||||||
|
<allow send_destination="org.freedesktop.systemd1"
|
||||||
|
send_interface="org.freedesktop.systemd1.Manager"
|
||||||
|
send_member="ListUnitFilesByPatterns"/>
|
||||||
|
|
||||||
<allow send_destination="org.freedesktop.systemd1"
|
<allow send_destination="org.freedesktop.systemd1"
|
||||||
send_interface="org.freedesktop.systemd1.Manager"
|
send_interface="org.freedesktop.systemd1.Manager"
|
||||||
send_member="GetUnitFileState"/>
|
send_member="GetUnitFileState"/>
|
||||||
|
@ -2653,7 +2653,9 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(UnitFileList*, unit_file_list_free_one);
|
|||||||
int unit_file_get_list(
|
int unit_file_get_list(
|
||||||
UnitFileScope scope,
|
UnitFileScope scope,
|
||||||
const char *root_dir,
|
const char *root_dir,
|
||||||
Hashmap *h) {
|
Hashmap *h,
|
||||||
|
char **states,
|
||||||
|
char **patterns) {
|
||||||
|
|
||||||
_cleanup_lookup_paths_free_ LookupPaths paths = {};
|
_cleanup_lookup_paths_free_ LookupPaths paths = {};
|
||||||
char **i;
|
char **i;
|
||||||
@ -2685,6 +2687,9 @@ int unit_file_get_list(
|
|||||||
if (!unit_name_is_valid(de->d_name, UNIT_NAME_ANY))
|
if (!unit_name_is_valid(de->d_name, UNIT_NAME_ANY))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!strv_fnmatch_or_empty(patterns, de->d_name, FNM_NOESCAPE))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (hashmap_get(h, de->d_name))
|
if (hashmap_get(h, de->d_name))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -2705,6 +2710,10 @@ int unit_file_get_list(
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
f->state = UNIT_FILE_BAD;
|
f->state = UNIT_FILE_BAD;
|
||||||
|
|
||||||
|
if (!strv_isempty(states) &&
|
||||||
|
!strv_contains(states, unit_file_state_to_string(f->state)))
|
||||||
|
continue;
|
||||||
|
|
||||||
r = hashmap_put(h, basename(f->path), f);
|
r = hashmap_put(h, basename(f->path), f);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
@ -232,7 +232,7 @@ int unit_file_add_dependency(
|
|||||||
int unit_file_get_state(UnitFileScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
|
int unit_file_get_state(UnitFileScope scope, const char *root_dir, const char *filename, UnitFileState *ret);
|
||||||
int unit_file_exists(UnitFileScope scope, const LookupPaths *paths, const char *name);
|
int unit_file_exists(UnitFileScope scope, const LookupPaths *paths, const char *name);
|
||||||
|
|
||||||
int unit_file_get_list(UnitFileScope scope, const char *root_dir, Hashmap *h);
|
int unit_file_get_list(UnitFileScope scope, const char *root_dir, Hashmap *h, char **states, char **patterns);
|
||||||
Hashmap* unit_file_list_free(Hashmap *h);
|
Hashmap* unit_file_list_free(Hashmap *h);
|
||||||
|
|
||||||
int unit_file_changes_add(UnitFileChange **changes, unsigned *n_changes, UnitFileChangeType type, const char *path, const char *source);
|
int unit_file_changes_add(UnitFileChange **changes, unsigned *n_changes, UnitFileChangeType type, const char *path, const char *source);
|
||||||
|
@ -541,6 +541,7 @@ static int get_unit_list(
|
|||||||
size_t size = c;
|
size_t size = c;
|
||||||
int r;
|
int r;
|
||||||
UnitInfo u;
|
UnitInfo u;
|
||||||
|
bool fallback = false;
|
||||||
|
|
||||||
assert(bus);
|
assert(bus);
|
||||||
assert(unit_infos);
|
assert(unit_infos);
|
||||||
@ -552,8 +553,7 @@ static int get_unit_list(
|
|||||||
"org.freedesktop.systemd1",
|
"org.freedesktop.systemd1",
|
||||||
"/org/freedesktop/systemd1",
|
"/org/freedesktop/systemd1",
|
||||||
"org.freedesktop.systemd1.Manager",
|
"org.freedesktop.systemd1.Manager",
|
||||||
"ListUnitsFiltered");
|
"ListUnitsByPatterns");
|
||||||
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_create_error(r);
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
@ -561,7 +561,34 @@ static int get_unit_list(
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_create_error(r);
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
|
r = sd_bus_message_append_strv(m, patterns);
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
r = sd_bus_call(bus, m, 0, &error, &reply);
|
r = sd_bus_call(bus, m, 0, &error, &reply);
|
||||||
|
if (r < 0 && sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD)) {
|
||||||
|
/* Fallback to legacy ListUnitsFiltered method */
|
||||||
|
fallback = true;
|
||||||
|
log_debug_errno(r, "Failed to list units: %s Falling back to ListUnitsFiltered method.", bus_error_message(&error, r));
|
||||||
|
m = sd_bus_message_unref(m);
|
||||||
|
sd_bus_error_free(&error);
|
||||||
|
|
||||||
|
r = sd_bus_message_new_method_call(
|
||||||
|
bus,
|
||||||
|
&m,
|
||||||
|
"org.freedesktop.systemd1",
|
||||||
|
"/org/freedesktop/systemd1",
|
||||||
|
"org.freedesktop.systemd1.Manager",
|
||||||
|
"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)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to list units: %s", bus_error_message(&error, r));
|
return log_error_errno(r, "Failed to list units: %s", bus_error_message(&error, r));
|
||||||
|
|
||||||
@ -572,7 +599,7 @@ static int get_unit_list(
|
|||||||
while ((r = bus_parse_unit_info(reply, &u)) > 0) {
|
while ((r = bus_parse_unit_info(reply, &u)) > 0) {
|
||||||
u.machine = machine;
|
u.machine = machine;
|
||||||
|
|
||||||
if (!output_show_unit(&u, patterns))
|
if (!output_show_unit(&u, fallback ? patterns : NULL))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!GREEDY_REALLOC(*unit_infos, size, c+1))
|
if (!GREEDY_REALLOC(*unit_infos, size, c+1))
|
||||||
@ -1282,7 +1309,7 @@ static int compare_unit_file_list(const void *a, const void *b) {
|
|||||||
return strcasecmp(basename(u->path), basename(v->path));
|
return strcasecmp(basename(u->path), basename(v->path));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool output_show_unit_file(const UnitFileList *u, char **patterns) {
|
static bool output_show_unit_file(const UnitFileList *u, char **states, char **patterns) {
|
||||||
assert(u);
|
assert(u);
|
||||||
|
|
||||||
if (!strv_fnmatch_or_empty(patterns, basename(u->path), FNM_NOESCAPE))
|
if (!strv_fnmatch_or_empty(patterns, basename(u->path), FNM_NOESCAPE))
|
||||||
@ -1299,8 +1326,8 @@ static bool output_show_unit_file(const UnitFileList *u, char **patterns) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strv_isempty(arg_states) &&
|
if (!strv_isempty(states) &&
|
||||||
!strv_find(arg_states, unit_file_state_to_string(u->state)))
|
!strv_find(states, unit_file_state_to_string(u->state)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1373,6 +1400,7 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
const char *state;
|
const char *state;
|
||||||
char *path;
|
char *path;
|
||||||
int r;
|
int r;
|
||||||
|
bool fallback = false;
|
||||||
|
|
||||||
pager_open(arg_no_pager, false);
|
pager_open(arg_no_pager, false);
|
||||||
|
|
||||||
@ -1386,7 +1414,7 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
if (!h)
|
if (!h)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
r = unit_file_get_list(arg_scope, arg_root, h);
|
r = unit_file_get_list(arg_scope, arg_root, h, arg_states, strv_skip(argv, 1));
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
unit_file_list_free(h);
|
unit_file_list_free(h);
|
||||||
return log_error_errno(r, "Failed to get unit file list: %m");
|
return log_error_errno(r, "Failed to get unit file list: %m");
|
||||||
@ -1401,7 +1429,7 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HASHMAP_FOREACH(u, h, i) {
|
HASHMAP_FOREACH(u, h, i) {
|
||||||
if (!output_show_unit_file(u, strv_skip(argv, 1)))
|
if (!output_show_unit_file(u, NULL, NULL))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
units[c++] = *u;
|
units[c++] = *u;
|
||||||
@ -1411,6 +1439,7 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
assert(c <= n_units);
|
assert(c <= n_units);
|
||||||
hashmap_free(h);
|
hashmap_free(h);
|
||||||
} else {
|
} else {
|
||||||
|
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
|
||||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
sd_bus *bus;
|
sd_bus *bus;
|
||||||
|
|
||||||
@ -1418,15 +1447,44 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = sd_bus_call_method(
|
r = sd_bus_message_new_method_call(
|
||||||
bus,
|
bus,
|
||||||
|
&m,
|
||||||
"org.freedesktop.systemd1",
|
"org.freedesktop.systemd1",
|
||||||
"/org/freedesktop/systemd1",
|
"/org/freedesktop/systemd1",
|
||||||
"org.freedesktop.systemd1.Manager",
|
"org.freedesktop.systemd1.Manager",
|
||||||
"ListUnitFiles",
|
"ListUnitFilesByPatterns");
|
||||||
&error,
|
if (r < 0)
|
||||||
&reply,
|
return bus_log_create_error(r);
|
||||||
NULL);
|
|
||||||
|
r = sd_bus_message_append_strv(m, arg_states);
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
|
r = sd_bus_message_append_strv(m, strv_skip(argv, 1));
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
|
r = sd_bus_call(bus, m, 0, &error, &reply);
|
||||||
|
if (r < 0 && sd_bus_error_has_name(&error, SD_BUS_ERROR_UNKNOWN_METHOD)) {
|
||||||
|
/* Fallback to legacy ListUnitFiles method */
|
||||||
|
fallback = true;
|
||||||
|
log_debug_errno(r, "Failed to list unit files: %s Falling back to ListUnitsFiles method.", bus_error_message(&error, r));
|
||||||
|
m = sd_bus_message_unref(m);
|
||||||
|
sd_bus_error_free(&error);
|
||||||
|
|
||||||
|
r = sd_bus_message_new_method_call(
|
||||||
|
bus,
|
||||||
|
&m,
|
||||||
|
"org.freedesktop.systemd1",
|
||||||
|
"/org/freedesktop/systemd1",
|
||||||
|
"org.freedesktop.systemd1.Manager",
|
||||||
|
"ListUnitFiles");
|
||||||
|
if (r < 0)
|
||||||
|
return bus_log_create_error(r);
|
||||||
|
|
||||||
|
r = sd_bus_call(bus, m, 0, &error, &reply);
|
||||||
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to list unit files: %s", bus_error_message(&error, r));
|
return log_error_errno(r, "Failed to list unit files: %s", bus_error_message(&error, r));
|
||||||
|
|
||||||
@ -1444,7 +1502,9 @@ static int list_unit_files(int argc, char *argv[], void *userdata) {
|
|||||||
unit_file_state_from_string(state)
|
unit_file_state_from_string(state)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (output_show_unit_file(&units[c], strv_skip(argv, 1)))
|
if (output_show_unit_file(&units[c],
|
||||||
|
fallback ? arg_states : NULL,
|
||||||
|
fallback ? strv_skip(argv, 1) : NULL))
|
||||||
c++;
|
c++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -606,7 +606,7 @@ static void test_preset_and_list(const char *root) {
|
|||||||
assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
|
assert_se(unit_file_get_state(UNIT_FILE_SYSTEM, root, "preset-no.service", &state) >= 0 && state == UNIT_FILE_DISABLED);
|
||||||
|
|
||||||
assert_se(h = hashmap_new(&string_hash_ops));
|
assert_se(h = hashmap_new(&string_hash_ops));
|
||||||
assert_se(unit_file_get_list(UNIT_FILE_SYSTEM, root, h) >= 0);
|
assert_se(unit_file_get_list(UNIT_FILE_SYSTEM, root, h, NULL, NULL) >= 0);
|
||||||
|
|
||||||
p = strjoina(root, "/usr/lib/systemd/system/preset-yes.service");
|
p = strjoina(root, "/usr/lib/systemd/system/preset-yes.service");
|
||||||
q = strjoina(root, "/usr/lib/systemd/system/preset-no.service");
|
q = strjoina(root, "/usr/lib/systemd/system/preset-no.service");
|
||||||
|
@ -50,7 +50,7 @@ int main(int argc, char* argv[]) {
|
|||||||
log_parse_environment();
|
log_parse_environment();
|
||||||
|
|
||||||
h = hashmap_new(&string_hash_ops);
|
h = hashmap_new(&string_hash_ops);
|
||||||
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h);
|
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h, NULL, NULL);
|
||||||
assert_se(r == 0);
|
assert_se(r == 0);
|
||||||
|
|
||||||
HASHMAP_FOREACH(p, h, i) {
|
HASHMAP_FOREACH(p, h, i) {
|
||||||
|
@ -53,7 +53,7 @@ static int test_unit_file_get_set(void) {
|
|||||||
h = hashmap_new(&string_hash_ops);
|
h = hashmap_new(&string_hash_ops);
|
||||||
assert_se(h);
|
assert_se(h);
|
||||||
|
|
||||||
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h);
|
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h, NULL, NULL);
|
||||||
|
|
||||||
if (r == -EPERM || r == -EACCES) {
|
if (r == -EPERM || r == -EACCES) {
|
||||||
printf("Skipping test: unit_file_get_list: %s", strerror(-r));
|
printf("Skipping test: unit_file_get_list: %s", strerror(-r));
|
||||||
|
Loading…
Reference in New Issue
Block a user