#include #include "syntax.h" void exec_cmd(ExecutableCommand cmd, int* pgid) { pid_t pid = fork(); if (pid == 0) { if (*pgid == -1) { setpgid(0, 0); } else { setpgid(0, *pgid); } dup2(cmd.stdin_fd, STDIN_FILENO); dup2(cmd.stdout_fd, STDOUT_FILENO); for (int i = 0; i < cmd.open_fds.count; i++) { FdRedirect fd_rd = *get_from_FdRedirectVec(&cmd.redirects, i); dup2(fd_rd.to, fd_rd.redirected); } signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTSTP, SIG_DFL); signal(SIGTTIN, SIG_DFL); signal(SIGTTOU, SIG_DFL); execvp(cmd.args[0], cmd.args); exit(67); } if (*pgid == -1) { setpgid(pid, pid); *pgid = pid; } else { setpgid(pid, *pgid); } } ExecutableCommand process_pl_command(PlCommand pl_cmd) { StrVec arg_vec = make_StrVec(256); for (int i = 0; i < pl_cmd.args.count; i++) { Arg arg = *get_from_ArgVec(&pl_cmd.args, i); switch (arg.kind) { case ARG_LIT: push_to_StrVec(&arg_vec, arg.as.lit_str); break; default: exit(67); } } FdRedirectVec fd_redirs = make_FdRedirectVec(256); for (int j = 0; j < pl_cmd.redirects.count, j++) { Redirect redir = *get_from_RedirectVec(&pl_cmd.redirects, j); FdRedirect fd_redir; int fd; switch (redir.kind) { case REDIR_FILE_IN: fd = } } } void execute_command_pipeline(PlCommand* pipeline) { int trunk_fd = STDIN_FILENO; int pgid = -1; size_t i = 0; Connector last_conn; do { PlCommand cmd = pipeline[i]; } while (last_conn != CONN_EOL); }