]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
inhibit: allow filtering --list also by what, who and why 39973/head
authorAntonio Alvarez Feijoo <antonio.feijoo@suse.com>
Wed, 3 Dec 2025 06:36:38 +0000 (07:36 +0100)
committerLuca Boccassi <bluca@debian.org>
Wed, 17 Dec 2025 23:23:44 +0000 (23:23 +0000)
Currently the list can only be filtered by mode, so make use of the remaining
options available to filter the output.

man/systemd-inhibit.xml
src/login/inhibit.c

index 0d5138e52c6ae52cfbc5a829590de4956ef56311..5ffb8f6fb6527a9169e99823f1e86b5e3f868075 100644 (file)
       <varlistentry>
         <term><option>--list</option></term>
 
-        <listitem><para>Lists all active inhibition locks instead of
-        acquiring one.</para></listitem>
+        <listitem><para>Lists all active inhibition locks instead of acquiring one. It can be filtered using
+        <option>--what=</option>, <option>--who=</option>, <option>--why=</option>, or
+        <option>--mode=</option>.</para></listitem>
       </varlistentry>
 
       <xi:include href="standard-options.xml" xpointer="no-ask-password" />
index 3535aa5d018094d71e658bf8108c9b1b4f7659d7..51379edc37e488ff2f2403984ab8d282cd31de53 100644 (file)
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include <fcntl.h>
+#include <fnmatch.h>
 #include <getopt.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -29,9 +30,9 @@
 #include "terminal-util.h"
 #include "user-util.h"
 
-static const char *arg_what = "idle:sleep:shutdown";
+static const char *arg_what = NULL;
 static const char *arg_who = NULL;
-static const char *arg_why = "Unknown reason";
+static const char *arg_why = NULL;
 static const char *arg_mode = NULL;
 static bool arg_ask_password = true;
 static PagerFlags arg_pager_flags = 0;
@@ -65,6 +66,8 @@ static int print_inhibitors(sd_bus *bus) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
         _cleanup_(table_unrefp) Table *table = NULL;
+        _cleanup_strv_free_ char **what_filter = NULL;
+
         int r;
 
         pager_open(arg_pager_flags);
@@ -85,6 +88,12 @@ static int print_inhibitors(sd_bus *bus) {
         if (r < 0)
                 return bus_log_parse_error(r);
 
+        if (arg_what) {
+                what_filter = strv_split(arg_what, ":");
+                if (!what_filter)
+                        return log_oom();
+        }
+
         for (;;) {
                 _cleanup_free_ char *comm = NULL, *u = NULL;
                 const char *what, *who, *why, *mode;
@@ -96,6 +105,25 @@ static int print_inhibitors(sd_bus *bus) {
                 if (r == 0)
                         break;
 
+                if (what_filter) {
+                        bool skip = false;
+
+                        STRV_FOREACH(op, what_filter)
+                                if (!string_contains_word(what, ":", *op)) {
+                                        skip = true;
+                                        break;
+                                }
+
+                        if (skip)
+                                continue;
+                }
+
+                if (arg_who && !streq(who, arg_who))
+                        continue;
+
+                if (arg_why && fnmatch(arg_why, why, FNM_CASEFOLD) != 0)
+                        continue;
+
                 if (arg_mode && !streq(mode, arg_mode))
                         continue;
 
@@ -307,6 +335,9 @@ static int run(int argc, char *argv[]) {
                 /* Ignore SIGINT and allow the forked process to receive it */
                 (void) ignore_signals(SIGINT);
 
+                if (!arg_what)
+                        arg_what = "idle:sleep:shutdown";
+
                 if (!arg_who) {
                         w = strv_join(argv + optind, " ");
                         if (!w)
@@ -315,6 +346,9 @@ static int run(int argc, char *argv[]) {
                         arg_who = w;
                 }
 
+                if (!arg_why)
+                        arg_why = "Unknown reason";
+
                 if (!arg_mode)
                         arg_mode = "block";