diff --git a/src/login/sysfs-show.c b/src/login/sysfs-show.c index d5c347be0c..5d2a6ad209 100644 --- a/src/login/sysfs-show.c +++ b/src/login/sysfs-show.c @@ -3,31 +3,33 @@ #include #include -#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; }