From: Karel Zak Date: Fri, 22 Apr 2022 09:20:26 +0000 (+0200) Subject: lsblk: add ID-LINK column X-Git-Tag: v2.39-rc1~695 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef7d50a0cc59d3b55587c8ea5fa45db45b888aee;p=thirdparty%2Futil-linux.git lsblk: add ID-LINK column Addresses: https://github.com/util-linux/util-linux/issues/1658 Signed-off-by: Karel Zak --- diff --git a/misc-utils/lsblk-properties.c b/misc-utils/lsblk-properties.c index 268ea99c6d..abc0595ff9 100644 --- a/misc-utils/lsblk-properties.c +++ b/misc-utils/lsblk-properties.c @@ -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; diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index ab4c42179b..ea3837fda7 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -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) diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h index 0ffe380088..873c9ab0ec 100644 --- a/misc-utils/lsblk.h +++ b/misc-utils/lsblk.h @@ -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/ */ /* lsblk specific (for --sysroot only) */ char *owner; /* user name */