diff options
-rw-r--r-- | configs/make32_defconfig | 4 | ||||
-rw-r--r-- | configs/make64_defconfig | 4 | ||||
-rw-r--r-- | configs/mingw32_defconfig | 4 | ||||
-rw-r--r-- | configs/mingw64_defconfig | 4 | ||||
-rw-r--r-- | configs/mingw64u_defconfig | 4 | ||||
-rw-r--r-- | include/libbb.h | 4 | ||||
-rw-r--r-- | libbb/lineedit.c | 4 | ||||
-rw-r--r-- | shell/ash.c | 49 |
8 files changed, 59 insertions, 18 deletions
diff --git a/configs/make32_defconfig b/configs/make32_defconfig index be793be52..428c16a4e 100644 --- a/configs/make32_defconfig +++ b/configs/make32_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Busybox version: 1.37.0.git | 3 | # Busybox version: 1.37.0.git |
4 | # Fri Sep 15 08:35:20 2023 | 4 | # Wed Sep 20 08:30:38 2023 |
5 | # | 5 | # |
6 | CONFIG_HAVE_DOT_CONFIG=y | 6 | CONFIG_HAVE_DOT_CONFIG=y |
7 | # CONFIG_PLATFORM_POSIX is not set | 7 | # CONFIG_PLATFORM_POSIX is not set |
@@ -1165,7 +1165,7 @@ CONFIG_ASH_HELP=y | |||
1165 | CONFIG_ASH_GETOPTS=y | 1165 | CONFIG_ASH_GETOPTS=y |
1166 | CONFIG_ASH_CMDCMD=y | 1166 | CONFIG_ASH_CMDCMD=y |
1167 | CONFIG_ASH_NOCONSOLE=y | 1167 | CONFIG_ASH_NOCONSOLE=y |
1168 | CONFIG_ASH_NOCASEGLOB=y | 1168 | CONFIG_ASH_GLOB_OPTIONS=y |
1169 | # CONFIG_CTTYHACK is not set | 1169 | # CONFIG_CTTYHACK is not set |
1170 | # CONFIG_HUSH is not set | 1170 | # CONFIG_HUSH is not set |
1171 | # CONFIG_SHELL_HUSH is not set | 1171 | # CONFIG_SHELL_HUSH is not set |
diff --git a/configs/make64_defconfig b/configs/make64_defconfig index 71f08c502..c69f1e5fb 100644 --- a/configs/make64_defconfig +++ b/configs/make64_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Busybox version: 1.37.0.git | 3 | # Busybox version: 1.37.0.git |
4 | # Fri Sep 15 08:35:20 2023 | 4 | # Wed Sep 20 08:30:38 2023 |
5 | # | 5 | # |
6 | CONFIG_HAVE_DOT_CONFIG=y | 6 | CONFIG_HAVE_DOT_CONFIG=y |
7 | # CONFIG_PLATFORM_POSIX is not set | 7 | # CONFIG_PLATFORM_POSIX is not set |
@@ -1165,7 +1165,7 @@ CONFIG_ASH_HELP=y | |||
1165 | CONFIG_ASH_GETOPTS=y | 1165 | CONFIG_ASH_GETOPTS=y |
1166 | CONFIG_ASH_CMDCMD=y | 1166 | CONFIG_ASH_CMDCMD=y |
1167 | CONFIG_ASH_NOCONSOLE=y | 1167 | CONFIG_ASH_NOCONSOLE=y |
1168 | CONFIG_ASH_NOCASEGLOB=y | 1168 | CONFIG_ASH_GLOB_OPTIONS=y |
1169 | # CONFIG_CTTYHACK is not set | 1169 | # CONFIG_CTTYHACK is not set |
1170 | # CONFIG_HUSH is not set | 1170 | # CONFIG_HUSH is not set |
1171 | # CONFIG_SHELL_HUSH is not set | 1171 | # CONFIG_SHELL_HUSH is not set |
diff --git a/configs/mingw32_defconfig b/configs/mingw32_defconfig index 12e432500..3a21dfae6 100644 --- a/configs/mingw32_defconfig +++ b/configs/mingw32_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Busybox version: 1.37.0.git | 3 | # Busybox version: 1.37.0.git |
4 | # Fri Sep 15 08:35:20 2023 | 4 | # Wed Sep 20 08:30:38 2023 |
5 | # | 5 | # |
6 | CONFIG_HAVE_DOT_CONFIG=y | 6 | CONFIG_HAVE_DOT_CONFIG=y |
7 | # CONFIG_PLATFORM_POSIX is not set | 7 | # CONFIG_PLATFORM_POSIX is not set |
@@ -1177,7 +1177,7 @@ CONFIG_ASH_HELP=y | |||
1177 | CONFIG_ASH_GETOPTS=y | 1177 | CONFIG_ASH_GETOPTS=y |
1178 | CONFIG_ASH_CMDCMD=y | 1178 | CONFIG_ASH_CMDCMD=y |
1179 | CONFIG_ASH_NOCONSOLE=y | 1179 | CONFIG_ASH_NOCONSOLE=y |
1180 | CONFIG_ASH_NOCASEGLOB=y | 1180 | CONFIG_ASH_GLOB_OPTIONS=y |
1181 | # CONFIG_CTTYHACK is not set | 1181 | # CONFIG_CTTYHACK is not set |
1182 | # CONFIG_HUSH is not set | 1182 | # CONFIG_HUSH is not set |
1183 | # CONFIG_SHELL_HUSH is not set | 1183 | # CONFIG_SHELL_HUSH is not set |
diff --git a/configs/mingw64_defconfig b/configs/mingw64_defconfig index dd5a9b068..8b993460f 100644 --- a/configs/mingw64_defconfig +++ b/configs/mingw64_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Busybox version: 1.37.0.git | 3 | # Busybox version: 1.37.0.git |
4 | # Fri Sep 15 08:35:20 2023 | 4 | # Wed Sep 20 08:30:38 2023 |
5 | # | 5 | # |
6 | CONFIG_HAVE_DOT_CONFIG=y | 6 | CONFIG_HAVE_DOT_CONFIG=y |
7 | # CONFIG_PLATFORM_POSIX is not set | 7 | # CONFIG_PLATFORM_POSIX is not set |
@@ -1177,7 +1177,7 @@ CONFIG_ASH_HELP=y | |||
1177 | CONFIG_ASH_GETOPTS=y | 1177 | CONFIG_ASH_GETOPTS=y |
1178 | CONFIG_ASH_CMDCMD=y | 1178 | CONFIG_ASH_CMDCMD=y |
1179 | CONFIG_ASH_NOCONSOLE=y | 1179 | CONFIG_ASH_NOCONSOLE=y |
1180 | CONFIG_ASH_NOCASEGLOB=y | 1180 | CONFIG_ASH_GLOB_OPTIONS=y |
1181 | # CONFIG_CTTYHACK is not set | 1181 | # CONFIG_CTTYHACK is not set |
1182 | # CONFIG_HUSH is not set | 1182 | # CONFIG_HUSH is not set |
1183 | # CONFIG_SHELL_HUSH is not set | 1183 | # CONFIG_SHELL_HUSH is not set |
diff --git a/configs/mingw64u_defconfig b/configs/mingw64u_defconfig index 159f409d9..a7428d1d2 100644 --- a/configs/mingw64u_defconfig +++ b/configs/mingw64u_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Busybox version: 1.37.0.git | 3 | # Busybox version: 1.37.0.git |
4 | # Fri Sep 15 08:35:20 2023 | 4 | # Wed Sep 20 08:30:38 2023 |
5 | # | 5 | # |
6 | CONFIG_HAVE_DOT_CONFIG=y | 6 | CONFIG_HAVE_DOT_CONFIG=y |
7 | # CONFIG_PLATFORM_POSIX is not set | 7 | # CONFIG_PLATFORM_POSIX is not set |
@@ -1177,7 +1177,7 @@ CONFIG_ASH_HELP=y | |||
1177 | CONFIG_ASH_GETOPTS=y | 1177 | CONFIG_ASH_GETOPTS=y |
1178 | CONFIG_ASH_CMDCMD=y | 1178 | CONFIG_ASH_CMDCMD=y |
1179 | CONFIG_ASH_NOCONSOLE=y | 1179 | CONFIG_ASH_NOCONSOLE=y |
1180 | CONFIG_ASH_NOCASEGLOB=y | 1180 | CONFIG_ASH_GLOB_OPTIONS=y |
1181 | # CONFIG_CTTYHACK is not set | 1181 | # CONFIG_CTTYHACK is not set |
1182 | # CONFIG_HUSH is not set | 1182 | # CONFIG_HUSH is not set |
1183 | # CONFIG_SHELL_HUSH is not set | 1183 | # CONFIG_SHELL_HUSH is not set |
diff --git a/include/libbb.h b/include/libbb.h index 2cdfac639..bbb3108a9 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -2011,6 +2011,7 @@ unsigned size_from_HISTFILESIZE(const char *hp) FAST_FUNC; | |||
2011 | # endif | 2011 | # endif |
2012 | typedef const char *get_exe_name_t(int i) FAST_FUNC; | 2012 | typedef const char *get_exe_name_t(int i) FAST_FUNC; |
2013 | typedef const char *sh_get_var_t(const char *name) FAST_FUNC; | 2013 | typedef const char *sh_get_var_t(const char *name) FAST_FUNC; |
2014 | typedef int sh_accept_glob_t(const char *name) FAST_FUNC; | ||
2014 | typedef struct line_input_t { | 2015 | typedef struct line_input_t { |
2015 | int flags; | 2016 | int flags; |
2016 | int timeout; | 2017 | int timeout; |
@@ -2024,6 +2025,9 @@ typedef struct line_input_t { | |||
2024 | # if ENABLE_SHELL_ASH || ENABLE_SHELL_HUSH | 2025 | # if ENABLE_SHELL_ASH || ENABLE_SHELL_HUSH |
2025 | /* function to fetch additional application-specific names to match */ | 2026 | /* function to fetch additional application-specific names to match */ |
2026 | get_exe_name_t *get_exe_name; | 2027 | get_exe_name_t *get_exe_name; |
2028 | # if ENABLE_ASH_GLOB_OPTIONS | ||
2029 | sh_accept_glob_t *sh_accept_glob; | ||
2030 | # endif | ||
2027 | # endif | 2031 | # endif |
2028 | # endif | 2032 | # endif |
2029 | # if (ENABLE_FEATURE_USERNAME_COMPLETION || ENABLE_FEATURE_EDITING_FANCY_PROMPT) \ | 2033 | # if (ENABLE_FEATURE_USERNAME_COMPLETION || ENABLE_FEATURE_EDITING_FANCY_PROMPT) \ |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 316c53f64..e7729996f 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -1032,6 +1032,10 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) | |||
1032 | goto cont; /* hmm, remove in progress? */ | 1032 | goto cont; /* hmm, remove in progress? */ |
1033 | 1033 | ||
1034 | # if ENABLE_PLATFORM_MINGW32 | 1034 | # if ENABLE_PLATFORM_MINGW32 |
1035 | # if ENABLE_ASH_GLOB_OPTIONS | ||
1036 | if (state->sh_accept_glob && !state->sh_accept_glob(found)) | ||
1037 | goto cont; | ||
1038 | # endif | ||
1035 | if (type == FIND_EXE_ONLY && S_ISREG(st.st_mode) && | 1039 | if (type == FIND_EXE_ONLY && S_ISREG(st.st_mode) && |
1036 | !(st.st_mode & S_IXUSR)) | 1040 | !(st.st_mode & S_IXUSR)) |
1037 | goto cont; | 1041 | goto cont; |
diff --git a/shell/ash.c b/shell/ash.c index f0480f723..95bf81db3 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -196,13 +196,15 @@ | |||
196 | //config: application. This may be useful when running a shell script | 196 | //config: application. This may be useful when running a shell script |
197 | //config: from a GUI application. | 197 | //config: from a GUI application. |
198 | //config: | 198 | //config: |
199 | //config:config ASH_NOCASEGLOB | 199 | //config:config ASH_GLOB_OPTIONS |
200 | //config: bool "'nocaseglob' option" | 200 | //config: bool "Globbing options" |
201 | //config: default y | 201 | //config: default y |
202 | //config: depends on (ASH || SH_IS_ASH || BASH_IS_ASH) && PLATFORM_MINGW32 | 202 | //config: depends on (ASH || SH_IS_ASH || BASH_IS_ASH) && PLATFORM_MINGW32 |
203 | //config: help | 203 | //config: help |
204 | //config: Enable support for the 'nocaseglob' option, which allows | 204 | //config: Enable support for options to control globbing: |
205 | //config: case-insensitive filename globbing. | 205 | //config: - 'nocaseglob' allows case-insensitive filename globbing |
206 | //config: - 'nohiddenglob' allows hidden files to be omitted from globbing | ||
207 | //config: - 'nohidsysglob' allows hidden system files to be omitted | ||
206 | //config: | 208 | //config: |
207 | //config:endif # ash options | 209 | //config:endif # ash options |
208 | 210 | ||
@@ -545,8 +547,10 @@ static const char *const optletters_optnames[] ALIGN_PTR = { | |||
545 | #if ENABLE_ASH_NOCONSOLE | 547 | #if ENABLE_ASH_NOCONSOLE |
546 | ,"\0" "noconsole" | 548 | ,"\0" "noconsole" |
547 | #endif | 549 | #endif |
548 | #if ENABLE_ASH_NOCASEGLOB | 550 | #if ENABLE_ASH_GLOB_OPTIONS |
549 | ,"\0" "nocaseglob" | 551 | ,"\0" "nocaseglob" |
552 | ,"\0" "nohiddenglob" | ||
553 | ,"\0" "nohidsysglob" | ||
550 | #endif | 554 | #endif |
551 | }; | 555 | }; |
552 | //bash 4.4.23 also has these opts (with these defaults): | 556 | //bash 4.4.23 also has these opts (with these defaults): |
@@ -673,8 +677,10 @@ struct globals_misc { | |||
673 | # if ENABLE_ASH_NOCONSOLE | 677 | # if ENABLE_ASH_NOCONSOLE |
674 | # define noconsole optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0)] | 678 | # define noconsole optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0)] |
675 | # endif | 679 | # endif |
676 | # if ENABLE_ASH_NOCASEGLOB | 680 | # if ENABLE_ASH_GLOB_OPTIONS |
677 | # define nocaseglob optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | 681 | # define nocaseglob optlist[17 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] |
682 | # define nohiddenglob optlist[18 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | ||
683 | # define nohidsysglob optlist[19 + BASH_PIPEFAIL + 2*(DEBUG != 0) + ENABLE_ASH_NOCONSOLE] | ||
678 | # endif | 684 | # endif |
679 | #endif | 685 | #endif |
680 | 686 | ||
@@ -8678,6 +8684,26 @@ expandmeta(struct strlist *str /*, int flag*/) | |||
8678 | #else | 8684 | #else |
8679 | /* ENABLE_ASH_INTERNAL_GLOB: Homegrown globbing code. (dash also has both, uses homegrown one.) */ | 8685 | /* ENABLE_ASH_INTERNAL_GLOB: Homegrown globbing code. (dash also has both, uses homegrown one.) */ |
8680 | 8686 | ||
8687 | #if ENABLE_ASH_GLOB_OPTIONS | ||
8688 | static int FAST_FUNC | ||
8689 | ash_accept_glob(const char *name) | ||
8690 | { | ||
8691 | struct stat st; | ||
8692 | |||
8693 | if (nohiddenglob || nohidsysglob) { | ||
8694 | if (!lstat(name, &st)) { | ||
8695 | if ((st.st_attr & FILE_ATTRIBUTE_HIDDEN)) { | ||
8696 | if (nohiddenglob || | ||
8697 | (st.st_attr & FILE_ATTRIBUTE_SYSTEM)) { | ||
8698 | return FALSE; | ||
8699 | } | ||
8700 | } | ||
8701 | } | ||
8702 | } | ||
8703 | return TRUE; | ||
8704 | } | ||
8705 | #endif | ||
8706 | |||
8681 | /* | 8707 | /* |
8682 | * Do metacharacter (i.e. *, ?, [...]) expansion. | 8708 | * Do metacharacter (i.e. *, ?, [...]) expansion. |
8683 | */ | 8709 | */ |
@@ -8783,12 +8809,16 @@ expmeta(exp_t *exp, char *name, unsigned name_len, unsigned expdir_len) | |||
8783 | while (!pending_int && (dp = readdir(dirp)) != NULL) { | 8809 | while (!pending_int && (dp = readdir(dirp)) != NULL) { |
8784 | if (dp->d_name[0] == '.' && !matchdot) | 8810 | if (dp->d_name[0] == '.' && !matchdot) |
8785 | continue; | 8811 | continue; |
8786 | #if ENABLE_ASH_NOCASEGLOB | 8812 | #if ENABLE_ASH_GLOB_OPTIONS |
8787 | # undef pmatch | 8813 | # undef pmatch |
8788 | # define pmatch(a, b) !fnmatch((a), (b), nocaseglob ? FNM_CASEFOLD : 0) | 8814 | # define pmatch(a, b) !fnmatch((a), (b), nocaseglob ? FNM_CASEFOLD : 0) |
8789 | #endif | 8815 | #endif |
8790 | if (pmatch(start, dp->d_name)) { | 8816 | if (pmatch(start, dp->d_name)) { |
8791 | if (atend) { | 8817 | if (atend) { |
8818 | #if ENABLE_ASH_GLOB_OPTIONS | ||
8819 | if (!ash_accept_glob(dp->d_name)) | ||
8820 | continue; | ||
8821 | #endif | ||
8792 | strcpy(enddir, dp->d_name); | 8822 | strcpy(enddir, dp->d_name); |
8793 | addfname(expdir); | 8823 | addfname(expdir); |
8794 | } else { | 8824 | } else { |
@@ -8816,7 +8846,7 @@ expmeta(exp_t *exp, char *name, unsigned name_len, unsigned expdir_len) | |||
8816 | endname[-esc - 1] = esc ? '\\' : '/'; | 8846 | endname[-esc - 1] = esc ? '\\' : '/'; |
8817 | #undef expdir | 8847 | #undef expdir |
8818 | #undef expdir_max | 8848 | #undef expdir_max |
8819 | #if ENABLE_ASH_NOCASEGLOB | 8849 | #if ENABLE_ASH_GLOB_OPTIONS |
8820 | # undef pmatch | 8850 | # undef pmatch |
8821 | # define pmatch(a, b) !fnmatch((a), (b), 0) | 8851 | # define pmatch(a, b) !fnmatch((a), (b), 0) |
8822 | #endif | 8852 | #endif |
@@ -10865,6 +10895,9 @@ setinteractive(int on) | |||
10865 | line_input_state = new_line_input_t(FOR_SHELL | WITH_PATH_LOOKUP); | 10895 | line_input_state = new_line_input_t(FOR_SHELL | WITH_PATH_LOOKUP); |
10866 | # if ENABLE_FEATURE_TAB_COMPLETION | 10896 | # if ENABLE_FEATURE_TAB_COMPLETION |
10867 | line_input_state->get_exe_name = ash_command_name; | 10897 | line_input_state->get_exe_name = ash_command_name; |
10898 | # if ENABLE_ASH_GLOB_OPTIONS | ||
10899 | line_input_state->sh_accept_glob = ash_accept_glob; | ||
10900 | # endif | ||
10868 | # endif | 10901 | # endif |
10869 | # if EDITING_HAS_sh_get_var | 10902 | # if EDITING_HAS_sh_get_var |
10870 | line_input_state->sh_get_var = lookupvar; | 10903 | line_input_state->sh_get_var = lookupvar; |