/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* minishell.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mea +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/05/02 12:14:09 by narnaud #+# #+# */ /* Updated: 2022/05/05 16:28:15 by mea ### ########.fr */ /* */ /* ************************************************************************** */ # include "minishell.h" void handle_status(t_datas *datas, int status) { if (WIFSIGNALED(status)) { datas->exit_code = 128 + WTERMSIG(status); if (datas->exit_code == 131) printf("Quit: 3\n"); } else datas->exit_code = WEXITSTATUS(status); } int caller(t_datas *datas, t_command *cmd) { pid_t pid; int pip[2]; int status; if (cmd->fd[1] == 0 && cmd->next && cmd->next->fd[0] == 0) { pipe(pip); cmd->fd[1] = pip[1]; cmd->next->fd[0] = pip[0]; } if (!cmd->prev && !cmd->next && command_call(datas, cmd) != -1)//check_builtin(cmd->argv[0])) return (1); pid = fork(); if (!pid) { if (cmd->fd[0]) dup2(cmd->fd[0], STDIN_FILENO); if (cmd->fd[1]) dup2(cmd->fd[1], STDOUT_FILENO); if (command_call(datas, cmd) == -1) exe(datas, cmd); exit(EXIT_SUCCESS); } if (cmd->fd[1]) close(cmd->fd[1]); if (cmd->next) caller(datas, cmd->next); waitpid(pid, &status, 0); handle_status(datas, status); if (cmd->fd[0]) close(cmd->fd[0]); return (1); } t_command *parser(t_datas *datas, t_token *tok, t_command *prev) { int i; t_command *cmd; if (!tok) return (NULL); cmd = ft_calloc(1, sizeof(t_command)); if (prev) cmd->prev = prev; i = 0; cmd->argv = ft_calloc(count_arguments(tok) + 1, sizeof(char *)); while(tok && tok->type != PIPE) { if (tok->type) update_redir(datas, cmd, tok); else cmd->argv[i++] = tok->value; tok = tok->next; } if (DEBUG) printf("######\n->cmd : %s, in_fd : %d, out_fd : %d\n", \ cmd->argv[0], cmd->fd[0], cmd->fd[1]); cmd->argv[i] = NULL; if (tok && tok->type == PIPE) cmd->next = parser(datas, tok->next, cmd); return(cmd); } t_token *lexer(t_datas *datas, char *line) { t_lexer *lex; char *tmp; int tmp_i; lex = ft_calloc(1, sizeof *lex); lex->state = ROOT_ST; tmp = ft_calloc(1024, sizeof *tmp); tmp_i = 0; while (*line) { if (check_state(lex, &line)) continue; if (lex->state != S_QUOTE_ST && *line == '$') tmp_i = replace_var(datas, &line, tmp, tmp_i); if (check_register(lex, &line, tmp)) { tmp_i = 0; ft_bzero(tmp, 1024); continue ; } tmp[tmp_i] = *line; line++; tmp_i++; } create_token(lex, tmp); return (lex->tokens); } int main(int argc, char **argv, char **envp) { t_datas datas; char *line; char **env_copy; int i; env_copy = ft_calloc(1024, sizeof(char *)); i = 0; while (envp[i]) { env_copy[i] = ft_strdup(envp[i]); i++; } datas.envp = env_copy; datas.exit_code = 0; if (argc < 2) (void)argv; while (1) { termios(0); line = readline("$ "); termios(1); if (line == NULL) halt(EXIT_FAILURE); if (is_empty(line)) continue ; caller(&datas, parser(&datas, lexer(&datas, line), NULL)); add_history(line); } clear_history(); return (EXIT_SUCCESS); }