udevadm/info: also show driver subsystem and device ID

This adds two more fields in 'udevadm info':
- J for device ID, e.g. b128:1, c10:1, n1, and so on.
- B for driver subsystem, e.g. pci, i2c, and so on.

These, especially the device ID field may be useful to find udev
database file under /run/udev/data for a device.
This commit is contained in:
Yu Watanabe
2024-08-27 04:14:12 +09:00
parent cd7c71154c
commit 3fe0fd20c9
2 changed files with 29 additions and 2 deletions

View File

@@ -336,10 +336,18 @@
<entry><literal>R:</literal></entry>
<entry>Device number in <filename>/sys/</filename> (i.e. the numeric suffix of the last component of <literal>P:</literal>)</entry>
</row>
<row>
<entry><literal>J:</literal></entry>
<entry>Device ID</entry>
</row>
<row>
<entry><literal>U:</literal></entry>
<entry>Kernel subsystem</entry>
</row>
<row>
<entry><literal>B:</literal></entry>
<entry>Driver subsystem</entry>
</row>
<row>
<entry><literal>T:</literal></entry>
<entry>Kernel device type within subsystem</entry>

View File

@@ -323,9 +323,15 @@ static int print_record(sd_device *device, const char *prefix) {
if (sd_device_get_sysnum(device, &str) >= 0)
printf("%sR: %s%s%s\n", prefix, ansi_highlight_white(), str, ansi_normal());
if (sd_device_get_device_id(device, &str) >= 0)
printf("%sJ: %s%s%s\n", prefix, ansi_highlight_white(), str, ansi_normal());
if (sd_device_get_subsystem(device, &subsys) >= 0)
printf("%sU: %s%s%s\n", prefix, ansi_highlight_green(), subsys, ansi_normal());
if (sd_device_get_driver_subsystem(device, &str) >= 0)
printf("%sB: %s%s%s\n", prefix, ansi_highlight_green(), str, ansi_normal());
if (sd_device_get_devtype(device, &str) >= 0)
printf("%sT: %s%s%s\n", prefix, ansi_highlight_green(), str, ansi_normal());
@@ -376,8 +382,9 @@ static int record_to_json(sd_device *device, sd_json_variant **ret) {
assert(device);
assert(ret);
/* We don't show any shorthand fields here as done in print_record() except for SYSNAME and SYSNUM as
* all the other ones have a matching property which will already be included. */
/* We don't show any shorthand fields here as done in print_record() except for SYSNAME, SYSNUM,
* DRIVER_SUBSYSTEM, and DEVICE_ID, as all the other ones have a matching property which will already
* be included. */
if (sd_device_get_sysname(device, &str) >= 0) {
r = sd_json_variant_set_field_string(&v, "SYSNAME", str);
@@ -391,6 +398,18 @@ static int record_to_json(sd_device *device, sd_json_variant **ret) {
return r;
}
if (sd_device_get_driver_subsystem(device, &str) >= 0) {
r = sd_json_variant_set_field_string(&v, "DRIVER_SUBSYSTEM", str);
if (r < 0)
return r;
}
if (sd_device_get_device_id(device, &str) >= 0) {
r = sd_json_variant_set_field_string(&v, "DEVICE_ID", str);
if (r < 0)
return r;
}
FOREACH_DEVICE_PROPERTY(device, key, val) {
r = sd_json_variant_set_field_string(&v, key, val);
if (r < 0)