]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsblk: add ID-LINK column
authorKarel Zak <kzak@redhat.com>
Fri, 22 Apr 2022 09:20:26 +0000 (11:20 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 22 Apr 2022 09:20:26 +0000 (11:20 +0200)
Addresses: https://github.com/util-linux/util-linux/issues/1658
Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/lsblk-properties.c
misc-utils/lsblk.c
misc-utils/lsblk.h

index 268ea99c6d7edbc5e8e148e5cdf2b6c0d3bcd2a5..abc0595ff9d999e171f2d0a2e4481a24e4317532 100644 (file)
@@ -36,6 +36,7 @@ void lsblk_device_free_properties(struct lsblk_devprop *p)
        free(p->serial);
        free(p->model);
        free(p->partflags);
+       free(p->byid);
 
        free(p->mode);
        free(p->owner);
@@ -51,11 +52,17 @@ static struct lsblk_devprop *get_properties_by_udev(struct lsblk_device *dev
        return NULL;
 }
 #else
+
+#define LSBLK_UDEV_BYID_PREFIX "/dev/disk/by-id/"
+#define LSBLK_UDEV_BYID_PREFIXSZ (sizeof(LSBLK_UDEV_BYID_PREFIX) - 1)
+
 static struct lsblk_devprop *get_properties_by_udev(struct lsblk_device *ld)
 {
        struct udev_device *dev;
+       struct udev_list_entry *le;
        const char *data;
        struct lsblk_devprop *prop;
+       size_t len;
 
        if (ld->udev_requested)
                return ld->properties;
@@ -129,6 +136,25 @@ static struct lsblk_devprop *get_properties_by_udev(struct lsblk_device *ld)
                normalize_whitespace((unsigned char *) prop->model);
        }
 
+       /* select the shortest udev by-id symlink */
+       len = 0;
+       udev_list_entry_foreach(le, udev_device_get_devlinks_list_entry(dev)) {
+               const char *name = udev_list_entry_get_name(le);
+               size_t sz;
+
+               if (!name || !startswith(name,  LSBLK_UDEV_BYID_PREFIX))
+                       continue;
+               name += LSBLK_UDEV_BYID_PREFIXSZ;
+               if (!*name)
+                       continue;
+               sz = strlen(name);
+               if (!len || sz < len) {
+                       len = sz;
+                       free(prop->byid);
+                       prop->byid = xstrdup(name);
+               }
+       }
+
        udev_device_unref(dev);
 done:
        ld->udev_requested = 1;
index ab4c42179b599e2226ed92f090f88fce7e0c52ff..ea3837fda7058fee5a4136bb1bbc01b5e422ccdc 100644 (file)
@@ -66,6 +66,7 @@ static int column_id_to_number(int id);
 /* column IDs */
 enum {
        COL_ALIOFF = 0,
+       COL_BYID,
        COL_DALIGN,
        COL_DAX,
        COL_DGRAN,
@@ -163,6 +164,7 @@ struct colinfo {
 /* columns descriptions */
 static struct colinfo infos[] = {
        [COL_ALIOFF] = { "ALIGNMENT", 6, SCOLS_FL_RIGHT, N_("alignment offset"), COLTYPE_NUM },
+       [COL_BYID] = { "ID-LINK", 0.1, SCOLS_FL_NOEXTREMES, N_("udev by-id link") },
        [COL_DALIGN] = { "DISC-ALN", 6, SCOLS_FL_RIGHT, N_("discard alignment offset"), COLTYPE_NUM },
        [COL_DAX] = { "DAX", 1, SCOLS_FL_RIGHT, N_("dax-capable device"), COLTYPE_BOOL },
        [COL_DGRAN] = { "DISC-GRAN", 6, SCOLS_FL_RIGHT, N_("discard granularity"), COLTYPE_SIZE },
@@ -927,6 +929,11 @@ static char *device_get_data(
                if (prop && prop->wwn)
                        str = xstrdup(prop->wwn);
                break;
+       case COL_BYID:
+               prop = lsblk_device_get_properties(dev);
+               if (prop && prop->byid)
+                       str = xstrdup(prop->byid);
+               break;
        case COL_RA:
                ul_path_read_string(dev->sysfs, &str, "queue/read_ahead_kb");
                if (sortdata)
index 0ffe380088810bf02dcc706b87a640f128ca11a2..873c9ab0ec789a1427cdc6da4e11b0549d72cb3c 100644 (file)
@@ -75,6 +75,7 @@ struct lsblk_devprop {
        char *wwn;              /* storage WWN */
        char *serial;           /* disk serial number */
        char *model;            /* disk model */
+       char *byid;             /* /dev/disk/by-id/<name> */
 
        /* lsblk specific (for --sysroot only)  */
        char *owner;            /* user name */