ash: recognize embedded scripts in SH_STANDALONE mode
function old new delta find_script_by_name - 51 +51 shellexec 254 271 +17 find_command 990 1007 +17 evalcommand 1653 1661 +8 doCommands 2233 2222 -11 run_applet_and_exit 128 100 -28 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 6/4 up/down: 104/-52) Total: 52 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
aa2959c90d
commit
151de441e7
@ -1322,7 +1322,7 @@ void bb_logenv_override(void) FAST_FUNC;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Embedded script support */
|
/* Embedded script support */
|
||||||
//int find_script_by_name(const char *arg IF_FEATURE_SH_STANDALONE(, int offset)) FAST_FUNC;
|
int find_script_by_name(const char *name) FAST_FUNC;
|
||||||
char *get_script_content(unsigned n) FAST_FUNC;
|
char *get_script_content(unsigned n) FAST_FUNC;
|
||||||
|
|
||||||
/* Applets which are useful from another applets */
|
/* Applets which are useful from another applets */
|
||||||
|
@ -964,20 +964,20 @@ void FAST_FUNC run_applet_no_and_exit(int applet_no, const char *name, char **ar
|
|||||||
# endif /* NUM_APPLETS > 0 */
|
# endif /* NUM_APPLETS > 0 */
|
||||||
|
|
||||||
# if NUM_SCRIPTS > 0
|
# if NUM_SCRIPTS > 0
|
||||||
static int
|
int FAST_FUNC
|
||||||
find_script_by_name(const char *arg)
|
find_script_by_name(const char *name)
|
||||||
{
|
{
|
||||||
const char *s = script_names;
|
const char *s = script_names;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while (*s) {
|
while (*s) {
|
||||||
if (strcmp(arg, s) == 0)
|
if (strcmp(name, s) == 0)
|
||||||
return i;
|
return i;
|
||||||
i++;
|
i++;
|
||||||
while (*s++ != '\0')
|
while (*s++ != '\0')
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return -1;
|
return -0x10000; /* make it so that NUM_APPLETS + <error> is still < 0 */
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
12
shell/ash.c
12
shell/ash.c
@ -8085,6 +8085,9 @@ static void shellexec(char *prog, char **argv, const char *path, int idx)
|
|||||||
if (strchr(prog, '/') != NULL
|
if (strchr(prog, '/') != NULL
|
||||||
#if ENABLE_FEATURE_SH_STANDALONE
|
#if ENABLE_FEATURE_SH_STANDALONE
|
||||||
|| (applet_no = find_applet_by_name(prog)) >= 0
|
|| (applet_no = find_applet_by_name(prog)) >= 0
|
||||||
|
# if NUM_SCRIPTS > 0
|
||||||
|
|| (applet_no = NUM_APPLETS + find_script_by_name(prog)) >= 0
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
|
tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp);
|
||||||
@ -10186,6 +10189,10 @@ evalcommand(union node *cmd, int flags)
|
|||||||
*/
|
*/
|
||||||
/* find_command() encodes applet_no as (-2 - applet_no) */
|
/* find_command() encodes applet_no as (-2 - applet_no) */
|
||||||
int applet_no = (- cmdentry.u.index - 2);
|
int applet_no = (- cmdentry.u.index - 2);
|
||||||
|
# if NUM_SCRIPTS > 0
|
||||||
|
/* Applets are ok, but not embedded scripts */
|
||||||
|
if (applet_no < NUM_APPLETS)
|
||||||
|
# endif
|
||||||
if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
|
if (applet_no >= 0 && APPLET_IS_NOFORK(applet_no)) {
|
||||||
char **sv_environ;
|
char **sv_environ;
|
||||||
|
|
||||||
@ -13368,6 +13375,11 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
|
|||||||
#if ENABLE_FEATURE_SH_STANDALONE
|
#if ENABLE_FEATURE_SH_STANDALONE
|
||||||
{
|
{
|
||||||
int applet_no = find_applet_by_name(name);
|
int applet_no = find_applet_by_name(name);
|
||||||
|
# if NUM_SCRIPTS > 0
|
||||||
|
if (applet_no < 0)
|
||||||
|
/* embedded script indices are offset by NUM_APPLETS */
|
||||||
|
applet_no = NUM_APPLETS + find_script_by_name(name);
|
||||||
|
# endif
|
||||||
if (applet_no >= 0) {
|
if (applet_no >= 0) {
|
||||||
entry->cmdtype = CMDNORMAL;
|
entry->cmdtype = CMDNORMAL;
|
||||||
entry->u.index = -2 - applet_no;
|
entry->u.index = -2 - applet_no;
|
||||||
|
Loading…
Reference in New Issue
Block a user