From d0ba749e8c802ed8a96be3571b38fbad25fd772f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Wed, 28 May 2025 03:18:14 +0900 Subject: [PATCH] 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. --- man/udevadm.xml | 20 ++++++----- src/udev/udevadm-info.c | 4 +-- src/udev/udevadm-util.c | 3 ++ test/units/TEST-17-UDEV.sanity-check.sh | 3 ++ tools/command_ignorelist | 46 ++++++++++++------------- 5 files changed, 42 insertions(+), 34 deletions(-) diff --git a/man/udevadm.xml b/man/udevadm.xml index 07ba2ff09de..c9a30901edb 100644 --- a/man/udevadm.xml +++ b/man/udevadm.xml @@ -30,12 +30,12 @@ udevadm info options - devpath|syspath|unit + devpath|syspath|id|unit udevadm trigger options - devpath|syspath|unit + devpath|syspath|id|unit udevadm settle @@ -52,13 +52,13 @@ udevadm test options - devpath|syspath|unit + devpath|syspath|id|unit udevadm test-builtin options command - devpath|syspath|unit + devpath|syspath|id|unit udevadm verify @@ -115,15 +115,17 @@ 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> Query the udev database for device information. 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 /dev/), a sys path (in which case it must start - with /sys/), or a systemd device unit name (in which case it must end with - .device, see + with /sys/), a device ID (such as n1, c5:1, + or b259:1, see + sd_device_get_device_id3). + or a systemd device unit name (in which case it must end with .device, see systemd.device5). @@ -427,7 +429,7 @@ 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> Request device events from the kernel. Primarily used to replay events at system coldplug time. @@ -902,7 +904,7 @@ 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> diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c index a9e99ef7e50..e3bc4c4858b 100644 --- a/src/udev/udevadm-info.c +++ b/src/udev/udevadm-info.c @@ -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); diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c index 73c39f696c4..7952d1dc149 100644 --- a/src/udev/udevadm-util.c +++ b/src/udev/udevadm-util.c @@ -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; diff --git a/test/units/TEST-17-UDEV.sanity-check.sh b/test/units/TEST-17-UDEV.sanity-check.sh index fa4533391a0..7b95722f7a8 100755 --- a/test/units/TEST-17-UDEV.sanity-check.sh +++ b/test/units/TEST-17-UDEV.sanity-check.sh @@ -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 diff --git a/tools/command_ignorelist b/tools/command_ignorelist index b8a4084d264..4a48d4e6142 100644 --- a/tools/command_ignorelist +++ b/tools/command_ignorelist @@ -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="/"] -- 2.47.3