summaryrefslogtreecommitdiff
path: root/src/udev/udevadm-info.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-06-26 15:44:41 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-07-03 22:21:44 +0900
commit21df146501fd812f07731e93e6c01873232b80fd (patch)
tree34e653dc7259ee00bf334679167d0e12103b0bae /src/udev/udevadm-info.c
parentfadcc1222949ed57ca2ce143f2eb9b93ea0dab1b (diff)
downloadsystemd-21df146501fd812f07731e93e6c01873232b80fd.tar.gz
udevadm: sort entries in `udevadm info -a` by attribute name
Diffstat (limited to 'src/udev/udevadm-info.c')
-rw-r--r--src/udev/udevadm-info.c77
1 files changed, 52 insertions, 25 deletions
diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c
index 1debdf2b31..b1209e6baf 100644
--- a/src/udev/udevadm-info.c
+++ b/src/udev/udevadm-info.c
@@ -17,6 +17,7 @@
#include "device-util.h"
#include "dirent-util.h"
#include "fd-util.h"
+#include "sort-util.h"
#include "string-table.h"
#include "string-util.h"
#include "udev-util.h"
@@ -56,9 +57,36 @@ static bool skip_attribute(const char *name) {
return string_table_lookup(skip, ELEMENTSOF(skip), name) >= 0;
}
-static void print_all_attributes(sd_device *device, const char *key) {
+typedef struct SysAttr {
+ const char *name;
+ const char *value;
+} SysAttr;
+
+static int sysattr_compare(const SysAttr *a, const SysAttr *b) {
+ return strcmp(a->name, b->name);
+}
+
+static int print_all_attributes(sd_device *device, bool is_parent) {
+ _cleanup_free_ SysAttr *sysattrs = NULL;
+ size_t n_items = 0, n_allocated = 0;
const char *name, *value;
+ value = NULL;
+ (void) sd_device_get_devpath(device, &value);
+ printf(" looking at %sdevice '%s':\n", is_parent ? "parent " : "", strempty(value));
+
+ value = NULL;
+ (void) sd_device_get_sysname(device, &value);
+ printf(" %s==\"%s\"\n", is_parent ? "KERNELS" : "KERNEL", strempty(value));
+
+ value = NULL;
+ (void) sd_device_get_subsystem(device, &value);
+ printf(" %s==\"%s\"\n", is_parent ? "SUBSYSTEMS" : "SUBSYSTEM", strempty(value));
+
+ value = NULL;
+ (void) sd_device_get_driver(device, &value);
+ printf(" %s==\"%s\"\n", is_parent ? "DRIVERS" : "DRIVER", strempty(value));
+
FOREACH_DEVICE_SYSATTR(device, name) {
size_t len;
@@ -79,14 +107,29 @@ static void print_all_attributes(sd_device *device, const char *key) {
if (len > 0)
continue;
- printf(" %s{%s}==\"%s\"\n", key, name, value);
+ if (!GREEDY_REALLOC(sysattrs, n_allocated, n_items + 1))
+ return log_oom();
+
+ sysattrs[n_items] = (SysAttr) {
+ .name = name,
+ .value = value,
+ };
+ n_items++;
}
+
+ typesafe_qsort(sysattrs, n_items, sysattr_compare);
+
+ for (size_t i = 0; i < n_items; i++)
+ printf(" %s{%s}==\"%s\"\n", is_parent ? "ATTRS" : "ATTR", sysattrs[i].name, sysattrs[i].value);
+
puts("");
+
+ return 0;
}
static int print_device_chain(sd_device *device) {
sd_device *child, *parent;
- const char *str;
+ int r;
printf("\n"
"Udevadm info starts with the device specified by the devpath and then\n"
@@ -96,30 +139,14 @@ static int print_device_chain(sd_device *device) {
"and the attributes from one single parent device.\n"
"\n");
- (void) sd_device_get_devpath(device, &str);
- printf(" looking at device '%s':\n", str);
- (void) sd_device_get_sysname(device, &str);
- printf(" KERNEL==\"%s\"\n", str);
- if (sd_device_get_subsystem(device, &str) < 0)
- str = "";
- printf(" SUBSYSTEM==\"%s\"\n", str);
- if (sd_device_get_driver(device, &str) < 0)
- str = "";
- printf(" DRIVER==\"%s\"\n", str);
- print_all_attributes(device, "ATTR");
+ r = print_all_attributes(device, false);
+ if (r < 0)
+ return r;
for (child = device; sd_device_get_parent(child, &parent) >= 0; child = parent) {
- (void) sd_device_get_devpath(parent, &str);
- printf(" looking at parent device '%s':\n", str);
- (void) sd_device_get_sysname(parent, &str);
- printf(" KERNELS==\"%s\"\n", str);
- if (sd_device_get_subsystem(parent, &str) < 0)
- str = "";
- printf(" SUBSYSTEMS==\"%s\"\n", str);
- if (sd_device_get_driver(parent, &str) < 0)
- str = "";
- printf(" DRIVERS==\"%s\"\n", str);
- print_all_attributes(parent, "ATTRS");
+ r = print_all_attributes(parent, true);
+ if (r < 0)
+ return r;
}
return 0;