aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h8
-rw-r--r--libbb/appletlib.c46
-rw-r--r--libbb/lineedit.c2
-rw-r--r--shell/ash.c10
4 files changed, 61 insertions, 5 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 740c25528..482fcce0c 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1320,6 +1320,14 @@ void run_noexec_applet_and_exit(int a, const char *name, char **argv) NORETURN F
1320#ifndef BUILD_INDIVIDUAL 1320#ifndef BUILD_INDIVIDUAL
1321int find_applet_by_name(const char *name) FAST_FUNC; 1321int find_applet_by_name(const char *name) FAST_FUNC;
1322void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC; 1322void run_applet_no_and_exit(int a, const char *name, char **argv) NORETURN FAST_FUNC;
1323int find_preferred_applet_by_name(const char *name) FAST_FUNC;
1324int is_applet_preferred(const char *name) FAST_FUNC;
1325# if ENABLE_PLATFORM_MINGW32 && \
1326 (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE)
1327# define find_applet_by_name(n) find_preferred_applet_by_name(n)
1328# else
1329# define is_applet_preferred(n) (1)
1330# endif
1323#endif 1331#endif
1324void show_usage_if_dash_dash_help(int applet_no, char **argv) FAST_FUNC; 1332void show_usage_if_dash_dash_help(int applet_no, char **argv) FAST_FUNC;
1325#if defined(__linux__) 1333#if defined(__linux__)
diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index aa442144a..8d58ce2ea 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -76,6 +76,13 @@ static inline int *get_perrno(void) { return &errno; }
76static const char packed_scripts[] ALIGN1 = { PACKED_SCRIPTS }; 76static const char packed_scripts[] ALIGN1 = { PACKED_SCRIPTS };
77#endif 77#endif
78 78
79#if defined(find_applet_by_name)
80# undef find_applet_by_name
81#endif
82#if defined(is_applet_preferred)
83# undef is_applet_preferred
84#endif
85
79/* "Do not compress usage text if uncompressed text is small 86/* "Do not compress usage text if uncompressed text is small
80 * and we don't include bunzip2 code for other reasons" 87 * and we don't include bunzip2 code for other reasons"
81 * 88 *
@@ -254,6 +261,45 @@ int FAST_FUNC find_applet_by_name(const char *name)
254 return -1; 261 return -1;
255} 262}
256 263
264#if ENABLE_PLATFORM_MINGW32 && NUM_APPLETS > 1 && \
265 (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE)
266int FAST_FUNC is_applet_preferred(const char *name)
267{
268 const char *var, *s;
269 size_t len;
270
271 var = getenv("BB_OVERRIDE_APPLETS");
272 if (var && *var) {
273 /* '-' overrides all applets */
274 if (var[0] == '-' && var[1] == '\0')
275 return FALSE;
276
277 /* Override applets from a space-separated list */
278 len = strlen(name);
279 s = var - 1;
280 while (1) {
281 s = strstr(s + 1, name);
282 if (!s)
283 break;
284 /* neither "name.." nor "xxx,name.."? */
285 if (s != var && s[-1] != ' ')
286 continue;
287 /* neither "..name" nor "..name,xxx"? */
288 if (s[len] != '\0' && s[len] != ' ')
289 continue;
290 return FALSE;
291 }
292 }
293 return TRUE;
294}
295
296int FAST_FUNC find_preferred_applet_by_name(const char *name)
297{
298 int applet_no = find_applet_by_name(name);
299 return applet_no >= 0 && is_applet_preferred(name) ? applet_no : -1;
300}
301#endif
302
257 303
258void lbb_prepare(const char *applet 304void lbb_prepare(const char *applet
259 IF_FEATURE_INDIVIDUAL(, char **argv)) 305 IF_FEATURE_INDIVIDUAL(, char **argv))
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 778511d16..4f68547eb 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -926,7 +926,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
926# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1 926# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1
927 const char *p = applet_names; 927 const char *p = applet_names;
928 while (*p) { 928 while (*p) {
929 if (strncmp(basecmd, p, baselen) == 0) 929 if (strncmp(basecmd, p, baselen) == 0 && is_applet_preferred(p))
930 add_match(xstrdup(p)); 930 add_match(xstrdup(p));
931 while (*p++ != '\0') 931 while (*p++ != '\0')
932 continue; 932 continue;
diff --git a/shell/ash.c b/shell/ash.c
index 6c1e58d6f..f42dc49c3 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -14961,10 +14961,12 @@ helpcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
14961 { 14961 {
14962 const char *a = applet_names; 14962 const char *a = applet_names;
14963 while (*a) { 14963 while (*a) {
14964 col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), a); 14964 if (is_applet_preferred(a)) {
14965 if (col > 60) { 14965 col += out1fmt("%c%s", ((col == 0) ? '\t' : ' '), a);
14966 out1fmt("\n"); 14966 if (col > 60) {
14967 col = 0; 14967 out1fmt("\n");
14968 col = 0;
14969 }
14968 } 14970 }
14969 while (*a++ != '\0') 14971 while (*a++ != '\0')
14970 continue; 14972 continue;