From 3b8d0552608b3a8af71f4ec2f0cff620cc4200cb Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 14 Apr 2022 11:31:06 +0200 Subject: [PATCH] fix ctrl_c in << heredoc --- includes/minishell.h | 6 ++- srcs/main.c | 10 +--- srcs/pipe/pipe.c | 6 +-- srcs/set_cmd/free_cmd.c | 2 +- srcs/set_cmd/set_cmd.c | 7 ++- srcs/set_redirection/redirection.c | 85 ++++++++++++++++++++++++------ 6 files changed, 84 insertions(+), 32 deletions(-) diff --git a/includes/minishell.h b/includes/minishell.h index 27b8f0a..1280528 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/03/09 22:33:49 by apommier #+# #+# */ -/* Updated: 2022/04/12 23:42:20 by apommier ### ########.fr */ +/* Updated: 2022/04/14 10:30:52 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,10 +79,14 @@ void free_cmd(t_cmd *cmd); void exit_shell(t_cmd *cmd); //set_quote.c +char *set_var(t_cmd *big_cmd, char *cmd); int is_in_quote(char *str, int index); int is_quote_good(char *str); char **ft_split_with_quote(char const *s, char c); +//signals +void crtl_c(int num); + //redirection.c set redirection and input good char *set_redirection(t_s_cmd *cmd, char *line, int index); char next_space(char *str, int i); diff --git a/srcs/main.c b/srcs/main.c index 12f67cf..ffd7768 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/03/06 13:27:11 by apommier #+# #+# */ -/* Updated: 2022/04/13 00:09:42 by apommier ### ########.fr */ +/* Updated: 2022/04/14 10:35:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,18 +14,12 @@ void crtl_c(int num) { - int tmpin; - - tmpin = dup(0); num = 0; - - close(0); - dup2(tmpin, 0); - close(tmpin); printf("\n"); rl_replace_line("", 0); rl_on_new_line(); rl_redisplay(); + //ft_putstr_fd("test\n", 0); } void sig_quit(int num) diff --git a/srcs/pipe/pipe.c b/srcs/pipe/pipe.c index fafb616..0f8e223 100644 --- a/srcs/pipe/pipe.c +++ b/srcs/pipe/pipe.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/04/02 18:51:31 by apommier #+# #+# */ -/* Updated: 2022/04/11 17:49:11 by apommier ### ########.fr */ +/* Updated: 2022/04/14 11:27:29 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,8 +57,8 @@ int wait_exit(t_cmd *cmd) else if (WIFSIGNALED(status)) { cmd->err_var = WTERMSIG(status); - if (cmd->err_var == 2) - ft_putstr_fd("\b\b\b\b\b", 1); + //if (cmd->err_var == 2) + ft_putstr_fd("\b\b\b\b\b", 1); } i++; } diff --git a/srcs/set_cmd/free_cmd.c b/srcs/set_cmd/free_cmd.c index 59027ae..84085e1 100644 --- a/srcs/set_cmd/free_cmd.c +++ b/srcs/set_cmd/free_cmd.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/03/09 12:33:30 by apommier #+# #+# */ -/* Updated: 2022/04/10 21:33:46 by apommier ### ########.fr */ +/* Updated: 2022/04/13 21:25:05 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/set_cmd/set_cmd.c b/srcs/set_cmd/set_cmd.c index b478952..b8827d2 100644 --- a/srcs/set_cmd/set_cmd.c +++ b/srcs/set_cmd/set_cmd.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/03/08 15:19:42 by apommier #+# #+# */ -/* Updated: 2022/04/13 01:28:18 by apommier ### ########.fr */ +/* Updated: 2022/04/14 10:58:15 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,8 @@ t_s_cmd *set_s_cmd(char *line, int index) s_cmd->outfile = 0; //printf("before redirect\n"); line = set_redirection(s_cmd, line, index);//SET REDIRECTION + if (!line) + return (0); split_line = ft_split_with_quote(line, ' '); //parse_quote(cmd); //print_double_fd(split_line, 0); @@ -67,7 +69,6 @@ t_cmd *split_cmd(t_cmd *cmd, char **cmds) cmd->s_cmds[i] = set_s_cmd(cmds[i], i); if (!cmd->s_cmds[i]) { - printf("invalid command\n"); free_cmd(cmd); return (0); } @@ -104,6 +105,8 @@ t_cmd *set_cmd(char *input, char **env) //cmd->err_var = 0; cmd->nb_s_cmd = double_size(cmds); cmd = split_cmd(cmd, cmds); //split each cmd into args in s_cmd + if (!cmd) + return (0); parse_quote(cmd); //printf("after parse quote -%s-\n", cmd->s_cmds[0]->cmd); free(cmds); diff --git a/srcs/set_redirection/redirection.c b/srcs/set_redirection/redirection.c index 69a73ca..52f6160 100644 --- a/srcs/set_redirection/redirection.c +++ b/srcs/set_redirection/redirection.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/03/09 15:18:58 by apommier #+# #+# */ -/* Updated: 2022/04/12 04:29:12 by apommier ### ########.fr */ +/* Updated: 2022/04/14 11:28:30 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ char next_space(char *str, int i) { - i++; + //i++; while (str[i] == ' ') i++; return (str[i]); @@ -49,7 +49,7 @@ char *get_word(char *str, int start) while (new[i] && new[i] != ' ' && new[i] != '>' && new[i] != '<') i++; new[i] = 0; - printf("get word= %s\n", new); + //printf("get word= %s\n", new); return (new); } @@ -75,6 +75,7 @@ char *set_input(char *line, t_s_cmd *cmd, int index) while ((line[i] != ' ' && line[i] != '<' && line[i] != '>') && line[i]) i++; cmd->infile = get_word(line, word_index); + cmd->infile = set_var(cmd->big_cmd, cmd->infile); line = cut_str(line, index, i); return (line); } @@ -95,6 +96,7 @@ char *set_output(char *line, t_s_cmd *cmd, int index) while ((line[i] != ' ' && line[i] != '<' && line[i] != '>') && line[i]) i++; cmd->outfile = get_word(line, index); + cmd->infile = set_var(cmd->big_cmd, cmd->infile); line = cut_str(line, index, i); return (line); } @@ -106,11 +108,11 @@ char *ft_input(char *line, t_s_cmd *cmd, int index) char next; i = index; - next = next_space(line, i); + next = next_space(line, i + 1); if (line[i + 1] == '<') { cmd->in_type = 1; - next = next_space(line, i + 1); + next = next_space(line, i + 2); } else cmd->in_type = 0; @@ -126,11 +128,11 @@ char *ft_output(char *line, t_s_cmd *cmd, int index) char next; i = index; - next = next_space(line, i); + next = next_space(line, i + 1); if (line[i + 1] == '>') { cmd->in_type = 1; - next = next_space(line, i + 1); + next = next_space(line, i + 2); } else cmd->in_type = 0; @@ -178,6 +180,11 @@ char **add_line(char **tab, char *line) return(ret); } +/*void del_heredoc() +{ + +}*/ + char *set_heredoc(int index, char **in) { char *nbr_file; @@ -203,30 +210,71 @@ char *set_heredoc(int index, char **in) return (file_name); } -void wait_prompt(t_s_cmd *cmd, int index) +void sig_heredoc(int num) +{ + num = 0; + struct sigaction base; + + base.sa_handler = &crtl_c; + base.sa_flags = 0; + //printf("sig_heredoc\n"); + if (sigaction(SIGINT, &base, 0) == -1) + { + printf("sigaction error2\n"); + return ; + } +} + +int wait_prompt(t_s_cmd *cmd, int index) { char *input; + int i; char **history; + char *in; + char *dup; + struct sigaction test; + + test.sa_handler = &sig_heredoc; + test.sa_flags = 0; + + + in = ft_strjoin(cmd->infile, "\n"); + free(cmd->infile); + cmd->infile = 0; + if (sigaction(SIGINT, &test, 0) == -1) + { + printf("sigaction error\n"); + exit(1); + } + //printf("wait_prompt\n"); history = 0; input = 0; - while (ft_strcmp(input, cmd->infile)) + i = 0; + while (i == 0 || (input && ft_strlen(input) && ft_strcmp(input, in))) { + i = 1; ft_putstr_fd("> ", 0); input = get_next_line(0); //input = readline(""); - printf("input= %s\n", input); + //printf("input= -%s-", input); if (!input) - return ; - input[ft_strlen(input) - 1] = 0; - if (ft_strcmp(input, cmd->infile)) - history = add_line(history, input); + return (0); + //input[ft_strlen(input) - 1] = 0; + if (ft_strcmp(input, in)) + { + dup = ft_strdup(input); + dup[ft_strlen(input) - 1] = 0; + dup = set_var(cmd->big_cmd, dup); + history = add_line(history, dup); + } } free(input); - free(cmd->infile); - cmd->infile = 0;//option? + //free(cmd->infile); + //cmd->infile = 0;//option? cmd->infile = set_heredoc(index, history); cmd->in_type = 0; + return (1); } char *set_redirection(t_s_cmd *cmd, char *line, int index) @@ -243,7 +291,10 @@ char *set_redirection(t_s_cmd *cmd, char *line, int index) { line = ft_input(line, cmd, i); if (cmd->in_type == 1) - wait_prompt(cmd, index); + { + if (!wait_prompt(cmd, index)) + return (0); + } i = 0; } }