chiark / gitweb /
udevadm trigger: allow matching by device name
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 26 Nov 2014 01:32:03 +0000 (20:32 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 26 Nov 2014 02:16:47 +0000 (21:16 -0500)
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

man/udevadm.xml
src/udev/udevadm-trigger.c

index 90d3246459545b2d648271d05d2c952b37fd6f06..38c1935fa82de190e5fba3ceae0bb1ba93e66fb0 100644 (file)
@@ -66,7 +66,7 @@
     the event queue, and provides simple debugging mechanisms.</para>
   </refsect1>
 
     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>
     <variablelist>
       <varlistentry>
         <term><option>--debug</option></term>
       </varlistentry>
     </variablelist>
 
       </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
       <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
           </listitem>
         </varlistentry>
       </variablelist>
           </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>
 
-    <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>
       <para>Request device events from the kernel. Primarily used to replay events at system coldplug time.</para>
       <variablelist>
         <varlistentry>
         </varlistentry>
         <varlistentry>
           <term><option>-y</option></term>
         </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
           <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>
             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>
         <varlistentry>
           <term><option>-b</option></term>
           <term><option>--parent-match=<replaceable>SYSPATH</replaceable></option></term>
           </listitem>
         </varlistentry>
       </variablelist>
           </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>
 
-    <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>
       <para>Watches the udev event queue, and exits if all current events are handled.</para>
       <variablelist>
         <varlistentry>
       </variablelist>
     </refsect2>
 
       </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.
       <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.
       </variablelist>
     </refsect2>
 
       </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>
       <para>Maintain the hardware database index in <filename>/etc/udev/hwdb.bin</filename>.</para>
       <variablelist>
         <varlistentry>
       </variablelist>
     </refsect2>
 
       </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>
       <para>Simulate a udev event run for the given device, and print debug output.</para>
       <variablelist>
         <varlistentry>
       </variablelist>
     </refsect2>
 
       </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>
       <para>Run a built-in command <replaceable>COMMAND</replaceable>
       for device <replaceable>DEVPATH</replaceable>, and print debug
       output.</para>
index 49e256289c717229da094b8f92f4b91a1ad2a6f2..e8a0c2fef6bc6a2b21f8a448416860b429f95e3e 100644 (file)
@@ -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"
                "  -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[]) {
                "  -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[] = {
         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 {
                 {}
         };
         enum {
@@ -187,6 +193,19 @@ static int adm_trigger(struct udev *udev, int argc, char *argv[]) {
                         break;
                 }
 
                         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;
                 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) {
         }
 
         switch (device_type) {