int ft_check_pipe(t_node *node, t_sh *sh) { int i; int ret; t_node *buffer; pid_t process; i = 1; process = fork(); buffer = node; if (process) { while (node->right && R_PRIORITY == 3) { i++; node = node->right; } exit(ft_pipe(buffer, sh, i)); } else waitpid(process, &ret, 0); if (WIFEXITED(ret)) return (WEXITSTATUS(ret)); return (1); }
static int exec_op(char *op, char *cmd, char **env) { char **tab; int ret; if (!(tab = ft_strsplit(cmd, ' '))) return (0); if (ft_tablen(tab) != 3) { ft_destroysplit(tab); return (ft_error("Format : <cmd|file> <operator> <cmd|file>", NULL)); } if (ft_strequ(op, "|")) { ft_pipe(env, tab[0], tab[2]); ft_destroysplit(tab); return (1); } else { ret = ft_redir(env, tab[0], tab[1], tab[2]); ft_destroysplit(tab); return (ret); } }
void ft_sh2(t_line *tree, char ***newenv) { int fd[2]; if (tree->type == 1) ft_execcmd(tree->cmd, newenv); if (tree->type == 2) { pipe(fd); ft_pipe(tree, newenv, fd); } if (tree->type == 3) ft_right(tree, newenv, 1); if (tree->type == 4) ft_left(tree, newenv); if (tree->type == 5) ft_right(tree, newenv, 2); if (tree->type == 7 || tree->type == 8) ft_logic_opp(tree, newenv); }
int choose_case(char ****cmd) { if (ft_strcmp(*(*cmd + 1)[0], "|") == 0) { if (ft_pipe(*cmd)) return (-1); cmd += 2; return (0); } if (!ft_strcmp(*(*cmd + len_arr_triple(*cmd) - 2)[0], ">") || (*cmd && !ft_strcmp(*(*cmd)[0], "<")) || (*(*cmd + 1) && !ft_strcmp(*(*cmd + 1)[0], "<"))) { if (choose_redir_case(cmd)) return (-1); } else { ft_putstr_fd("42sh: parse error\n", 2); return (-1); } return (1); }
int ft_opcode_tree(t_op **tmp, t_data *env, int flag) { int ret; ret = 0; (void)env; if ((*tmp)->code == 0) ret = ft_semicol(tmp, env); else if ((*tmp)->code == 1) ret = ft_and(tmp, env); else if ((*tmp)->code == 2) ret = ft_or(tmp, env); else if ((*tmp)->code == 3) ret = ft_pipe(tmp, env); else if ((*tmp)->code == 4) ret = ft_ar_lft(tmp, env); else if ((*tmp)->code == 5) ret = ft_ar_rgt(tmp, env); else if ((*tmp)->code == 6) ret = ft_db_ar_rgt(tmp, env); else if ((*tmp)->code == 7) ret = ft_db_ar_lft(tmp, env, flag); return (ret); }