Add in a new FEATURE (off by default) BB_FEATURE_SH_BUILTINS_ALWAYS_WIN.
authorEric Andersen <andersen@codepoet.org>
Fri, 17 Nov 2000 18:07:30 +0000 (18:07 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 17 Nov 2000 18:07:30 +0000 (18:07 -0000)
Make the sh default to using external commands when a path is provided.

Config.h
lash.c
sh.c
shell/lash.c

index b2baac2a2f6fe6878a297aecb75ba07cd72d8c1d..c010671b5e8333e7ec3675149716b104601b2b98 100644 (file)
--- a/Config.h
+++ b/Config.h
 //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 7a8810aef258440bc2e897819915976e1491d2a2..d6ac1fc179122444ee373174c4286b974472a716 100644 (file)
--- 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 7a8810aef258440bc2e897819915976e1491d2a2..d6ac1fc179122444ee373174c4286b974472a716 100644 (file)
--- 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++);
index 7a8810aef258440bc2e897819915976e1491d2a2..d6ac1fc179122444ee373174c4286b974472a716 100644 (file)
@@ -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++);