aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Config.in26
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/xfuncs.c16
-rw-r--r--modutils/modprobe.c23
4 files changed, 40 insertions, 26 deletions
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 <applet> --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 <sys/types.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -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 */
}