From ce05175372a9ddca1a225db0765ace1127a39293 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 12 Nov 2021 09:22:01 -0800 Subject: chore: simplified organizational structure --- src/cmd/rc/main.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/cmd/rc/main.c (limited to 'src/cmd/rc/main.c') diff --git a/src/cmd/rc/main.c b/src/cmd/rc/main.c new file mode 100644 index 0000000..2c0aa42 --- /dev/null +++ b/src/cmd/rc/main.c @@ -0,0 +1,66 @@ +#include "rc.h" +#include "parse.h" +#include "exec.h" + +#include +#include + +// ----------------------------------------------------------------------- +// globals + +Thread *runner = nil; +Shell shell = { 0 }; + +// ----------------------------------------------------------------------- +// functions + +void +initshell(void) +{ + if((shell.interactive=isatty(0))){ + while(tcgetpgrp(0) != (shell.pid = getpgrp())) + kill(-shell.pid, SIGTTIN); + + /* ignore job control signals */ + signal(SIGINT, SIG_IGN); + signal(SIGQUIT, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + signal(SIGTTIN, SIG_IGN); + signal(SIGTTOU, SIG_IGN); + /* + * NOTE: if SIGCHLD is set to SIG_IGN then + * 1. children that terminate do not become zombies + * 2. call a to wait() will block until all children have terminated + * 3. the call to wait will fail with errno == ECHILD + * see for discussion: + * https://stackoverflow.com/questions/1608017/no-child-process-error-from-waitpid-when-waiting-for-process-group + */ + // signal(SIGCHLD, SIG_IGN); + + /* take control */ + shell.pid = getpid(); + if(setpgid(shell.pid, shell.pid)<0) + fatal("could not put shell in its own process group"); + + tcsetpgrp(shell.pid, shell.pid); + } +} + +// ----------------------------------------------------------------------- +// main point of entry + +int +main(int argc, char *argv[]) +{ + shell.err = openfd(2); + + initenv(); + initpath(); + initkeywords(); + initshell(); + inithistory(); + + enablevi(); + xboot(argc, argv); + /* unreachable */ +} -- cgit v1.2.1