aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-10-06 17:07:46 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-10-06 17:07:46 +0200
commitfc862343cc5d0c305811fe23311084ae3702ed42 (patch)
tree6417bd07fd58dab95eea3193acfd5230f0ff57f1 /src
parent54394620893f7245c7697a57d724d430d06b57d1 (diff)
downloadminishell-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
Diffstat (limited to 'src')
-rw-r--r--src/eval/operation.c21
-rw-r--r--src/lexer/trim.c4
-rw-r--r--src/main.c10
-rw-r--r--src/parser/parser.c8
-rw-r--r--src/preprocess.c4
5 files changed, 27 insertions, 20 deletions
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);
diff --git a/src/main.c b/src/main.c
index 3398814..7898547 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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]))))
{