diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index fab2584b..dc8504c9 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/27 20:29:56 by jhalford #+# #+# */ -/* Updated: 2017/03/10 13:26:16 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:31:17 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/exec/exec_reset.c b/42sh/src/exec/exec_reset.c index fd0e7a66..354b3cde 100644 --- a/42sh/src/exec/exec_reset.c +++ b/42sh/src/exec/exec_reset.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/08 14:31:42 by jhalford #+# #+# */ -/* Updated: 2017/03/10 13:13:49 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:48:19 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,13 +21,13 @@ int exec_reset(void) /* exec->fd_save[1] = 1;//fcntl(STDOUT, F_DUPFD_CLOEXEC); */ /* exec->fd_save[2] = 1;//fcntl(STDERR, F_DUPFD_CLOEXEC); */ DG("check 0"); - if ((exec->fd_save[0] = fcntl(STDIN, F_DUPFD_CLOEXEC, 10)) == -1) - ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); + if ((exec->fd_save[0] = fcntl(STDIN, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF) + ft_dprintf(2, "{red}%s: internal fcntl STDIN error errno=%i %s{eoc}\n", SHELL_NAME, errno); DG("check 1"); - if ((exec->fd_save[1] = fcntl(STDOUT, F_DUPFD_CLOEXEC, 10)) == -1) - ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); - if ((exec->fd_save[2] = fcntl(STDERR, F_DUPFD_CLOEXEC, 10)) == -1) - ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); + if ((exec->fd_save[1] = fcntl(STDOUT, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF) + ft_dprintf(2, "{red}%s: internal fcntl STDOUT error errno=%i %s{eoc}\n", SHELL_NAME, errno); + if ((exec->fd_save[2] = fcntl(STDERR, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF) + ft_dprintf(2, "{red}%s: internal fcntl STDERR error errno=%i %s{eoc}\n", SHELL_NAME, errno); DG("saved [%i:%i:%i]", exec->fd_save[0], exec->fd_save[1], exec->fd_save[2]); exec->op_stack = NULL; exec->fdin = STDIN; diff --git a/42sh/src/exec/fd_is_valid.c b/42sh/src/exec/fd_is_valid.c index 39fac840..b0347bcf 100644 --- a/42sh/src/exec/fd_is_valid.c +++ b/42sh/src/exec/fd_is_valid.c @@ -6,16 +6,18 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/03 13:46:40 by jhalford #+# #+# */ -/* Updated: 2017/03/06 16:58:38 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:59:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -int fd_is_valid(int fd, int has_flag) +int fd_is_valid(int fd, int has_mode) { - int flags; + int fd_flags; + int fd_modes; - flags = fcntl(fd, F_GETFD); - return ((flags != -1 || errno != EBADF) && flags & has_flag); + fd_modes = fcntl(fd, F_GETFL); + fd_flags = fcntl(fd, F_GETFD); + return ((fd_flags != -1 || errno != EBADF) && fd_modes & has_mode); } diff --git a/42sh/src/exec/redirect_greatand.c b/42sh/src/exec/redirect_greatand.c index d2bf02aa..ad449c2b 100644 --- a/42sh/src/exec/redirect_greatand.c +++ b/42sh/src/exec/redirect_greatand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:12:31 by jhalford #+# #+# */ -/* Updated: 2017/03/06 16:54:43 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 14:01:06 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,14 +17,14 @@ int redirect_greatand(t_redir *redir) int fdold; int fdnew; - if (ft_strcmp(redir->word, "-")) + if (ft_strcmp(redir->word, "-") == 0) { close(redir->n); return (0); } if (!ft_stris(redir->word, ft_isdigit)) { - ft_dprintf(2, "%s: %s: can only be digits", SHELL_NAME, redir->word); + ft_dprintf(2, "{red}%s: %s: can only be digits{eoc}\n", SHELL_NAME, redir->word); return (1); } fdold = ft_atoi(redir->word); @@ -33,9 +33,10 @@ int redirect_greatand(t_redir *redir) return (0); if (fdold > 9) return (bad_fd(fdold)); - if (fd_is_valid(fdold, O_RDONLY)) + if (fd_is_valid(fdold, O_RDONLY | O_RDWR)) dup2_close(fdold, fdnew); else - return (bad_fd(fdold)); + close(fdnew); + /* return (bad_fd(fdold)); */ return (0); } diff --git a/42sh/src/exec/redirect_lessand.c b/42sh/src/exec/redirect_lessand.c index 9c184b82..30f11cdc 100644 --- a/42sh/src/exec/redirect_lessand.c +++ b/42sh/src/exec/redirect_lessand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/06 22:11:18 by jhalford #+# #+# */ -/* Updated: 2017/03/06 16:53:29 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 14:00:40 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,14 +17,14 @@ int redirect_lessand(t_redir *redir) int fdold; int fdnew; - if (ft_strcmp(redir->word, "-")) + if (ft_strcmp(redir->word, "-") == 0) { close(redir->n); return (0); } if (!ft_stris(redir->word, ft_isdigit)) { - ft_dprintf(2, "%s: %s: can only be digits", SHELL_NAME, redir->word); + ft_dprintf(2, "{red}%s: %s: can only be digits{eoc}\n", SHELL_NAME, redir->word); return (1); } fdold = ft_atoi(redir->word); @@ -33,9 +33,10 @@ int redirect_lessand(t_redir *redir) return (0); if (fdold > 9) return (bad_fd(fdold)); - if (fd_is_valid(fdold, O_WRONLY)) + if (fd_is_valid(fdold, O_WRONLY | O_RDWR)) dup2_close(fdold, fdnew); else - return (bad_fd(fdold)); + close(fdnew); + /* return (bad_fd(fdold)); */ return (0); } diff --git a/42sh/src/lexer/lexer_greatand.c b/42sh/src/lexer/lexer_greatand.c index c7f17888..e3bccbe7 100644 --- a/42sh/src/lexer/lexer_greatand.c +++ b/42sh/src/lexer/lexer_greatand.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/03 11:56:58 by jhalford #+# #+# */ -/* Updated: 2017/03/08 23:34:08 by ariard ### ########.fr */ +/* Updated: 2017/03/10 13:45:47 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/data_init.c b/42sh/src/main/data_init.c index 43442aa4..4aa0ab28 100644 --- a/42sh/src/main/data_init.c +++ b/42sh/src/main/data_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/11/28 19:26:32 by jhalford #+# #+# */ -/* Updated: 2017/03/10 12:12:26 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:48:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/main/main.c b/42sh/src/main/main.c index a71a1ebc..c9a68cc8 100644 --- a/42sh/src/main/main.c +++ b/42sh/src/main/main.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/06 18:40:58 by jhalford #+# #+# */ -/* Updated: 2017/03/10 13:28:24 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:31:16 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/add_redir.c b/42sh/src/parser/add_redir.c index 28bd864c..45080542 100644 --- a/42sh/src/parser/add_redir.c +++ b/42sh/src/parser/add_redir.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 16:39:05 by ariard #+# #+# */ -/* Updated: 2017/03/10 13:19:14 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:45:42 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/42sh/src/parser/heredoc_parser.c b/42sh/src/parser/heredoc_parser.c index 6da6ff5e..b8d77513 100644 --- a/42sh/src/parser/heredoc_parser.c +++ b/42sh/src/parser/heredoc_parser.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/08 16:21:05 by ariard #+# #+# */ -/* Updated: 2017/03/10 13:26:15 by jhalford ### ########.fr */ +/* Updated: 2017/03/10 13:33:29 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */