[systemd-commits] 2 commits - Makefile.am man/udevadm.xml src/udev

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Tue Nov 25 18:17:17 PST 2014


 Makefile.am                |    4 +-
 man/udevadm.xml            |   57 +++++++++++++++++++++++++++-----
 src/udev/udevadm-info.c    |   30 -----------------
 src/udev/udevadm-trigger.c |   78 ++++++++++++++++++++++++++++-----------------
 src/udev/udevadm-util.c    |   49 ++++++++++++++++++++++++++++
 src/udev/udevadm-util.h    |   22 ++++++++++++
 6 files changed, 171 insertions(+), 69 deletions(-)

New commits:
commit 80877656a557231f8187f7bc371fd4cb3b70de5a
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Tue Nov 25 20:32:03 2014 -0500

    udevadm trigger: allow matching by device name
    
    This makes udevadm trigger mirror udevadm info, except that multiple
    device names can be specified. Instructions in 60-keyboard.hwdb should
    now actually work.
    
    udevadm(8) is updated, but it could use a bit more polishing.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=82311

diff --git a/man/udevadm.xml b/man/udevadm.xml
index 90d3246..38c1935 100644
--- a/man/udevadm.xml
+++ b/man/udevadm.xml
@@ -66,7 +66,7 @@
     the event queue, and provides simple debugging mechanisms.</para>
   </refsect1>
 
-  <refsect1><title>OPTIONS</title>
+  <refsect1><title>Options</title>
     <variablelist>
       <varlistentry>
         <term><option>--debug</option></term>
@@ -89,7 +89,11 @@
       </varlistentry>
     </variablelist>
 
-    <refsect2><title>udevadm info <optional><replaceable>OPTIONS</replaceable></optional> <optional><replaceable>DEVPATH</replaceable>|<replaceable>FILE</replaceable></optional></title>
+    <refsect2><title>udevadm info
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+      <arg choice="opt"><replaceable>devpath</replaceable>|<replaceable>file</replaceable></arg>
+    </title>
+
       <para>Queries the udev database for device information
       stored in the udev database. It can also query the properties
       of a device from its sysfs representation to help creating udev
@@ -201,9 +205,16 @@
           </listitem>
         </varlistentry>
       </variablelist>
+
+      <para>In addition an optional positional argument can be used
+      to specify a device name or a sys path. It must start with
+      <filename>/dev</filename> or <filename>/sys</filename>
+      respectively.</para>
     </refsect2>
 
-    <refsect2><title>udevadm trigger <optional>options</optional></title>
+    <refsect2><title>udevadm trigger
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+      <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>file</replaceable></arg></title>
       <para>Request device events from the kernel. Primarily used to replay events at system coldplug time.</para>
       <variablelist>
         <varlistentry>
@@ -299,14 +310,22 @@
         </varlistentry>
         <varlistentry>
           <term><option>-y</option></term>
-          <term><option>--sysname-match=<replaceable>NAME</replaceable></option></term>
+          <term><option>--sysname-match=<replaceable>PATH</replaceable></option></term>
           <listitem>
             <para>Trigger events for devices with a matching sys
-            device name. This option can be specified multiple times
+            device path. This option can be specified multiple times
             and supports shell style pattern matching.</para>
           </listitem>
         </varlistentry>
         <varlistentry>
+          <term><option>--name-match=<replaceable>NAME</replaceable></option></term>
+          <listitem>
+            <para>Trigger events for devices with a matching
+            device path. This options can be specified multiple
+            times.</para>
+          </listitem>
+        </varlistentry>
+        <varlistentry>
           <term><option>-b</option></term>
           <term><option>--parent-match=<replaceable>SYSPATH</replaceable></option></term>
           <listitem>
@@ -322,9 +341,16 @@
           </listitem>
         </varlistentry>
       </variablelist>
+
+      <para>In addition optional positional arguments can be used
+      to specify device names or sys paths. They must start with
+      <filename>/dev</filename> or <filename>/sys</filename>
+      respectively.</para>
     </refsect2>
 
-    <refsect2><title>udevadm settle <optional>options</optional></title>
+    <refsect2><title>udevadm settle
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+    </title>
       <para>Watches the udev event queue, and exits if all current events are handled.</para>
       <variablelist>
         <varlistentry>
@@ -433,7 +459,9 @@
       </variablelist>
     </refsect2>
 
-    <refsect2><title>udevadm monitor <optional>options</optional></title>
+    <refsect2><title>udevadm monitor
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+    </title>
       <para>Listens to the kernel uevents and events sent out by a udev rule
       and prints the devpath of the event to the console. It can be used to analyze the
       event timing, by comparing the timestamps of the kernel uevent and the udev event.
@@ -484,7 +512,9 @@
       </variablelist>
     </refsect2>
 
-    <refsect2><title>udevadm hwdb <optional>options</optional></title>
+    <refsect2><title>udevadm hwdb
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+    </title>
       <para>Maintain the hardware database index in <filename>/etc/udev/hwdb.bin</filename>.</para>
       <variablelist>
         <varlistentry>
@@ -532,7 +562,10 @@
       </variablelist>
     </refsect2>
 
-    <refsect2><title>udevadm test <optional>options</optional> <replaceable>devpath</replaceable></title>
+    <refsect2><title>udevadm test
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+      <arg><replaceable>devpath</replaceable></arg>
+    </title>
       <para>Simulate a udev event run for the given device, and print debug output.</para>
       <variablelist>
         <varlistentry>
@@ -565,7 +598,11 @@
       </variablelist>
     </refsect2>
 
-    <refsect2><title>udevadm test-builtin <optional>options</optional> <replaceable>COMMAND</replaceable> <replaceable>DEVPATH</replaceable></title>
+    <refsect2><title>udevadm test-builtin
+      <arg choice="opt"><replaceable>options</replaceable></arg>
+      <arg><replaceable>command</replaceable></arg>
+      <arg><replaceable>devpath</replaceable></arg>
+    </title>
       <para>Run a built-in command <replaceable>COMMAND</replaceable>
       for device <replaceable>DEVPATH</replaceable>, and print debug
       output.</para>
diff --git a/src/udev/udevadm-trigger.c b/src/udev/udevadm-trigger.c
index 49e2562..e8a0c2f 100644
--- a/src/udev/udevadm-trigger.c
+++ b/src/udev/udevadm-trigger.c
@@ -86,26 +86,32 @@ static void help(void) {
                "  -A,--attr-nomatch=<file[=<value>]> exclude devices with a matching attribute\n"
                "  -p,--property-match=<key>=<value>  trigger devices with a matching property\n"
                "  -g,--tag-match=<key>=<value>       trigger devices with a matching property\n"
-               "  -y,--sysname-match=<name>          trigger devices with a matching name\n"
+               "  -y,--sysname-match=<name>          trigger devices with this /sys path\n"
+               "     --name-match=<name>             trigger devices with this /dev name\n"
                "  -b,--parent-match=<name>           trigger devices with that parent device\n"
                "  -h,--help\n\n");
 }
 
 static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
+        enum {
+                ARG_NAME = 0x100,
+        };
+
         static const struct option options[] = {
-                { "verbose",           no_argument,       NULL, 'v' },
-                { "dry-run",           no_argument,       NULL, 'n' },
-                { "type",              required_argument, NULL, 't' },
-                { "action",            required_argument, NULL, 'c' },
-                { "subsystem-match",   required_argument, NULL, 's' },
-                { "subsystem-nomatch", required_argument, NULL, 'S' },
-                { "attr-match",        required_argument, NULL, 'a' },
-                { "attr-nomatch",      required_argument, NULL, 'A' },
-                { "property-match",    required_argument, NULL, 'p' },
-                { "tag-match",         required_argument, NULL, 'g' },
-                { "sysname-match",     required_argument, NULL, 'y' },
-                { "parent-match",      required_argument, NULL, 'b' },
-                { "help",              no_argument,       NULL, 'h' },
+                { "verbose",           no_argument,       NULL, 'v'      },
+                { "dry-run",           no_argument,       NULL, 'n'      },
+                { "type",              required_argument, NULL, 't'      },
+                { "action",            required_argument, NULL, 'c'      },
+                { "subsystem-match",   required_argument, NULL, 's'      },
+                { "subsystem-nomatch", required_argument, NULL, 'S'      },
+                { "attr-match",        required_argument, NULL, 'a'      },
+                { "attr-nomatch",      required_argument, NULL, 'A'      },
+                { "property-match",    required_argument, NULL, 'p'      },
+                { "tag-match",         required_argument, NULL, 'g'      },
+                { "sysname-match",     required_argument, NULL, 'y'      },
+                { "name-match",        required_argument, NULL, ARG_NAME },
+                { "parent-match",      required_argument, NULL, 'b'      },
+                { "help",              no_argument,       NULL, 'h'      },
                 {}
         };
         enum {
@@ -187,6 +193,19 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
                         break;
                 }
 
+                case ARG_NAME: {
+                        _cleanup_udev_device_unref_ struct udev_device *dev;
+
+                        dev = find_device(udev, optarg, "/dev/");
+                        if (dev == NULL) {
+                                log_error("unable to open the device '%s'", optarg);
+                                return 2;
+                        }
+
+                        udev_enumerate_add_match_parent(udev_enumerate, dev);
+                        break;
+                }
+
                 case 'h':
                         help();
                         return 0;
@@ -197,9 +216,16 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
                 }
         }
 
