Compare commits

...

5 Commits

Author SHA1 Message Date
Frantisek Sumsal a64911f9b7 travis: install missing deps for the Coverity run
Let's install libzstd & libfido2 to cover two recently added features.
In case of libfido2 this should also get rid of the 'dead code' issues
found by Coverity, like CID#1430168, CID#1430167, CID#1430166, or
CID#1430165.
2020-07-06 11:06:59 +02:00
Yu Watanabe c5fbdebec6
Merge pull request #16287 from yuwata/udevadm-info-attribute-walk
udevadm: make --attribute-walk show subdir attributes
2020-07-06 14:47:51 +09:00
Zbigniew Jędrzejewski-Szmek 21c7fe6d12 sd-device: be more defensive in FOREACH_DEVICE_SYSATTR
Follow-up for fadcc12229.
2020-07-05 10:55:18 +02:00
Yu Watanabe 21df146501 udevadm: sort entries in `udevadm info -a` by attribute name 2020-07-03 22:21:44 +09:00
Yu Watanabe fadcc12229 sd-device: make FOREACH_DEVICE_SYSATTR() list attributes in subdirectories
Then, `udevadm info -a` can show subdir attributes.

Closes #12191.
2020-07-03 22:21:44 +09:00
3 changed files with 120 additions and 40 deletions

View File

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

View File

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

View File

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