redirection tweaks

This commit is contained in:
Jack Halford 2017-03-10 14:01:39 +01:00
parent 9361d965bc
commit d051ccc127
10 changed files with 32 additions and 28 deletions

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/27 20:29:56 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/08 14:31:42 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[1] = 1;//fcntl(STDOUT, F_DUPFD_CLOEXEC); */
/* exec->fd_save[2] = 1;//fcntl(STDERR, F_DUPFD_CLOEXEC); */ /* exec->fd_save[2] = 1;//fcntl(STDERR, F_DUPFD_CLOEXEC); */
DG("check 0"); DG("check 0");
if ((exec->fd_save[0] = fcntl(STDIN, F_DUPFD_CLOEXEC, 10)) == -1) if ((exec->fd_save[0] = fcntl(STDIN, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF)
ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); ft_dprintf(2, "{red}%s: internal fcntl STDIN error errno=%i %s{eoc}\n", SHELL_NAME, errno);
DG("check 1"); DG("check 1");
if ((exec->fd_save[1] = fcntl(STDOUT, F_DUPFD_CLOEXEC, 10)) == -1) if ((exec->fd_save[1] = fcntl(STDOUT, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF)
ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); 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) if ((exec->fd_save[2] = fcntl(STDERR, F_DUPFD_CLOEXEC, 10)) == -1 && errno != EBADF)
ft_dprintf(2, "{red}%s: internal fcntl error errno=%i %s{eoc}\n", SHELL_NAME, errno); 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]); DG("saved [%i:%i:%i]", exec->fd_save[0], exec->fd_save[1], exec->fd_save[2]);
exec->op_stack = NULL; exec->op_stack = NULL;
exec->fdin = STDIN; exec->fdin = STDIN;

View file

@ -6,16 +6,18 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/03 13:46:40 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" #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); fd_modes = fcntl(fd, F_GETFL);
return ((flags != -1 || errno != EBADF) && flags & has_flag); fd_flags = fcntl(fd, F_GETFD);
return ((fd_flags != -1 || errno != EBADF) && fd_modes & has_mode);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/06 22:12:31 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 fdold;
int fdnew; int fdnew;
if (ft_strcmp(redir->word, "-")) if (ft_strcmp(redir->word, "-") == 0)
{ {
close(redir->n); close(redir->n);
return (0); return (0);
} }
if (!ft_stris(redir->word, ft_isdigit)) 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); return (1);
} }
fdold = ft_atoi(redir->word); fdold = ft_atoi(redir->word);
@ -33,9 +33,10 @@ int redirect_greatand(t_redir *redir)
return (0); return (0);
if (fdold > 9) if (fdold > 9)
return (bad_fd(fdold)); return (bad_fd(fdold));
if (fd_is_valid(fdold, O_RDONLY)) if (fd_is_valid(fdold, O_RDONLY | O_RDWR))
dup2_close(fdold, fdnew); dup2_close(fdold, fdnew);
else else
return (bad_fd(fdold)); close(fdnew);
/* return (bad_fd(fdold)); */
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/06 22:11:18 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 fdold;
int fdnew; int fdnew;
if (ft_strcmp(redir->word, "-")) if (ft_strcmp(redir->word, "-") == 0)
{ {
close(redir->n); close(redir->n);
return (0); return (0);
} }
if (!ft_stris(redir->word, ft_isdigit)) 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); return (1);
} }
fdold = ft_atoi(redir->word); fdold = ft_atoi(redir->word);
@ -33,9 +33,10 @@ int redirect_lessand(t_redir *redir)
return (0); return (0);
if (fdold > 9) if (fdold > 9)
return (bad_fd(fdold)); return (bad_fd(fdold));
if (fd_is_valid(fdold, O_WRONLY)) if (fd_is_valid(fdold, O_WRONLY | O_RDWR))
dup2_close(fdold, fdnew); dup2_close(fdold, fdnew);
else else
return (bad_fd(fdold)); close(fdnew);
/* return (bad_fd(fdold)); */
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/03 11:56:58 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */ /* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/28 19:26:32 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */ /* By: jhalford <jhalford@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/12/06 18:40:58 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/17 16:39:05 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */ /* By: ariard <ariard@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/08 16:21:05 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 */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */