diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-06-15 12:39:56 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-06-15 12:39:56 +0200 |
| commit | 11a719bab26b3ccccbd219decab2d0cf77021004 (patch) | |
| tree | 6629ec00d8ac3054f0daa906e3fd06092bef4b32 /src/eval/redir.c | |
| parent | ec9177a513d1fdd510abcb70a9640d1bd94023f5 (diff) | |
| download | minishell-11a719bab26b3ccccbd219decab2d0cf77021004.tar.gz minishell-11a719bab26b3ccccbd219decab2d0cf77021004.tar.bz2 minishell-11a719bab26b3ccccbd219decab2d0cf77021004.zip | |
Refactoring redirection out of eval/cmd.c, Added tag check shortcut
Diffstat (limited to 'src/eval/redir.c')
| -rw-r--r-- | src/eval/redir.c | 80 |
1 files changed, 80 insertions, 0 deletions
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)); +} |
