/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* execution.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cchauvet executable, "pwd") == 0) return_code = pwd(cmd->fd_out[0]); else if (ft_strcmp(cmd->executable, "env") == 0) return_code = print_env(data->env, cmd->fd_out[0]); else if (ft_strcmp(cmd->executable, "export") == 0) return_code = ft_export(data->env, cmd->args + 1, cmd->fd_out[0]); else if (ft_strcmp(cmd->executable, "cd") == 0) return_code = (move_folder(cmd->args + 1, cmd->fd_out[0])); else if (ft_strcmp(cmd->executable, "unset") == 0) return_code = (unset(data->env, cmd->args, cmd->fd_out[0])); else if (ft_strcmp(cmd->executable, "echo") == 0) return_code = (echo(cmd->fd_out[0], cmd->args + 1)); else { return_code = ft_exit(cmd->args + 1, *data->exit_code); if (return_code >= 0) { *data->exit_code = return_code; return (-2); } } *data->exit_code = return_code; return (return_code); } static bool ft_executor(t_data *data, t_cmd *cmd, char **env) { if (cmd->fd_in[0] == -1 || cmd->fd_out[0] == -1 || cmd->executable == NULL) return (0); cmd->pid = fork(); if (cmd->pid == -1) return (1); if (cmd->pid == 0) { signal(SIGQUIT, ft_quit); dup2(cmd->fd_in[0], 0); dup2(cmd->fd_out[0], 1); ft_lstiter(*data->cmds, ft_cmdcloser); execve(cmd->executable, cmd->args, env); return (1); } return (0); } static int ft_cmd_executor(t_data *data, t_cmd *cmd) { int exit_code; char **env; if (cmd->own_cmd == 1) { exit_code = ft_execute_own_cmd(data, cmd); ft_closer(cmd->fd_in); ft_closer(cmd->fd_out); if (exit_code == -2) return (1); } else { env = env_to_strs(data->env); if (env == NULL) return (1); exit_code = ft_executor(data, cmd, env); ft_closer(cmd->fd_in); ft_closer(cmd->fd_out); ft_freer_tab_ultimate(1, env); if (exit_code == 1) return (1); } return (0); } int ft_cmds_executor(t_data *data) { int fds[2]; t_list *current; t_cmd *content; current = *data->cmds; while (current != NULL) { content = current->content; fds[0] = -1; if (current->next != NULL) { if (pipe(fds) == -1) return (1); ft_add_fd(content->fd_out, fds[1]); ft_add_fd(((t_cmd *)(current->next->content))->fd_in, fds[0]); } if (content->fd_in[0] == -2 || content->fd_out[0] == -2) ft_mega_closer(content->fd_in, content->fd_out); else if (ft_cmd_executor(data, content)) return (1); current = current->next; } return (0); }