On Mon, Aug 7, 2017 at 12:32 PM, Justin Cinkelj <justin.cink...@xlab.si>
wrote:

> Busybox ash shell is more powerful than OSv --runscript option.
> Use ash when fancy shell is required.
>
> While busybox config file includes default options (e.g. nearly all
> options are enabled), the usr.manifiest doesn't try to create all
> valid symlinks to busybox binary. Instead, only a few are included.
>
> A small test script is provided (commented out in usr.manifest).
> It can be run as:
> ./scripts/run.py -e "--env=PATH=/usr/lib sleep 1.2; ash /cmd0.sh; echo
> Done"
>


Thanks. I committed this.

I was annoyed that you need this "--env=PATH" thing, so I tried this patch:

diff --git a/busybox/GET b/busybox/GET
index 90f2ab1..86a893a 100755
--- a/busybox/GET
+++ b/busybox/GET
@@ -34,7 +34,11 @@ cat <<EOF > usr.manifest
 /usr/lib/echo: ->/usr/lib/busybox
 /usr/lib/ping: ->/usr/lib/busybox
 #
+# Link /usr/bin (in ash's default PATH) to /usr/lib where we put the
executables
+#
+/usr/bin: ->/usr/lib
+#
 # test scripts
 ## /**: \${MODULE_DIR}/test-script/**

then ran "scripts/run.py -e ash" and expected commands to work normally,
and they almost did, except I see this:

/home/nyh/osv.tmp2/osv$ scripts/run.py -e ash
OSv v0.24-425-g77b1f05
eth0: 192.168.122.15
ash: can't access tty; job control turned off
/ # ls
dev            libuutil.so    tmp            zfs.so
etc            libzfs.so      tools          zpool.so
libenviron.so  proc           usr
ash: ls: not found
/home/nyh/osv.tmp2/osv$

So although "ls" *was* found (in /usr/bin/ls because /usr/bin is linked to
/usr/lib), and ran, after running it, ash still complains it wasn't found
in the path and exits OSv (?).
Do you have any idea why this happens?

Another nitpick it would be nice to fix: If I type a full pathname of a
non-existant command, I get this:

/ # /aaa
terminate called after throwing an instance of 'osv::launch_error'
  what():  Failed to load object: /aaa
Aborted

I guess osv_execve() throws an exception which you should catch. Perhaps
osv_execve() should do this catching, and return -1 (and some relevant
errno) to behave more like the original execve?


