diff options
| author | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-21 14:13:22 +0200 |
|---|---|---|
| committer | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-21 14:13:22 +0200 |
| commit | 202f4f3a9b7818359d89ef2583618b397e1824b4 (patch) | |
| tree | fae26d260720f0d67187dc59d8ff34f2b73f54cb /src/exec.c | |
| parent | fc27548c447ed9bcd07493983431e0a6e72c7cef (diff) | |
start setting up proc sub
Diffstat (limited to 'src/exec.c')
| -rw-r--r-- | src/exec.c | 50 |
1 files changed, 34 insertions, 16 deletions
@@ -6,6 +6,8 @@ #include "syntax.h" +void execute_command_pipeline(Pipeline pipeline, int stdin_fd, int stdout_fd); + void execute_cmd(ExecutableCommand cmd, int* pgid) { @@ -27,8 +29,8 @@ void execute_cmd(ExecutableCommand cmd, int* pgid) { dup2(fd_rd.to, fd_rd.redirected); } - for (int j = 0; j < cmd.open_fds.count; j++) { - int fd = *get_from_IntVec(&cmd.open_fds, j); + for (int j = 0; j < cmd.child_open_fds.count; j++) { + int fd = *get_from_IntVec(&cmd.child_open_fds, j); close(fd); } @@ -53,19 +55,30 @@ void execute_cmd(ExecutableCommand cmd, int* pgid) { ExecutableCommand process_pl_command(PlCommand pl_cmd) { StrVec arg_vec = make_StrVec(256); + FdRedirectVec fd_redirs = make_FdRedirectVec(256); + IntVec parent_open_fds = make_IntVec(256); + IntVec child_open_fds = make_IntVec(256); + + int ps_pipe_fds[2]; + 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; + case ARG_PS_IN: + pipe(ps_pipe_fds); + execute_command_pipeline(*(Pipeline*)arg.as.sub_pipeline, STDIN_FILENO, ps_pipe_fds[1]); + close(ps_pipe_fds[1]); + char pname[64]; + snprintf(pname, sizeof(pname), "/dev/fd/%d", ps_pipe_fds[0]); + break; default: exit(67); } } - FdRedirectVec fd_redirs = make_FdRedirectVec(256); - IntVec open_fds = make_IntVec(256); for (int j = 0; j < pl_cmd.redirects.count; j++) { Redirect redir = *get_from_RedirectVec(&pl_cmd.redirects, j); FdRedirect fd_redir; @@ -73,17 +86,20 @@ ExecutableCommand process_pl_command(PlCommand pl_cmd) { switch (redir.kind) { case REDIR_READ: fd = open(redir.as.filename, O_RDONLY, 0644); - push_to_IntVec(&open_fds, fd); + push_to_IntVec(&parent_open_fds, fd); + push_to_IntVec(&child_open_fds, fd); fd_redir = (FdRedirect){.to = fd, .redirected = STDIN_FILENO}; break; case REDIR_WRITE_APPEND: fd = open(redir.as.filename, O_WRONLY | O_CREAT | O_APPEND, 0644); - push_to_IntVec(&open_fds, fd); + push_to_IntVec(&parent_open_fds, fd); + push_to_IntVec(&child_open_fds, fd); fd_redir = (FdRedirect){.to = fd, .redirected = STDOUT_FILENO}; break; case REDIR_WRITE_TRUNC: fd = open(redir.as.filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); - push_to_IntVec(&open_fds, fd); + push_to_IntVec(&parent_open_fds, fd); + push_to_IntVec(&child_open_fds, fd); fd_redir = (FdRedirect){.to = fd, .redirected = STDOUT_FILENO}; break; default: @@ -98,12 +114,12 @@ ExecutableCommand process_pl_command(PlCommand pl_cmd) { } args[arg_vec.count] = NULL; - return (ExecutableCommand){.args = args, .redirects = fd_redirs, .open_fds = open_fds}; + return (ExecutableCommand){.args = args, .redirects = fd_redirs, .parent_open_fds = parent_open_fds, .child_open_fds = child_open_fds}; } -void execute_command_pipeline(Pipeline pipeline) { - int trunk_fd = STDIN_FILENO; +void execute_command_pipeline(Pipeline pipeline, int stdin_fd, int stdout_fd) { + int trunk_fd = stdin_fd; int pgid = -1; @@ -116,23 +132,25 @@ void execute_command_pipeline(Pipeline pipeline) { exec_cmd.stdin_fd = trunk_fd; if (i > 0) { - push_to_IntVec(&exec_cmd.open_fds, trunk_fd); + push_to_IntVec(&exec_cmd.parent_open_fds, trunk_fd); + push_to_IntVec(&exec_cmd.child_open_fds, trunk_fd); } - exec_cmd.stdout_fd = STDOUT_FILENO; + exec_cmd.stdout_fd = stdout_fd; if (cmd.conn == CONN_PIPE) { int pipe_fds[2]; pipe(pipe_fds); exec_cmd.stdout_fd = pipe_fds[1]; - push_to_IntVec(&exec_cmd.open_fds, pipe_fds[1]); + push_to_IntVec(&exec_cmd.parent_open_fds, pipe_fds[1]); + push_to_IntVec(&exec_cmd.child_open_fds, pipe_fds[1]); trunk_fd = pipe_fds[0]; } execute_cmd(exec_cmd, &pgid); - for (int j = 0; j < exec_cmd.open_fds.count; j++) { - int fd = *get_from_IntVec(&exec_cmd.open_fds, j); + for (int j = 0; j < exec_cmd.parent_open_fds.count; j++) { + int fd = *get_from_IntVec(&exec_cmd.parent_open_fds, j); close(fd); } } @@ -143,5 +161,5 @@ void execute_command_pipeline(Pipeline pipeline) { } void execute_pipeline_tree(PipelineTree pltree) { - execute_command_pipeline(*pltree.root); + execute_command_pipeline(*pltree.root, STDIN_FILENO, STDOUT_FILENO); } |
