echo: special case "echo --help": it should not show help text

While at it, fix "busybox --help echo" and other special applets to still print
the help text.

function                                             old     new   delta
run_applet_and_exit                                  732     761     +29
show_usage_if_dash_dash_help                          70      78      +8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 37/0)               Total: 37 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2021-03-15 17:42:25 +01:00
parent f25d254dfd
commit f26e5634b1

View File

@ -263,9 +263,14 @@ void lbb_prepare(const char *applet
&& strcmp(argv[1], "--help") == 0
&& !is_prefixed_with(applet, "busybox")
) {
/* Special case. POSIX says "test --help"
* should be no different from e.g. "test --foo". */
if (!ENABLE_TEST || strcmp(applet_name, "test") != 0)
/* Special cases. POSIX says "test --help"
* should be no different from e.g. "test --foo".
*/
if (!(ENABLE_TEST && strcmp(applet_name, "test") == 0)
&& !(ENABLE_TRUE && strcmp(applet_name, "true") == 0)
&& !(ENABLE_FALSE && strcmp(applet_name, "false") == 0)
&& !(ENABLE_ECHO && strcmp(applet_name, "echo") == 0)
)
bb_show_usage();
}
#endif
@ -891,15 +896,21 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
if (!argv[2])
goto help;
/* convert to "<applet> --help" */
argv[0] = argv[2];
applet_name = argv[0] = argv[2];
argv[2] = NULL;
if (find_applet_by_name(applet_name) >= 0) {
/* Make "--help foo" exit with 0: */
xfunc_error_retval = 0;
bb_show_usage();
} /* else: unknown applet, fall through (causes "applet not found" later) */
} else {
/* "busybox <applet> arg1 arg2 ..." */
argv++;
/* We support "busybox /a/path/to/applet args..." too. Allows for
* "#!/bin/busybox"-style wrappers
*/
applet_name = bb_get_last_path_component_nostrip(argv[0]);
}
/* We support "busybox /a/path/to/applet args..." too. Allows for
* "#!/bin/busybox"-style wrappers */
applet_name = bb_get_last_path_component_nostrip(argv[0]);
run_applet_and_exit(applet_name, argv);
}
# endif
@ -910,7 +921,7 @@ void FAST_FUNC show_usage_if_dash_dash_help(int applet_no, char **argv)
/* Special case. POSIX says "test --help"
* should be no different from e.g. "test --foo".
* Thus for "test", we skip --help check.
* "true" and "false" are also special.
* "true", "false", "echo" are also special.
*/
if (1
# if defined APPLET_NO_test
@ -921,6 +932,9 @@ void FAST_FUNC show_usage_if_dash_dash_help(int applet_no, char **argv)
# endif
# if defined APPLET_NO_false
&& applet_no != APPLET_NO_false
# endif
# if defined APPLET_NO_echo
&& applet_no != APPLET_NO_echo
# endif
) {
if (argv[1] && !argv[2] && strcmp(argv[1], "--help") == 0) {