Attempt at fixing bug 815 by upgrading bb_spawn() so that builtins are at

the start of the path.  (This should be under the same config option as
the standalone shell, but right now that's buried in the shell menu.)

Also add the ability to specify CONFIG_BUSYBOX_EXEC_PATH with /proc/self/exe
as an overrideable default.
This commit is contained in:
Rob Landley 2006-06-14 01:24:33 +00:00
parent 575c8bacda
commit c7ddefc062
4 changed files with 40 additions and 26 deletions

View File

@ -32,6 +32,7 @@ config CONFIG_NITPICK
choice choice
prompt "Buffer allocation policy" prompt "Buffer allocation policy"
default CONFIG_FEATURE_BUFFERS_USE_MALLOC default CONFIG_FEATURE_BUFFERS_USE_MALLOC
depends on CONFIG_NITPICK
help help
There are 3 ways BusyBox can handle buffer allocations: There are 3 ways BusyBox can handle buffer allocations:
- Use malloc. This costs code size for the call to xmalloc. - 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 config CONFIG_FEATURE_COMPRESS_USAGE
bool "Store applet usage messages in compressed form" bool "Store applet usage messages in compressed form"
default y default y
depends on CONFIG_SHOW_USAGE depends on CONFIG_SHOW_USAGE && CONFIG_NITPICK
help help
Store usage messages in compressed form, uncompress them on-the-fly Store usage messages in compressed form, uncompress them on-the-fly
when <applet> --help is called. 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 config CONFIG_FEATURE_INSTALLER
bool "Support --install [-s] to install applet links at runtime" bool "Support --install [-s] to install applet links at runtime"
default n default n
@ -99,14 +106,13 @@ config CONFIG_LOCALE_SUPPORT
config CONFIG_GETOPT_LONG config CONFIG_GETOPT_LONG
bool "Enable support for --long-options" bool "Enable support for --long-options"
default n default n
depends on !CONFIG_NO_GETOPT_LONG
help help
Enable this if you want busybox applets to use the gnu --long-option Enable this if you want busybox applets to use the gnu --long-option
style, in addition to single character -a -b -c style options. style, in addition to single character -a -b -c style options.
config CONFIG_FEATURE_DEVPTS config CONFIG_FEATURE_DEVPTS
bool "Use the devpts filesystem for Unix98 PTYs" bool "Use the devpts filesystem for Unix98 PTYs"
default y if CONFIG_FEATURE_DEVFS default y
help help
Enable if you want BusyBox to use Unix98 PTY support. If enabled, Enable if you want BusyBox to use Unix98 PTY support. If enabled,
busybox will use /dev/ptmx for the master side of the pseudoterminal 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 config CONFIG_FEATURE_CLEAN_UP
bool "Clean up all memory before exiting (usually not needed)" bool "Clean up all memory before exiting (usually not needed)"
default n default n
depends on CONFIG_NITPICK
help help
As a size optimization, busybox normally exits without explicitly As a size optimization, busybox normally exits without explicitly
freeing dynamically allocated memory or closing files. This saves freeing dynamically allocated memory or closing files. This saves
@ -201,6 +208,16 @@ config CONFIG_SELINUX
Most people will leave this set to 'N'. 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 endmenu
menu 'Build Options' menu 'Build Options'
@ -221,7 +238,8 @@ config CONFIG_STATIC
config CONFIG_BUILD_LIBBUSYBOX config CONFIG_BUILD_LIBBUSYBOX
bool "Build shared libbusybox" bool "Build shared libbusybox"
default y depends on CONFIG_STANDALONE
default n
help help
Build a shared library libbusybox.so which contains all Build a shared library libbusybox.so which contains all
libraries used inside busybox. libraries used inside busybox.

View File

@ -171,6 +171,7 @@ extern void xstat(const char *filename, struct stat *buf);
extern int bb_xsocket(int domain, int type, int protocol); extern int bb_xsocket(int domain, int type, int protocol);
extern pid_t bb_spawn(char **argv); extern pid_t bb_spawn(char **argv);
extern pid_t bb_xspawn(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_xdaemon(int nochdir, int noclose);
extern void bb_xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); extern void bb_xbind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
extern void bb_xlisten(int s, int backlog); extern void bb_xlisten(int s, int backlog);

View File

@ -9,6 +9,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/wait.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -189,13 +190,14 @@ pid_t bb_spawn(char **argv)
{ {
static int failed; static int failed;
pid_t pid; pid_t pid;
void *app = find_applet_by_name(argv[0]);
// Be nice to nommu machines. // Be nice to nommu machines.
failed = 0; failed = 0;
pid = vfork(); pid = vfork();
if (pid < 0) return pid; if (pid < 0) return pid;
if (!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 // 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 // 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; return pid;
} }
#endif #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

View File

@ -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 ); printf("%s module %s\n", do_insert?"Loading":"Unloading", list-> m_name );
} }
if (!show_only) { if (!show_only) {
int rc2 = 0; int rc2 = wait4pid(bb_spawn(argv));
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;
}
if (do_insert) { if (do_insert) {
rc = rc2; /* only last module matters */ rc = rc2; /* only last module matters */
} }