diff --git a/srcs/main.c b/srcs/main.c index 3d83bd4..9dbebc1 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/17 19:26:30 by apommier ### ########.fr */ +/* Updated: 2022/04/18 09:24:25 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,18 @@ void sig_quit(int num) { num = 0; ft_putstr_fd("\b \b\b \b", 1); - printf("quit num= %d\n", num); + //printf("quit num= %d\n", num); + //exit(0); +} + +void sig_quit2(int num) +{ + num = 0; + //ft_putchar_fd(127, 1); + //ft_putchar_fd(127, 1); + ft_putstr_fd("\b \b\b \b", 1); + ft_putstr_fd("sigquit2\n", 1); + //printf("sig_quit2\n"); //exit(0); } @@ -53,11 +64,24 @@ void print_prompt(char **path) { char *input; t_cmd *cmd; - int err_var; + //int tmpin = dup(0); + //int tmpout = dup(1); + int err_var; + struct sigaction test; + memset(&test, 0, sizeof(test)); + test.sa_handler = &sig_quit; + test.sa_flags = 0; input = 0; err_var = 0; cmd = 0; + if (sigaction(SIGQUIT, &test, 0) == -1) + { + printf("Minishell: sigaction error\n"); + exit(1); + } + /*else + printf("sigaction good\n");*/ while (1) { input = readline("\033[1;31m~$ \033[0m"); @@ -67,18 +91,14 @@ void print_prompt(char **path) exit_shell(cmd, 0); } add_history(input); - /*if (!ft_strcmp("exit", input) && input) - { - free(input); - exit_shell(cmd); - }*/ if (ft_strlen(input) && next_space(input, 0) && input) { cmd = set_cmd(input, path, err_var); //path = ft_dup_double(path); - free_double(path); + if (cmd) { + free_double(path); //cmd->err_var = 0; execute(cmd, cmd->env); err_var = cmd->err_var; @@ -88,7 +108,13 @@ void print_prompt(char **path) cmd = 0; } else + { + /*close(0); + close(1); + dup2(tmpin, 0); + dup2(tmpout, 1);*/ ft_putstr_fd("Minishell: error while parsing command\n", 2); + } } free(input); } @@ -97,7 +123,7 @@ void print_prompt(char **path) int main(int ac, char **av, char **path) { char **env; - + if (!isatty(0)) { printf("Not today\n"); @@ -112,7 +138,7 @@ int main(int ac, char **av, char **path) } printf("---MINISHELL START---\n"); signal(SIGINT, crtl_c); - + //signal(SIGQUIT, sig_quit); print_prompt(env); return (0); } \ No newline at end of file diff --git a/srcs/pipe/pipe.c b/srcs/pipe/pipe.c index 8da7d90..770ce70 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/18 03:16:38 by apommier ### ########.fr */ +/* Updated: 2022/04/18 06:32:01 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -91,6 +91,11 @@ void exec_cmd(t_cmd *cmd, char **env, int *fdpipe) ft_putstr_fd("Minishell: command not found: ", 2); ft_putstr_fd(cmd->current_s_cmd->cmd + 1, 2); ft_putstr_fd("\n", 2); + close(0); + close(1); + close(cmd->tmpin); + close(cmd->tmpout); + free_cmd(cmd); exit(127); } if (-1 == execve(cmd->current_s_cmd->cmd, cmd->current_s_cmd->args, env)) @@ -138,8 +143,8 @@ void execute(t_cmd *cmd, char **env) fdin = dup(tmpin); while(cmd->current_s_cmd) { - if (i > 0 ) - close(fdout); + //if (i != 0) + // close(fdout); cmd->current_s_cmd->child = 1; fdout = -1; if (i > 0 && cmd->current_s_cmd->infile) diff --git a/srcs/set_cmd/set_cmd.c b/srcs/set_cmd/set_cmd.c index 72978fd..4be295f 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/17 02:08:41 by apommier ### ########.fr */ +/* Updated: 2022/04/18 13:22:46 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,10 @@ t_s_cmd *set_s_cmd(char *line, int index) //printf("before redirect\n"); line = set_redirection(s_cmd, line, index);//SET REDIRECTION if (!line) + { + free(s_cmd); return (0); + } split_line = ft_split_with_quote(line, ' '); //parse_quote(cmd); //print_double_fd(split_line, 0); @@ -69,6 +72,7 @@ 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("no cmd in splitcmd\n"); free_cmd(cmd); return (0); } @@ -126,8 +130,11 @@ t_cmd *set_cmd(char *input, char **env, int nb) cmd = split_cmd(cmd, cmds); //split each cmd into args in s_cmd //printf("end split cdm\n"); if (!cmd) - //free_cmd(cmd); + { + free(cmds); + //printf("no cmd\n"); return (0); + } parse_quote(cmd); free(cmds); if (cmd) diff --git a/srcs/set_quote/set_quote.c b/srcs/set_quote/set_quote.c index e4582ef..cbdf880 100644 --- a/srcs/set_quote/set_quote.c +++ b/srcs/set_quote/set_quote.c @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/04/09 23:58:21 by apommier #+# #+# */ -/* Updated: 2022/04/16 13:47:49 by apommier ### ########.fr */ +/* Updated: 2022/04/18 06:43:23 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -141,23 +141,24 @@ char *change_var(t_cmd *big_cmd, char *cmd, int *index) while (cmd[i] && (ft_isalnum(cmd[i]) || cmd[i] == '_' || cmd[i] == '?')) i++; swap = ft_substr(cmd, *index + 1, i - *index - 1); - //printf("swap= -%s-\n", swap); var = get_var(big_cmd, swap); - //printf("var -%s-\n", var); + free(swap); swap2 = ft_strdup(cmd + i); cmd[*index] = 0; ret = ft_strjoin(cmd, var); + free(cmd); *index += ft_strlen(var) - 1; free(var); var = ret; ret = ft_strjoin(ret, swap2); - //printf("change_var -%s-\n", ret); + free(swap2); return (ret); } char *set_var(t_cmd *big_cmd, char *cmd) { int i; + char *del; //printf("set_var\n"); i = 0; @@ -192,7 +193,9 @@ char *set_var(t_cmd *big_cmd, char *cmd) } i++; } + del = cmd; cmd = del_char(cmd, &i); + free(cmd); } //i++; @@ -210,14 +213,18 @@ int parse_quote(t_cmd *cmd) { int i; int j; - + char *swap; + i = 0; while (cmd->s_cmds[i]) { j = -1; while (cmd->s_cmds[i]->args[++j]) { + swap = cmd->s_cmds[i]->args[j]; cmd->s_cmds[i]->args[j] = set_var(cmd, cmd->s_cmds[i]->args[j]); + if (cmd->s_cmds[i]->args[j] != swap) + free(swap); } //printf("parse quote -%s-\n", cmd->s_cmds[i]->args[0]); if (!is_builtin(cmd->s_cmds[i]->args[0])) diff --git a/srcs/set_redirection/redirection.c b/srcs/set_redirection/redirection.c index 283386b..b6fb8b2 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/17 10:25:03 by apommier ### ########.fr */ +/* Updated: 2022/04/18 12:50:33 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -233,9 +233,10 @@ void sig_heredoc(int num) num = 0; struct sigaction base; + memset(&base, 0, sizeof(base)); base.sa_handler = &crtl_c; base.sa_flags = 0; - close(1); + //close(1); //printf("sig_heredoc\n"); if (sigaction(SIGINT, &base, 0) == -1) { @@ -251,9 +252,10 @@ int wait_prompt(t_s_cmd *cmd, int index) char **history; char *in; char *dup; + char *del; struct sigaction test; - + memset(&test, 0, sizeof(test)); test.sa_handler = &sig_heredoc; test.sa_flags = 0; @@ -273,21 +275,32 @@ int wait_prompt(t_s_cmd *cmd, int index) while (i == 0 || (input && ft_strlen(input) && ft_strcmp(input, in))) { i = 1; + if (input) + free(input); ft_putstr_fd("> ", 0); input = get_next_line(0); //input = readline(""); //printf("input= -%s-", input); if (!input) + { + free(in); + free_double(history); return (0); + } //input[ft_strlen(input) - 1] = 0; if (ft_strcmp(input, in)) { dup = ft_strdup(input); dup[ft_strlen(input) - 1] = 0; + del = dup; dup = set_var(cmd->big_cmd, dup); history = add_line(history, dup); + if (dup != del) + free(del); + free(dup); } } + free(in); free(input); //free(cmd->infile); //cmd->infile = 0;//option? @@ -316,7 +329,11 @@ char *set_redirection(t_s_cmd *cmd, char *line, int index) if (cmd->in_type == 1) { if (!wait_prompt(cmd, index)) + { + free(line); + //printf("no waitpromt\n"); return (0); + } } i = 0; }