diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2020-10-06 17:07:46 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2020-10-06 17:07:46 +0200 |
| commit | fc862343cc5d0c305811fe23311084ae3702ed42 (patch) | |
| tree | 6417bd07fd58dab95eea3193acfd5230f0ff57f1 | |
| parent | 54394620893f7245c7697a57d724d430d06b57d1 (diff) | |
| download | minishell-fc862343cc5d0c305811fe23311084ae3702ed42.tar.gz minishell-fc862343cc5d0c305811fe23311084ae3702ed42.tar.bz2 minishell-fc862343cc5d0c305811fe23311084ae3702ed42.zip | |
Fixing error status on mac, Fixing parser pipeline segfault, Fixing pipeline not closing read-end
| -rw-r--r-- | include/lexer.h | 4 | ||||
| m--------- | minishell_test | 0 | ||||
| -rw-r--r-- | src/eval/operation.c | 21 | ||||
| -rw-r--r-- | src/lexer/trim.c | 4 | ||||
| -rw-r--r-- | src/main.c | 10 | ||||
| -rw-r--r-- | src/parser/parser.c | 8 | ||||
| -rw-r--r-- | src/preprocess.c | 4 |
7 files changed, 29 insertions, 22 deletions
diff --git a/include/lexer.h b/include/lexer.h index 30d5ae2..82b4d1d 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -6,7 +6,7 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/19 10:51:26 by nahaddac #+# #+# */ -/* Updated: 2020/09/15 18:24:12 by charles ### ########.fr */ +/* Updated: 2020/10/06 16:21:01 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ enum e_tok TAG_IS_STR = TAG_STR | TAG_STR_SINGLE | TAG_STR_DOUBLE, TAG_IS_REDIR = TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND, - TAG_IS_SEP = TAG_AND | TAG_END | TAG_OR | TAG_PIPE, + TAG_IS_SEP = TAG_AND | TAG_END | TAG_OR, }; /* diff --git a/minishell_test b/minishell_test -Subproject 1e713de9e5013c91495e0428179947f0764409a +Subproject 058491e35baa8bc73e14b48ceb765a3fe3c07e1 diff --git a/src/eval/operation.c b/src/eval/operation.c index a54b657..d8206b6 100644 --- a/src/eval/operation.c +++ b/src/eval/operation.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 15:27:22 by charles #+# #+# */ -/* Updated: 2020/10/06 15:53:12 by cacharle ### ########.fr */ +/* Updated: 2020/10/06 16:11:54 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,12 +60,6 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast) prev_output = STDIN_FILENO; curr = ast->pipeline; - - // create pipe - // fork - // dup2 pipe write -> stdout - // dup2 prev_output -> stdin - while (curr->next != NULL) { pipe(p); @@ -75,11 +69,18 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast) { dup2(p[FD_WRITE], STDOUT_FILENO); if (prev_output != STDIN_FILENO) + { dup2(prev_output, STDIN_FILENO); + close(prev_output); + } close(p[FD_READ]); + fds[0] = FD_NONE; + fds[1] = FD_NONE; exit(eval(fds, env, curr->data, NULL, FD_NONE)); } close(p[FD_WRITE]); + if (prev_output != STDIN_FILENO) + close(prev_output); prev_output = p[FD_READ]; curr = curr->next; } @@ -89,10 +90,16 @@ int eval_pipeline(int fds[2], t_env env, t_ast *ast) { /* dup2(p[FD_WRITE], STDOUT_FILENO); */ if (prev_output != STDIN_FILENO) + { dup2(prev_output, STDIN_FILENO); + close(prev_output); + } close(p[FD_WRITE]); + fds[0] = FD_NONE; + fds[1] = FD_NONE; exit(eval(fds, env, curr->data, NULL, FD_NONE)); } + close(p[FD_READ]); while (wait(NULL) != -1) ; diff --git a/src/lexer/trim.c b/src/lexer/trim.c index 652a78b..c8ed49e 100644 --- a/src/lexer/trim.c +++ b/src/lexer/trim.c @@ -6,7 +6,7 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/07/16 08:18:36 by nahaddac #+# #+# */ -/* Updated: 2020/09/16 20:09:42 by charles ### ########.fr */ +/* Updated: 2020/10/06 16:14:54 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -66,7 +66,7 @@ int del_quote(char *str) if (quote_counter % 2 == 1) { errorf("unexpected EOF while looking for matching `%c'\n", str[0]); - return (1); + return (2); } str[i] = '\0'; ft_memmove(str, str + 1, ft_strlen(str + 1) + 1); @@ -6,7 +6,7 @@ /* By: cacharle <cacharle@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/10/06 10:36:28 by cacharle ### ########.fr */ +/* Updated: 2020/10/06 16:14:07 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,11 +43,11 @@ int execute(t_env env, char *input) return (status); parser_out = parse(lexer_out); if (parser_out == NULL || parser_out->syntax_error) - return (1); + return (2); fds[0] = FD_NONE; fds[1] = FD_NONE; status = eval(fds, env, parser_out->ast, NULL, FD_NONE); - ast_destroy(parser_out->ast); + /* ast_destroy(parser_out->ast); */ free(parser_out); if (status == EVAL_FATAL) exit(1); @@ -69,11 +69,11 @@ int repl(t_env env) continue ; } if (execute(env, line) == EVAL_FATAL) - return (1); + return (2); print_prompt(); } if (ret != FTGL_EOF) - return (1); + return (2); return (0); } diff --git a/src/parser/parser.c b/src/parser/parser.c index 0e3fbaf..80f7349 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -6,7 +6,7 @@ /* By: nahaddac <nahaddac@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/17 18:09:04 by nahaddac #+# #+# */ -/* Updated: 2020/10/06 11:22:14 by cacharle ### ########.fr */ +/* Updated: 2020/10/06 16:26:48 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,8 +38,6 @@ static char *g_sep_str_lookup[] = { t_parsed *parse_redir(t_tok_lst *input, t_tok_lst **redirs) { tok_lst_push_back(redirs, tok_lst_uncons(&input)); - if (input == NULL) - return (parsed_error("syntax error near unexpected token `newline'\n")); // FIXME big condition could be avoided with lexer not putting STICK // if the next tokens isn't a string while (input != NULL @@ -59,7 +57,7 @@ t_parsed *parse_cmd(t_tok_lst *input) t_ast *ast; t_parsed *tmp; - if (input->tag & TAG_IS_SEP) + if (input->tag & TAG_IS_SEP || input->tag == TAG_PIPE) return (parsed_error("syntax error near unexpected token `%s'\n", input->content)); if ((ast = ast_new(AST_CMD)) == NULL) return (NULL); @@ -90,6 +88,8 @@ t_parsed *parse_pipeline(t_tok_lst *input) if (expr == NULL || expr->syntax_error || expr->rest == NULL || expr->rest->tag != TAG_PIPE) return (expr); + if (expr->rest->next == NULL) + return (parsed_error("syntax error expected token\n")); tail = parse_pipeline(expr->rest->next); if (tail == NULL || tail->syntax_error) return (tail); diff --git a/src/preprocess.c b/src/preprocess.c index 3b05e76..22bf266 100644 --- a/src/preprocess.c +++ b/src/preprocess.c @@ -6,7 +6,7 @@ /* By: charles <charles@student.42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/03 08:58:49 by charles #+# #+# */ -/* Updated: 2020/09/16 19:42:25 by charles ### ########.fr */ +/* Updated: 2020/10/06 16:30:30 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -85,7 +85,7 @@ char **st_tokens_to_argv(t_tok_lst **tokens) bool escape(char *str, enum e_tok tag) { - if (str[0] == '\\' && str[1] != '\0' + if (str[0] == '\\' // && str[1] != '\0' not on mac && (tag & TAG_STR || ((tag & TAG_STR_DOUBLE) && ft_strchr("\\\"$", str[1])))) { |
