]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udevadm: allow to specify device by device ID
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 27 May 2025 18:18:14 +0000 (03:18 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 28 May 2025 19:04:22 +0000 (04:04 +0900)
We have already exposed device ID in the output of device ID in J
fields. Also sd_device_get_device_id() and sd_device_new_from_device_id()
are already public. Hence, making udevadm accept device IDs may be
useful.

With this change, as we save several data in /run/udev with device ID,
we can call udevadm something like the following:
```
udevadm info $(ls /run/udev/tags/uaccess)
```
Then, we can show all devices that has uaccess tag.

man/udevadm.xml
src/udev/udevadm-info.c
src/udev/udevadm-util.c
test/units/TEST-17-UDEV.sanity-check.sh
tools/command_ignorelist

index 07ba2ff09deac71acb06c0574892a3ff6548010f..c9a30901edbd3878d27d8173c5659772776d8c43 100644 (file)
     <cmdsynopsis>
       <command>udevadm info</command>
       <arg choice="opt" rep="repeat"><replaceable>options</replaceable></arg>
-      <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable></arg>
+      <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable></arg>
     </cmdsynopsis>
     <cmdsynopsis>
       <command>udevadm trigger</command>
       <arg choice="opt" rep="repeat"><replaceable>options</replaceable></arg>
-      <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable></arg>
+      <arg choice="opt" rep="repeat"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable></arg>
     </cmdsynopsis>
     <cmdsynopsis>
       <command>udevadm settle</command>
     <cmdsynopsis>
       <command>udevadm test</command>
       <arg choice="opt" rep="repeat"><replaceable>options</replaceable></arg>
-      <arg choice="plain"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable></arg>
+      <arg choice="plain"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable></arg>
     </cmdsynopsis>
     <cmdsynopsis>
       <command>udevadm test-builtin</command>
       <arg choice="opt" rep="repeat"><replaceable>options</replaceable></arg>
       <arg choice="plain"><replaceable>command</replaceable></arg>
-      <arg choice="plain"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable></arg>
+      <arg choice="plain"><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable></arg>
     </cmdsynopsis>
     <cmdsynopsis>
       <command>udevadm verify</command>
     <refsect2>
       <title>udevadm info
       <optional><replaceable>options</replaceable>…</optional>
-      <optional><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable>…</optional>
+      <optional><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable>…</optional>
       </title>
 
       <para>Query the udev database for device information.</para>
 
       <para>Positional arguments should be used to specify one or more devices. Each one may be a device name
       (in which case it must start with <filename>/dev/</filename>), a sys path (in which case it must start
-      with <filename>/sys/</filename>), or a systemd device unit name (in which case it must end with
-      <literal>.device</literal>, see
+      with <filename>/sys/</filename>), a device ID (such as <literal>n1</literal>, <literal>c5:1</literal>,
+      or <literal>b259:1</literal>, see
+      <citerefentry><refentrytitle>sd_device_get_device_id</refentrytitle><manvolnum>3</manvolnum></citerefentry>).
+      or a systemd device unit name (in which case it must end with <literal>.device</literal>, see
       <citerefentry><refentrytitle>systemd.device</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
       </para>
 
     <refsect2>
       <title>udevadm trigger
       <optional><replaceable>options</replaceable>…</optional>
-      <optional><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable>…</optional>
+      <optional><replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable>…</optional>
       </title>
 
       <para>Request device events from the kernel. Primarily used to replay events at system coldplug time.</para>
     <refsect2>
       <title>udevadm test
       <optional><replaceable>options</replaceable>…</optional>
-      <replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>unit</replaceable>
+      <replaceable>devpath</replaceable>|<replaceable>syspath</replaceable>|<replaceable>id</replaceable>|<replaceable>unit</replaceable>
       </title>
 
       <para>
index a9e99ef7e50b4a7a9e02fbddc52b355902c7d715..e3bc4c4858bf8f5cd7eb150bd44026ca70796094 100644 (file)
@@ -1302,10 +1302,10 @@ int info_main(int argc, char *argv[], void *userdata) {
         STRV_FOREACH(p, arg_devices) {
                 _cleanup_(sd_device_unrefp) sd_device *device = NULL;
 
-                r = find_device(*p, NULL, &device);
+                r = find_device(*p, /* prefix = */ NULL, &device);
                 if (r < 0) {
                         if (r == -EINVAL)
-                                log_error_errno(r, "Bad argument \"%s\", expected an absolute path in /dev/ or /sys/ or a unit name: %m", *p);
+                                log_error_errno(r, "Bad argument \"%s\", expected an absolute path in /dev/ or /sys/, device ID, or a unit name: %m", *p);
                         else
                                 log_error_errno(r, "Unknown device \"%s\": %m",  *p);
 
index 73c39f696c4e25572889a05fa84df64d201a7286..7952d1dc149c156e1557cea038a014bd5d71f75c 100644 (file)
@@ -75,6 +75,9 @@ int find_device(const char *id, const char *prefix, sd_device **ret) {
         assert(id);
         assert(ret);
 
+        if (sd_device_new_from_device_id(ret, id) >= 0)
+                return 0;
+
         if (sd_device_new_from_path(ret, id) >= 0)
                 return 0;
 
index fa4533391a071839ae293e127c09366311e4953b..7b95722f7a835526e2959e489b78dd3a3c92d157 100755 (executable)
@@ -82,6 +82,9 @@ udevadm control --revert
 udevadm info /dev/null
 udevadm info /sys/class/net/$netdev
 udevadm info "$(systemd-escape -p --suffix device /sys/devices/virtual/net/$netdev)"
+[[ "$(udevadm info --json=short n1 | jq -r .DEVICE_ID)" == n1 ]]
+udevadm info "$(udevadm info --json=short /dev/null | jq -r .DEVICE_ID)"
+udevadm info "$(udevadm info --json=short /sys/class/net/$netdev | jq -r .DEVICE_ID)"
 udevadm info --property DEVNAME /sys/class/net/$netdev
 udevadm info --property DEVNAME --value /sys/class/net/$netdev
 udevadm info --property HELLO /sys/class/net/$netdev
index b8a4084d2640f5c1198321a19121e85ed6995182..4a48d4e61428279b311034d8b8fe4e8bd5fc37cb 100644 (file)
@@ -494,28 +494,28 @@ udev.xml ./refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/
 udev.xml ./refsect1[title="Rules Files"]/refsect2[title="Keys"]/variablelist[4]/varlistentry[term="$$"]
 udevadm.xml ./refsect1[title="Options"]/variablelist/varlistentry[term="-d"]
 udevadm.xml ./refsect1[title="Options"]/variablelist/varlistentry[term="-V"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-q"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-p"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-n"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-r"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-a"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-x"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-P"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-d"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-e"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-c"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-v"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-n"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-t"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-c"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-s"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-S"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-a"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-A"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-p"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-g"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-y"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|unit…\n      "]/variablelist/varlistentry[term="-b"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-q"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-p"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-n"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-r"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-a"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-x"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-P"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-d"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-e"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm info\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-c"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-v"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-n"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-t"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-c"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-s"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-S"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-a"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-A"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-p"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-g"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-y"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm trigger\n      options…\n      devpath|syspath|id|unit…\n      "]/variablelist/varlistentry[term="-b"]
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm settle\n      options…\n      "]/variablelist/varlistentry[term="-t"]
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm settle\n      options…\n      "]/variablelist/varlistentry[term="-E"]
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm control options…"]/variablelist/varlistentry[term="-e"]
@@ -531,7 +531,7 @@ udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm monitor\n      o
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm monitor\n      options…\n      "]/variablelist/varlistentry[term="-p"]
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm monitor\n      options…\n      "]/variablelist/varlistentry[term="-s"]
 udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm monitor\n      options…\n      "]/variablelist/varlistentry[term="-t"]
-udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm test\n      options…\n      devpath|syspath|unit\n      "]/variablelist/varlistentry[term="-a"]
+udevadm.xml ./refsect1[title="Options"]/refsect2[title="udevadm test\n      options…\n      devpath|syspath|id|unit\n      "]/variablelist/varlistentry[term="-a"]
 vconsole.conf.xml ./refsect1[title="Options"]/variablelist/varlistentry[term="KEYMAP="]
 vconsole.conf.xml ./refsect1[title="Options"]/variablelist/varlistentry[term="FONT="]
 file-hierarchy.xml ./refsect1[title="General Structure"]/variablelist/varlistentry[term="/"]