mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-10-27 18:55:09 +03:00
login/sysfs-show: replace udev_device by sd_device
This commit is contained in:
parent
4f209af7da
commit
e156d24b0a
@ -3,31 +3,33 @@
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "libudev.h"
|
||||
#include "sd-device.h"
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "device-enumerator-private.h"
|
||||
#include "locale-util.h"
|
||||
#include "path-util.h"
|
||||
#include "string-util.h"
|
||||
#include "sysfs-show.h"
|
||||
#include "terminal-util.h"
|
||||
#include "udev-util.h"
|
||||
#include "util.h"
|
||||
|
||||
static int show_sysfs_one(
|
||||
struct udev *udev,
|
||||
const char *seat,
|
||||
struct udev_list_entry **item,
|
||||
sd_device **dev_list,
|
||||
size_t *i_dev,
|
||||
size_t n_dev,
|
||||
const char *sub,
|
||||
const char *prefix,
|
||||
unsigned n_columns,
|
||||
OutputFlags flags) {
|
||||
|
||||
size_t max_width;
|
||||
int r;
|
||||
|
||||
assert(udev);
|
||||
assert(seat);
|
||||
assert(item);
|
||||
assert(dev_list);
|
||||
assert(i_dev);
|
||||
assert(prefix);
|
||||
|
||||
if (flags & OUTPUT_FULL_WIDTH)
|
||||
@ -37,73 +39,58 @@ static int show_sysfs_one(
|
||||
else
|
||||
max_width = n_columns;
|
||||
|
||||
while (*item) {
|
||||
_cleanup_(udev_device_unrefp) struct udev_device *d = NULL;
|
||||
struct udev_list_entry *next, *lookahead;
|
||||
const char *sn, *name, *sysfs, *subsystem, *sysname;
|
||||
while (*i_dev < n_dev) {
|
||||
const char *sysfs, *sn, *name = NULL, *subsystem = NULL, *sysname = NULL;
|
||||
_cleanup_free_ char *k = NULL, *l = NULL;
|
||||
size_t lookahead;
|
||||
bool is_master;
|
||||
|
||||
sysfs = udev_list_entry_get_name(*item);
|
||||
if (!path_startswith(sysfs, sub))
|
||||
if (sd_device_get_syspath(dev_list[*i_dev], &sysfs) < 0 ||
|
||||
!path_startswith(sysfs, sub))
|
||||
return 0;
|
||||
|
||||
d = udev_device_new_from_syspath(udev, sysfs);
|
||||
if (!d) {
|
||||
*item = udev_list_entry_get_next(*item);
|
||||
continue;
|
||||
}
|
||||
|
||||
sn = udev_device_get_property_value(d, "ID_SEAT");
|
||||
if (isempty(sn))
|
||||
if (sd_device_get_property_value(dev_list[*i_dev], "ID_SEAT", &sn) < 0 || isempty(sn))
|
||||
sn = "seat0";
|
||||
|
||||
/* Explicitly also check for tag 'seat' here */
|
||||
if (!streq(seat, sn) || !udev_device_has_tag(d, "seat")) {
|
||||
*item = udev_list_entry_get_next(*item);
|
||||
if (!streq(seat, sn) || sd_device_has_tag(dev_list[*i_dev], "seat") <= 0) {
|
||||
(*i_dev)++;
|
||||
continue;
|
||||
}
|
||||
|
||||
is_master = udev_device_has_tag(d, "master-of-seat");
|
||||
is_master = sd_device_has_tag(dev_list[*i_dev], "master-of-seat") > 0;
|
||||
|
||||
name = udev_device_get_sysattr_value(d, "name");
|
||||
if (!name)
|
||||
name = udev_device_get_sysattr_value(d, "id");
|
||||
subsystem = udev_device_get_subsystem(d);
|
||||
sysname = udev_device_get_sysname(d);
|
||||
if (sd_device_get_sysattr_value(dev_list[*i_dev], "name", &name) < 0)
|
||||
(void) sd_device_get_sysattr_value(dev_list[*i_dev], "id", &name);
|
||||
|
||||
(void) sd_device_get_subsystem(dev_list[*i_dev], &subsystem);
|
||||
(void) sd_device_get_sysname(dev_list[*i_dev], &sysname);
|
||||
|
||||
/* Look if there's more coming after this */
|
||||
lookahead = next = udev_list_entry_get_next(*item);
|
||||
while (lookahead) {
|
||||
for (lookahead = *i_dev + 1; lookahead < n_dev; lookahead++) {
|
||||
const char *lookahead_sysfs;
|
||||
|
||||
lookahead_sysfs = udev_list_entry_get_name(lookahead);
|
||||
if (sd_device_get_syspath(dev_list[lookahead], &lookahead_sysfs) < 0)
|
||||
continue;
|
||||
|
||||
if (path_startswith(lookahead_sysfs, sub) &&
|
||||
!path_startswith(lookahead_sysfs, sysfs)) {
|
||||
_cleanup_(udev_device_unrefp) struct udev_device *lookahead_d = NULL;
|
||||
const char *lookahead_sn;
|
||||
|
||||
lookahead_d = udev_device_new_from_syspath(udev, lookahead_sysfs);
|
||||
if (lookahead_d) {
|
||||
const char *lookahead_sn;
|
||||
if (sd_device_get_property_value(dev_list[lookahead], "ID_SEAT", &lookahead_sn) < 0 ||
|
||||
isempty(lookahead_sn))
|
||||
lookahead_sn = "seat0";
|
||||
|
||||
lookahead_sn = udev_device_get_property_value(d, "ID_SEAT");
|
||||
if (isempty(lookahead_sn))
|
||||
lookahead_sn = "seat0";
|
||||
|
||||
if (streq(seat, lookahead_sn) && udev_device_has_tag(lookahead_d, "seat"))
|
||||
break;
|
||||
}
|
||||
if (streq(seat, lookahead_sn) && sd_device_has_tag(dev_list[lookahead], "seat") > 0)
|
||||
break;
|
||||
}
|
||||
|
||||
lookahead = udev_list_entry_get_next(lookahead);
|
||||
}
|
||||
|
||||
k = ellipsize(sysfs, max_width, 20);
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
printf("%s%s%s\n", prefix, special_glyph(lookahead ? TREE_BRANCH : TREE_RIGHT), k);
|
||||
printf("%s%s%s\n", prefix, special_glyph(lookahead < n_dev ? TREE_BRANCH : TREE_RIGHT), k);
|
||||
|
||||
if (asprintf(&l,
|
||||
"%s%s:%s%s%s%s",
|
||||
@ -117,29 +104,31 @@ static int show_sysfs_one(
|
||||
if (!k)
|
||||
return -ENOMEM;
|
||||
|
||||
printf("%s%s%s\n", prefix, lookahead ? special_glyph(TREE_VERTICAL) : " ", k);
|
||||
printf("%s%s%s\n", prefix, lookahead < n_dev ? special_glyph(TREE_VERTICAL) : " ", k);
|
||||
|
||||
*item = next;
|
||||
if (*item) {
|
||||
if (++(*i_dev) < n_dev) {
|
||||
_cleanup_free_ char *p = NULL;
|
||||
|
||||
p = strappend(prefix, lookahead ? special_glyph(TREE_VERTICAL) : " ");
|
||||
p = strappend(prefix, lookahead < n_dev ? special_glyph(TREE_VERTICAL) : " ");
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
show_sysfs_one(udev, seat, item, sysfs, p,
|
||||
n_columns == (unsigned) -1 || n_columns < 2 ? n_columns : n_columns - 2,
|
||||
flags);
|
||||
r = show_sysfs_one(seat, dev_list, i_dev, n_dev, sysfs, p,
|
||||
n_columns == (unsigned) -1 || n_columns < 2 ? n_columns : n_columns - 2,
|
||||
flags);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int show_sysfs(const char *seat, const char *prefix, unsigned n_columns, OutputFlags flags) {
|
||||
_cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL;
|
||||
_cleanup_(udev_unrefp) struct udev *udev = NULL;
|
||||
struct udev_list_entry *first = NULL;
|
||||
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
|
||||
size_t n_dev = 0, n_allocated = 0, i = 0;
|
||||
sd_device *d, **dev_list = NULL;
|
||||
int r;
|
||||
|
||||
if (n_columns <= 0)
|
||||
@ -150,34 +139,43 @@ int show_sysfs(const char *seat, const char *prefix, unsigned n_columns, OutputF
|
||||
if (isempty(seat))
|
||||
seat = "seat0";
|
||||
|
||||
udev = udev_new();
|
||||
if (!udev)
|
||||
return -ENOMEM;
|
||||
|
||||
e = udev_enumerate_new(udev);
|
||||
if (!e)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!streq(seat, "seat0"))
|
||||
r = udev_enumerate_add_match_tag(e, seat);
|
||||
else
|
||||
r = udev_enumerate_add_match_tag(e, "seat");
|
||||
r = sd_device_enumerator_new(&e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = udev_enumerate_add_match_is_initialized(e);
|
||||
r = sd_device_enumerator_allow_uninitialized(e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = udev_enumerate_scan_devices(e);
|
||||
r = sd_device_enumerator_add_match_tag(e, streq(seat, "seat0") ? "seat" : seat);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
first = udev_enumerate_get_list_entry(e);
|
||||
if (first)
|
||||
show_sysfs_one(udev, seat, &first, "/", prefix, n_columns, flags);
|
||||
r = device_enumerator_scan_devices(e);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
FOREACH_DEVICE_AND_SUBSYSTEM(e, d) {
|
||||
const char *syspath;
|
||||
|
||||
if (sd_device_get_syspath(d, &syspath) < 0)
|
||||
continue;
|
||||
|
||||
if (!GREEDY_REALLOC(dev_list, n_allocated, n_dev + 2))
|
||||
return -ENOMEM;
|
||||
|
||||
dev_list[n_dev++] = sd_device_ref(d);
|
||||
dev_list[n_dev] = NULL;
|
||||
}
|
||||
|
||||
if (n_dev > 0)
|
||||
show_sysfs_one(seat, dev_list, &i, n_dev, "/", prefix, n_columns, flags);
|
||||
else
|
||||
printf("%s%s%s\n", prefix, special_glyph(TREE_RIGHT), "(none)");
|
||||
|
||||
return r;
|
||||
for (i = 0; i < n_dev; i++)
|
||||
sd_device_unref(dev_list[i]);
|
||||
free(dev_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user