summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemctl.xml28
-rw-r--r--src/systemctl/systemctl.c21
2 files changed, 34 insertions, 15 deletions
diff --git a/man/systemctl.xml b/man/systemctl.xml
index e3d22a7b5b..bf31b6114d 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -87,14 +87,26 @@
<term><option>--type=</option></term>
<term><option>-t</option></term>
- <listitem><para>When listing units,
- limit display to certain unit
- types. If not specified units of all
- types will be shown. The argument
- should be a unit type name such as
- <option>service</option>,
- <option>socket</option> and
- similar.</para></listitem>
+ <listitem><para>The argument should
+ be a unit type name such as
+ <option>service</option> and
+ <option>socket</option>,
+ or a unit load state such as
+ <option>loaded</option> and
+ <option>masked</option>.
+ </para>
+
+ <para>If the argument is a unit type,
+ when listing units, limit display to
+ certain unit types. If not specified
+ units of all types will be shown.</para>
+
+ <para>If the argument is a unit load state,
+ when listing units, limit display to
+ certain unit types. If not specified
+ units of in all load states will be
+ shown.</para>
+ </listitem>
</varlistentry>
<varlistentry>
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index a9681798dd..6ab92cebf0 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -65,6 +65,7 @@
#include "path-util.h"
static const char *arg_type = NULL;
+static const char *arg_load_state = NULL;
static char **arg_property = NULL;
static bool arg_all = false;
static const char *arg_job_mode = "replace";
@@ -337,7 +338,9 @@ static bool output_show_unit(const struct unit_info *u) {
return (!arg_type || ((dot = strrchr(u->id, '.')) &&
streq(dot+1, arg_type))) &&
- (arg_all || !(streq(u->active_state, "inactive") || u->following[0]) || u->job_id > 0);
+ (!arg_load_state || streq(u->load_state, arg_load_state)) &&
+ (arg_all || !(streq(u->active_state, "inactive")
+ || u->following[0]) || u->job_id > 0);
}
static void output_units_list(const struct unit_info *unit_infos, unsigned c) {
@@ -4650,13 +4653,17 @@ static int systemctl_parse_argv(int argc, char *argv[]) {
return 0;
case 't':
- if (unit_type_from_string(optarg) < 0) {
- log_error("Invalid unit type '%s'.", optarg);
- return -EINVAL;
+ if (unit_type_from_string(optarg) >= 0) {
+ arg_type = optarg;
+ break;
}
- arg_type = optarg;
- break;
-
+ if (unit_load_state_from_string(optarg) >= 0) {
+ arg_load_state = optarg;
+ break;
+ }
+ log_error("Unkown unit type or load state '%s'.",
+ optarg);
+ return -EINVAL;
case 'p': {
char **l;