[PATCH] Treat custom and applet scripts as applets
Denys Vlasenko
vda.linux at googlemail.com
Sat Nov 17 20:22:09 UTC 2018
Applied with some changes, please check current git.
In particular:
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;
}
Currently, scripted_main() can only be reached if the applet is indeed a script.
Therefore, checking that it's in applet_numbers[] is pointless
(it is there). Therefore, we don't NEED applet_numbers[] and
find_script_by_name(), right?
(
And if we'd need it later for "busybox --showscript", we can check it via
applet_main[applet_no] == scripted_main
)
On Sat, Nov 17, 2018 at 6:48 PM Ron Yorston <rmy at pobox.com> wrote:
>
> BusyBox has support for embedded shell scripts. Two types can be
> distinguished: custom scripts and scripts implementing applets.
>
> Custom scripts should be placed in the 'embed' directory at build
> time. They are given a default applet configuration and appear
> as applets to the user but no further configuration is possible.
>
> Applet scripts are integrated with the BusyBox build system and
> are intended to be used to ship standard applets that just happen
> to be implemented as scripts. They can be configured at build time
> and appear just like native applets.
>
> Such scripts should be placed in the 'applets_sh' directory. A stub
> C program should be written to provide the usual applet configuration
> details and placed in a suitable subsystem directory. It may be
> helpful to have a configuration option to enable any dependencies the
> script requires: see the 'nologin' applet for an example.
>
> function old new delta
> scripted_main - 53 +53
> packed_usage 32951 32997 +46
> .rodata 168610 168655 +45
> applet_names 2695 2703 +8
> applet_main 3128 3136 +8
> script_names 9 - -9
> find_script_by_name 57 26 -31
> run_applet_and_exit 782 728 -54
> ------------------------------------------------------------------------------
> (add/remove: 1/1 grow/shrink: 4/2 up/down: 160/-94) Total: 66 bytes
>
> Signed-off-by: Ron Yorston <rmy at pobox.com>
> ---
> .gitignore | 5 ++
> Makefile | 4 +-
> applets/busybox.mkscripts | 16 +++++
> {embed => applets_sh}/nologin | 0
> include/applets.src.h | 21 +++++++
> include/libbb.h | 1 +
> libbb/appletlib.c | 69 ++++++++++------------
> libbb/lineedit.c | 20 ++-----
> scripts/embedded_scripts | 107 ++++++++++++++++++++++++++--------
> scripts/gen_build_files.sh | 21 ++++++-
> shell/ash.c | 19 ++----
> util-linux/nologin.c | 27 +++++++++
> 12 files changed, 213 insertions(+), 97 deletions(-)
> create mode 100755 applets/busybox.mkscripts
> rename {embed => applets_sh}/nologin (100%)
> create mode 100644 util-linux/nologin.c
>
> diff --git a/.gitignore b/.gitignore
> index c03c2e8a6..becd9bf6d 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -56,3 +56,8 @@ cscope.po.out
> #
> tags
> TAGS
> +
> +#
> +# user-supplied scripts
> +#
> +/embed
> diff --git a/Makefile b/Makefile
> index 8a0dbdf49..c19280476 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -361,7 +361,7 @@ scripts/basic/%: scripts_basic ;
>
> # This target generates Kbuild's and Config.in's from *.c files
> PHONY += gen_build_files
> -gen_build_files: $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c)
> +gen_build_files: $(wildcard $(srctree)/*/*.c) $(wildcard $(srctree)/*/*/*.c) $(wildcard embed/*)
> $(Q)$(srctree)/scripts/gen_build_files.sh $(srctree) $(objtree)
>
> # bbox: we have helpers in applets/
> @@ -851,7 +851,7 @@ quiet_cmd_gen_common_bufsiz = GEN include/common_bufsiz.h
> quiet_cmd_split_autoconf = SPLIT include/autoconf.h -> include/config/*
> cmd_split_autoconf = scripts/basic/split-include include/autoconf.h include/config
> quiet_cmd_gen_embedded_scripts = GEN include/embedded_scripts.h
> - cmd_gen_embedded_scripts = scripts/embedded_scripts include/embedded_scripts.h embed
> + cmd_gen_embedded_scripts = $(srctree)/scripts/embedded_scripts include/embedded_scripts.h $(srctree)/embed $(srctree)/applets_sh
> #bbox# piggybacked generation of few .h files
> include/config/MARKER: scripts/basic/split-include include/autoconf.h $(wildcard embed/*) scripts/embedded_scripts
> $(call cmd,split_autoconf)
> diff --git a/applets/busybox.mkscripts b/applets/busybox.mkscripts
> new file mode 100755
> index 000000000..935685cba
> --- /dev/null
> +++ b/applets/busybox.mkscripts
> @@ -0,0 +1,16 @@
> +#!/bin/sh
> +# Make busybox scripted applet list file.
> +
> +# input $1: full path to Config.h
> +# input $2: full path to applets.h
> +# output (stdout): list of pathnames that should be linked to busybox
> +
> +export LC_ALL=POSIX
> +export LC_CTYPE=POSIX
> +
> +CONFIG_H=${1:-include/autoconf.h}
> +APPLETS_H=${2:-include/applets.h}
> +$HOSTCC -E -DMAKE_SCRIPTS -include $CONFIG_H $APPLETS_H |
> + awk '/^[ \t]*SCRIPT/{
> + print $2
> + }'
> diff --git a/embed/nologin b/applets_sh/nologin
> similarity index 100%
> rename from embed/nologin
> rename to applets_sh/nologin
> diff --git a/include/applets.src.h b/include/applets.src.h
> index 2ddf120ad..a9db5d160 100644
> --- a/include/applets.src.h
> +++ b/include/applets.src.h
> @@ -22,41 +22,60 @@ s - suid type:
> BB_SUID_REQUIRE or BB_SUID_MAYBE applet.
> */
>
> +#define NOUSAGE_STR "\b"
> +
> +#define dummy_trivial_usage NOUSAGE_STR \
> +
> +#define dummy_full_usage "" \
> +
> #if defined(PROTOTYPES)
> # define APPLET(name,l,s) int name##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> # define APPLET_ODDNAME(name,main,l,s,help) int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> # define APPLET_NOEXEC(name,main,l,s,help) int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> # define APPLET_NOFORK(name,main,l,s,help) int main##_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> +# define APPLET_SCRIPTED(name,main,l,s,help)
>
> #elif defined(NAME_MAIN)
> # define APPLET(name,l,s) name name##_main
> # define APPLET_ODDNAME(name,main,l,s,help) name main##_main
> # define APPLET_NOEXEC(name,main,l,s,help) name main##_main
> # define APPLET_NOFORK(name,main,l,s,help) name main##_main
> +# define APPLET_SCRIPTED(name,main,l,s,help) name scripted_main
>
> #elif defined(MAKE_USAGE) && ENABLE_FEATURE_VERBOSE_USAGE
> # define APPLET(name,l,s) MAKE_USAGE(#name, name##_trivial_usage name##_full_usage)
> # define APPLET_ODDNAME(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage help##_full_usage)
> # define APPLET_NOEXEC(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage help##_full_usage)
> # define APPLET_NOFORK(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage help##_full_usage)
> +# define APPLET_SCRIPTED(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage help##_full_usage)
>
> #elif defined(MAKE_USAGE) && !ENABLE_FEATURE_VERBOSE_USAGE
> # define APPLET(name,l,s) MAKE_USAGE(#name, name##_trivial_usage)
> # define APPLET_ODDNAME(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage)
> # define APPLET_NOEXEC(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage)
> # define APPLET_NOFORK(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage)
> +# define APPLET_SCRIPTED(name,main,l,s,help) MAKE_USAGE(#name, help##_trivial_usage)
>
> #elif defined(MAKE_LINKS)
> # define APPLET(name,l,c) LINK l name
> # define APPLET_ODDNAME(name,main,l,s,help) LINK l name
> # define APPLET_NOEXEC(name,main,l,s,help) LINK l name
> # define APPLET_NOFORK(name,main,l,s,help) LINK l name
> +# define APPLET_SCRIPTED(name,main,l,s,help) LINK l name
>
> #elif defined(MAKE_SUID)
> # define APPLET(name,l,s) SUID s l name
> # define APPLET_ODDNAME(name,main,l,s,help) SUID s l name
> # define APPLET_NOEXEC(name,main,l,s,help) SUID s l name
> # define APPLET_NOFORK(name,main,l,s,help) SUID s l name
> +# define APPLET_SCRIPTED(name,main,l,s,help) SUID s l name
> +
> +#elif defined(MAKE_SCRIPTS)
> +# define APPLET(name,l,s)
> +# define APPLET_ODDNAME(name,main,l,s,help)
> +# define APPLET_NOEXEC(name,main,l,s,help)
> +# define APPLET_NOFORK(name,main,l,s,help)
> +# define APPLET_SCRIPTED(name,main,l,s,help) SCRIPT name
>
> #else
> static struct bb_applet applets[] = { /* name, main, location, need_suid */
> @@ -64,6 +83,7 @@ s - suid type:
> # define APPLET_ODDNAME(name,main,l,s,help) { #name, #main, l, s },
> # define APPLET_NOEXEC(name,main,l,s,help) { #name, #main, l, s, 1 },
> # define APPLET_NOFORK(name,main,l,s,help) { #name, #main, l, s, 1, 1 },
> +# define APPLET_SCRIPTED(name,main,l,s,help) { #name, #main, l, s },
> #endif
>
> #if ENABLE_INSTALL_NO_USR
> @@ -84,3 +104,4 @@ INSERT
> #undef APPLET_ODDNAME
> #undef APPLET_NOEXEC
> #undef APPLET_NOFORK
> +#undef APPLET_SCRIPTED
> diff --git a/include/libbb.h b/include/libbb.h
> index a32608ebd..3fcff421b 100644
> --- a/include/libbb.h
> +++ b/include/libbb.h
> @@ -1324,6 +1324,7 @@ void bb_logenv_override(void) FAST_FUNC;
> /* Embedded script support */
> int find_script_by_name(const char *name) FAST_FUNC;
> char *get_script_content(unsigned n) FAST_FUNC;
> +int scripted_main(int argc UNUSED_PARAM, char** argv) FAST_FUNC;
>
> /* Applets which are useful from another applets */
> int bb_cat(char** argv) FAST_FUNC;
> diff --git a/libbb/appletlib.c b/libbb/appletlib.c
> index 6dfaf1f41..5e7114198 100644
> --- a/libbb/appletlib.c
> +++ b/libbb/appletlib.c
> @@ -51,7 +51,7 @@
> #include "usage_compressed.h"
>
> #if ENABLE_ASH_EMBEDDED_SCRIPTS
> -# define DEFINE_script_names 1
> +# define DEFINE_SCRIPT_DATA 1
> # include "embedded_scripts.h"
> #else
> # define NUM_SCRIPTS 0
> @@ -754,6 +754,14 @@ static void install_links(const char *busybox UNUSED_PARAM,
> }
> # endif
>
> +int FAST_FUNC 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;
> +}
> +
> static void run_applet_and_exit(const char *name, char **argv) NORETURN;
>
> # if ENABLE_BUSYBOX
> @@ -818,27 +826,21 @@ int busybox_main(int argc UNUSED_PARAM, char **argv)
> /* prevent last comma to be in the very last pos */
> output_width--;
> a = applet_names;
> - {
> -# if NUM_SCRIPTS > 0
> - int i;
> - for (i = 0; i < 2; i++, a = script_names)
> -# endif
> - while (*a) {
> - int len2 = strlen(a) + 2;
> - if (col >= (int)output_width - len2) {
> - full_write2_str(",\n");
> - col = 0;
> - }
> - if (col == 0) {
> - col = 6;
> - full_write2_str("\t");
> - } else {
> - full_write2_str(", ");
> - }
> - full_write2_str(a);
> - col += len2;
> - a += len2 - 1;
> + while (*a) {
> + int len2 = strlen(a) + 2;
> + if (col >= (int)output_width - len2) {
> + full_write2_str(",\n");
> + col = 0;
> + }
> + if (col == 0) {
> + col = 6;
> + full_write2_str("\t");
> + } else {
> + full_write2_str(", ");
> }
> + full_write2_str(a);
> + col += len2;
> + a += len2 - 1;
> }
> full_write2_str("\n");
> return 0;
> @@ -949,17 +951,15 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
> int FAST_FUNC
> find_script_by_name(const char *name)
> {
> - const char *s = script_names;
> - int i = 0;
> + int i;
> + int applet = find_applet_by_name(name);
>
> - while (*s) {
> - if (strcmp(name, s) == 0)
> - return i;
> - i++;
> - while (*s++ != '\0')
> - continue;
> + if (applet >= 0) {
> + for (i=0; i<NUM_SCRIPTS; ++i)
> + if (applet_numbers[i] == applet)
> + return i;
> }
> - return -0x10000; /* make it so that NUM_APPLETS + <error> is still < 0 */
> + return -1;
> }
>
> char* FAST_FUNC
> @@ -978,7 +978,7 @@ get_script_content(unsigned n)
> }
> # endif /* NUM_SCRIPTS > 0 */
>
> -# if ENABLE_BUSYBOX || NUM_APPLETS > 0 || NUM_SCRIPTS > 0
> +# if ENABLE_BUSYBOX || NUM_APPLETS > 0
> static NORETURN void run_applet_and_exit(const char *name, char **argv)
> {
> # if ENABLE_BUSYBOX
> @@ -993,13 +993,6 @@ static NORETURN void run_applet_and_exit(const char *name, char **argv)
> run_applet_no_and_exit(applet, name, argv);
> }
> # endif
> -# if NUM_SCRIPTS > 0
> - {
> - int script = find_script_by_name(name);
> - if (script >= 0)
> - exit(ash_main(-script - 1, argv));
> - }
> -# endif
>
> /*bb_error_msg_and_die("applet not found"); - links in printf */
> full_write2_str(applet_name);
> diff --git a/libbb/lineedit.c b/libbb/lineedit.c
> index 618e7c221..b1e971f88 100644
> --- a/libbb/lineedit.c
> +++ b/libbb/lineedit.c
> @@ -41,12 +41,6 @@
> #include "busybox.h"
> #include "NUM_APPLETS.h"
> #include "unicode.h"
> -#if ENABLE_ASH_EMBEDDED_SCRIPTS
> -# include "embedded_scripts.h"
> -#else
> -# define NUM_SCRIPTS 0
> -#endif
> -
> #ifndef _POSIX_VDISABLE
> # define _POSIX_VDISABLE '\0'
> #endif
> @@ -812,20 +806,14 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
> }
> pf_len = strlen(pfind);
>
> -# if ENABLE_FEATURE_SH_STANDALONE && (NUM_APPLETS != 1 || NUM_SCRIPTS > 0)
> +# if ENABLE_FEATURE_SH_STANDALONE && NUM_APPLETS != 1
> if (type == FIND_EXE_ONLY && !dirbuf) {
> - const char *p;
> -# if NUM_APPLETS != 1 && NUM_SCRIPTS > 0
> - for (i = 0, p = applet_names; i < 2; i++, p = script_names)
> -# elif NUM_APPLETS != 1 /* and NUM_SCRIPTS == 0 */
> - p = applet_names;
> -# else /* NUM_APPLETS == 1 && NUM_SCRIPTS > 0 */
> - p = script_names;
> -# endif
> + const char *p = applet_names;
> +
> while (*p) {
> if (strncmp(pfind, p, pf_len) == 0)
> add_match(xstrdup(p));
> - while (*p++)
> + while (*p++ != '\0')
> continue;
> }
> }
> diff --git a/scripts/embedded_scripts b/scripts/embedded_scripts
> index 7245ba6e0..b7a023ce0 100755
> --- a/scripts/embedded_scripts
> +++ b/scripts/embedded_scripts
> @@ -1,7 +1,8 @@
> #!/bin/sh
>
> target="$1"
> -loc="$2"
> +custom_loc="$2"
> +applet_loc="$3"
>
> test "$target" || exit 1
> test "$SED" || SED=sed
> @@ -14,46 +15,102 @@ if test $? != 0; then
> exit 1
> fi
>
> -exec >"$target.$$"
> -
> -scripts=""
> -if [ -d "$loc" ]
> +custom_scripts=""
> +if [ -d "$custom_loc" ]
> then
> - scripts=$(cd $loc; ls * 2>/dev/null)
> + custom_scripts=$(cd $custom_loc; ls * 2>/dev/null)
> fi
> +all_scripts=$(applets/busybox.mkscripts)
> +
> +# all_scripts includes applet scripts and custom scripts, sort them out
> +applet_scripts=""
> +for i in $all_scripts
> +do
> + found=0
> + for j in $custom_scripts
> + do
> + if [ "$i" = "$j" ]
> + then
> + found=1
> + break;
> + fi
> + done
> + if [ $found -eq 0 ]
> + then
> + # anything that isn't a custom script is an applet script
> + applet_scripts="$applet_scripts $i"
> + fi
> +done
>
> -n=$(echo $scripts | wc -w)
> +# we know the custom scripts are present but applet scripts might have
> +# become detached from their configuration
> +for i in $applet_scripts
> +do
> + #if [ ! -f "$applet_loc/$i" -a ! -f "$custom_loc/$i" ]
> + if [ ! -f "$applet_loc/$i" ]
> + then
> + echo "missing applet script $i"
> + exit 1
> + fi
> +done
>
> -if [ $n -ne 0 ]
> +n=$(echo $custom_scripts $applet_scripts | wc -w)
> +nall=$(echo $all_scripts | wc -w)
> +
> +if [ $n -ne $nall ]
> then
> - printf '#ifdef DEFINE_script_names\n'
> - printf 'const char script_names[] ALIGN1 = '
> - for i in $scripts
> + echo "script mismatch $n != $nall"
> + exit 1
> +fi
> +
> +concatenate_scripts() {
> + for i in $custom_scripts
> + do
> + cat $custom_loc/$i
> + printf '\000'
> + done
> + for i in $applet_scripts
> do
> - printf '"%s\\0"' $i
> + cat $applet_loc/$i
> + printf '\000'
> done
> - printf ';\n'
> +}
> +
> +exec >"$target.$$"
> +
> +if [ $n -ne 0 ]
> +then
> + printf '#ifdef DEFINE_SCRIPT_DATA\n'
> + if [ $n -ne 0 ]
> + then
> + printf 'const uint16_t applet_numbers[] = {\n'
> + for i in $custom_scripts $applet_scripts
> + do
> + # TODO support applets with names including invalid characters
> + printf '\tAPPLET_NO_%s,\n' $i
> + done
> + printf '};\n'
> + fi
> printf '#else\n'
> - printf 'extern const char script_names[] ALIGN1;\n'
> + if [ $n -ne 0 ]
> + then
> + printf 'extern const uint16_t applet_numbers[];\n'
> + fi
> printf '#endif\n'
> fi
> -printf "#define NUM_SCRIPTS $n\n\n"
> +
> +printf "\n"
> +printf '#define NUM_SCRIPTS %d\n' $n
> +printf "\n"
>
> if [ $n -ne 0 ]
> then
> printf '#define UNPACKED_SCRIPTS_LENGTH '
> - for i in $scripts
> - do
> - cat $loc/$i
> - printf '\000'
> - done | wc -c
> + concatenate_scripts | wc -c
>
> printf '#define PACKED_SCRIPTS \\\n'
> - for i in $scripts
> - do
> - cat $loc/$i
> - printf '\000'
> - done | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | od -v -b \
> + concatenate_scripts | bzip2 -1 | $DD bs=2 skip=1 2>/dev/null | \
> + od -v -b \
> | grep -v '^ ' \
> | $SED -e 's/^[^ ]*//' \
> -e 's/ //g' \
> diff --git a/scripts/gen_build_files.sh b/scripts/gen_build_files.sh
> index f79fa2f83..64e4bffa9 100755
> --- a/scripts/gen_build_files.sh
> +++ b/scripts/gen_build_files.sh
> @@ -17,12 +17,26 @@ status() { printf ' %-8s%s\n' "$1" "$2"; }
> gen() { status "GEN" "$@"; }
> chk() { status "CHK" "$@"; }
>
> +# scripts in the 'embed' directory are treated as fake applets
> +custom_scripts()
> +{
> + custom_loc="$1"
> + if [ -d "$custom_loc" ]
> + then
> + for i in $(cd "$custom_loc"; ls *)
> + do
> + printf "APPLET_SCRIPTED(%s, scripted, BB_DIR_USR_BIN, BB_SUID_DROP, dummy)\n" $i;
> + done
> + fi
> +}
> +
> generate()
> {
> # NB: data to be inserted at INSERT line is coming on stdin
> src="$1"
> dst="$2"
> header="$3"
> + loc="$4"
> #chk "${dst}"
> {
> # Need to use printf: different shells have inconsistent
> @@ -32,6 +46,10 @@ generate()
> sed -n '/^INSERT$/ q; p' "${src}"
> # copy stdin to stdout
> cat
> + if [ -n "$loc" ]
> + then
> + custom_scripts "$loc"
> + fi
> # print everything after INSERT line
> sed -n '/^INSERT$/ {
> :l
> @@ -53,7 +71,8 @@ sed -n 's@^//applet:@@p' "$srctree"/*/*.c "$srctree"/*/*/*.c \
> | generate \
> "$srctree/include/applets.src.h" \
> "include/applets.h" \
> - "/* DO NOT EDIT. This file is generated from applets.src.h */"
> + "/* DO NOT EDIT. This file is generated from applets.src.h */" \
> + "$srctree/embed"
>
> # (Re)generate include/usage.h
> # We add line continuation backslash after each line,
> diff --git a/shell/ash.c b/shell/ash.c
> index b1f8f15d2..44b3569dc 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -158,6 +158,10 @@
> //config: at build time. Like applets, scripts can be run as
> //config: 'busybox SCRIPT ...' or by linking their name to the binary.
> //config:
> +//config: This also allows applets to be implemented as scripts: place
> +//config: the script in 'applets_sh' and a stub C file containing
> +//config: configuration in the appropriate subsystem directory.
> +//config:
> //config:endif # ash options
>
> //applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
> @@ -8016,9 +8020,6 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c
> {
> #if ENABLE_FEATURE_SH_STANDALONE
> if (applet_no >= 0) {
> -# if NUM_SCRIPTS > 0
> - if (applet_no < NUM_APPLETS)
> -# endif
> if (APPLET_IS_NOEXEC(applet_no)) {
> clearenv();
> while (*envp)
> @@ -8088,9 +8089,6 @@ static void shellexec(char *prog, char **argv, const char *path, int idx)
> if (strchr(prog, '/') != NULL
> #if ENABLE_FEATURE_SH_STANDALONE
> || (applet_no = find_applet_by_name(prog)) >= 0
> -# if NUM_SCRIPTS > 0
> - || (applet_no = NUM_APPLETS + find_script_by_name(prog)) >= 0
> -# endif
> #endif
> ) {
> tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
> @@ -10192,10 +10190,6 @@ evalcommand(union node *cmd, int flags)
> */
> /* find_command() encodes applet_no as (-2 - applet_no) */
> int applet_no = (- cmdentry.u.index - 2);
> -# if NUM_SCRIPTS > 0
> - /* Applets are ok, but not embedded scripts */
> - if (applet_no < NUM_APPLETS)
> -# endif
> if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
> char **sv_environ;
>
> @@ -13378,11 +13372,6 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
> #if ENABLE_FEATURE_SH_STANDALONE
> {
> int applet_no = find_applet_by_name(name);
> -# if NUM_SCRIPTS > 0
> - if (applet_no < 0)
> - /* embedded script indices are offset by NUM_APPLETS */
> - applet_no = NUM_APPLETS + find_script_by_name(name);
> -# endif
> if (applet_no >= 0) {
> entry->cmdtype = CMDNORMAL;
> entry->u.index = -2 - applet_no;
> diff --git a/util-linux/nologin.c b/util-linux/nologin.c
> new file mode 100644
> index 000000000..52c640784
> --- /dev/null
> +++ b/util-linux/nologin.c
> @@ -0,0 +1,27 @@
> +//config:config NOLOGIN
> +//config: bool "nologin"
> +//config: default y
> +//config: depends on ASH_EMBEDDED_SCRIPTS
> +//config: help
> +//config: Politely refuse a login
> +//config:
> +//config:config NOLOGIN_DEPENDENCIES
> +//config: bool "Dependencies for nologin"
> +//config: default y
> +//config: depends on NOLOGIN
> +//config: select CAT
> +//config: select ECHO
> +//config: select SLEEP
> +//config: help
> +//config: nologin is implemented as a shell script. It requires the
> +//config: following in the runtime environment:
> +//config: cat echo sleep
> +//config: If you know these will be available externally you can
> +//config: disable this option.
> +
> +//applet:IF_NOLOGIN(APPLET_SCRIPTED(nologin, scripted, BB_DIR_USR_SBIN, BB_SUID_DROP, nologin))
> +
> +//usage:#define nologin_trivial_usage
> +//usage: ""
> +//usage:#define nologin_full_usage "\n\n"
> +//usage: "Display a message that an account is not available and exit non-zero."
> --
> 2.19.1
>
More information about the busybox
mailing list