aboutsummaryrefslogtreecommitdiff
path: root/src/main.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-08-31 07:29:46 +0000
committer_ov4 <ov4@ov4.org>2026-08-31 07:29:46 +0000
commitb404880177a4eb9419a65fdf2536e42df36d524d (patch)
treebb7bd6e85414add09297feafa1b67ebcbb796980 /src/main.cc
parent60c1851b4ab92a5687af16ef566486e48813babc (diff)
eval
Diffstat (limited to 'src/main.cc')
-rw-r--r--src/main.cc98
1 files changed, 1 insertions, 97 deletions
diff --git a/src/main.cc b/src/main.cc
index 91448ff..4d89e6e 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -21,6 +21,7 @@
#include "parse.h"
#include "handler.h"
#include "ground.h"
+#include "eval.h"
using namespace std;
using namespace ov4;
@@ -141,100 +142,8 @@ int main(int argc, char **argv)
exit(0); /* control never reaches here */
}
-/*
- * eval - Evaluate the command line that the user has just typed in
- *
- * If the user has requested a built-in command (quit, jobs, bg or fg)
- * then execute it immediately. Otherwise, fork a child process and
- * run the job in the context of the child. If the job is running in
- * the foreground, wait for it to terminate and then return. Note:
- * each child process must have a unique process group ID so that our
- * background children don't receive SIGINT (SIGTSTP) from the kernel
- * when we type ctrl-c (ctrl-z) at the keyboard.
-*/
-void eval(char *cmdline)
-{
- char arg[MAXARGS][MAXLINE];
- char *argv[MAXARGS];
- for (int i = 0 ; i < MAXARGS; i++)
- {
- argv[i] = &arg[i][0];
- }
- int ground = parseline(cmdline, argv);
- if (argv[0] == nullptr) return;
-
- if (builtin_cmd(argv[0]))
- {
- LOG << "built-in" << endl;
- if (strcmp(argv[0], "quit") == 0) builtin_command_quit();
- else if (strcmp(argv[0], "jobs") == 0) listjobs(jobs);
- else if (strcmp(argv[0], "fg") == 0) do_bgfg(argv);
- else if (strcmp(argv[0], "bg") == 0) do_bgfg(argv);
- else cerr << "built-in but not supported" << endl;
- return;
- }
- sigset_t prev;
- block_all(&prev);
-
- pid_t pid = fork();
- if (pid == 0) // child
- {
- sigprocmask(SIG_SETMASK, &prev, nullptr);
- setpgid(0, 0);
-
- execve(argv[0], argv, environ);
-
- atomic_print(cmdline, true);
- atomic_print(": Command not found\n");
- exit(-1); // if no command is found
- }
-
- // parent
-
- if (!ground) // foreground
- {
- addjob(jobs, pid, FG, cmdline);
- sigset_t prev_with_sigchld_blocked = prev;
- sigaddset(&prev_with_sigchld_blocked, SIGCHLD);
- sigprocmask(SIG_SETMASK, &prev_with_sigchld_blocked, NULL);
- waitfg(pid);
- sigprocmask(SIG_SETMASK, &prev, NULL);
- }
- else // background
- {
- addjob(jobs, pid, BG, cmdline);
- sigprocmask(SIG_SETMASK, &prev, NULL);
- cout << "[" << pid2jid(pid) << "] (" << pid << ") " << cmdline;
- }
-
-
-
- return;
-}
-
-/*
- * parseline - Parse the command line and build the argv array.
- *
- * Characters enclosed in single quotes are treated as a single
- * argument. Return true if the user has requested a BG job, false if
- * the user has requested a FG job.
- */
-
-
-/*
- * builtin_cmd - If the user has typed a built-in command then execute
- * it immediately.
- */
-int builtin_cmd(char *c_str)
-{
- string s(c_str);
- for (auto c : builtin_cmd_list)
- if (c == s)
- return 1;
- return 0; /* not a builtin command */
-}
@@ -293,11 +202,6 @@ handler_t *Signal(int signum, handler_t *handler)
}
-void builtin_command_quit()
-{
- exit(0);
-}
-