/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* 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 if (ft_strcmp(cmd->executable, "exit") == 0) { return_code = ft_exit(cmd->args + 1); if (return_code >= 0) { data->exit_code = return_code; return (-1); } } return (return_code); } static int ft_executor(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) { dup2(cmd->fd_in[0], 0); dup2(cmd->fd_out[0], 1); if (cmd->fd_in[0] > 2) close(cmd->fd_in[0]); if (cmd->fd_out[0] > 2) close(cmd->fd_out[0]); execve(cmd->executable, cmd->args, env); } 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_own_cmd(data, cmd); if (exit_code == -1) return (1); } else { env = env_to_strs(data->env); if (env == NULL) return (1); exit_code = ft_executor(cmd, env); if (exit_code == -1) return (1); ft_freer_tab_ultimate(1, env); } if (ft_gen_exit_code(data)) 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; 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 (ft_cmd_executor(data, content)) return (1); ft_closer(content->fd_in); ft_closer(content->fd_out); current = current->next; } return (0); }