if (k != u->id)
continue;
- if (!strv_isempty(states) &&
- !strv_contains(states, unit_load_state_to_string(u->load_state)) &&
- !strv_contains(states, unit_active_state_to_string(unit_active_state(u))) &&
- !strv_contains(states, unit_sub_state_to_string(u)))
- continue;
-
- if (!strv_isempty(patterns) &&
- !strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE))
+ if (unit_is_filtered(u, states, patterns))
continue;
r = reply_unit_info(reply, u);
return 0;
}
+bool unit_is_filtered(Unit *u, char *const *states, char *const *patterns) {
+ assert(u);
+
+ if (!strv_isempty(states)) {
+ char *const *unit_states = STRV_MAKE(
+ unit_load_state_to_string(u->load_state),
+ unit_active_state_to_string(unit_active_state(u)),
+ unit_sub_state_to_string(u));
+
+ if (!strv_overlap(states, unit_states))
+ return true;
+ }
+
+ return !strv_isempty(patterns) && !strv_fnmatch_or_empty(patterns, u->id, FNM_NOESCAPE);
+}
+
static int unit_get_nice(Unit *u) {
ExecContext *ec;
int unit_arm_timer(Unit *u, sd_event_source **source, bool relative, usec_t usec, sd_event_time_handler_t handler);
+bool unit_is_filtered(Unit *u, char *const *states, char *const *patterns);
+
int unit_compare_priority(Unit *a, Unit *b);
UnitMountDependencyType unit_mount_dependency_type_from_string(const char *s) _const_;