diff --git a/Config.in b/Config.in index 85d61652c..188f0f905 100644 --- a/Config.in +++ b/Config.in @@ -32,6 +32,7 @@ config CONFIG_NITPICK choice prompt "Buffer allocation policy" default CONFIG_FEATURE_BUFFERS_USE_MALLOC + depends on CONFIG_NITPICK help There are 3 ways BusyBox can handle buffer allocations: - Use malloc. This costs code size for the call to xmalloc. @@ -75,11 +76,17 @@ config CONFIG_FEATURE_VERBOSE_USAGE config CONFIG_FEATURE_COMPRESS_USAGE bool "Store applet usage messages in compressed form" default y - depends on CONFIG_SHOW_USAGE + depends on CONFIG_SHOW_USAGE && CONFIG_NITPICK help Store usage messages in compressed form, uncompress them on-the-fly when --help is called. + If you have a really tiny busybox with few applets enabled (and + bunzip2 isn't one of them), the overhead of the decompressor might + be noticeable. Also, if you run executables directly from ROM + and have very little memory, this might not be a win. Otherwise, + you probably want this. + config CONFIG_FEATURE_INSTALLER bool "Support --install [-s] to install applet links at runtime" default n @@ -99,14 +106,13 @@ config CONFIG_LOCALE_SUPPORT config CONFIG_GETOPT_LONG bool "Enable support for --long-options" default n - depends on !CONFIG_NO_GETOPT_LONG help Enable this if you want busybox applets to use the gnu --long-option style, in addition to single character -a -b -c style options. config CONFIG_FEATURE_DEVPTS bool "Use the devpts filesystem for Unix98 PTYs" - default y if CONFIG_FEATURE_DEVFS + default y help Enable if you want BusyBox to use Unix98 PTY support. If enabled, busybox will use /dev/ptmx for the master side of the pseudoterminal @@ -117,6 +123,7 @@ config CONFIG_FEATURE_DEVPTS config CONFIG_FEATURE_CLEAN_UP bool "Clean up all memory before exiting (usually not needed)" default n + depends on CONFIG_NITPICK help As a size optimization, busybox normally exits without explicitly freeing dynamically allocated memory or closing files. This saves @@ -201,6 +208,16 @@ config CONFIG_SELINUX Most people will leave this set to 'N'. +config CONFIG_BUSYBOX_EXEC_PATH + string "Path to BusyBox executable" + default "/proc/self/exe" + help + When Busybox applets need to run other busybox applets, BusyBox + sometimes needs to exec() itself. When the /proc filesystem is + mounted, /proc/self/exe always points to the currently running + executable. If you haven't got /proc, set this to wherever you + want to run BusyBox from. + endmenu menu 'Build Options' @@ -221,7 +238,8 @@ config CONFIG_STATIC config CONFIG_BUILD_LIBBUSYBOX bool "Build shared libbusybox" - default y + depends on CONFIG_STANDALONE + default n help Build a shared library libbusybox.so which contains all libraries used inside busybox. diff --git a/include/libbb.h b/include/libbb.h index b93b7a618..5877a4a83 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -171,6 +171,7 @@ extern void xstat(const char *filename, struct stat *buf); extern int bb_xsocket(int domain, int type, int protocol); extern pid_t bb_spawn(char **argv); extern pid_t bb_xspawn(char **argv); +extern int wait4pid(int pid); extern void bb_xdaemon(int nochdir, int noclose); extern void bb_xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); extern void bb_xlisten(int s, int backlog); diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c index 2cfafb01a..432fd6079 100644 --- a/libbb/xfuncs.c +++ b/libbb/xfuncs.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -189,13 +190,14 @@ pid_t bb_spawn(char **argv) { static int failed; pid_t pid; + void *app = find_applet_by_name(argv[0]); // Be nice to nommu machines. failed = 0; pid = vfork(); if (pid < 0) return pid; if (!pid) { - execvp(*argv, argv); + execvp(app ? CONFIG_BUSYBOX_EXEC_PATH : *argv, argv); // We're sharing a stack with blocked parent, let parent know we failed // and then exit to unblock parent (but don't run atexit() stuff, which @@ -216,3 +218,15 @@ pid_t bb_xspawn(char **argv) return pid; } #endif + +#ifdef L_wait4 +int wait4pid(int pid) +{ + int status; + + if (pid == -1 || waitpid(pid, &status, 0) == -1) return -1; + if (WIFEXITED(status)) return WEXITSTATUS(status); + if (WIFSIGNALED(status)) return WTERMSIG(status); + return 0; +} +#endif diff --git a/modutils/modprobe.c b/modutils/modprobe.c index 93e510293..698eed84a 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -666,27 +666,8 @@ static int mod_process ( struct mod_list_t *list, int do_insert ) printf("%s module %s\n", do_insert?"Loading":"Unloading", list-> m_name ); } if (!show_only) { - int rc2 = 0; - int status; - switch (fork()) { - case -1: - rc2 = 1; - break; - case 0: //child - execvp(argv[0], argv); - bb_perror_msg_and_die("exec of %s", argv[0]); - /* NOTREACHED */ - default: - if (wait(&status) == -1) { - rc2 = 1; - break; - } - if (WIFEXITED(status)) - rc2 = WEXITSTATUS(status); - if (WIFSIGNALED(status)) - rc2 = WTERMSIG(status); - break; - } + int rc2 = wait4pid(bb_spawn(argv)); + if (do_insert) { rc = rc2; /* only last module matters */ }