diff options
| -rw-r--r-- | include/eval.h | 12 | ||||
| -rw-r--r-- | include/lexer.h | 5 | ||||
| -rw-r--r-- | src/eval/cmd.c | 91 | ||||
| -rw-r--r-- | src/eval/redir.c | 80 | ||||
| -rw-r--r-- | src/lexer/token.c | 13 | ||||
| -rw-r--r-- | src/main.c | 34 |
6 files changed, 130 insertions, 105 deletions
diff --git a/include/eval.h b/include/eval.h index 3ba7527..f834d45 100644 --- a/include/eval.h +++ b/include/eval.h @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 17:05:30 by charles #+# #+# */ -/* Updated: 2020/06/15 10:31:06 by charles ### ########.fr */ +/* Updated: 2020/06/15 11:09:49 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,8 @@ typedef struct t_builtin_func builtin; } t_fork_param_cmd; +#define MS_NO_FD -2 + /* ** eval.c */ @@ -97,6 +99,12 @@ void error_eval_put(enum e_error id, char *unexpected); ** cmd.c */ -int eval_cmd(t_env env, t_path path, t_ast *ast); +int eval_cmd(t_env env, t_path path, t_ast *ast); + +/* +** redir.c +*/ + +bool redir_extract(t_ftlst *redirs, t_env env, int *fd_in, int *fd_out); #endif diff --git a/include/lexer.h b/include/lexer.h index e2abe28..3acffb0 100644 --- a/include/lexer.h +++ b/include/lexer.h @@ -21,6 +21,9 @@ enum e_token_tag TAG_STR_DOUBLE = 1 << 10, TAG_STR_SINGLE = 1 << 11, TAG_STICK = 1 << 12, + + TAG_IS_STR = TAG_STR | TAG_STR_SINGLE | TAG_STR_DOUBLE, + TAG_IS_REDIR = TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND, }; typedef struct @@ -39,5 +42,7 @@ int lexe_space(char *input); t_token *token_new(enum e_token_tag tag, char *content); void token_destroy(t_token *token); +void token_destroy_lst(t_ftlst *tokens); +void token_destroy_lst2(t_ftlst *tokens1, t_ftlst *tokens2); #endif diff --git a/src/eval/cmd.c b/src/eval/cmd.c index 958c7ae..9468cb2 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,14 +6,12 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/06/15 10:58:59 by charles ### ########.fr */ +/* Updated: 2020/06/15 11:09:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "eval.h" -#define MS_NO_FD -2 - /* ** \brief Wrap a function in a fork ** \param fd_in fork input file descriptor @@ -35,8 +33,8 @@ int fork_wrap( return (-1); if (child_pid == 0) { - if (dup2(fd_in, STDIN_FILENO) == -1 || - dup2(fd_out, STDOUT_FILENO) == -1) + if ((fd_in != MS_NO_FD && dup2(fd_in, STDIN_FILENO) == -1) || + (fd_out != MS_NO_FD && dup2(fd_out, STDOUT_FILENO) == -1)) exit(EXIT_FAILURE); if ((status = wrapped(passed)) == -1) exit(EXIT_FAILURE); @@ -58,85 +56,6 @@ int forked_cmd(void *void_param) return (execve(param->exec_path, param->argv, (char**)param->env->data)); } -bool redir_has_tag(t_ftlst *redir, enum e_token_tag tags) -{ - return (((t_token*)redir->data)->tag & tags); -} - -bool redir_extract(t_ftlst *redirs, t_env env, int *fd_in, int *fd_out) -{ - t_ftlst *after; - t_ftlst *curr; - char *filename; - - if (redirs == NULL) - return (true); - if (!redir_has_tag(redirs, TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND) - || redirs->next == NULL - || !redir_has_tag(redirs->next, TAG_STR | TAG_STR_SINGLE | TAG_STR_DOUBLE)) - return (false); - curr = redirs->next; - while (curr != NULL && redir_has_tag(curr, TAG_STR | TAG_STR_SINGLE | TAG_STR_DOUBLE)) - { - if (curr->next == NULL || redir_has_tag(curr->next, TAG_REDIR_IN | TAG_REDIR_OUT | TAG_REDIR_APPEND)) - { - after = curr->next; - curr->next = NULL; - } - curr = curr->next; - } - if ((filename = preprocess_filename(&redirs->next, env)) == NULL) - { - ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); - ft_lstdestroy(&after, (void (*)(void*))token_destroy); - return (false); - } - if (redir_has_tag(redirs, TAG_REDIR_IN)) - { - if (*fd_in != STDIN_FILENO) - close(*fd_in); - if ((*fd_in = open(filename, O_RDONLY)) == -1) - { - error_eval_put(ERROR_OPEN, filename); - ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); - ft_lstdestroy(&after, (void (*)(void*))token_destroy); - free(filename); - return (false); - } - } - else if (redir_has_tag(redirs, TAG_REDIR_OUT)) - { - if (*fd_out != STDOUT_FILENO) - close(*fd_out); - if ((*fd_out = open(filename, - O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) - { - error_eval_put(ERROR_OPEN, filename); - ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); - ft_lstdestroy(&after, (void (*)(void*))token_destroy); - free(filename); - return (false); - } - } - else if (redir_has_tag(redirs, TAG_REDIR_APPEND)) - { - if (*fd_out != STDOUT_FILENO) - close(*fd_out); - if ((*fd_out = open(filename, - O_WRONLY | O_APPEND | O_CREAT, 0644)) == -1) - { - error_eval_put(ERROR_OPEN, filename); - ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); - ft_lstdestroy(&after, (void (*)(void*))token_destroy); - free(filename); - return (false); - } - } - ft_lstdestroy(&redirs, (void (*)(void*))token_destroy); - free(filename); - return (redir_extract(after, env, fd_in, fd_out)); -} - int eval_cmd(t_env env, t_path path, t_ast *ast) { t_fork_param_cmd param; @@ -144,8 +63,8 @@ int eval_cmd(t_env env, t_path path, t_ast *ast) int fd_out; char **argv; - fd_in = STDIN_FILENO; - fd_out = STDOUT_FILENO; + fd_in = MS_NO_FD; + fd_out = MS_NO_FD; if (!redir_extract(ast->redirs, env, &fd_in, &fd_out)) { ast->redirs = NULL; diff --git a/src/eval/redir.c b/src/eval/redir.c new file mode 100644 index 0000000..c6f98d4 --- /dev/null +++ b/src/eval/redir.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* redir.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/06/15 11:05:34 by charles #+# #+# */ +/* Updated: 2020/06/15 11:44:38 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "eval.h" + +static enum e_token_tag st_lst_tag(t_ftlst *lst) +{ + return (((t_token*)lst->data)->tag); +} + +static bool st_open_replace(int *fd, char *filename, int oflag) +{ + if (*fd != MS_NO_FD) + close(*fd); + if (oflag & O_CREAT) + *fd = open(filename, oflag, 0644); + else + *fd = open(filename, oflag); + if (*fd == -1) + { + error_eval_put(ERROR_OPEN, filename); + free(filename); + return (false); + } + return (true); +} + +bool redir_extract( + t_ftlst *redirs, + t_env env, + int *fd_in, + int *fd_out) +{ + t_ftlst *after; + t_ftlst *curr; + char *filename; + + if (redirs == NULL) + return (true); + if (!(st_lst_tag(redirs) & TAG_IS_REDIR) || redirs->next == NULL + || !(st_lst_tag(redirs->next) & TAG_IS_STR)) + return (false); + curr = redirs->next; + while (curr != NULL && st_lst_tag(curr) & TAG_IS_STR) + { + if (curr->next == NULL || st_lst_tag(curr->next) & TAG_IS_REDIR) + { + after = curr->next; + curr->next = NULL; + } + curr = curr->next; + } + if ((filename = preprocess_filename(&redirs->next, env)) == NULL) + { + token_destroy_lst2(redirs, after); + return (false); + } + if ((st_lst_tag(redirs) == TAG_REDIR_IN + && !st_open_replace(fd_in, filename, O_RDONLY)) + || (st_lst_tag(redirs) == TAG_REDIR_OUT + && !st_open_replace(fd_out, filename, O_WRONLY | O_CREAT | O_TRUNC)) + || (st_lst_tag(redirs) == TAG_REDIR_APPEND + && !st_open_replace(fd_out, filename, O_WRONLY | O_CREAT | O_APPEND))) + { + token_destroy_lst2(redirs, after); + return (false); + } + token_destroy_lst(redirs); + free(filename); + return (redir_extract(after, env, fd_in, fd_out)); +} diff --git a/src/lexer/token.c b/src/lexer/token.c index 0a13526..966a443 100644 --- a/src/lexer/token.c +++ b/src/lexer/token.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/09 13:38:08 by charles #+# #+# */ -/* Updated: 2020/06/14 20:51:25 by charles ### ########.fr */ +/* Updated: 2020/06/15 11:38:24 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,3 +34,14 @@ void token_destroy(t_token *token) free(token->content); free(token); } + +void token_destroy_lst(t_ftlst *tokens) +{ + ft_lstdestroy(&tokens, (void (*)(void*))token_destroy); +} + +void token_destroy_lst2(t_ftlst *tokens1, t_ftlst *tokens2) +{ + ft_lstdestroy(&tokens1, (void (*)(void*))token_destroy); + ft_lstdestroy(&tokens2, (void (*)(void*))token_destroy); +} @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/28 11:45:44 by cacharle #+# #+# */ -/* Updated: 2020/06/15 11:00:03 by charles ### ########.fr */ +/* Updated: 2020/06/15 11:19:23 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -91,26 +91,28 @@ int main(int argc, char **argv, char **envp) /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "ls"))); */ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-a"))); */ /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "-l"))); */ - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "*/*.c"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src/*.c include/*.h"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); - ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$$LFS$TERM$TERM."))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "|)}>#*.c"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "src#<{(|.c include#<{(|.h"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$A$B"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\$TERM"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "$TER\\M"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR, "\\\\"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "''''$TEST\\TEST"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE, ",$TEST,$B,"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE , "$TEST"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_DOUBLE | TAG_STICK, "$TEST"))); */ + /* ft_lstpush_back(&args, ft_lstnew(token_new(TAG_STR_SINGLE, "$TEST"))); */ t_ftlst *redirs = NULL; ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_IN, NULL))); ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "bonjour"))); - ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); + ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_APPEND, NULL))); ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo"))); + ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_REDIR_OUT, NULL))); + ft_lstpush_back(&redirs, ft_lstnew(token_new(TAG_STR, "yo1"))); t_ast *ast = ast_new(AST_CMD); ast->cmd_argv = args; |
