free(p->serial);
free(p->model);
free(p->partflags);
+ free(p->byid);
free(p->mode);
free(p->owner);
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;
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;
/* column IDs */
enum {
COL_ALIOFF = 0,
+ COL_BYID,
COL_DALIGN,
COL_DAX,
COL_DGRAN,
/* 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 },
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)
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 */