From 50b3113dc2d7056d34e053826cb2d23327c99803 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 17 Nov 2000 18:07:30 +0000 Subject: Add in a new FEATURE (off by default) BB_FEATURE_SH_BUILTINS_ALWAYS_WIN. Make the sh default to using external commands when a path is provided. --- Config.h | 8 ++++++++ lash.c | 19 ++++++++++++++++++- sh.c | 19 ++++++++++++++++++- shell/lash.c | 19 ++++++++++++++++++- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/Config.h b/Config.h index b2baac2a2..c010671b5 100644 --- a/Config.h +++ b/Config.h @@ -234,6 +234,14 @@ //among other thing. #define BB_FEATURE_SH_STANDALONE_SHELL // +//When this is enabled, busybox shell builtins can be called using full path +//names. This causes builtins (which includes every single busybox command +//when you enable BB_FEATURE_SH_STANDALONE_SHELL) to override real commands on +//the filesystem. When this is enabled, if you run /bin/cat, it will use +//BusyBox cat even if /bin/cat exists on the filesystem and is _not_ busybox. +//Some systems want this, others do not. Choose wisely. :-) +//BB_FEATURE_SH_BUILTINS_ALWAYS_WIN +// // Enable tab completion in the shell (not yet // working very well -- so don't turn this on) //#define BB_FEATURE_SH_TAB_COMPLETION diff --git a/lash.c b/lash.c index 7a8810aef..d6ac1fc17 100644 --- a/lash.c +++ b/lash.c @@ -1216,7 +1216,24 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int #ifdef BB_FEATURE_SH_STANDALONE_SHELL /* Check if the command matches any busybox internal commands here */ while (a->name != 0) { - if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), a->name) == 0) { +#ifdef BB_FEATURE_SH_BUILTINS_ALWAYS_WIN + if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), + a->name) == 0) +#else + /* Check if the command matches any busybox internal + * commands ("applets") here. Following discussions from + * November 2000 on busybox@opensource.lineo.com, don't use + * get_last_path_component(). This way explicit (with + * slashes) filenames will never be interpreted as an + * applet, just like with builtins. This way the user can + * override an applet with an explicit filename reference. + * The only downside to this change is that an explicit + * /bin/foo invocation fill fork and exec /bin/foo, even if + * /bin/foo is a symlink to busybox. + */ + if (strcmp(newJob->progs[i].argv[0], a->name) == 0) +#endif + { int argc_l; char** argv=newJob->progs[i].argv; for(argc_l=0;*argv!=NULL; argv++, argc_l++); diff --git a/sh.c b/sh.c index 7a8810aef..d6ac1fc17 100644 --- a/sh.c +++ b/sh.c @@ -1216,7 +1216,24 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int #ifdef BB_FEATURE_SH_STANDALONE_SHELL /* Check if the command matches any busybox internal commands here */ while (a->name != 0) { - if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), a->name) == 0) { +#ifdef BB_FEATURE_SH_BUILTINS_ALWAYS_WIN + if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), + a->name) == 0) +#else + /* Check if the command matches any busybox internal + * commands ("applets") here. Following discussions from + * November 2000 on busybox@opensource.lineo.com, don't use + * get_last_path_component(). This way explicit (with + * slashes) filenames will never be interpreted as an + * applet, just like with builtins. This way the user can + * override an applet with an explicit filename reference. + * The only downside to this change is that an explicit + * /bin/foo invocation fill fork and exec /bin/foo, even if + * /bin/foo is a symlink to busybox. + */ + if (strcmp(newJob->progs[i].argv[0], a->name) == 0) +#endif + { int argc_l; char** argv=newJob->progs[i].argv; for(argc_l=0;*argv!=NULL; argv++, argc_l++); diff --git a/shell/lash.c b/shell/lash.c index 7a8810aef..d6ac1fc17 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -1216,7 +1216,24 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int #ifdef BB_FEATURE_SH_STANDALONE_SHELL /* Check if the command matches any busybox internal commands here */ while (a->name != 0) { - if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), a->name) == 0) { +#ifdef BB_FEATURE_SH_BUILTINS_ALWAYS_WIN + if (strcmp(get_last_path_component(newJob->progs[i].argv[0]), + a->name) == 0) +#else + /* Check if the command matches any busybox internal + * commands ("applets") here. Following discussions from + * November 2000 on busybox@opensource.lineo.com, don't use + * get_last_path_component(). This way explicit (with + * slashes) filenames will never be interpreted as an + * applet, just like with builtins. This way the user can + * override an applet with an explicit filename reference. + * The only downside to this change is that an explicit + * /bin/foo invocation fill fork and exec /bin/foo, even if + * /bin/foo is a symlink to busybox. + */ + if (strcmp(newJob->progs[i].argv[0], a->name) == 0) +#endif + { int argc_l; char** argv=newJob->progs[i].argv; for(argc_l=0;*argv!=NULL; argv++, argc_l++); -- cgit v1.2.3