Add in exec support (patch from Torbj?rn Axelsson <torax@cendio.se>)
authorEric Andersen <andersen@codepoet.org>
Thu, 21 Sep 2000 02:48:07 +0000 (02:48 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 21 Sep 2000 02:48:07 +0000 (02:48 -0000)
and disable backticks (since they are still wierdly broken in some
cases.

lash.c
sh.c
shell/lash.c

diff --git a/lash.c b/lash.c
index 60c51f619449635be8ab5f3e0f6b35884aa9d828..b8f4072029ffcd2db1e09401d0b5db41c89b4d03 100644 (file)
--- a/lash.c
+++ b/lash.c
@@ -26,7 +26,7 @@
  */
 
 
-#define BB_FEATURE_SH_BACKTICKS
+//#define BB_FEATURE_SH_BACKTICKS
 //#define BB_FEATURE_SH_IF_EXPRESSIONS
 #define BB_FEATURE_SH_ENVIRONMENT
 //#define DEBUG_SHELL
@@ -108,6 +108,7 @@ struct builtInCommand {
 /* function prototypes for builtins */
 static int builtin_cd(struct job *cmd, struct jobSet *junk);
 static int builtin_env(struct job *dummy, struct jobSet *junk);
+static int builtin_exec(struct job *cmd, struct jobSet *junk);
 static int builtin_exit(struct job *cmd, struct jobSet *junk);
 static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
 static int builtin_help(struct job *cmd, struct jobSet *junk);
@@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", builtin_fg_bg},
        {"cd", "Change working directory", builtin_cd},
+       {"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
        {"exit", "Exit from shell()", builtin_exit},
        {"fg", "Bring job into the foreground", builtin_fg_bg},
        {"jobs", "Lists the active jobs", builtin_jobs},
@@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
        return (0);
 }
 
+/* built-in 'exec' handler */
+static int builtin_exec(struct job *cmd, struct jobSet *junk)
+{
+       if (cmd->progs[0].argv[1])
+       {
+               cmd->progs[0].argv++;
+               execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
+               fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
+                               strerror(errno));
+       }
+       return TRUE;
+}
+
 /* built-in 'exit' handler */
 static int builtin_exit(struct job *cmd, struct jobSet *junk)
 {
diff --git a/sh.c b/sh.c
index 60c51f619449635be8ab5f3e0f6b35884aa9d828..b8f4072029ffcd2db1e09401d0b5db41c89b4d03 100644 (file)
--- a/sh.c
+++ b/sh.c
@@ -26,7 +26,7 @@
  */
 
 
-#define BB_FEATURE_SH_BACKTICKS
+//#define BB_FEATURE_SH_BACKTICKS
 //#define BB_FEATURE_SH_IF_EXPRESSIONS
 #define BB_FEATURE_SH_ENVIRONMENT
 //#define DEBUG_SHELL
@@ -108,6 +108,7 @@ struct builtInCommand {
 /* function prototypes for builtins */
 static int builtin_cd(struct job *cmd, struct jobSet *junk);
 static int builtin_env(struct job *dummy, struct jobSet *junk);
+static int builtin_exec(struct job *cmd, struct jobSet *junk);
 static int builtin_exit(struct job *cmd, struct jobSet *junk);
 static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
 static int builtin_help(struct job *cmd, struct jobSet *junk);
@@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", builtin_fg_bg},
        {"cd", "Change working directory", builtin_cd},
+       {"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
        {"exit", "Exit from shell()", builtin_exit},
        {"fg", "Bring job into the foreground", builtin_fg_bg},
        {"jobs", "Lists the active jobs", builtin_jobs},
@@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
        return (0);
 }
 
+/* built-in 'exec' handler */
+static int builtin_exec(struct job *cmd, struct jobSet *junk)
+{
+       if (cmd->progs[0].argv[1])
+       {
+               cmd->progs[0].argv++;
+               execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
+               fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
+                               strerror(errno));
+       }
+       return TRUE;
+}
+
 /* built-in 'exit' handler */
 static int builtin_exit(struct job *cmd, struct jobSet *junk)
 {
index 60c51f619449635be8ab5f3e0f6b35884aa9d828..b8f4072029ffcd2db1e09401d0b5db41c89b4d03 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 
-#define BB_FEATURE_SH_BACKTICKS
+//#define BB_FEATURE_SH_BACKTICKS
 //#define BB_FEATURE_SH_IF_EXPRESSIONS
 #define BB_FEATURE_SH_ENVIRONMENT
 //#define DEBUG_SHELL
@@ -108,6 +108,7 @@ struct builtInCommand {
 /* function prototypes for builtins */
 static int builtin_cd(struct job *cmd, struct jobSet *junk);
 static int builtin_env(struct job *dummy, struct jobSet *junk);
+static int builtin_exec(struct job *cmd, struct jobSet *junk);
 static int builtin_exit(struct job *cmd, struct jobSet *junk);
 static int builtin_fg_bg(struct job *cmd, struct jobSet *jobList);
 static int builtin_help(struct job *cmd, struct jobSet *junk);
@@ -139,6 +140,7 @@ static int busy_loop(FILE * input);
 static struct builtInCommand bltins[] = {
        {"bg", "Resume a job in the background", builtin_fg_bg},
        {"cd", "Change working directory", builtin_cd},
+       {"exec", "Exec command, replacing this shell with the exec'd process", builtin_exec},
        {"exit", "Exit from shell()", builtin_exit},
        {"fg", "Bring job into the foreground", builtin_fg_bg},
        {"jobs", "Lists the active jobs", builtin_jobs},
@@ -219,6 +221,19 @@ static int builtin_env(struct job *dummy, struct jobSet *junk)
        return (0);
 }
 
+/* built-in 'exec' handler */
+static int builtin_exec(struct job *cmd, struct jobSet *junk)
+{
+       if (cmd->progs[0].argv[1])
+       {
+               cmd->progs[0].argv++;
+               execvp(cmd->progs[0].argv[0], cmd->progs[0].argv);
+               fatalError("Exec to %s failed: %s\n", cmd->progs[0].argv[0],
+                               strerror(errno));
+       }
+       return TRUE;
+}
+
 /* built-in 'exit' handler */
 static int builtin_exit(struct job *cmd, struct jobSet *junk)
 {