udevadm: allow to specify device by device ID

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.
This commit is contained in:
Yu Watanabe
2025-05-28 03:18:14 +09:00
parent 337f45d811
commit d0ba749e8c
5 changed files with 42 additions and 34 deletions

View File

@@ -30,12 +30,12 @@
<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>
@@ -52,13 +52,13 @@
<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>
@@ -115,15 +115,17 @@
<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>
@@ -427,7 +429,7 @@
<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>
@@ -902,7 +904,7 @@
<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>

View 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);

View 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;

View File

@@ -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

View 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="/"]