summaryrefslogtreecommitdiffstats
path: root/misc-utils/lsblk.c
diff options
context:
space:
mode:
authorKarel Zak2017-04-19 14:28:16 +0200
committerKarel Zak2017-04-19 14:28:16 +0200
commitbe685b98c03b43c34d0f6e0447361f7d2dcdae9a (patch)
tree63529d5d339a04ec21a07f854ac5e2a07df8a7f0 /misc-utils/lsblk.c
parentlsblk: add ZONED column (diff)
downloadkernel-qcow2-util-linux-be685b98c03b43c34d0f6e0447361f7d2dcdae9a.tar.gz
kernel-qcow2-util-linux-be685b98c03b43c34d0f6e0447361f7d2dcdae9a.tar.xz
kernel-qcow2-util-linux-be685b98c03b43c34d0f6e0447361f7d2dcdae9a.zip
lsblk: don't duplicate columns
$ lsblk --discard --perms NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO NAME SIZE OWNER GROUP MODE sdb 0 0B 0B 0 sdb 74.5G root disk brw-rw---- └─sdb1 0 0B 0B 0 └─sdb1 74.5G root disk brw-rw---- sda 0 512B 2G 0 sda 223.6G root disk brw-rw---- ├─sda4 0 512B 2G 0 ├─sda4 50G root disk brw-rw---- ├─sda2 0 512B 2G 0 ├─sda2 200M root disk brw-rw---- ├─sda5 0 512B 2G 0 ├─sda5 35.1G root disk brw-rw---- ├─sda3 0 512B 2G 0 ├─sda3 130.3G root disk brw-rw---- ├─sda1 0 512B 2G 0 ├─sda1 200M root disk brw-rw---- └─sda6 0 512B 2G 0 └─sda6 7.8G root disk brw-rw---- ... see NAME column. It's fine to support duplicated columns when requested by user (e.g. -o NAME,NAME,SIZE), but it does not make sense for the default output when multiple command options specified. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils/lsblk.c')
-rw-r--r--misc-utils/lsblk.c104
1 files changed, 55 insertions, 49 deletions
diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
index 12a6b2d06..e778642db 100644
--- a/misc-utils/lsblk.c
+++ b/misc-utils/lsblk.c
@@ -79,6 +79,8 @@ UL_DEBUG_DEFINE_MASKNAMES(lsblk) = UL_DEBUG_EMPTY_MASKNAMES;
#define LSBLK_EXIT_SOMEOK 64
#define LSBLK_EXIT_ALLFAILED 32
+static int column_id_to_number(int id);
+
/* column IDs */
enum {
COL_NAME = 0,
@@ -230,17 +232,21 @@ static struct lsblk *lsblk; /* global handler */
static int columns[ARRAY_SIZE(infos) * 2];
static size_t ncolumns;
-static inline size_t err_columns_index(size_t arysz, size_t idx)
+
+static inline void add_column(int id)
{
- if (idx >= arysz)
+ if (ncolumns >= ARRAY_SIZE(columns))
errx(EXIT_FAILURE, _("too many columns specified, "
"the limit is %zu columns"),
- arysz - 1);
- return idx;
+ ARRAY_SIZE(columns) - 1);
+ columns[ ncolumns++ ] = id;
}
-#define add_column(ary, n, id) \
- ((ary)[ err_columns_index(ARRAY_SIZE(ary), (n)) ] = (id))
+static inline void add_uniq_column(int id)
+{
+ if (column_id_to_number(id) < 0)
+ add_column(id);
+}
static int excludes[256];
static size_t nexcludes;
@@ -1743,15 +1749,15 @@ int main(int argc, char *argv[])
lsblk->nodeps = 1;
break;
case 'D':
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_DALIGN);
- add_column(columns, ncolumns++, COL_DGRAN);
- add_column(columns, ncolumns++, COL_DMAX);
- add_column(columns, ncolumns++, COL_DZERO);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_DALIGN);
+ add_uniq_column(COL_DGRAN);
+ add_uniq_column(COL_DMAX);
+ add_uniq_column(COL_DZERO);
break;
case 'z':
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_ZONED);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_ZONED);
break;
case 'e':
parse_excludes(optarg);
@@ -1796,42 +1802,42 @@ int main(int argc, char *argv[])
lsblk->inverse = 1;
break;
case 'f':
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_FSTYPE);
- add_column(columns, ncolumns++, COL_LABEL);
- add_column(columns, ncolumns++, COL_UUID);
- add_column(columns, ncolumns++, COL_TARGET);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_FSTYPE);
+ add_uniq_column(COL_LABEL);
+ add_uniq_column(COL_UUID);
+ add_uniq_column(COL_TARGET);
break;
case 'm':
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_SIZE);
- add_column(columns, ncolumns++, COL_OWNER);
- add_column(columns, ncolumns++, COL_GROUP);
- add_column(columns, ncolumns++, COL_MODE);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_SIZE);
+ add_uniq_column(COL_OWNER);
+ add_uniq_column(COL_GROUP);
+ add_uniq_column(COL_MODE);
break;
case 't':
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_ALIOFF);
- add_column(columns, ncolumns++, COL_MINIO);
- add_column(columns, ncolumns++, COL_OPTIO);
- add_column(columns, ncolumns++, COL_PHYSEC);
- add_column(columns, ncolumns++, COL_LOGSEC);
- add_column(columns, ncolumns++, COL_ROTA);
- add_column(columns, ncolumns++, COL_SCHED);
- add_column(columns, ncolumns++, COL_RQ_SIZE);
- add_column(columns, ncolumns++, COL_RA);
- add_column(columns, ncolumns++, COL_WSAME);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_ALIOFF);
+ add_uniq_column(COL_MINIO);
+ add_uniq_column(COL_OPTIO);
+ add_uniq_column(COL_PHYSEC);
+ add_uniq_column(COL_LOGSEC);
+ add_uniq_column(COL_ROTA);
+ add_uniq_column(COL_SCHED);
+ add_uniq_column(COL_RQ_SIZE);
+ add_uniq_column(COL_RA);
+ add_uniq_column(COL_WSAME);
break;
case 'S':
lsblk->nodeps = 1;
lsblk->scsi = 1;
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_HCTL);
- add_column(columns, ncolumns++, COL_TYPE);
- add_column(columns, ncolumns++, COL_VENDOR);
- add_column(columns, ncolumns++, COL_MODEL);
- add_column(columns, ncolumns++, COL_REV);
- add_column(columns, ncolumns++, COL_TRANSPORT);
+ add_uniq_column(COL_NAME);
+ add_uniq_column(COL_HCTL);
+ add_uniq_column(COL_TYPE);
+ add_uniq_column(COL_VENDOR);
+ add_uniq_column(COL_MODEL);
+ add_uniq_column(COL_REV);
+ add_uniq_column(COL_TRANSPORT);
break;
case 'V':
printf(UTIL_LINUX_VERSION);
@@ -1850,13 +1856,13 @@ int main(int argc, char *argv[])
check_sysdevblock();
if (!ncolumns) {
- add_column(columns, ncolumns++, COL_NAME);
- add_column(columns, ncolumns++, COL_MAJMIN);
- add_column(columns, ncolumns++, COL_RM);
- add_column(columns, ncolumns++, COL_SIZE);
- add_column(columns, ncolumns++, COL_RO);
- add_column(columns, ncolumns++, COL_TYPE);
- add_column(columns, ncolumns++, COL_TARGET);
+ add_column(COL_NAME);
+ add_column(COL_MAJMIN);
+ add_column(COL_RM);
+ add_column(COL_SIZE);
+ add_column(COL_RO);
+ add_column(COL_TYPE);
+ add_column(COL_TARGET);
}
if (outarg && string_add_to_idarray(outarg, columns, ARRAY_SIZE(columns),
@@ -1877,7 +1883,7 @@ int main(int argc, char *argv[])
if (lsblk->sort_id >= 0 && column_id_to_number(lsblk->sort_id) < 0) {
/* the sort column is not between output columns -- add as hidden */
- add_column(columns, ncolumns++, lsblk->sort_id);
+ add_column(lsblk->sort_id);
lsblk->sort_hidden = 1;
}