ash: add FEATURE_SH_NOFORK support

This commit is contained in:
Denis Vlasenko 2008-04-12 20:07:53 +00:00
parent 4a9ca13fe7
commit 9bc80d7062
2 changed files with 35 additions and 0 deletions

View File

@ -287,6 +287,23 @@ config FEATURE_SH_STANDALONE
# that exact location with that exact name, this option will not work at
# all.
config FEATURE_SH_NOFORK
bool "Run 'nofork' applets directly"
default n
depends on (MSH || LASH || HUSH || ASH) && FEATURE_PREFER_APPLETS
help
This option causes busybox shells [currently only ash]
to not execute typical fork/exec/wait sequence, but call <applet>_main
directly, if possible. (Sometimes it is not possible: for example,
this is not possible in pipes).
This will be done only for some applets (those which are marked
NOFORK in include/applets.h).
This may significantly speed up some shell scripts.
This feature is relatively new. Use with care.
config CTTYHACK
bool "cttyhack"
default n

View File

@ -8747,6 +8747,24 @@ evalcommand(union node *cmd, int flags)
/* Execute the command. */
switch (cmdentry.cmdtype) {
default:
#if ENABLE_FEATURE_SH_NOFORK
{
/* TODO: don't rerun find_applet_by_name, find_command
* already did it. Make it save applet_no somewhere */
int applet_no = find_applet_by_name(argv[0]);
if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
struct nofork_save_area nofork_save;
listsetvar(varlist.list, VEXPORT|VSTACK);
save_nofork_data(&nofork_save);
/* run <applet>_main(), then restore nofork_save_area */
exitstatus = run_nofork_applet_prime(&nofork_save, applet_no, argv) & 0xff;
break;
}
}
#endif
/* Fork off a child process if necessary. */
if (!(flags & EV_EXIT) || trap[0]) {
INT_OFF;