mirror of
https://github.com/sheumann/hush.git
synced 2024-09-12 00:55:11 +00:00
ash: add FEATURE_SH_NOFORK support
This commit is contained in:
parent
4a9ca13fe7
commit
9bc80d7062
@ -287,6 +287,23 @@ config FEATURE_SH_STANDALONE
|
|||||||
# that exact location with that exact name, this option will not work at
|
# that exact location with that exact name, this option will not work at
|
||||||
# all.
|
# 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
|
config CTTYHACK
|
||||||
bool "cttyhack"
|
bool "cttyhack"
|
||||||
default n
|
default n
|
||||||
|
18
shell/ash.c
18
shell/ash.c
@ -8747,6 +8747,24 @@ evalcommand(union node *cmd, int flags)
|
|||||||
/* Execute the command. */
|
/* Execute the command. */
|
||||||
switch (cmdentry.cmdtype) {
|
switch (cmdentry.cmdtype) {
|
||||||
default:
|
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. */
|
/* Fork off a child process if necessary. */
|
||||||
if (!(flags & EV_EXIT) || trap[0]) {
|
if (!(flags & EV_EXIT) || trap[0]) {
|
||||||
INT_OFF;
|
INT_OFF;
|
||||||
|
Loading…
Reference in New Issue
Block a user