>
> Signed-off-by: Justin Cinkelj <justin.cink...@xlab.si>
> ---
>  busybox/.gitignore                                 |    3 +
>  busybox/GET                                        |   40 +
>  busybox/Makefile                                   |   13 +
>  busybox/patches/0001-OSv-remove-exit-usage.patch   |  190 ++++
>  ...lude-file-line-function-into-TRACE-output.patch |   55 +
>  .../0003-OSv-ash-fix-process-spawning.patch        |  263 +++++
>  busybox/patches/busybox-main.c                     |    5 +
>  busybox/patches/config                             | 1139
> ++++++++++++++++++++
>  busybox/test-script/cmd0.sh                        |   26 +
>  9 files changed, 1734 insertions(+)
>  create mode 100644 busybox/.gitignore
>  create mode 100755 busybox/GET
>  create mode 100644 busybox/Makefile
>  create mode 100644 busybox/patches/0001-OSv-remove-exit-usage.patch
>  create mode 100644 busybox/patches/0002-ash-inclu
> de-file-line-function-into-TRACE-output.patch
>  create mode 100644 busybox/patches/0003-OSv-ash-f
> ix-process-spawning.patch
>  create mode 100644 busybox/patches/busybox-main.c
>  create mode 100644 busybox/patches/config
>  create mode 100644 busybox/test-script/cmd0.sh
>
> diff --git a/busybox/.gitignore b/busybox/.gitignore
> new file mode 100644
> index 0000000..d0721e6
> --- /dev/null
> +++ b/busybox/.gitignore
> @@ -0,0 +1,3 @@
> +build/
> +usr.manifest
> +
> diff --git a/busybox/GET b/busybox/GET
> new file mode 100755
> index 0000000..90f2ab1
> --- /dev/null
> +++ b/busybox/GET
> @@ -0,0 +1,40 @@
> +#!/bin/bash
> +
> +set -e
> +
> +URL=https://github.com/mirror/busybox
> +VERSION_GIT=1_27_stable
> +VERSION_LIB=1.27.1
> +
> +[ ! -d build ] && mkdir build
> +cd build
> +if [ ! -d busybox ]
> +then
> +  git clone --branch $VERSION_GIT --depth 1 $URL
> +  (cd busybox && git am ../../patches/000[0-9]-*\.patch)
> +fi
> +cd busybox
> +
> +cp -f ../../patches/config .config
> +make -j4
> +(cd 0_lib/ && ln -sf libbusybox.so.${VERSION_LIB} libbusybox.so)
> +gcc -o busybox-main.so ../../patches/busybox-main.c -L0_lib -lbusybox
> -shared -fPIC
> +cd ../..
> +
> +cat <<EOF > usr.manifest
> +/usr/lib/libbusybox.so.${VERSION_LIB}: \${MODULE_DIR}/build/busybox/0
> _lib/libbusybox.so.${VERSION_LIB}_unstripped
> +/usr/lib/busybox: \${MODULE_DIR}/build/busybox/busybox-main.so
> +/usr/lib/ash: ->/usr/lib/busybox
> +#
> +# common utilities
> +/usr/lib/df: ->/usr/lib/busybox
> +/usr/lib/sleep: ->/usr/lib/busybox
> +/usr/lib/ls: ->/usr/lib/busybox
> +/usr/lib/cat: ->/usr/lib/busybox
> +/usr/lib/echo: ->/usr/lib/busybox
> +/usr/lib/ping: ->/usr/lib/busybox
> +#
> +# test scripts
> +## /**: \${MODULE_DIR}/test-script/**
> +
> +EOF
> \ No newline at end of file
> diff --git a/busybox/Makefile b/busybox/Makefile
> new file mode 100644
> index 0000000..5b56cb1
> --- /dev/null
> +++ b/busybox/Makefile
> @@ -0,0 +1,13 @@
> +#
> +# Copyright (C) 2017 XLAB d.o.o.
> +#
> +# This work is open source software, licensed under the terms of the
> +# BSD license as described in the LICENSE file in the top-level directory.
> +#
> +
> +.PHONY: module
> +module:
> +       ./GET
> +
> +clean:
> +       rm -rf build
> diff --git a/busybox/patches/0001-OSv-remove-exit-usage.patch
> b/busybox/patches/0001-OSv-remove-exit-usage.patch
> new file mode 100644
> index 0000000..515e510
> --- /dev/null
> +++ b/busybox/patches/0001-OSv-remove-exit-usage.patch
> @@ -0,0 +1,190 @@
> +From 12453fd712c7874609eb4bcb2246a37c00571161 Mon Sep 17 00:00:00 2001
> +From: Justin Cinkelj <justin.cink...@xlab.si>
> +Date: Thu, 3 Aug 2017 09:53:51 +0200
> +Subject: [PATCH 1/3] OSv: remove exit() usage
> +
> +exit() would shutdown whole OSv VM, remove it.
> +This requires removing noreturn attribute from related functions.
> +
> +Signed-off-by: Justin Cinkelj <justin.cink...@xlab.si>
> +---
> + include/libbb.h    |  6 +++---
> + libbb/appletlib.c  | 28 ++++++++++++++--------------
> + libbb/verror_msg.c |  2 +-
> + libbb/xfunc_die.c  |  4 ++--
> + 4 files changed, 20 insertions(+), 20 deletions(-)
> +
> +diff --git a/include/libbb.h b/include/libbb.h
> +index 8eccd81..bef7437 100644
> +--- a/include/libbb.h
> ++++ b/include/libbb.h
> +@@ -1108,7 +1108,7 @@ int spawn_and_wait(char **argv) FAST_FUNC;
> + int run_nofork_applet(int applet_no, char **argv) FAST_FUNC;
> + #ifndef BUILD_INDIVIDUAL
> + extern int find_applet_by_name(const char *name) FAST_FUNC;
> +-extern void run_applet_no_and_exit(int a, const char *name, char **argv)
> NORETURN FAST_FUNC;
> ++extern int run_applet_no_and_exit(int a, const char *name, char **argv)
> /*NORETURN*/ FAST_FUNC;
> + #endif
> +
> + /* Helpers for daemonization.
> +@@ -1243,8 +1243,8 @@ extern smallint syslog_level;
> + extern smallint logmode;
> + extern uint8_t xfunc_error_retval;
> + extern void (*die_func)(void);
> +-extern void xfunc_die(void) NORETURN FAST_FUNC;
> +-extern void bb_show_usage(void) NORETURN FAST_FUNC;
> ++extern int xfunc_die(void) /*NORETURN*/ FAST_FUNC;
> ++extern int bb_show_usage(void) /*NORETURN*/ FAST_FUNC;
> + extern void bb_error_msg(const char *s, ...) __attribute__ ((format
> (printf, 1, 2))) FAST_FUNC;
> + extern void bb_error_msg_and_die(const char *s, ...) __attribute__
> ((noreturn, format (printf, 1, 2))) FAST_FUNC;
> + extern void bb_perror_msg(const char *s, ...) __attribute__ ((format
> (printf, 1, 2))) FAST_FUNC;
> +diff --git a/libbb/appletlib.c b/libbb/appletlib.c
> +index df65849..c3e54a8 100644
> +--- a/libbb/appletlib.c
> ++++ b/libbb/appletlib.c
> +@@ -130,7 +130,7 @@ static const char *unpack_usage_messages(void)
> + #endif /* FEATURE_COMPRESS_USAGE */
> +
> +
> +-void FAST_FUNC bb_show_usage(void)
> ++int FAST_FUNC bb_show_usage(void)
> + {
> +       if (ENABLE_SHOW_USAGE) {
> + #ifdef SINGLE_APPLET_STR
> +@@ -152,7 +152,7 @@ void FAST_FUNC bb_show_usage(void)
> +               int ap = find_applet_by_name(applet_name);
> +
> +               if (ap < 0) /* never happens, paranoia */
> +-                      xfunc_die();
> ++                      return xfunc_die();
> +               while (ap) {
> +                       while (*p++) continue;
> +                       ap--;
> +@@ -172,7 +172,7 @@ void FAST_FUNC bb_show_usage(void)
> +                       dealloc_usage_messages((char*)usage_string);
> + #endif
> +       }
> +-      xfunc_die();
> ++      return xfunc_die();
> + }
> +
> + int FAST_FUNC find_applet_by_name(const char *name)
> +@@ -329,7 +329,7 @@ void lbb_prepare(const char *applet
> +               /* Special case. POSIX says "test --help"
> +                * should be no different from e.g. "test --foo".  */
> +               if (!ENABLE_TEST || strcmp(applet_name, "test") != 0)
> +-                      bb_show_usage();
> ++                      return bb_show_usage();
> +       }
> + #endif
> + }
> +@@ -748,7 +748,7 @@ static void install_links(const char *busybox
> UNUSED_PARAM,
> + # endif
> +
> + # if ENABLE_BUSYBOX
> +-static void run_applet_and_exit(const char *name, char **argv) NORETURN;
> ++static int run_applet_and_exit(const char *name, char **argv)
> /*NORETURN*/;
> +
> + /* If we were called as "busybox..." */
> + static int busybox_main(char **argv)
> +@@ -872,12 +872,12 @@ static int busybox_main(char **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]);
> +-      run_applet_and_exit(applet_name, argv);
> ++      return run_applet_and_exit(applet_name, argv);
> + }
> + # endif
> +
> + # if NUM_APPLETS > 0
> +-void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name,
> char **argv)
> ++int FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name,
> char **argv)
> + {
> +       int argc = string_array_len(argv);
> +
> +@@ -908,30 +908,30 @@ void FAST_FUNC run_applet_no_and_exit(int
> applet_no, const char *name, char **ar
> +               if (argc == 2 && strcmp(argv[1], "--help") == 0) {
> +                       /* Make "foo --help" exit with 0: */
> +                       xfunc_error_retval = 0;
> +-                      bb_show_usage();
> ++                      return bb_show_usage();
> +               }
> +       }
> +       if (ENABLE_FEATURE_SUID)
> +               check_suid(applet_no);
> +       xfunc_error_retval = applet_main[applet_no](argc, argv);
> +       /* Note: applet_main() may also not return (die on a xfunc or
> such) */
> +-      xfunc_die();
> ++      return xfunc_die();
> + }
> + # endif /* NUM_APPLETS > 0 */
> +
> + # if ENABLE_BUSYBOX || NUM_APPLETS > 0
> +-static NORETURN void run_applet_and_exit(const char *name, char **argv)
> ++static /*NORETURN*/ int run_applet_and_exit(const char *name, char
> **argv)
> + {
> + #  if ENABLE_BUSYBOX
> +       if (is_prefixed_with(name, "busybox"))
> +-              exit(busybox_main(argv));
> ++              return busybox_main(argv);
> + #  endif
> + #  if NUM_APPLETS > 0
> +       /* find_applet_by_name() search is more expensive, so goes second
> */
> +       {
> +               int applet = find_applet_by_name(name);
> +               if (applet >= 0)
> +-                      run_applet_no_and_exit(applet, name, argv);
> ++                      return run_applet_no_and_exit(applet, name, argv);
> +       }
> + #  endif
> +
> +@@ -939,7 +939,7 @@ static NORETURN void run_applet_and_exit(const char
> *name, char **argv)
> +       full_write2_str(applet_name);
> +       full_write2_str(": applet not found\n");
> +       /* POSIX: "If a command is not found, the exit status shall be
> 127" */
> +-      exit(127);
> ++      return 127;
> + }
> + # endif
> +
> +@@ -1029,7 +1029,7 @@ int main(int argc UNUSED_PARAM, char **argv)
> +               applet_name++;
> +       applet_name = bb_basename(applet_name);
> +       parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */
> +-      run_applet_and_exit(applet_name, argv);
> ++      return run_applet_and_exit(applet_name, argv);
> +
> + #endif
> + }
> +diff --git a/libbb/verror_msg.c b/libbb/verror_msg.c
> +index 22c3035..2e20eb9 100644
> +--- a/libbb/verror_msg.c
> ++++ b/libbb/verror_msg.c
> +@@ -169,7 +169,7 @@ void FAST_FUNC bb_error_msg_and_die(const char *s,
> ...)
> +       va_start(p, s);
> +       bb_verror_msg(s, p, NULL);
> +       va_end(p);
> +-      xfunc_die();
> ++      exit(xfunc_die());
> + }
> +
> + void FAST_FUNC bb_error_msg(const char *s, ...)
> +diff --git a/libbb/xfunc_die.c b/libbb/xfunc_die.c
> +index 73f7998..76a8541 100644
> +--- a/libbb/xfunc_die.c
> ++++ b/libbb/xfunc_die.c
> +@@ -14,9 +14,9 @@
> +
> + void (*die_func)(void);
> +
> +-void FAST_FUNC xfunc_die(void)
> ++int FAST_FUNC xfunc_die(void)
> + {
> +       if (die_func)
> +               die_func();
> +-      exit(xfunc_error_retval);
> ++      return xfunc_error_retval;
> + }
> +--
> +2.9.4
> +
> diff --git 
> a/busybox/patches/0002-ash-include-file-line-function-into-TRACE-output.patch
> b/busybox/patches/0002-ash-include-file-line-function-into-
> TRACE-output.patch
> new file mode 100644
> index 0000000..5f04dfe
> --- /dev/null
> +++ b/busybox/patches/0002-ash-include-file-line-function-into-
> TRACE-output.patch
> @@ -0,0 +1,55 @@
> +From b66f0eeeedd028d6d4e187addb5107b22bc22a73 Mon Sep 17 00:00:00 2001
> +From: Justin Cinkelj <justin.cink...@xlab.si>
> +Date: Fri, 4 Aug 2017 09:45:04 +0200
> +Subject: [PATCH 2/3] ash: include file,line,function into TRACE output
> +
> +Just my personal preference. It makes easier to throw only
> +TRACE(("line-visited\n"));
> +at random places to figure out, which code path is actually executed.
> +
> +Unfortunately this now doesn't work:
> +if (flag) TRACE(("aa")); else TRACE(("bb"));
> +
> +Signed-off-by: Justin Cinkelj <justin.cink...@xlab.si>
> +---
> + shell/ash.c | 9 +++++++--
> + 1 file changed, 7 insertions(+), 2 deletions(-)
> +
> +diff --git a/shell/ash.c b/shell/ash.c
> +index 7a11305..1df4dda 100644
> +--- a/shell/ash.c
> ++++ b/shell/ash.c
> +@@ -418,7 +418,10 @@ extern struct globals_misc *const
> ash_ptr_to_globals_misc;
> + #if DEBUG
> + static void trace_printf(const char *fmt, ...);
> + static void trace_vprintf(const char *fmt, va_list va);
> +-# define TRACE(param)    trace_printf param
> ++static int ss_line;
> ++static const char* ss_file;
> ++static const char* ss_func;
> ++# define TRACE(param)    { ss_line=__LINE__; ss_file=__FILE__;
> ss_func=__FUNCTION__; trace_printf param ; }
> + # define TRACEV(param)   trace_vprintf param
> + # define close(fd) do { \
> +       int dfd = (fd); \
> +@@ -874,6 +877,7 @@ trace_printf(const char *fmt, ...)
> +               fprintf(tracefile, "[%u] ", (int) getpid());
> +       if (DEBUG_SIG)
> +               fprintf(tracefile, "pending s:%d i:%d(supp:%d) ",
> pending_sig, pending_int, suppress_int);
> ++      fprintf(tracefile, "%s:%d=%s: ", ss_file, ss_line, ss_func);
> +       va_start(va, fmt);
> +       vfprintf(tracefile, fmt, va);
> +       va_end(va);
> +@@ -12381,8 +12385,9 @@ readtoken(void)
> +  out:
> +       checkkwd = 0;
> + #if DEBUG
> +-      if (!alreadyseen)
> ++      if (!alreadyseen) {
> +               TRACE(("token '%s' %s\n", tokname_array[t], t == TWORD ?
> wordtext : ""));
> ++      }
> +       else
> +               TRACE(("reread token '%s' %s\n", tokname_array[t], t ==
> TWORD ? wordtext : ""));
> + #endif
> +--
> +2.9.4
> +
> diff --git a/busybox/patches/0003-OSv-ash-fix-process-spawning.patch
> b/busybox/patches/0003-OSv-ash-fix-process-spawning.patch
> new file mode 100644
> index 0000000..38e57cc
> --- /dev/null
> +++ b/busybox/patches/0003-OSv-ash-fix-process-spawning.patch
> @@ -0,0 +1,263 @@
> +From 5660683a32c95e95a87d712332d0ba6302f5a546 Mon Sep 17 00:00:00 2001
> +From: Justin Cinkelj <justin.cink...@xlab.si>
> +Date: Mon, 7 Aug 2017 09:08:52 +0200
> +Subject: [PATCH 3/3] OSv: ash fix process spawning
> +
> +OSv or Linux build is selected with OSV_BUILD flag in include/busybox.h.
> +
> +fork is ignored, and we pretend 0 is returned, so that child code does
> +get executed.
> +execve is replaced with osv_execve.
> +To wait on process termination, osv_waittid is used.
> +
> +A few additional exit() calls have to be skipped.
> +A few additonal function do return in OSv, so remove NORETURN from their
> +declaration.
> +
> +Signed-off-by: Justin Cinkelj <justin.cink...@xlab.si>
> +---
> + include/busybox.h          |  7 +++++++
> + libbb/vfork_daemon_rexec.c | 18 +++++++++++++++++
> + shell/ash.c                | 50 ++++++++++++++++++++++++++++++
> +++++++++++++---
> + 3 files changed, 72 insertions(+), 3 deletions(-)
> +
> +diff --git a/include/busybox.h b/include/busybox.h
> +index 6a003d5..6c13e27 100644
> +--- a/include/busybox.h
> ++++ b/include/busybox.h
> +@@ -5,6 +5,13 @@
> + #ifndef BUSYBOX_H
> + #define BUSYBOX_H 1
> +
> ++/* ============ OSv helpers */
> ++#define OSV_BUILD 1
> ++extern int osv_execve(const char *path, char *const argv[], char *const
> envp[],
> ++    long *thread_id, int notification_fd) __attribute__((weak));
> ++extern long osv_waittid(long tid, int *status, int options)
> __attribute__((weak));
> ++#include <assert.h>
> ++
> + #include "libbb.h"
> + /* BB_DIR_foo and BB_SUID_bar constants: */
> + #include "applet_metadata.h"
> +diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
> +index 576534e..8e82713 100644
> +--- a/libbb/vfork_daemon_rexec.c
> ++++ b/libbb/vfork_daemon_rexec.c
> +@@ -25,17 +25,28 @@ pid_t FAST_FUNC spawn(char **argv)
> +       /* Compiler should not optimize stores here */
> +       volatile int failed;
> +       pid_t pid;
> ++#if OSV_BUILD
> ++      pid_t pid2 = -1;
> ++#endif
> +
> +       fflush_all();
> +
> +       /* Be nice to nommu machines. */
> +       failed = 0;
> ++#if OSV_BUILD == 0
> +       pid = vfork();
> ++#else
> ++      pid = 0;
> ++#endif
> +       if (pid < 0) /* error */
> +               return pid;
> +       if (!pid) { /* child */
> +               /* This macro is ok - it doesn't do NOEXEC/NOFORK tricks */
> ++#if OSV_BUILD == 0
> +               BB_EXECVP(argv[0], argv);
> ++#else
> ++              osv_execve(argv[0], argv, NULL, (long*)&pid2, -1);
> ++#endif
> +
> +               /* We are (maybe) sharing a stack with blocked parent,
> +                * let parent know we failed and then exit to unblock
> parent
> +@@ -44,7 +55,9 @@ pid_t FAST_FUNC spawn(char **argv)
> +               failed = errno;
> +               /* mount, for example, does not want the message */
> +               /*bb_perror_msg("can't execute '%s'", argv[0]);*/
> ++#if OSV_BUILD == 0
> +               _exit(111);
> ++#endif
> +       }
> +       /* parent */
> +       /* Unfortunately, this is not reliable: according to standards
> +@@ -57,7 +70,11 @@ pid_t FAST_FUNC spawn(char **argv)
> +               errno = failed;
> +               return -1;
> +       }
> ++#if OSV_BUILD == 0
> +       return pid;
> ++#else
> ++      return pid2;
> ++#endif
> + }
> +
> + /* Die with an error message if we can't spawn a child process. */
> +@@ -159,6 +176,7 @@ int FAST_FUNC spawn_and_wait(char **argv)
> +       int rc;
> + #if ENABLE_FEATURE_PREFER_APPLETS && (NUM_APPLETS > 1)
> +       int a = find_applet_by_name(argv[0]);
> ++      // printf("DBG %s:%d-%s: a=%d, argv[0]=%s.\n", __FILE__, __LINE__,
> __FUNCTION__, a, argv[0]);
> +
> +       if (a >= 0) {
> +               if (APPLET_IS_NOFORK(a))
> +diff --git a/shell/ash.c b/shell/ash.c
> +index 1df4dda..bc16394 100644
> +--- a/shell/ash.c
> ++++ b/shell/ash.c
> +@@ -460,7 +460,7 @@ var_end(const char *var)
> +
> + /* ============ Interrupts / exceptions */
> +
> +-static void exitshell(void) NORETURN;
> ++static void exitshell(void) /*NORETURN*/;
> +
> + /*
> +  * These macros allow the user to suspend the handling of interrupt
> signals
> +@@ -4944,7 +4944,9 @@ forkchild(struct job *jp, union node *n, int mode)
> +               ignoresig(SIGINT);
> +               ignoresig(SIGQUIT);
> +               if (jp->nprocs == 0) {
> ++#if OSV_BUILD == 0
> +                       close(0);
> ++#endif
> +                       if (open(bb_dev_null, O_RDONLY) != 0)
> +                               ash_msg_and_raise_error("can't open
> '%s'", bb_dev_null);
> +               }
> +@@ -5030,7 +5032,11 @@ forkshell(struct job *jp, union node *n, int mode)
> +       int pid;
> +
> +       TRACE(("forkshell(%%%d, %p, %d) called\n", jobno(jp), n, mode));
> ++#if OSV_BUILD == 0
> +       pid = fork();
> ++#else
> ++      pid = 0;
> ++#endif
> +       if (pid < 0) {
> +               TRACE(("Fork failed, errno=%d", errno));
> +               if (jp)
> +@@ -5041,6 +5047,10 @@ forkshell(struct job *jp, union node *n, int mode)
> +               CLEAR_RANDOM_T(&random_gen); /* or else $RANDOM repeats in
> child */
> +               forkchild(jp, n, mode);
> +       } else {
> ++              // TODO: In OSv, forkparent will not be called.
> ++              // Because of that, jobs might not will work as expected.
> ++              // Apps are just started in background, and they finish at
> some time.
> ++              // Shell might not be able to wait on them to finish.
> +               forkparent(jp, n, mode, pid);
> +       }
> +       return pid;
> +@@ -7713,7 +7723,21 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,)
> char *cmd, char **argv, char **
> +               execve(cmd, argv, envp);
> +       } while (errno == EINTR);
> + #else
> ++      // printf("DBG %s:%d-%s: cmd=%s, argv[0]=%s.\n", __FILE__,
> __LINE__, __FUNCTION__, cmd, argv[0]);
> ++#if OSV_BUILD == 0
> +       execve(cmd, argv, envp);
> ++#else
> ++      {
> ++              int ret = 0;
> ++              pid_t ch_pid = -1;
> ++              ret = osv_execve(cmd, argv, envp, (long*)&ch_pid, -1);
> ++              //errno = 0; // osv_execve should clear errno on success
> ++              if(ret)
> ++                      errno = ENOSYS;
> ++              osv_waittid(ch_pid, NULL, 0);
> ++              return;
> ++      }
> ++#endif
> + #endif
> +       if (cmd != (char*) bb_busybox_exec_path && errno == ENOEXEC) {
> +               /* Run "cmd" as a shell script:
> +@@ -7748,7 +7772,7 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,)
> char *cmd, char **argv, char **
> +  * have to change the find_command routine as well.
> +  * argv[-1] must exist and be writable! See tryexec() for why.
> +  */
> +-static void shellexec(char *prog, char **argv, const char *path, int
> idx) NORETURN;
> ++static void shellexec(char *prog, char **argv, const char *path, int
> idx) /*NORETURN*/;
> + static void shellexec(char *prog, char **argv, const char *path, int idx)
> + {
> +       char *cmdname;
> +@@ -7764,6 +7788,7 @@ static void shellexec(char *prog, char **argv,
> const char *path, int idx)
> + #endif
> +       ) {
> +               tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv,
> envp);
> ++              // printf("DBG %s:%d-%s after tryexec(%s, argv[0]=%s,
> ...), errno=%p %d, idx=%d\n", __FILE__,__LINE__,__FUNCTION__, prog,
> argv[0], &errno, errno, idx); fflush(stdout);
> +               if (applet_no >= 0) {
> +                       /* We tried execing ourself, but it didn't work.
> +                        * Maybe /proc/self/exe doesn't exist?
> +@@ -7785,6 +7810,12 @@ static void shellexec(char *prog, char **argv,
> const char *path, int idx)
> +               }
> +       }
> +
> ++#if OSV_BUILD
> ++      // OSv, tryexec succedded, don't continue with error path
> ++      if(e == 0)
> ++              return;
> ++#endif
> ++
> +       /* Map to POSIX errors */
> +       switch (e) {
> +       case EACCES:
> +@@ -9778,6 +9809,12 @@ evalcommand(union node *cmd, int flags)
> +               listsetvar(varlist.list, VEXPORT|VSTACK);
> +               shellexec(argv[0], argv, path, cmdentry.u.index);
> +               /* NOTREACHED */
> ++#if OSV_BUILD
> ++              // printf("DBG %s:%d-%s shellexec returned\n",
> __FILE__,__LINE__,__FUNCTION__);
> ++              status = 0;
> ++              exitstatus = 0;
> ++              break;
> ++#endif
> +       } /* default */
> +       case CMDBUILTIN:
> +               cmdenviron = varlist.list;
> +@@ -10357,7 +10394,9 @@ closescript(void)
> +       popallfiles();
> +       if (g_parsefile->pf_fd > 0) {
> +               close(g_parsefile->pf_fd);
> +-              g_parsefile->pf_fd = 0;
> ++              // set it to -1, to prevent reading from fd=0 in preadfd
> and nonblock_immune_read.
> ++              // On OSv, stdin is always available.
> ++              g_parsefile->pf_fd = -1;
> +       }
> + }
> +
> +@@ -12587,6 +12626,7 @@ cmdloop(int top)
> +                       inter++;
> +                       chkmail();
> +               }
> ++              // printf("DBG %s:%d-%s inter=%d\n",
> __FILE__,__LINE__,__FUNCTION__, inter);
> +               n = parsecmd(inter);
> + #if DEBUG
> +               if (DEBUG > 2 && debug && (n != NODE_EOF))
> +@@ -13382,7 +13422,9 @@ exitshell(void)
> +        */
> +       setjobctl(0);
> +       flush_stdout_stderr();
> ++#if OSV_BUILD==0
> +       _exit(status);
> ++#endif
> +       /* NOTREACHED */
> + }
> +
> +@@ -13592,6 +13634,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
> +               s = state;
> +               if (e == EXEXIT || s == 0 || iflag == 0 || shlvl) {
> +                       exitshell();
> ++                      return 0; // for OSv only
> +               }
> +               if (e == EXINT) {
> +                       newline_and_flush(stderr);
> +@@ -13694,6 +13737,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
> + #endif
> +       TRACE(("End of main reached\n"));
> +       exitshell();
> ++      return 0; // // for OSv only. Or return errno ?
> +       /* NOTREACHED */
> + }
> +
> +--
> +2.9.4
> +
> diff --git a/busybox/patches/busybox-main.c b/busybox/patches/busybox-main
> .c
> new file mode 100644
> index 0000000..6980e37
> --- /dev/null
> +++ b/busybox/patches/busybox-main.c
> @@ -0,0 +1,5 @@
> +extern int lbb_main(char **);
> +int main(int argc, char** argv)
> +{
> +    return lbb_main(argv);
> +}
> diff --git a/busybox/patches/config b/busybox/patches/config
> new file mode 100644
> index 0000000..05b7700
> --- /dev/null
> +++ b/busybox/patches/config
> @@ -0,0 +1,1139 @@
> +#
> +# Automatically generated make config: don't edit
> +# Busybox version: 1.27.1
> +# Mon Aug  7 10:48:01 2017
> +#
> +CONFIG_HAVE_DOT_CONFIG=y
> +
> +#
> +# Busybox Settings
> +#
> +CONFIG_DESKTOP=y
> +# CONFIG_EXTRA_COMPAT is not set
> +# CONFIG_FEDORA_COMPAT is not set
> +CONFIG_INCLUDE_SUSv2=y
> +# CONFIG_USE_PORTABLE_CODE is not set
> +CONFIG_SHOW_USAGE=y
> +CONFIG_FEATURE_VERBOSE_USAGE=y
> +CONFIG_FEATURE_COMPRESS_USAGE=y
> +CONFIG_BUSYBOX=y
> +CONFIG_FEATURE_INSTALLER=y
> +# CONFIG_INSTALL_NO_USR is not set
> +# CONFIG_PAM is not set
> +CONFIG_LONG_OPTS=y
> +CONFIG_FEATURE_DEVPTS=y
> +# CONFIG_FEATURE_CLEAN_UP is not set
> +CONFIG_FEATURE_UTMP=y
> +CONFIG_FEATURE_WTMP=y
> +CONFIG_FEATURE_PIDFILE=y
> +CONFIG_PID_FILE_PATH="/var/run"
> +CONFIG_FEATURE_SUID=y
> +CONFIG_FEATURE_SUID_CONFIG=y
> +CONFIG_FEATURE_SUID_CONFIG_QUIET=y
> +# CONFIG_SELINUX is not set
> +# CONFIG_FEATURE_PREFER_APPLETS is not set
> +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe"
> +CONFIG_FEATURE_SYSLOG=y
> +# CONFIG_FEATURE_HAVE_RPC is not set
> +CONFIG_PLATFORM_LINUX=y
> +
> +#
> +# Build Options
> +#
> +# CONFIG_STATIC is not set
> +# CONFIG_PIE is not set
> +# CONFIG_NOMMU is not set
> +CONFIG_BUILD_LIBBUSYBOX=y
> +# CONFIG_FEATURE_INDIVIDUAL is not set
> +CONFIG_FEATURE_SHARED_BUSYBOX=y
> +CONFIG_LFS=y
> +CONFIG_CROSS_COMPILER_PREFIX=""
> +CONFIG_SYSROOT=""
> +CONFIG_EXTRA_CFLAGS="-ggdb"
> +CONFIG_EXTRA_LDFLAGS=""
> +CONFIG_EXTRA_LDLIBS=""
> +
> +#
> +# Installation Options ("make install" behavior)
> +#
> +CONFIG_INSTALL_APPLET_SYMLINKS=y
> +# CONFIG_INSTALL_APPLET_HARDLINKS is not set
> +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set
> +# CONFIG_INSTALL_APPLET_DONT is not set
> +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set
> +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set
> +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set
> +CONFIG_PREFIX="./_install"
> +
> +#
> +# Debugging Options
> +#
> +CONFIG_DEBUG=y
> +# CONFIG_DEBUG_PESSIMIZE is not set
> +# CONFIG_DEBUG_SANITIZE is not set
> +# CONFIG_UNIT_TEST is not set
> +# CONFIG_WERROR is not set
> +CONFIG_NO_DEBUG_LIB=y
> +# CONFIG_DMALLOC is not set
> +# CONFIG_EFENCE is not set
> +
> +#
> +# Busybox Library Tuning
> +#
> +# CONFIG_FEATURE_USE_BSS_TAIL is not set
> +CONFIG_FEATURE_RTMINMAX=y
> +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y
> +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set
> +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
> +CONFIG_PASSWORD_MINLEN=6
> +CONFIG_MD5_SMALL=1
> +CONFIG_SHA3_SMALL=1
> +# CONFIG_FEATURE_FAST_TOP is not set
> +# CONFIG_FEATURE_ETC_NETWORKS is not set
> +CONFIG_FEATURE_EDITING=y
> +CONFIG_FEATURE_EDITING_MAX_LEN=1024
> +# CONFIG_FEATURE_EDITING_VI is not set
> +CONFIG_FEATURE_EDITING_HISTORY=255
> +CONFIG_FEATURE_EDITING_SAVEHISTORY=y
> +# CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set
> +CONFIG_FEATURE_REVERSE_SEARCH=y
> +CONFIG_FEATURE_TAB_COMPLETION=y
> +CONFIG_FEATURE_USERNAME_COMPLETION=y
> +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y
> +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set
> +# CONFIG_LOCALE_SUPPORT is not set
> +CONFIG_UNICODE_SUPPORT=y
> +# CONFIG_UNICODE_USING_LOCALE is not set
> +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set
> +CONFIG_SUBST_WCHAR=63
> +CONFIG_LAST_SUPPORTED_WCHAR=767
> +# CONFIG_UNICODE_COMBINING_WCHARS is not set
> +# CONFIG_UNICODE_WIDE_WCHARS is not set
> +# CONFIG_UNICODE_BIDI_SUPPORT is not set
> +# CONFIG_UNICODE_NEUTRAL_TABLE is not set
> +# CONFIG_UNICODE_PRESERVE_BROKEN is not set
> +CONFIG_FEATURE_NON_POSIX_CP=y
> +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set
> +CONFIG_FEATURE_USE_SENDFILE=y
> +CONFIG_FEATURE_COPYBUF_KB=4
> +CONFIG_FEATURE_SKIP_ROOTFS=y
> +CONFIG_MONOTONIC_SYSCALL=y
> +CONFIG_IOCTL_HEX2STR_ERROR=y
> +CONFIG_FEATURE_HWIB=y
> +
> +#
> +# Applets
> +#
> +
> +#
> +# Archival Utilities
> +#
> +CONFIG_FEATURE_SEAMLESS_XZ=y
> +CONFIG_FEATURE_SEAMLESS_LZMA=y
> +CONFIG_FEATURE_SEAMLESS_BZ2=y
> +CONFIG_FEATURE_SEAMLESS_GZ=y
> +# CONFIG_FEATURE_SEAMLESS_Z is not set
> +# CONFIG_AR is not set
> +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
> +# CONFIG_FEATURE_AR_CREATE is not set
> +# CONFIG_UNCOMPRESS is not set
> +CONFIG_GUNZIP=y
> +CONFIG_ZCAT=y
> +CONFIG_FEATURE_GUNZIP_LONG_OPTIONS=y
> +CONFIG_BUNZIP2=y
> +CONFIG_BZCAT=y
> +CONFIG_UNLZMA=y
> +CONFIG_LZCAT=y
> +CONFIG_LZMA=y
> +# CONFIG_FEATURE_LZMA_FAST is not set
> +CONFIG_UNXZ=y
> +CONFIG_XZCAT=y
> +CONFIG_XZ=y
> +CONFIG_BZIP2=y
> +CONFIG_FEATURE_BZIP2_DECOMPRESS=y
> +CONFIG_CPIO=y
> +CONFIG_FEATURE_CPIO_O=y
> +CONFIG_FEATURE_CPIO_P=y
> +CONFIG_DPKG=y
> +CONFIG_DPKG_DEB=y
> +CONFIG_GZIP=y
> +CONFIG_FEATURE_GZIP_LONG_OPTIONS=y
> +CONFIG_GZIP_FAST=0
> +# CONFIG_FEATURE_GZIP_LEVELS is not set
> +CONFIG_FEATURE_GZIP_DECOMPRESS=y
> +CONFIG_LZOP=y
> +# CONFIG_UNLZOP is not set
> +# CONFIG_LZOPCAT is not set
> +# CONFIG_LZOP_COMPR_HIGH is not set
> +CONFIG_RPM2CPIO=y
> +CONFIG_RPM=y
> +CONFIG_TAR=y
> +CONFIG_FEATURE_TAR_LONG_OPTIONS=y
> +CONFIG_FEATURE_TAR_CREATE=y
> +CONFIG_FEATURE_TAR_AUTODETECT=y
> +CONFIG_FEATURE_TAR_FROM=y
> +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y
> +CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y
> +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
> +CONFIG_FEATURE_TAR_TO_COMMAND=y
> +CONFIG_FEATURE_TAR_UNAME_GNAME=y
> +CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y
> +# CONFIG_FEATURE_TAR_SELINUX is not set
> +CONFIG_UNZIP=y
> +CONFIG_FEATURE_UNZIP_CDF=y
> +CONFIG_FEATURE_UNZIP_BZIP2=y
> +CONFIG_FEATURE_UNZIP_LZMA=y
> +CONFIG_FEATURE_UNZIP_XZ=y
> +
> +#
> +# Coreutils
> +#
> +CONFIG_BASENAME=y
> +CONFIG_CAT=y
> +CONFIG_FEATURE_CATV=y
> +CONFIG_CHGRP=y
> +CONFIG_CHMOD=y
> +CONFIG_CHOWN=y
> +CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y
> +CONFIG_CHROOT=y
> +CONFIG_CKSUM=y
> +CONFIG_COMM=y
> +CONFIG_CP=y
> +CONFIG_FEATURE_CP_LONG_OPTIONS=y
> +CONFIG_CUT=y
> +CONFIG_DATE=y
> +CONFIG_FEATURE_DATE_ISOFMT=y
> +# CONFIG_FEATURE_DATE_NANO is not set
> +CONFIG_FEATURE_DATE_COMPAT=y
> +CONFIG_DD=y
> +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y
> +CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y
> +CONFIG_FEATURE_DD_IBS_OBS=y
> +CONFIG_FEATURE_DD_STATUS=y
> +CONFIG_DF=y
> +CONFIG_FEATURE_DF_FANCY=y
> +CONFIG_DIRNAME=y
> +CONFIG_DOS2UNIX=y
> +CONFIG_UNIX2DOS=y
> +CONFIG_DU=y
> +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y
> +CONFIG_ECHO=y
> +CONFIG_FEATURE_FANCY_ECHO=y
> +CONFIG_ENV=y
> +CONFIG_FEATURE_ENV_LONG_OPTIONS=y
> +CONFIG_EXPAND=y
> +CONFIG_FEATURE_EXPAND_LONG_OPTIONS=y
> +CONFIG_UNEXPAND=y
> +CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS=y
> +CONFIG_EXPR=y
> +CONFIG_EXPR_MATH_SUPPORT_64=y
> +CONFIG_FACTOR=y
> +CONFIG_FALSE=y
> +CONFIG_FOLD=y
> +CONFIG_FSYNC=y
> +CONFIG_HEAD=y
> +CONFIG_FEATURE_FANCY_HEAD=y
> +CONFIG_HOSTID=y
> +CONFIG_ID=y
> +CONFIG_GROUPS=y
> +CONFIG_INSTALL=y
> +CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y
> +CONFIG_LINK=y
> +CONFIG_LN=y
> +CONFIG_LOGNAME=y
> +CONFIG_LS=y
> +CONFIG_FEATURE_LS_FILETYPES=y
> +CONFIG_FEATURE_LS_FOLLOWLINKS=y
> +CONFIG_FEATURE_LS_RECURSIVE=y
> +CONFIG_FEATURE_LS_WIDTH=y
> +CONFIG_FEATURE_LS_SORTFILES=y
> +CONFIG_FEATURE_LS_TIMESTAMPS=y
> +CONFIG_FEATURE_LS_USERNAME=y
> +CONFIG_FEATURE_LS_COLOR=y
> +CONFIG_FEATURE_LS_COLOR_IS_DEFAULT=y
> +CONFIG_MD5SUM=y
> +CONFIG_SHA1SUM=y
> +CONFIG_SHA256SUM=y
> +CONFIG_SHA512SUM=y
> +CONFIG_SHA3SUM=y
> +
> +#
> +# Common options for md5sum, sha1sum, sha256sum, sha512sum, sha3sum
> +#
> +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
> +CONFIG_MKDIR=y
> +CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y
> +CONFIG_MKFIFO=y
> +CONFIG_MKNOD=y
> +CONFIG_MKTEMP=y
> +CONFIG_MV=y
> +CONFIG_FEATURE_MV_LONG_OPTIONS=y
> +CONFIG_NICE=y
> +CONFIG_NL=y
> +CONFIG_NOHUP=y
> +CONFIG_NPROC=y
> +CONFIG_OD=y
> +CONFIG_PASTE=y
> +CONFIG_PRINTENV=y
> +CONFIG_PRINTF=y
> +CONFIG_PWD=y
> +CONFIG_READLINK=y
> +CONFIG_FEATURE_READLINK_FOLLOW=y
> +CONFIG_REALPATH=y
> +CONFIG_RM=y
> +CONFIG_RMDIR=y
> +CONFIG_FEATURE_RMDIR_LONG_OPTIONS=y
> +CONFIG_SEQ=y
> +CONFIG_SHRED=y
> +CONFIG_SHUF=y
> +CONFIG_SLEEP=y
> +CONFIG_FEATURE_FANCY_SLEEP=y
> +CONFIG_FEATURE_FLOAT_SLEEP=y
> +CONFIG_SORT=y
> +CONFIG_FEATURE_SORT_BIG=y
> +CONFIG_SPLIT=y
> +CONFIG_FEATURE_SPLIT_FANCY=y
> +CONFIG_STAT=y
> +CONFIG_FEATURE_STAT_FORMAT=y
> +CONFIG_FEATURE_STAT_FILESYSTEM=y
> +CONFIG_STTY=y
> +CONFIG_SUM=y
> +CONFIG_SYNC=y
> +CONFIG_FEATURE_SYNC_FANCY=y
> +CONFIG_TAC=y
> +CONFIG_TAIL=y
> +CONFIG_FEATURE_FANCY_TAIL=y
> +CONFIG_TEE=y
> +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
> +CONFIG_TEST=y
> +CONFIG_TEST1=y
> +CONFIG_TEST2=y
> +CONFIG_FEATURE_TEST_64=y
> +CONFIG_TIMEOUT=y
> +CONFIG_TOUCH=y
> +CONFIG_FEATURE_TOUCH_NODEREF=y
> +CONFIG_FEATURE_TOUCH_SUSV3=y
> +CONFIG_TR=y
> +CONFIG_FEATURE_TR_CLASSES=y
> +CONFIG_FEATURE_TR_EQUIV=y
> +CONFIG_TRUE=y
> +CONFIG_TRUNCATE=y
> +CONFIG_TTY=y
> +CONFIG_UNAME=y
> +CONFIG_UNAME_OSNAME="GNU/Linux"
> +CONFIG_UNIQ=y
> +CONFIG_UNLINK=y
> +CONFIG_USLEEP=y
> +CONFIG_UUDECODE=y
> +CONFIG_BASE64=y
> +CONFIG_UUENCODE=y
> +CONFIG_WC=y
> +CONFIG_FEATURE_WC_LARGE=y
> +CONFIG_WHOAMI=y
> +CONFIG_WHO=y
> +CONFIG_W=y
> +CONFIG_USERS=y
> +CONFIG_YES=y
> +
> +#
> +# Common options
> +#
> +CONFIG_FEATURE_VERBOSE=y
> +
> +#
> +# Common options for cp and mv
> +#
> +CONFIG_FEATURE_PRESERVE_HARDLINKS=y
> +
> +#
> +# Common options for df, du, ls
> +#
> +CONFIG_FEATURE_HUMAN_READABLE=y
> +
> +#
> +# Console Utilities
> +#
> +CONFIG_CHVT=y
> +CONFIG_CLEAR=y
> +CONFIG_DEALLOCVT=y
> +CONFIG_DUMPKMAP=y
> +CONFIG_FGCONSOLE=y
> +CONFIG_KBD_MODE=y
> +CONFIG_LOADFONT=y
> +CONFIG_SETFONT=y
> +CONFIG_FEATURE_SETFONT_TEXTUAL_MAP=y
> +CONFIG_DEFAULT_SETFONT_DIR=""
> +
> +#
> +# Common options for loadfont and setfont
> +#
> +CONFIG_FEATURE_LOADFONT_PSF2=y
> +CONFIG_FEATURE_LOADFONT_RAW=y
> +CONFIG_LOADKMAP=y
> +CONFIG_OPENVT=y
> +CONFIG_RESET=y
> +CONFIG_RESIZE=y
> +CONFIG_FEATURE_RESIZE_PRINT=y
> +CONFIG_SETCONSOLE=y
> +CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y
> +CONFIG_SETKEYCODES=y
> +CONFIG_SETLOGCONS=y
> +CONFIG_SHOWKEY=y
> +
> +#
> +# Debian Utilities
> +#
> +CONFIG_PIPE_PROGRESS=y
> +CONFIG_RUN_PARTS=y
> +CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y
> +CONFIG_FEATURE_RUN_PARTS_FANCY=y
> +CONFIG_START_STOP_DAEMON=y
> +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y
> +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y
> +CONFIG_WHICH=y
> +
> +#
> +# Editors
> +#
> +CONFIG_AWK=y
> +CONFIG_FEATURE_AWK_LIBM=y
> +CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y
> +CONFIG_CMP=y
> +CONFIG_DIFF=y
> +CONFIG_FEATURE_DIFF_LONG_OPTIONS=y
> +CONFIG_FEATURE_DIFF_DIR=y
> +CONFIG_ED=y
> +CONFIG_PATCH=y
> +CONFIG_SED=y
> +CONFIG_VI=y
> +CONFIG_FEATURE_VI_MAX_LEN=4096
> +# CONFIG_FEATURE_VI_8BIT is not set
> +CONFIG_FEATURE_VI_COLON=y
> +CONFIG_FEATURE_VI_YANKMARK=y
> +CONFIG_FEATURE_VI_SEARCH=y
> +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set
> +CONFIG_FEATURE_VI_USE_SIGNALS=y
> +CONFIG_FEATURE_VI_DOT_CMD=y
> +CONFIG_FEATURE_VI_READONLY=y
> +CONFIG_FEATURE_VI_SETOPTS=y
> +CONFIG_FEATURE_VI_SET=y
> +CONFIG_FEATURE_VI_WIN_RESIZE=y
> +CONFIG_FEATURE_VI_ASK_TERMINAL=y
> +CONFIG_FEATURE_VI_UNDO=y
> +CONFIG_FEATURE_VI_UNDO_QUEUE=y
> +CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=256
> +CONFIG_FEATURE_ALLOW_EXEC=y
> +
> +#
> +# Finding Utilities
> +#
> +CONFIG_FIND=y
> +CONFIG_FEATURE_FIND_PRINT0=y
> +CONFIG_FEATURE_FIND_MTIME=y
> +CONFIG_FEATURE_FIND_MMIN=y
> +CONFIG_FEATURE_FIND_PERM=y
> +CONFIG_FEATURE_FIND_TYPE=y
> +CONFIG_FEATURE_FIND_XDEV=y
> +CONFIG_FEATURE_FIND_MAXDEPTH=y
> +CONFIG_FEATURE_FIND_NEWER=y
> +CONFIG_FEATURE_FIND_INUM=y
> +CONFIG_FEATURE_FIND_EXEC=y
> +CONFIG_FEATURE_FIND_EXEC_PLUS=y
> +CONFIG_FEATURE_FIND_USER=y
> +CONFIG_FEATURE_FIND_GROUP=y
> +CONFIG_FEATURE_FIND_NOT=y
> +CONFIG_FEATURE_FIND_DEPTH=y
> +CONFIG_FEATURE_FIND_PAREN=y
> +CONFIG_FEATURE_FIND_SIZE=y
> +CONFIG_FEATURE_FIND_PRUNE=y
> +CONFIG_FEATURE_FIND_DELETE=y
> +CONFIG_FEATURE_FIND_PATH=y
> +CONFIG_FEATURE_FIND_REGEX=y
> +# CONFIG_FEATURE_FIND_CONTEXT is not set
> +CONFIG_FEATURE_FIND_LINKS=y
> +CONFIG_GREP=y
> +CONFIG_EGREP=y
> +CONFIG_FGREP=y
> +CONFIG_FEATURE_GREP_CONTEXT=y
> +CONFIG_XARGS=y
> +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y
> +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
> +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
> +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
> +CONFIG_FEATURE_XARGS_SUPPORT_REPL_STR=y
> +
> +#
> +# Init Utilities
> +#
> +CONFIG_BOOTCHARTD=y
> +CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER=y
> +CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE=y
> +CONFIG_HALT=y
> +CONFIG_POWEROFF=y
> +CONFIG_REBOOT=y
> +# CONFIG_FEATURE_CALL_TELINIT is not set
> +CONFIG_TELINIT_PATH=""
> +CONFIG_INIT=y
> +CONFIG_LINUXRC=y
> +CONFIG_FEATURE_USE_INITTAB=y
> +# CONFIG_FEATURE_KILL_REMOVED is not set
> +CONFIG_FEATURE_KILL_DELAY=0
> +CONFIG_FEATURE_INIT_SCTTY=y
> +CONFIG_FEATURE_INIT_SYSLOG=y
> +CONFIG_FEATURE_INIT_QUIET=y
> +# CONFIG_FEATURE_INIT_COREDUMPS is not set
> +CONFIG_INIT_TERMINAL_TYPE="linux"
> +CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y
> +
> +#
> +# Login/Password Management Utilities
> +#
> +CONFIG_FEATURE_SHADOWPASSWDS=y
> +CONFIG_USE_BB_PWD_GRP=y
> +CONFIG_USE_BB_SHADOW=y
> +CONFIG_USE_BB_CRYPT=y
> +CONFIG_USE_BB_CRYPT_SHA=y
> +CONFIG_ADDGROUP=y
> +CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS=y
> +CONFIG_FEATURE_ADDUSER_TO_GROUP=y
> +CONFIG_ADD_SHELL=y
> +CONFIG_REMOVE_SHELL=y
> +CONFIG_ADDUSER=y
> +CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y
> +# CONFIG_FEATURE_CHECK_NAMES is not set
> +CONFIG_LAST_ID=60000
> +CONFIG_FIRST_SYSTEM_ID=100
> +CONFIG_LAST_SYSTEM_ID=999
> +CONFIG_CHPASSWD=y
> +CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des"
> +CONFIG_CRYPTPW=y
> +CONFIG_MKPASSWD=y
> +CONFIG_DELUSER=y
> +CONFIG_DELGROUP=y
> +CONFIG_FEATURE_DEL_USER_FROM_GROUP=y
> +CONFIG_GETTY=y
> +CONFIG_LOGIN=y
> +# CONFIG_LOGIN_SESSION_AS_CHILD is not set
> +CONFIG_LOGIN_SCRIPTS=y
> +CONFIG_FEATURE_NOLOGIN=y
> +CONFIG_FEATURE_SECURETTY=y
> +CONFIG_PASSWD=y
> +CONFIG_FEATURE_PASSWD_WEAK_CHECK=y
> +CONFIG_SU=y
> +CONFIG_FEATURE_SU_SYSLOG=y
> +CONFIG_FEATURE_SU_CHECKS_SHELLS=y
> +# CONFIG_FEATURE_SU_BLANK_PW_NEEDS_SECURE_TTY is not set
> +CONFIG_SULOGIN=y
> +CONFIG_VLOCK=y
> +
> +#
> +# Linux Ext2 FS Progs
> +#
> +CONFIG_CHATTR=y
> +CONFIG_FSCK=y
> +CONFIG_LSATTR=y
> +# CONFIG_TUNE2FS is not set
> +
> +#
> +# Linux Module Utilities
> +#
> +CONFIG_MODPROBE_SMALL=y
> +CONFIG_DEPMOD=y
> +CONFIG_INSMOD=y
> +CONFIG_LSMOD=y
> +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
> +CONFIG_MODINFO=y
> +CONFIG_MODPROBE=y
> +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set
> +CONFIG_RMMOD=y
> +
> +#
> +# Options common to multiple modutils
> +#
> +CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y
> +CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y
> +# CONFIG_FEATURE_2_4_MODULES is not set
> +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
> +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
> +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
> +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
> +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
> +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set
> +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set
> +# CONFIG_FEATURE_MODUTILS_ALIAS is not set
> +# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set
> +CONFIG_DEFAULT_MODULES_DIR="/lib/modules"
> +CONFIG_DEFAULT_DEPMOD_FILE="modules.dep"
> +
> +#
> +# Linux System Utilities
> +#
> +CONFIG_ACPID=y
> +CONFIG_FEATURE_ACPID_COMPAT=y
> +CONFIG_BLKDISCARD=y
> +CONFIG_BLKID=y
> +# CONFIG_FEATURE_BLKID_TYPE is not set
> +CONFIG_BLOCKDEV=y
> +CONFIG_CAL=y
> +CONFIG_CHRT=y
> +CONFIG_DMESG=y
> +CONFIG_FEATURE_DMESG_PRETTY=y
> +CONFIG_EJECT=y
> +CONFIG_FEATURE_EJECT_SCSI=y
> +CONFIG_FALLOCATE=y
> +CONFIG_FATATTR=y
> +CONFIG_FBSET=y
> +CONFIG_FEATURE_FBSET_FANCY=y
> +CONFIG_FEATURE_FBSET_READMODE=y
> +CONFIG_FDFORMAT=y
> +CONFIG_FDISK=y
> +# CONFIG_FDISK_SUPPORT_LARGE_DISKS is not set
> +CONFIG_FEATURE_FDISK_WRITABLE=y
> +# CONFIG_FEATURE_AIX_LABEL is not set
> +# CONFIG_FEATURE_SGI_LABEL is not set
> +# CONFIG_FEATURE_SUN_LABEL is not set
> +# CONFIG_FEATURE_OSF_LABEL is not set
> +# CONFIG_FEATURE_GPT_LABEL is not set
> +CONFIG_FEATURE_FDISK_ADVANCED=y
> +CONFIG_FINDFS=y
> +CONFIG_FLOCK=y
> +CONFIG_FDFLUSH=y
> +CONFIG_FREERAMDISK=y
> +CONFIG_FSCK_MINIX=y
> +CONFIG_FSFREEZE=y
> +CONFIG_FSTRIM=y
> +CONFIG_GETOPT=y
> +CONFIG_FEATURE_GETOPT_LONG=y
> +CONFIG_HEXDUMP=y
> +CONFIG_FEATURE_HEXDUMP_REVERSE=y
> +CONFIG_HD=y
> +CONFIG_XXD=y
> +CONFIG_HWCLOCK=y
> +CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y
> +# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set
> +CONFIG_IONICE=y
> +CONFIG_IPCRM=y
> +CONFIG_IPCS=y
> +CONFIG_LAST=y
> +CONFIG_FEATURE_LAST_FANCY=y
> +CONFIG_LOSETUP=y
> +CONFIG_LSPCI=y
> +CONFIG_LSUSB=y
> +CONFIG_MDEV=y
> +CONFIG_FEATURE_MDEV_CONF=y
> +CONFIG_FEATURE_MDEV_RENAME=y
> +CONFIG_FEATURE_MDEV_RENAME_REGEXP=y
> +CONFIG_FEATURE_MDEV_EXEC=y
> +CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y
> +CONFIG_MESG=y
> +CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y
> +CONFIG_MKE2FS=y
> +CONFIG_MKFS_EXT2=y
> +CONFIG_MKFS_MINIX=y
> +CONFIG_FEATURE_MINIX2=y
> +# CONFIG_MKFS_REISER is not set
> +CONFIG_MKDOSFS=y
> +CONFIG_MKFS_VFAT=y
> +CONFIG_MKSWAP=y
> +CONFIG_FEATURE_MKSWAP_UUID=y
> +CONFIG_MORE=y
> +CONFIG_MOUNT=y
> +CONFIG_FEATURE_MOUNT_FAKE=y
> +CONFIG_FEATURE_MOUNT_VERBOSE=y
> +# CONFIG_FEATURE_MOUNT_HELPERS is not set
> +CONFIG_FEATURE_MOUNT_LABEL=y
> +# CONFIG_FEATURE_MOUNT_NFS is not set
> +CONFIG_FEATURE_MOUNT_CIFS=y
> +CONFIG_FEATURE_MOUNT_FLAGS=y
> +CONFIG_FEATURE_MOUNT_FSTAB=y
> +CONFIG_FEATURE_MOUNT_OTHERTAB=y
> +CONFIG_MOUNTPOINT=y
> +CONFIG_NSENTER=y
> +CONFIG_FEATURE_NSENTER_LONG_OPTS=y
> +CONFIG_PIVOT_ROOT=y
> +CONFIG_RDATE=y
> +CONFIG_RDEV=y
> +CONFIG_READPROFILE=y
> +CONFIG_RENICE=y
> +CONFIG_REV=y
> +CONFIG_RTCWAKE=y
> +CONFIG_SCRIPT=y
> +CONFIG_SCRIPTREPLAY=y
> +CONFIG_SETARCH=y
> +CONFIG_LINUX32=y
> +CONFIG_LINUX64=y
> +CONFIG_SETPRIV=y
> +CONFIG_SETSID=y
> +CONFIG_SWAPON=y
> +CONFIG_FEATURE_SWAPON_DISCARD=y
> +CONFIG_FEATURE_SWAPON_PRI=y
> +CONFIG_SWAPOFF=y
> +CONFIG_SWITCH_ROOT=y
> +CONFIG_TASKSET=y
> +CONFIG_FEATURE_TASKSET_FANCY=y
> +CONFIG_UEVENT=y
> +CONFIG_UMOUNT=y
> +CONFIG_FEATURE_UMOUNT_ALL=y
> +CONFIG_UNSHARE=y
> +CONFIG_WALL=y
> +
> +#
> +# Common options for mount/umount
> +#
> +CONFIG_FEATURE_MOUNT_LOOP=y
> +CONFIG_FEATURE_MOUNT_LOOP_CREATE=y
> +# CONFIG_FEATURE_MTAB_SUPPORT is not set
> +CONFIG_VOLUMEID=y
> +
> +#
> +# Filesystem/Volume identification
> +#
> +CONFIG_FEATURE_VOLUMEID_BCACHE=y
> +CONFIG_FEATURE_VOLUMEID_BTRFS=y
> +CONFIG_FEATURE_VOLUMEID_CRAMFS=y
> +CONFIG_FEATURE_VOLUMEID_EXFAT=y
> +CONFIG_FEATURE_VOLUMEID_EXT=y
> +CONFIG_FEATURE_VOLUMEID_F2FS=y
> +CONFIG_FEATURE_VOLUMEID_FAT=y
> +CONFIG_FEATURE_VOLUMEID_HFS=y
> +CONFIG_FEATURE_VOLUMEID_ISO9660=y
> +CONFIG_FEATURE_VOLUMEID_JFS=y
> +CONFIG_FEATURE_VOLUMEID_LINUXRAID=y
> +CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y
> +CONFIG_FEATURE_VOLUMEID_LUKS=y
> +CONFIG_FEATURE_VOLUMEID_NILFS=y
> +CONFIG_FEATURE_VOLUMEID_NTFS=y
> +CONFIG_FEATURE_VOLUMEID_OCFS2=y
> +CONFIG_FEATURE_VOLUMEID_REISERFS=y
> +CONFIG_FEATURE_VOLUMEID_ROMFS=y
> +# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set
> +CONFIG_FEATURE_VOLUMEID_SYSV=y
> +CONFIG_FEATURE_VOLUMEID_UBIFS=y
> +CONFIG_FEATURE_VOLUMEID_UDF=y
> +CONFIG_FEATURE_VOLUMEID_XFS=y
> +
> +#
> +# Miscellaneous Utilities
> +#
> +CONFIG_ADJTIMEX=y
> +# CONFIG_BBCONFIG is not set
> +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set
> +CONFIG_BEEP=y
> +CONFIG_FEATURE_BEEP_FREQ=4000
> +CONFIG_FEATURE_BEEP_LENGTH_MS=30
> +CONFIG_CHAT=y
> +CONFIG_FEATURE_CHAT_NOFAIL=y
> +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set
> +CONFIG_FEATURE_CHAT_IMPLICIT_CR=y
> +CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y
> +CONFIG_FEATURE_CHAT_SEND_ESCAPES=y
> +CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y
> +CONFIG_FEATURE_CHAT_CLR_ABORT=y
> +CONFIG_CONSPY=y
> +CONFIG_CROND=y
> +CONFIG_FEATURE_CROND_D=y
> +CONFIG_FEATURE_CROND_CALL_SENDMAIL=y
> +CONFIG_FEATURE_CROND_DIR="/var/spool/cron"
> +CONFIG_CRONTAB=y
> +CONFIG_DC=y
> +CONFIG_FEATURE_DC_LIBM=y
> +# CONFIG_DEVFSD is not set
> +# CONFIG_DEVFSD_MODLOAD is not set
> +# CONFIG_DEVFSD_FG_NP is not set
> +# CONFIG_DEVFSD_VERBOSE is not set
> +# CONFIG_FEATURE_DEVFS is not set
> +CONFIG_DEVMEM=y
> +CONFIG_FBSPLASH=y
> +# CONFIG_FLASHCP is not set
> +# CONFIG_FLASH_ERASEALL is not set
> +# CONFIG_FLASH_LOCK is not set
> +# CONFIG_FLASH_UNLOCK is not set
> +CONFIG_HDPARM=y
> +CONFIG_FEATURE_HDPARM_GET_IDENTITY=y
> +CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y
> +CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y
> +CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y
> +CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y
> +CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y
> +CONFIG_I2CGET=y
> +CONFIG_I2CSET=y
> +CONFIG_I2CDUMP=y
> +CONFIG_I2CDETECT=y
> +# CONFIG_INOTIFYD is not set
> +CONFIG_LESS=y
> +CONFIG_FEATURE_LESS_MAXLINES=9999999
> +CONFIG_FEATURE_LESS_BRACKETS=y
> +CONFIG_FEATURE_LESS_FLAGS=y
> +CONFIG_FEATURE_LESS_TRUNCATE=y
> +CONFIG_FEATURE_LESS_MARKS=y
> +CONFIG_FEATURE_LESS_REGEXP=y
> +CONFIG_FEATURE_LESS_WINCH=y
> +CONFIG_FEATURE_LESS_ASK_TERMINAL=y
> +CONFIG_FEATURE_LESS_DASHCMD=y
> +CONFIG_FEATURE_LESS_LINENUMS=y
> +CONFIG_LSSCSI=y
> +CONFIG_MAKEDEVS=y
> +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
> +CONFIG_FEATURE_MAKEDEVS_TABLE=y
> +CONFIG_MAN=y
> +CONFIG_MICROCOM=y
> +CONFIG_MT=y
> +CONFIG_NANDWRITE=y
> +CONFIG_NANDDUMP=y
> +CONFIG_PARTPROBE=y
> +CONFIG_RAIDAUTORUN=y
> +CONFIG_READAHEAD=y
> +# CONFIG_RFKILL is not set
> +CONFIG_RUNLEVEL=y
> +CONFIG_RX=y
> +CONFIG_SETSERIAL=y
> +CONFIG_STRINGS=y
> +CONFIG_TIME=y
> +CONFIG_TTYSIZE=y
> +CONFIG_UBIRENAME=y
> +CONFIG_UBIATTACH=y
> +CONFIG_UBIDETACH=y
> +CONFIG_UBIMKVOL=y
> +CONFIG_UBIRMVOL=y
> +CONFIG_UBIRSVOL=y
> +CONFIG_UBIUPDATEVOL=y
> +CONFIG_VOLNAME=y
> +CONFIG_WATCHDOG=y
> +
> +#
> +# Networking Utilities
> +#
> +CONFIG_FEATURE_IPV6=y
> +# CONFIG_FEATURE_UNIX_LOCAL is not set
> +CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y
> +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set
> +CONFIG_ARP=y
> +CONFIG_ARPING=y
> +CONFIG_BRCTL=y
> +CONFIG_FEATURE_BRCTL_FANCY=y
> +CONFIG_FEATURE_BRCTL_SHOW=y
> +CONFIG_DNSD=y
> +CONFIG_ETHER_WAKE=y
> +CONFIG_FTPD=y
> +CONFIG_FEATURE_FTPD_WRITE=y
> +CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y
> +CONFIG_FEATURE_FTPD_AUTHENTICATION=y
> +CONFIG_FTPGET=y
> +CONFIG_FTPPUT=y
> +CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y
> +CONFIG_HOSTNAME=y
> +CONFIG_DNSDOMAINNAME=y
> +CONFIG_HTTPD=y
> +CONFIG_FEATURE_HTTPD_RANGES=y
> +CONFIG_FEATURE_HTTPD_SETUID=y
> +CONFIG_FEATURE_HTTPD_BASIC_AUTH=y
> +CONFIG_FEATURE_HTTPD_AUTH_MD5=y
> +CONFIG_FEATURE_HTTPD_CGI=y
> +CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y
> +CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y
> +CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y
> +CONFIG_FEATURE_HTTPD_ERROR_PAGES=y
> +CONFIG_FEATURE_HTTPD_PROXY=y
> +CONFIG_FEATURE_HTTPD_GZIP=y
> +CONFIG_IFCONFIG=y
> +CONFIG_FEATURE_IFCONFIG_STATUS=y
> +CONFIG_FEATURE_IFCONFIG_SLIP=y
> +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y
> +CONFIG_FEATURE_IFCONFIG_HW=y
> +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y
> +CONFIG_IFENSLAVE=y
> +CONFIG_IFPLUGD=y
> +CONFIG_IFUP=y
> +CONFIG_IFDOWN=y
> +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate"
> +CONFIG_FEATURE_IFUPDOWN_IP=y
> +CONFIG_FEATURE_IFUPDOWN_IPV4=y
> +CONFIG_FEATURE_IFUPDOWN_IPV6=y
> +CONFIG_FEATURE_IFUPDOWN_MAPPING=y
> +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set
> +CONFIG_INETD=y
> +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO=y
> +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD=y
> +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y
> +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y
> +CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y
> +# CONFIG_FEATURE_INETD_RPC is not set
> +CONFIG_IP=y
> +CONFIG_IPADDR=y
> +CONFIG_IPLINK=y
> +CONFIG_IPROUTE=y
> +CONFIG_IPTUNNEL=y
> +CONFIG_IPRULE=y
> +CONFIG_IPNEIGH=y
> +CONFIG_FEATURE_IP_ADDRESS=y
> +CONFIG_FEATURE_IP_LINK=y
> +CONFIG_FEATURE_IP_ROUTE=y
> +CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2"
> +CONFIG_FEATURE_IP_TUNNEL=y
> +CONFIG_FEATURE_IP_RULE=y
> +CONFIG_FEATURE_IP_NEIGH=y
> +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set
> +CONFIG_IPCALC=y
> +CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y
> +CONFIG_FEATURE_IPCALC_FANCY=y
> +CONFIG_FAKEIDENTD=y
> +CONFIG_NAMEIF=y
> +CONFIG_FEATURE_NAMEIF_EXTENDED=y
> +CONFIG_NBDCLIENT=y
> +CONFIG_NC=y
> +CONFIG_NC_SERVER=y
> +CONFIG_NC_EXTRA=y
> +# CONFIG_NC_110_COMPAT is not set
> +CONFIG_NETSTAT=y
> +CONFIG_FEATURE_NETSTAT_WIDE=y
> +CONFIG_FEATURE_NETSTAT_PRG=y
> +CONFIG_NSLOOKUP=y
> +CONFIG_NTPD=y
> +CONFIG_FEATURE_NTPD_SERVER=y
> +CONFIG_FEATURE_NTPD_CONF=y
> +CONFIG_PING=y
> +CONFIG_PING6=y
> +CONFIG_FEATURE_FANCY_PING=y
> +CONFIG_PSCAN=y
> +CONFIG_ROUTE=y
> +CONFIG_SLATTACH=y
> +CONFIG_SSL_CLIENT=y
> +CONFIG_TCPSVD=y
> +CONFIG_UDPSVD=y
> +CONFIG_TELNET=y
> +CONFIG_FEATURE_TELNET_TTYPE=y
> +CONFIG_FEATURE_TELNET_AUTOLOGIN=y
> +CONFIG_FEATURE_TELNET_WIDTH=y
> +CONFIG_TELNETD=y
> +CONFIG_FEATURE_TELNETD_STANDALONE=y
> +CONFIG_FEATURE_TELNETD_INETD_WAIT=y
> +CONFIG_TFTP=y
> +CONFIG_TFTPD=y
> +
> +#
> +# Common options for tftp/tftpd
> +#
> +CONFIG_FEATURE_TFTP_GET=y
> +CONFIG_FEATURE_TFTP_PUT=y
> +CONFIG_FEATURE_TFTP_BLOCKSIZE=y
> +CONFIG_FEATURE_TFTP_PROGRESS_BAR=y
> +# CONFIG_TFTP_DEBUG is not set
> +CONFIG_TLS=y
> +CONFIG_TRACEROUTE=y
> +CONFIG_TRACEROUTE6=y
> +CONFIG_FEATURE_TRACEROUTE_VERBOSE=y
> +CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y
> +CONFIG_TUNCTL=y
> +CONFIG_FEATURE_TUNCTL_UG=y
> +CONFIG_VCONFIG=y
> +CONFIG_WGET=y
> +CONFIG_FEATURE_WGET_LONG_OPTIONS=y
> +CONFIG_FEATURE_WGET_STATUSBAR=y
> +CONFIG_FEATURE_WGET_AUTHENTICATION=y
> +CONFIG_FEATURE_WGET_TIMEOUT=y
> +CONFIG_FEATURE_WGET_HTTPS=y
> +CONFIG_FEATURE_WGET_OPENSSL=y
> +CONFIG_WHOIS=y
> +CONFIG_ZCIP=y
> +# CONFIG_UDHCPC6 is not set
> +# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set
> +# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set
> +# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set
> +CONFIG_UDHCPD=y
> +CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y
> +# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set
> +CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases"
> +CONFIG_DUMPLEASES=y
> +CONFIG_DHCPRELAY=y
> +CONFIG_UDHCPC=y
> +CONFIG_FEATURE_UDHCPC_ARPING=y
> +CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y
> +CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script"
> +# CONFIG_FEATURE_UDHCP_PORT is not set
> +CONFIG_UDHCP_DEBUG=9
> +CONFIG_FEATURE_UDHCP_RFC3397=y
> +CONFIG_FEATURE_UDHCP_8021Q=y
> +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80
> +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n"
> +
> +#
> +# Print Utilities
> +#
> +CONFIG_LPD=y
> +CONFIG_LPR=y
> +CONFIG_LPQ=y
> +
> +#
> +# Mail Utilities
> +#
> +CONFIG_MAKEMIME=y
> +CONFIG_POPMAILDIR=y
> +CONFIG_FEATURE_POPMAILDIR_DELIVERY=y
> +CONFIG_REFORMIME=y
> +CONFIG_FEATURE_REFORMIME_COMPAT=y
> +CONFIG_SENDMAIL=y
> +CONFIG_FEATURE_MIME_CHARSET="us-ascii"
> +
> +#
> +# Process Utilities
> +#
> +CONFIG_FREE=y
> +CONFIG_FUSER=y
> +CONFIG_IOSTAT=y
> +CONFIG_KILL=y
> +CONFIG_KILLALL=y
> +CONFIG_KILLALL5=y
> +CONFIG_LSOF=y
> +CONFIG_MPSTAT=y
> +CONFIG_NMETER=y
> +CONFIG_PGREP=y
> +CONFIG_PKILL=y
> +CONFIG_PIDOF=y
> +CONFIG_FEATURE_PIDOF_SINGLE=y
> +CONFIG_FEATURE_PIDOF_OMIT=y
> +CONFIG_PMAP=y
> +CONFIG_POWERTOP=y
> +CONFIG_FEATURE_POWERTOP_INTERACTIVE=y
> +CONFIG_PS=y
> +# CONFIG_FEATURE_PS_WIDE is not set
> +# CONFIG_FEATURE_PS_LONG is not set
> +CONFIG_FEATURE_PS_TIME=y
> +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set
> +CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y
> +CONFIG_PSTREE=y
> +CONFIG_PWDX=y
> +CONFIG_SMEMCAP=y
> +CONFIG_BB_SYSCTL=y
> +CONFIG_TOP=y
> +CONFIG_FEATURE_TOP_INTERACTIVE=y
> +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
> +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y
> +CONFIG_FEATURE_TOP_SMP_CPU=y
> +CONFIG_FEATURE_TOP_DECIMALS=y
> +CONFIG_FEATURE_TOP_SMP_PROCESS=y
> +CONFIG_FEATURE_TOPMEM=y
> +CONFIG_UPTIME=y
> +CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y
> +CONFIG_WATCH=y
> +CONFIG_FEATURE_SHOW_THREADS=y
> +
> +#
> +# Runit Utilities
> +#
> +CONFIG_CHPST=y
> +CONFIG_SETUIDGID=y
> +CONFIG_ENVUIDGID=y
> +CONFIG_ENVDIR=y
> +CONFIG_SOFTLIMIT=y
> +CONFIG_RUNSV=y
> +CONFIG_RUNSVDIR=y
> +# CONFIG_FEATURE_RUNSVDIR_LOG is not set
> +CONFIG_SV=y
> +CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service"
> +CONFIG_SVC=y
> +CONFIG_SVLOGD=y
> +# CONFIG_CHCON is not set
> +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set
> +# CONFIG_GETENFORCE is not set
> +# CONFIG_GETSEBOOL is not set
> +# CONFIG_LOAD_POLICY is not set
> +# CONFIG_MATCHPATHCON is not set
> +# CONFIG_RUNCON is not set
> +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set
> +# CONFIG_SELINUXENABLED is not set
> +# CONFIG_SESTATUS is not set
> +# CONFIG_SETENFORCE is not set
> +# CONFIG_SETFILES is not set
> +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set
> +# CONFIG_RESTORECON is not set
> +# CONFIG_SETSEBOOL is not set
> +
> +#
> +# Shells
> +#
> +CONFIG_SH_IS_ASH=y
> +# CONFIG_SH_IS_HUSH is not set
> +# CONFIG_SH_IS_NONE is not set
> +# CONFIG_BASH_IS_ASH is not set
> +# CONFIG_BASH_IS_HUSH is not set
> +CONFIG_BASH_IS_NONE=y
> +CONFIG_ASH=y
> +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
> +CONFIG_ASH_INTERNAL_GLOB=y
> +CONFIG_ASH_BASH_COMPAT=y
> +CONFIG_ASH_JOB_CONTROL=y
> +CONFIG_ASH_ALIAS=y
> +CONFIG_ASH_RANDOM_SUPPORT=y
> +CONFIG_ASH_EXPAND_PRMT=y
> +CONFIG_ASH_IDLE_TIMEOUT=y
> +CONFIG_ASH_MAIL=y
> +CONFIG_ASH_ECHO=y
> +CONFIG_ASH_PRINTF=y
> +CONFIG_ASH_TEST=y
> +CONFIG_ASH_HELP=y
> +CONFIG_ASH_GETOPTS=y
> +CONFIG_ASH_CMDCMD=y
> +CONFIG_CTTYHACK=y
> +CONFIG_HUSH=y
> +CONFIG_HUSH_BASH_COMPAT=y
> +CONFIG_HUSH_BRACE_EXPANSION=y
> +CONFIG_HUSH_INTERACTIVE=y
> +CONFIG_HUSH_SAVEHISTORY=y
> +CONFIG_HUSH_JOB=y
> +CONFIG_HUSH_TICK=y
> +CONFIG_HUSH_IF=y
> +CONFIG_HUSH_LOOPS=y
> +CONFIG_HUSH_CASE=y
> +CONFIG_HUSH_FUNCTIONS=y
> +CONFIG_HUSH_LOCAL=y
> +CONFIG_HUSH_RANDOM_SUPPORT=y
> +CONFIG_HUSH_MODE_X=y
> +CONFIG_HUSH_ECHO=y
> +CONFIG_HUSH_PRINTF=y
> +CONFIG_HUSH_TEST=y
> +CONFIG_HUSH_HELP=y
> +CONFIG_HUSH_EXPORT=y
> +CONFIG_HUSH_EXPORT_N=y
> +CONFIG_HUSH_KILL=y
> +CONFIG_HUSH_WAIT=y
> +CONFIG_HUSH_TRAP=y
> +CONFIG_HUSH_TYPE=y
> +CONFIG_HUSH_READ=y
> +CONFIG_HUSH_SET=y
> +CONFIG_HUSH_UNSET=y
> +CONFIG_HUSH_ULIMIT=y
> +CONFIG_HUSH_UMASK=y
> +# CONFIG_HUSH_MEMLEAK is not set
> +# CONFIG_MSH is not set
> +
> +#
> +# Options common to all shells
> +#
> +CONFIG_FEATURE_SH_MATH=y
> +CONFIG_FEATURE_SH_MATH_64=y
> +CONFIG_FEATURE_SH_EXTRA_QUIET=y
> +# CONFIG_FEATURE_SH_STANDALONE is not set
> +CONFIG_FEATURE_SH_NOFORK=y
> +CONFIG_FEATURE_SH_HISTFILESIZE=y
> +
> +#
> +# System Logging Utilities
> +#
> +CONFIG_KLOGD=y
> +
> +#
> +# klogd should not be used together with syslog to kernel printk buffer
> +#
> +CONFIG_FEATURE_KLOGD_KLOGCTL=y
> +CONFIG_LOGGER=y
> +CONFIG_LOGREAD=y
> +CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
> +CONFIG_SYSLOGD=y
> +CONFIG_FEATURE_ROTATE_LOGFILE=y
> +CONFIG_FEATURE_REMOTE_LOG=y
> +CONFIG_FEATURE_SYSLOGD_DUP=y
> +CONFIG_FEATURE_SYSLOGD_CFG=y
> +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
> +CONFIG_FEATURE_IPC_SYSLOG=y
> +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
> +CONFIG_FEATURE_KMSG_SYSLOG=y
> diff --git a/busybox/test-script/cmd0.sh b/busybox/test-script/cmd0.sh
> new file mode 100644
> index 0000000..a32374c
> --- /dev/null
> +++ b/busybox/test-script/cmd0.sh
> @@ -0,0 +1,26 @@
> +echo "/*--------------------------------------*/"
> +echo test-echo-string
> +echo env-AAA=$AAA
> +export AAA=aaa
> +echo env-AAA=$AAA
> +echo env-PATH=$PATH
> +echo "/*--------------------------------------*/"
> +echo "TEST ls /tools"
> +ls -al /tools
> +echo "/*--------------------------------------*/"
> +echo "TEST /usr/lib/ls /etc"
> +/usr/lib/ls -al /etc
> +echo "/*--------------------------------------*/"
> +echo -n 'before-and-and ' && echo -n 'after-and-and ' && echo 'OK'
> +if [ "$AAA" == "aaa" ]; then echo "OK if: $AAA==aaa"; fi
> +[[ "$AAA" == "bbb" ]] || echo "OK [[ ]]: $AAA!=bbb"
> +echo "/*--------------------------------------*/"
> +echo "before-missing-commnand"
> +no_such_command
> +echo "OK after-missing-commnand"
> +echo "/*--------------------------------------*/"
> +echo "before-syntax-error"
> +if [ true ]; echo blah; fi
> +# execution stops here in bash too
> +echo "OK after-syntax-error"
> +echo "/*--------------------------------------*/"
> --
> 2.9.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to osv-dev+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to