chiark / gitweb /
systemctl: filter shown units by their load state
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 10 Jul 2012 16:03:03 +0000 (18:03 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 10 Jul 2012 16:05:47 +0000 (18:05 +0200)
E.g. systemctl --all -t masked gives the list of masked units.

The -t/--type option is reused. This is possible because unit types
and unit load states are called differently, so it is possible to
distinguish what the user meant. Using the same option also means that
the interface is user for the user: less options to remember.

man/systemctl.xml
src/systemctl/systemctl.c

index e3d22a7b5bf000281d7e849c10182b144b51a405..bf31b6114d9b7923c2a075f78f4b48bf1db54056 100644 (file)
                                 <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>
index a9681798dd55baef54e0ca1087c5fcfedd8180c3..6ab92cebf0fd34b5ac60766358c34b08666462ee 100644 (file)
@@ -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;