Compare commits
5 Commits
3da49ad55a
...
a64911f9b7
Author | SHA1 | Date |
---|---|---|
Frantisek Sumsal | a64911f9b7 | |
Yu Watanabe | c5fbdebec6 | |
Zbigniew Jędrzejewski-Szmek | 21c7fe6d12 | |
Yu Watanabe | 21df146501 | |
Yu Watanabe | fadcc12229 |
|
@ -1564,34 +1564,68 @@ _public_ const char *sd_device_get_property_next(sd_device *device, const char *
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int device_sysattrs_read_all(sd_device *device) {
|
static int device_sysattrs_read_all_internal(sd_device *device, const char *subdir) {
|
||||||
|
_cleanup_free_ char *path_dir = NULL;
|
||||||
_cleanup_closedir_ DIR *dir = NULL;
|
_cleanup_closedir_ DIR *dir = NULL;
|
||||||
const char *syspath;
|
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
|
const char *syspath;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(device);
|
|
||||||
|
|
||||||
if (device->sysattrs_read)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
r = sd_device_get_syspath(device, &syspath);
|
r = sd_device_get_syspath(device, &syspath);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
dir = opendir(syspath);
|
if (subdir) {
|
||||||
|
_cleanup_free_ char *p = NULL;
|
||||||
|
|
||||||
|
p = path_join(syspath, subdir, "uevent");
|
||||||
|
if (!p)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
if (access(p, F_OK) >= 0)
|
||||||
|
/* this is a child device, skipping */
|
||||||
|
return 0;
|
||||||
|
if (errno != ENOENT) {
|
||||||
|
log_debug_errno(errno, "Failed to stat %s, ignoring subdir: %m", p);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
path_dir = path_join(syspath, subdir);
|
||||||
|
if (!path_dir)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir = opendir(path_dir ?: syspath);
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
FOREACH_DIRENT_ALL(dent, dir, return -errno) {
|
FOREACH_DIRENT_ALL(dent, dir, return -errno) {
|
||||||
_cleanup_free_ char *path = NULL;
|
_cleanup_free_ char *path = NULL, *p = NULL;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
|
||||||
/* only handle symlinks and regular files */
|
if (dot_or_dot_dot(dent->d_name))
|
||||||
if (!IN_SET(dent->d_type, DT_LNK, DT_REG))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
path = path_join(syspath, dent->d_name);
|
/* only handle symlinks, regular files, and directories */
|
||||||
|
if (!IN_SET(dent->d_type, DT_LNK, DT_REG, DT_DIR))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (subdir) {
|
||||||
|
p = path_join(subdir, dent->d_name);
|
||||||
|
if (!p)
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dent->d_type == DT_DIR) {
|
||||||
|
/* read subdirectory */
|
||||||
|
r = device_sysattrs_read_all_internal(device, p ?: dent->d_name);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
path = path_join(syspath, p ?: dent->d_name);
|
||||||
if (!path)
|
if (!path)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
@ -1601,11 +1635,26 @@ static int device_sysattrs_read_all(sd_device *device) {
|
||||||
if (!(statbuf.st_mode & S_IRUSR))
|
if (!(statbuf.st_mode & S_IRUSR))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
r = set_put_strdup(&device->sysattrs, dent->d_name);
|
r = set_put_strdup(&device->sysattrs, p ?: dent->d_name);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int device_sysattrs_read_all(sd_device *device) {
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(device);
|
||||||
|
|
||||||
|
if (device->sysattrs_read)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = device_sysattrs_read_all_internal(device, NULL);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
device->sysattrs_read = true;
|
device->sysattrs_read = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "device-util.h"
|
#include "device-util.h"
|
||||||
#include "dirent-util.h"
|
#include "dirent-util.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
|
#include "sort-util.h"
|
||||||
#include "string-table.h"
|
#include "string-table.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "udev-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;
|
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;
|
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) {
|
FOREACH_DEVICE_SYSATTR(device, name) {
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
|
@ -79,14 +107,29 @@ static void print_all_attributes(sd_device *device, const char *key) {
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
continue;
|
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("");
|
puts("");
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_device_chain(sd_device *device) {
|
static int print_device_chain(sd_device *device) {
|
||||||
sd_device *child, *parent;
|
sd_device *child, *parent;
|
||||||
const char *str;
|
int r;
|
||||||
|
|
||||||
printf("\n"
|
printf("\n"
|
||||||
"Udevadm info starts with the device specified by the devpath and then\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"
|
"and the attributes from one single parent device.\n"
|
||||||
"\n");
|
"\n");
|
||||||
|
|
||||||
(void) sd_device_get_devpath(device, &str);
|
r = print_all_attributes(device, false);
|
||||||
printf(" looking at device '%s':\n", str);
|
if (r < 0)
|
||||||
(void) sd_device_get_sysname(device, &str);
|
return r;
|
||||||
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");
|
|
||||||
|
|
||||||
for (child = device; sd_device_get_parent(child, &parent) >= 0; child = parent) {
|
for (child = device; sd_device_get_parent(child, &parent) >= 0; child = parent) {
|
||||||
(void) sd_device_get_devpath(parent, &str);
|
r = print_all_attributes(parent, true);
|
||||||
printf(" looking at parent device '%s':\n", str);
|
if (r < 0)
|
||||||
(void) sd_device_get_sysname(parent, &str);
|
return r;
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -18,11 +18,15 @@ REPO_ROOT="${REPO_ROOT:-$PWD}"
|
||||||
ADDITIONAL_DEPS=(
|
ADDITIONAL_DEPS=(
|
||||||
clang
|
clang
|
||||||
dnf-plugins-core
|
dnf-plugins-core
|
||||||
hostname libasan
|
hostname
|
||||||
jq iputils
|
iputils
|
||||||
|
jq
|
||||||
|
libasan
|
||||||
libfdisk-devel
|
libfdisk-devel
|
||||||
|
libfido2-devel
|
||||||
libpwquality-devel
|
libpwquality-devel
|
||||||
libubsan
|
libubsan
|
||||||
|
libzstd-devel
|
||||||
llvm
|
llvm
|
||||||
openssl-devel
|
openssl-devel
|
||||||
p11-kit-devel
|
p11-kit-devel
|
||||||
|
|
Loading…
Reference in New Issue