-        if (optind < argc) {
-                fprintf(stderr, "Extraneous argument: '%s'\n", argv[optind]);
-                return 1;
+        for (; optind < argc; optind++) {
+                _cleanup_udev_device_unref_ struct udev_device *dev;
+
+                dev = find_device(udev, argv[optind], NULL);
+                if (dev == NULL) {
+                        log_error("unable to open the device '%s'", argv[optind]);
+                        return 2;
+                }
+
+                udev_enumerate_add_match_parent(udev_enumerate, dev);
         }
 
         switch (device_type) {

commit d6170d27b26eeeace966bb9720d66fcac2a6ef1b
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Tue Nov 25 19:39:19 2014 -0500

    udevadm: split out find_device helper
    
    The idea is to unify the way that devices can be specified.

diff --git a/Makefile.am b/Makefile.am
index 1674f61..b52ff8e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3462,7 +3462,9 @@ udevadm_SOURCES = \
 	src/udev/udevadm-settle.c \
 	src/udev/udevadm-trigger.c \
 	src/udev/udevadm-test.c \
-	src/udev/udevadm-test-builtin.c
+	src/udev/udevadm-test-builtin.c \
+	src/udev/udevadm-util.c \
+	src/udev/udevadm-util.h
 
 udevadm_LDADD = \
 	libudev-core.la
diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c
index 22d0826..a56f159 100644
--- a/src/udev/udevadm-info.c
+++ b/src/udev/udevadm-info.c
@@ -31,6 +31,7 @@
 
 #include "udev.h"
 #include "udev-util.h"
+#include "udevadm-util.h"
 
 static bool skip_attribute(const char *name) {
         static const char* const skip[] = {
@@ -257,35 +258,6 @@ static void cleanup_db(struct udev *udev) {
         }
 }
 
-static struct udev_device *find_device(struct udev *udev, const char *id, const char *prefix) {
-        char name[UTIL_PATH_SIZE];
-
-        if (prefix && !startswith(id, prefix)) {
-                strscpyl(name, sizeof(name), prefix, id, NULL);
-                id = name;
-        }
-
-        if (startswith(id, "/dev/")) {
-                struct stat statbuf;
-                char type;
-
-                if (stat(id, &statbuf) < 0)
-                        return NULL;
-
-                if (S_ISBLK(statbuf.st_mode))
-                        type = 'b';
-                else if (S_ISCHR(statbuf.st_mode))
-                        type = 'c';
-                else
-                        return NULL;
-
-                return udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
-        } else if (startswith(id, "/sys/"))
-                return udev_device_new_from_syspath(udev, id);
-        else
-                return NULL;
-}
-
 static int uinfo(struct udev *udev, int argc, char *argv[]) {
         _cleanup_udev_device_unref_ struct udev_device *device = NULL;
         bool root = 0;
diff --git a/src/udev/udevadm-trigger.c b/src/udev/udevadm-trigger.c
index a52d1b5..49e2562 100644
--- a/src/udev/udevadm-trigger.c
+++ b/src/udev/udevadm-trigger.c
@@ -32,6 +32,7 @@
 
 #include "udev.h"
 #include "udev-util.h"
+#include "udevadm-util.h"
 #include "util.h"
 
 static int verbose;
@@ -174,25 +175,18 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
                         udev_enumerate_add_match_sysname(udev_enumerate, optarg);
                         break;
                 case 'b': {
-                        char path[UTIL_PATH_SIZE];
-                        struct udev_device *dev;
-
-                        /* add sys dir if needed */
-                        if (!startswith(optarg, "/sys"))
-                                strscpyl(path, sizeof(path), "/sys", optarg, NULL);
-                        else
-                                strscpy(path, sizeof(path), optarg);
-                        util_remove_trailing_chars(path, '/');
-                        dev = udev_device_new_from_syspath(udev, path);
+                        _cleanup_udev_device_unref_ struct udev_device *dev;
+
+                        dev = find_device(udev, optarg, "/sys");
                         if (dev == NULL) {
                                 log_error("unable to open the device '%s'", optarg);
                                 return 2;
                         }
+
                         udev_enumerate_add_match_parent(udev_enumerate, dev);
-                        /* drop reference immediately, enumerate pins the device as long as needed */
-                        udev_device_unref(dev);
                         break;
                 }
+
                 case 'h':
                         help();
                         return 0;
diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c
new file mode 100644
index 0000000..37e80c3
--- /dev/null
+++ b/src/udev/udevadm-util.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2008-2009 Kay Sievers <kay at vrfy.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "udevadm-util.h"
+
+struct udev_device *find_device(struct udev *udev,
+                                const char *id,
+                                const char *prefix) {
+
+        assert(udev);
+        assert(id);
+
+        if (prefix && !startswith(id, prefix))
+                id = strappenda(prefix, id);
+
+        if (startswith(id, "/dev/")) {
+                struct stat statbuf;
+                char type;
+
+                if (stat(id, &statbuf) < 0)
+                        return NULL;
+
+                if (S_ISBLK(statbuf.st_mode))
+                        type = 'b';
+                else if (S_ISCHR(statbuf.st_mode))
+                        type = 'c';
+                else
+                        return NULL;
+
+                return udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
+        } else if (startswith(id, "/sys/"))
+                return udev_device_new_from_syspath(udev, id);
+        else
+                return NULL;
+}
diff --git a/src/udev/udevadm-util.h b/src/udev/udevadm-util.h
new file mode 100644
index 0000000..dba651f
--- /dev/null
+++ b/src/udev/udevadm-util.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2014 Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "udev.h"
+
+struct udev_device *find_device(struct udev *udev,
+                                const char *id,
+                                const char *prefix);



More information about the systemd-commits mailing list