From 9f368e38fbd165144a7398d3e6d8ae68ea97a3e6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 28 Feb 2011 12:16:10 +0100 Subject: [PATCH] ls: fix bits for -T, -w and --color; make -n imply -l; fix comments Signed-off-by: Denys Vlasenko --- coreutils/ls.c | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/coreutils/ls.c b/coreutils/ls.c index 2242fbaac..8d25b5d5f 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -159,7 +159,7 @@ STYLE_MASK = STYLE_SINGLE, /* which of the three times will be used */ TIME_CHANGE = (1 << 21) * ENABLE_FEATURE_LS_TIMESTAMPS, -TIME_ACCESS = (1 << 22) * ENABLE_FEATURE_LS_TIMESTAMPS, +TIME_ACCESS = (2 << 21) * ENABLE_FEATURE_LS_TIMESTAMPS, TIME_MASK = (3 << 21) * ENABLE_FEATURE_LS_TIMESTAMPS, /* how will the files be sorted (CONFIG_FEATURE_LS_SORTFILES) */ @@ -189,10 +189,9 @@ LIST_LONG = LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | LIST_SIZE | \ /* Not fully compatible - we show not only '/' but other chars too */ /* -SXvhTw GNU options, busybox optionally supports */ /* -T TABWIDTH is ignored (we don't use tabs on output) */ -/* -K SELinux mandated options, busybox optionally supports */ +/* -KZ SELinux mandated options, busybox optionally supports */ +/* (coreutils 8.4 has no -K, remove it?) */ /* -e I think we made this one up (looks similar to GNU --full-time) */ -/* Std opts we do not support: */ -/* -H Follow the links on command line only */ static const char ls_options[] ALIGN1 = "Cadil1gnsxQAk" /* 13 opts, total 13 */ IF_FEATURE_LS_TIMESTAMPS("cetu") /* 4, 17 */ @@ -235,7 +234,7 @@ enum { OPTBIT_L = OPTBIT_K + 2 * ENABLE_SELINUX, OPTBIT_H, /* 27 */ OPTBIT_h = OPTBIT_L + 2 * ENABLE_FEATURE_LS_FOLLOWLINKS, - OPTBIT_T = OPTBIT_h + 2 * ENABLE_FEATURE_HUMAN_READABLE, + OPTBIT_T = OPTBIT_h + 1 * ENABLE_FEATURE_HUMAN_READABLE, OPTBIT_w, /* 30 */ OPTBIT_color = OPTBIT_T + 2 * ENABLE_FEATURE_AUTOWIDTH, @@ -269,12 +268,12 @@ static const uint32_t opt_flags[] = { LIST_LONG | STYLE_LONG, /* l */ STYLE_SINGLE, /* 1 */ 0, /* g (don't show owner) - handled via OPT_g */ - LIST_ID_NUMERIC, /* n */ + LIST_ID_NUMERIC | LIST_LONG | STYLE_LONG, /* n (assumes l) */ LIST_BLOCKS, /* s */ DISP_ROWS | STYLE_COLUMNAR, /* x */ 0, /* Q (quote filename) - handled via OPT_Q */ DISP_HIDDEN, /* A */ - ENABLE_SELINUX * LIST_CONTEXT, /* k (ignored if !SELINUX) */ + ENABLE_SELINUX * (LIST_CONTEXT|STYLE_SINGLE), /* k (ignored if !SELINUX) */ #if ENABLE_FEATURE_LS_TIMESTAMPS TIME_CHANGE | (ENABLE_FEATURE_LS_SORTFILES * SORT_CTIME), /* c */ LIST_FULLTIME, /* e */ @@ -295,8 +294,8 @@ static const uint32_t opt_flags[] = { DISP_RECURSIVE, /* R */ #endif #if ENABLE_SELINUX - LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */ - LIST_MODEBITS|LIST_ID_NAME|LIST_CONTEXT, /* Z */ + LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME|STYLE_SINGLE, /* K */ + LIST_MODEBITS|LIST_ID_NAME|LIST_CONTEXT|STYLE_SINGLE, /* Z */ #endif (1U << 31) /* options after Z are not processed through opt_flags */ @@ -688,8 +687,16 @@ static NOINLINE unsigned list_single(const struct dnode *dn) column += printf("%-10s ", (char *) bb_mode_string(dn->dstat.st_mode)); if (all_fmt & LIST_NLINKS) column += printf("%4lu ", (long) dn->dstat.st_nlink); + if (all_fmt & LIST_ID_NUMERIC) { + if (option_mask32 & OPT_g) + column += printf("%-8u ", (int) dn->dstat.st_gid); + else + column += printf("%-8u %-8u ", + (int) dn->dstat.st_uid, + (int) dn->dstat.st_gid); + } #if ENABLE_FEATURE_LS_USERNAME - if (all_fmt & LIST_ID_NAME) { + else if (all_fmt & LIST_ID_NAME) { if (option_mask32 & OPT_g) { column += printf("%-8.8s ", get_cached_groupname(dn->dstat.st_gid)); @@ -700,14 +707,6 @@ static NOINLINE unsigned list_single(const struct dnode *dn) } } #endif - if (all_fmt & LIST_ID_NUMERIC) { - if (option_mask32 & OPT_g) - column += printf("%-8u ", (int) dn->dstat.st_gid); - else - column += printf("%-8u %-8u ", - (int) dn->dstat.st_uid, - (int) dn->dstat.st_gid); - } if (all_fmt & LIST_SIZE) { if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) { column += printf("%4u, %3u ", @@ -1040,7 +1039,8 @@ int ls_main(int argc UNUSED_PARAM, char **argv) init_unicode(); - all_fmt = ENABLE_FEATURE_LS_SORTFILES * SORT_NAME; + if (ENABLE_FEATURE_LS_SORTFILES) + all_fmt = SORT_NAME; #if ENABLE_FEATURE_AUTOWIDTH /* obtain the terminal width */ @@ -1081,8 +1081,6 @@ int ls_main(int argc UNUSED_PARAM, char **argv) if (flags & TIME_MASK) all_fmt &= ~TIME_MASK; - if (flags & LIST_CONTEXT) - all_fmt |= STYLE_SINGLE; all_fmt |= flags; } } @@ -1121,11 +1119,8 @@ int ls_main(int argc UNUSED_PARAM, char **argv) if (all_fmt & TIME_ACCESS) all_fmt = (all_fmt & ~SORT_MASK) | SORT_ATIME; } - if ((all_fmt & STYLE_MASK) != STYLE_LONG) /* only for long list */ + if ((all_fmt & STYLE_MASK) != STYLE_LONG) /* not -l? */ all_fmt &= ~(LIST_ID_NUMERIC|LIST_ID_NAME|LIST_FULLTIME); - if (ENABLE_FEATURE_LS_USERNAME) - if ((all_fmt & STYLE_MASK) == STYLE_LONG && (all_fmt & LIST_ID_NUMERIC)) - all_fmt &= ~LIST_ID_NAME; /* don't list names if numeric uid */ /* choose a display format if one was not already specified by an option */ if (!(all_fmt & STYLE_MASK)) -- 2.25.1