/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* shell_loop.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */ /* Updated: 2021/10/30 15:32:44 by lperrey ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" //static char **tokens_list_to_argv(t_token *t); // temp test void sigint_handler(int signum); //tmp void sigquit_aka_eof_handler(int signum); //tmp void shell_loop(t_all *c) { char *line_input; line_input = NULL; while (1) { if (line_input) free(line_input); line_input = readline(c->prompt); if (line_input && *line_input) { add_history(line_input); c->token_list = input_to_tokens(line_input); // TEMP // A faire aprés être sortie du mode interactif // - Ignorer tout les signaux // - Remettre ori_termios c->signal_behaviour.sa_handler = SIG_IGN; sigaction(SIGINT, &c->signal_behaviour, NULL); sigaction(SIGQUIT, &c->signal_behaviour, NULL); tcsetattr(STDIN_FILENO, TCSANOW, &c->ori_termios); if (!fork()) { char *arg_test[3]; arg_test[0] = ft_strdup("sleep"); arg_test[1] = ft_strdup("3"); arg_test[2] = NULL; sigaction(SIGQUIT, &c->ori_signal_behaviour, NULL); sigaction(SIGINT, &c->ori_signal_behaviour, NULL); execve("/bin/sleep", arg_test, c->envp); } else { int wait_test; wait(&wait_test); c->signal_behaviour.sa_handler = sigint_handler; sigaction(SIGINT, &c->signal_behaviour, NULL); c->signal_behaviour.sa_handler = SIG_IGN; sigaction(SIGQUIT, &c->signal_behaviour, NULL); tcsetattr(STDIN_FILENO, TCSANOW, &c->interactive_termios); } // EXEC_PIPES_AND_CO() // temp placeholder /* if (ft_strncmp(c->token_list->content, "env", 4) == 0) builtin_env(0, NULL, c); else if (ft_strncmp(c->token_list->content, "exit", 5) == 0) builtin_exit(0, NULL, c); else if (ft_strncmp(c->token_list->content, "echo", 5) == 0) builtin_echo(ft_lstsize((t_list *)c->token_list) + 1, tokens_list_to_argv(c->token_list), c); else { if (parsing(c->token_list)) ft_putstr_fd("Syntax OK:\n-----------\n", 1); else ft_putstr_fd("Syntax KO:\n-----------\n", 1); ft_putstr_fd("TOKENS LIST :\n-----------\n", 1); ft_lstprint((t_list *)c->token_list, 1); ft_lstclear((t_list **)&c->token_list, free); } */ } else if (!line_input) write(1, "\n", 1); } } /* static char **tokens_list_to_argv(t_token *t) // temp test { size_t i; char **argv; i = ft_lstsize((t_list *)t); argv = ft_calloc(i + 1, sizeof(char*)); i = 0; while (t) { argv[i] = t->content; i++; t = t->next; } return (argv); } */