busybox: add '--show SCRIPT' option to display scripts

Add an option to allow the content of embedded scripts to be
displayed.  This includes applet scripts, custom scripts and the
.profile script.

function                                             old     new   delta
busybox_main                                         624     701     +77
find_script_by_name                                    -      24     +24
scripted_main                                         41      35      -6
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 101/-6)             Total: 95 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2018-11-18 19:12:26 +01:00 committed by Denys Vlasenko
parent 3778898f97
commit d1b2ae2d04
2 changed files with 59 additions and 38 deletions

View File

@ -178,6 +178,11 @@ config BUSYBOX
Running "busybox APPLET [ARGS...]" will still work, of course. Running "busybox APPLET [ARGS...]" will still work, of course.
config FEATURE_SHOW_SCRIPT
bool "Support --show SCRIPT"
default y
depends on BUSYBOX
config FEATURE_INSTALLER config FEATURE_INSTALLER
bool "Support --install [-s] to install applet links at runtime" bool "Support --install [-s] to install applet links at runtime"
default y default y

View File

@ -756,6 +756,44 @@ static void install_links(const char *busybox UNUSED_PARAM,
static void run_applet_and_exit(const char *name, char **argv) NORETURN; static void run_applet_and_exit(const char *name, char **argv) NORETURN;
# if NUM_SCRIPTS > 0
static int find_script_by_name(const char *name)
{
int i;
int applet = find_applet_by_name(name);
if (applet >= 0) {
for (i = 0; i < NUM_SCRIPTS; ++i)
if (applet_numbers[i] == applet)
return i;
}
return -1;
}
int scripted_main(int argc UNUSED_PARAM, char **argv)
{
int script = find_script_by_name(applet_name);
if (script >= 0)
exit(ash_main(-script - 1, argv));
return 0;
}
char* FAST_FUNC
get_script_content(unsigned n)
{
char *t = unpack_bz2_data(packed_scripts, sizeof(packed_scripts),
UNPACKED_SCRIPTS_LENGTH);
if (t) {
while (n != 0) {
while (*t++ != '\0')
continue;
n--;
}
}
return t;
}
# endif /* NUM_SCRIPTS > 0 */
# if ENABLE_BUSYBOX # if ENABLE_BUSYBOX
# if ENABLE_FEATURE_SH_STANDALONE && ENABLE_FEATURE_TAB_COMPLETION # if ENABLE_FEATURE_SH_STANDALONE && ENABLE_FEATURE_TAB_COMPLETION
/* /*
@ -793,6 +831,9 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
"\n" "\n"
"Usage: busybox [function [arguments]...]\n" "Usage: busybox [function [arguments]...]\n"
" or: busybox --list"IF_FEATURE_INSTALLER("[-full]")"\n" " or: busybox --list"IF_FEATURE_INSTALLER("[-full]")"\n"
# if ENABLE_FEATURE_SHOW_SCRIPT && NUM_SCRIPTS > 0
" or: busybox --show SCRIPT\n"
# endif
IF_FEATURE_INSTALLER( IF_FEATURE_INSTALLER(
" or: busybox --install [-s] [DIR]\n" " or: busybox --install [-s] [DIR]\n"
) )
@ -838,6 +879,19 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
return 0; return 0;
} }
# if ENABLE_FEATURE_SHOW_SCRIPT && NUM_SCRIPTS > 0
if (strcmp(argv[1], "--show") == 0) {
int n;
if (!argv[2])
bb_error_msg_and_die(bb_msg_requires_arg, "--show");
n = find_script_by_name(argv[2]);
if (n < 0)
bb_error_msg_and_die("script '%s' not found", argv[2]);
full_write1_str(get_script_content(n));
return 0;
}
# endif
if (is_prefixed_with(argv[1], "--list")) { if (is_prefixed_with(argv[1], "--list")) {
unsigned i = 0; unsigned i = 0;
const char *a = applet_names; const char *a = applet_names;
@ -939,44 +993,6 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
} }
# endif /* NUM_APPLETS > 0 */ # endif /* NUM_APPLETS > 0 */
# if NUM_SCRIPTS > 0
static int find_script_by_name(const char *name)
{
int i;
int applet = find_applet_by_name(name);
if (applet >= 0) {
for (i = 0; i < NUM_SCRIPTS; ++i)
if (applet_numbers[i] == applet)
return i;
}
return -1;
}
int scripted_main(int argc UNUSED_PARAM, char **argv)
{
int script = find_script_by_name(applet_name);
if (script >= 0)
exit(ash_main(-script - 1, argv));
return 0;
}
char* FAST_FUNC
get_script_content(unsigned n)
{
char *t = unpack_bz2_data(packed_scripts, sizeof(packed_scripts),
UNPACKED_SCRIPTS_LENGTH);
if (t) {
while (n != 0) {
while (*t++ != '\0')
continue;
n--;
}
}
return t;
}
# endif /* NUM_SCRIPTS > 0 */
# if ENABLE_BUSYBOX || NUM_APPLETS > 0 # if ENABLE_BUSYBOX || NUM_APPLETS > 0
static NORETURN void run_applet_and_exit(const char *name, char **argv) static NORETURN void run_applet_and_exit(const char *name, char **argv)
{ {