aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2023-06-01 14:30:48 +0100
committerRon Yorston <rmy@pobox.com>2023-06-01 14:30:48 +0100
commitb7a30ac995544f9dfacf7b200f2a75717060037a (patch)
tree511dae5029903f9b02017361e31370e196cfbf70
parenta1ccb78df0a218d8fa760015f82bca6b7939b95b (diff)
downloadbusybox-w32-b7a30ac995544f9dfacf7b200f2a75717060037a.tar.gz
busybox-w32-b7a30ac995544f9dfacf7b200f2a75717060037a.tar.bz2
busybox-w32-b7a30ac995544f9dfacf7b200f2a75717060037a.zip
ls: allow hidden system files to be omitted
The 'ls' applet in busybox-w32 treated files with the hidden attribute as though they had a leading '.'. Some such files also have the system attribute set. Since these aren't of much interest to most users and since several of them have long unsightly names there's some advantage in allowing them to be omitted from the listing. Implement this by omitting hidden system files if the '-a' or '-A' option is given twice. Adds 80-88 bytes (GitHub issue #328)
-rw-r--r--coreutils/ls.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 3c659294c..d15588a13 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -109,8 +109,11 @@
109//usage:#define ls_full_usage "\n\n" 109//usage:#define ls_full_usage "\n\n"
110//usage: "List directory contents\n" 110//usage: "List directory contents\n"
111//usage: "\n -1 One column output" 111//usage: "\n -1 One column output"
112//usage: "\n -a Include names starting with ." 112//usage: "\n -a Include names starting with ." IF_PLATFORM_MINGW32(" and hidden files")
113//usage: "\n -A Like -a, but exclude . and .." 113//usage: "\n -A Like -a, but exclude . and .."
114//usage: IF_PLATFORM_MINGW32(
115//usage: "\n -aa,-AA Like -a,-A but omit hidden system files"
116//usage: )
114////usage: "\n -C List by columns" - don't show, this is a default anyway 117////usage: "\n -C List by columns" - don't show, this is a default anyway
115//usage: "\n -x List by lines" 118//usage: "\n -x List by lines"
116//usage: "\n -d List directory names, not contents" 119//usage: "\n -d List directory names, not contents"
@@ -340,6 +343,10 @@ struct globals {
340 /* Do time() just once. Saves one syscall per file for "ls -l" */ 343 /* Do time() just once. Saves one syscall per file for "ls -l" */
341 time_t current_time_t; 344 time_t current_time_t;
342#endif 345#endif
346#if ENABLE_PLATFORM_MINGW32
347 int a_count, A_count;
348# define HIDSYS (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)
349#endif
343} FIX_ALIASING; 350} FIX_ALIASING;
344#define G (*(struct globals*)bb_common_bufsiz1) 351#define G (*(struct globals*)bb_common_bufsiz1)
345#define INIT_G() do { \ 352#define INIT_G() do { \
@@ -974,7 +981,10 @@ static struct dnode **scan_one_dir(const char *path, unsigned *nfiles_p)
974 if (!cur) { 981 if (!cur) {
975#else 982#else
976 if (!cur || ((cur->dn_attr & FILE_ATTRIBUTE_HIDDEN) && 983 if (!cur || ((cur->dn_attr & FILE_ATTRIBUTE_HIDDEN) &&
977 !(option_mask32 & (OPT_a|OPT_A)))) { 984 !(option_mask32 & (OPT_a|OPT_A))) ||
985 (((cur->dn_attr & HIDSYS) == HIDSYS) &&
986 MAX(G.a_count, G.A_count) > 1)
987 ) {
978 /* skip invalid or hidden files */ 988 /* skip invalid or hidden files */
979#endif 989#endif
980 free(fullname); 990 free(fullname);
@@ -1166,9 +1176,11 @@ int ls_main(int argc UNUSED_PARAM, char **argv)
1166 IF_FEATURE_LS_TIMESTAMPS(":c-u:u-c") /* mtime/atime */ 1176 IF_FEATURE_LS_TIMESTAMPS(":c-u:u-c") /* mtime/atime */
1167 /* -w NUM: */ 1177 /* -w NUM: */
1168 IF_FEATURE_LS_WIDTH(":w+") 1178 IF_FEATURE_LS_WIDTH(":w+")
1179 IF_PLATFORM_MINGW32(":aa:AA")
1169 , ls_longopts 1180 , ls_longopts
1170 IF_FEATURE_LS_WIDTH(, /*-T*/ NULL, /*-w*/ &G_terminal_width) 1181 IF_FEATURE_LS_WIDTH(, /*-T*/ NULL, /*-w*/ &G_terminal_width)
1171 IF_FEATURE_LS_COLOR(, &color_opt) 1182 IF_FEATURE_LS_COLOR(, &color_opt)
1183 IF_PLATFORM_MINGW32(, &G.a_count, &G.A_count)
1172 ); 1184 );
1173#if 0 /* option bits debug */ 1185#if 0 /* option bits debug */
1174 bb_error_msg("opt:0x%08x l:%x H:%x color:%x dirs:%x", opt, OPT_l, OPT_H, OPT_color, OPT_dirs_first); 1186 bb_error_msg("opt:0x%08x l:%x H:%x color:%x dirs:%x", opt, OPT_l, OPT_H, OPT_color, OPT_dirs_first);