diff options
author | Karel Zak | 2017-04-19 14:28:16 +0200 |
---|---|---|
committer | Karel Zak | 2017-04-19 14:28:16 +0200 |
commit | be685b98c03b43c34d0f6e0447361f7d2dcdae9a (patch) | |
tree | 63529d5d339a04ec21a07f854ac5e2a07df8a7f0 /misc-utils/lsblk.c | |
parent | lsblk: add ZONED column (diff) | |
download | kernel-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.c | 104 |
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; } |