1 /* redir.c -- Functions to perform input and output redirection. */
3 /* Copyright (C) 1997-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
23 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
25 #endif /* _AIX && RISC6000 && !__GNUC__ */
28 #include "bashtypes.h"
29 #if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
30 # include <sys/file.h>
33 #include "posixstat.h"
35 #if defined (HAVE_UNISTD_H)
49 #define NEED_FPURGE_DECL
53 #include "execute_cmd.h"
56 #if defined (BUFFERED_INPUT)
60 #define SHELL_FD_BASE 10
64 extern int posixly_correct
;
65 extern REDIRECT
*redirection_undo_list
;
66 extern REDIRECT
*exec_redirection_undo_list
;
68 /* Static functions defined and used in this file. */
69 static void add_undo_close_redirect
__P((int));
70 static void add_exec_redirect
__P((REDIRECT
*));
71 static int add_undo_redirect
__P((int, enum r_instruction
, int));
72 static int expandable_redirection_filename
__P((REDIRECT
*));
73 static int stdin_redirection
__P((enum r_instruction
, int));
74 static int undoablefd
__P((int));
75 static int do_redirection_internal
__P((REDIRECT
*, int));
77 static int write_here_document
__P((int, WORD_DESC
*));
78 static int write_here_string
__P((int, WORD_DESC
*));
79 static int here_document_to_fd
__P((WORD_DESC
*, enum r_instruction
));
81 static int redir_special_open
__P((int, char *, int, int, enum r_instruction
));
82 static int noclobber_open
__P((char *, int, int, enum r_instruction
));
83 static int redir_open
__P((char *, int, int, enum r_instruction
));
85 static int redir_varassign
__P((REDIRECT
*, int));
86 static int redir_varvalue
__P((REDIRECT
*));
88 /* Spare redirector used when translating [N]>&WORD[-] or [N]<&WORD[-] to
89 a new redirection and when creating the redirection undo list. */
92 /* Set to errno when a here document cannot be created for some reason.
93 Used to print a reasonable error message. */
94 static int heredoc_errno
;
97 redirection_error (temp
, error
)
101 char *filename
, *allocname
;
105 if (temp
->rflags
& REDIR_VARASSIGN
)
106 filename
= savestring (temp
->redirector
.filename
->word
);
107 else if (temp
->redirector
.dest
< 0)
108 /* This can happen when read_token_word encounters overflow, like in
110 filename
= _("file descriptor out of range");
112 /* This error can never involve NOCLOBBER */
113 else if (error
!= NOCLOBBER_REDIRECT
&& temp
->redirector
.dest
>= 0 && error
== EBADF
)
115 /* If we're dealing with two file descriptors, we have to guess about
116 which one is invalid; in the cases of r_{duplicating,move}_input and
117 r_{duplicating,move}_output we're here because dup2() failed. */
118 switch (temp
->instruction
)
120 case r_duplicating_input
:
121 case r_duplicating_output
:
124 filename
= allocname
= itos (temp
->redirectee
.dest
);
126 case r_duplicating_input_word
:
127 if (temp
->redirector
.dest
== 0) /* Guess */
128 filename
= temp
->redirectee
.filename
->word
; /* XXX */
130 filename
= allocname
= itos (temp
->redirector
.dest
);
132 case r_duplicating_output_word
:
133 if (temp
->redirector
.dest
== 1) /* Guess */
134 filename
= temp
->redirectee
.filename
->word
; /* XXX */
136 filename
= allocname
= itos (temp
->redirector
.dest
);
139 filename
= allocname
= itos (temp
->redirector
.dest
);
144 else if (expandable_redirection_filename (temp
))
147 if (posixly_correct
&& interactive_shell
== 0)
149 oflags
= temp
->redirectee
.filename
->flags
;
150 temp
->redirectee
.filename
->flags
|= W_NOGLOB
;
152 filename
= allocname
= redirection_expand (temp
->redirectee
.filename
);
153 if (posixly_correct
&& interactive_shell
== 0)
154 temp
->redirectee
.filename
->flags
= oflags
;
156 filename
= temp
->redirectee
.filename
->word
;
158 else if (temp
->redirectee
.dest
< 0)
159 filename
= "file descriptor out of range";
161 filename
= allocname
= itos (temp
->redirectee
.dest
);
165 case AMBIGUOUS_REDIRECT
:
166 internal_error (_("%s: ambiguous redirect"), filename
);
169 case NOCLOBBER_REDIRECT
:
170 internal_error (_("%s: cannot overwrite existing file"), filename
);
173 #if defined (RESTRICTED_SHELL)
174 case RESTRICTED_REDIRECT
:
175 internal_error (_("%s: restricted: cannot redirect output"), filename
);
177 #endif /* RESTRICTED_SHELL */
179 case HEREDOC_REDIRECT
:
180 internal_error (_("cannot create temp file for here-document: %s"), strerror (heredoc_errno
));
183 case BADVAR_REDIRECT
:
184 internal_error (_("%s: cannot assign fd to variable"), filename
);
188 internal_error ("%s: %s", filename
, strerror (error
));
195 /* Perform the redirections on LIST. If flags & RX_ACTIVE, then actually
196 make input and output file descriptors, otherwise just do whatever is
197 neccessary for side effecting. flags & RX_UNDOABLE says to remember
198 how to undo the redirections later, if non-zero. If flags & RX_CLEXEC
199 is non-zero, file descriptors opened in do_redirection () have their
200 close-on-exec flag set. */
202 do_redirections (list
, flags
)
209 if (flags
& RX_UNDOABLE
)
211 if (redirection_undo_list
)
213 dispose_redirects (redirection_undo_list
);
214 redirection_undo_list
= (REDIRECT
*)NULL
;
216 if (exec_redirection_undo_list
)
217 dispose_exec_redirects ();
220 for (temp
= list
; temp
; temp
= temp
->next
)
222 error
= do_redirection_internal (temp
, flags
);
225 redirection_error (temp
, error
);
232 /* Return non-zero if the redirection pointed to by REDIRECT has a
233 redirectee.filename that can be expanded. */
235 expandable_redirection_filename (redirect
)
238 switch (redirect
->instruction
)
240 case r_output_direction
:
242 case r_input_direction
:
243 case r_inputa_direction
:
245 case r_append_err_and_out
:
248 case r_duplicating_input_word
:
249 case r_duplicating_output_word
:
250 case r_move_input_word
:
251 case r_move_output_word
:
259 /* Expand the word in WORD returning a string. If WORD expands to
260 multiple words (or no words), then return NULL. */
262 redirection_expand (word
)
266 WORD_LIST
*tlist1
, *tlist2
;
269 w
= copy_word (word
);
271 w
->flags
|= W_NOSPLIT
;
273 tlist1
= make_word_list (w
, (WORD_LIST
*)NULL
);
275 tlist2
= expand_words_no_vars (tlist1
);
277 dispose_words (tlist1
);
279 if (!tlist2
|| tlist2
->next
)
281 /* We expanded to no words, or to more than a single word.
282 Dispose of the word list and return NULL. */
284 dispose_words (tlist2
);
285 return ((char *)NULL
);
287 result
= string_list (tlist2
); /* XXX savestring (tlist2->word->word)? */
288 dispose_words (tlist2
);
293 write_here_string (fd
, redirectee
)
295 WORD_DESC
*redirectee
;
301 herestr
= expand_string_to_string (redirectee
->word
, 0);
303 herelen
= STRLEN (herestr
);
305 n
= write (fd
, herestr
, herelen
);
308 n
= write (fd
, "\n", 1);
322 /* Write the text of the here document pointed to by REDIRECTEE to the file
323 descriptor FD, which is already open to a temp file. Return 0 if the
324 write is successful, otherwise return errno. */
326 write_here_document (fd
, redirectee
)
328 WORD_DESC
*redirectee
;
331 int document_len
, fd2
;
333 register WORD_LIST
*t
, *tlist
;
335 /* Expand the text if the word that was specified had
336 no quoting. The text that we expand is treated
337 exactly as if it were surrounded by double quotes. */
339 if (redirectee
->flags
& W_QUOTED
)
341 document
= redirectee
->word
;
342 document_len
= strlen (document
);
343 /* Set errno to something reasonable if the write fails. */
344 if (write (fd
, document
, document_len
) < document_len
)
355 tlist
= expand_string (redirectee
->word
, Q_HERE_DOCUMENT
);
360 /* Try using buffered I/O (stdio) and writing a word
361 at a time, letting stdio do the work of buffering
362 for us rather than managing our own strings. Most
363 stdios are not particularly fast, however -- this
364 may need to be reconsidered later. */
365 if ((fd2
= dup (fd
)) < 0 || (fp
= fdopen (fd2
, "w")) == NULL
)
372 for (t
= tlist
; t
; t
= t
->next
)
374 /* This is essentially the body of
375 string_list_internal expanded inline. */
376 document
= t
->word
->word
;
377 document_len
= strlen (document
);
379 putc (' ', fp
); /* separator */
380 fwrite (document
, document_len
, 1, fp
);
387 dispose_words (tlist
);
391 dispose_words (tlist
);
392 if (fclose (fp
) != 0)
402 /* Create a temporary file holding the text of the here document pointed to
403 by REDIRECTEE, and return a file descriptor open for reading to the temp
404 file. Return -1 on any error, and make sure errno is set appropriately. */
406 here_document_to_fd (redirectee
, ri
)
407 WORD_DESC
*redirectee
;
408 enum r_instruction ri
;
413 fd
= sh_mktmpfd ("sh-thd", MT_USERANDOM
|MT_USETMPDIR
, &filename
);
415 /* If we failed for some reason other than the file existing, abort */
422 errno
= r
= 0; /* XXX */
423 /* write_here_document returns 0 on success, errno on failure. */
424 if (redirectee
->word
)
425 r
= (ri
!= r_reading_string
) ? write_here_document (fd
, redirectee
)
426 : write_here_string (fd
, redirectee
);
437 /* In an attempt to avoid races, we close the first fd only after opening
439 /* Make the document really temporary. Also make it the input. */
440 fd2
= open (filename
, O_RDONLY
, 0600);
453 if (unlink (filename
) < 0)
456 #if defined (__CYGWIN__)
457 /* Under CygWin 1.1.0, the unlink will fail if the file is
458 open. This hack will allow the previous action of silently
459 ignoring the error, but will still leave the file there. This
460 needs some kind of magic. */
463 #endif /* __CYGWIN__ */
475 #define RF_DEVSTDERR 2
476 #define RF_DEVSTDIN 3
477 #define RF_DEVSTDOUT 4
481 /* A list of pattern/value pairs for filenames that the redirection
482 code handles specially. */
483 static STRING_INT_ALIST _redir_special_filenames
[] = {
484 #if !defined (HAVE_DEV_FD)
485 { "/dev/fd/[0-9]*", RF_DEVFD
},
487 #if !defined (HAVE_DEV_STDIN)
488 { "/dev/stderr", RF_DEVSTDERR
},
489 { "/dev/stdin", RF_DEVSTDIN
},
490 { "/dev/stdout", RF_DEVSTDOUT
},
492 #if defined (NETWORK_REDIRECTIONS)
493 { "/dev/tcp/*/*", RF_DEVTCP
},
494 { "/dev/udp/*/*", RF_DEVUDP
},
500 redir_special_open (spec
, filename
, flags
, mode
, ri
)
504 enum r_instruction ri
;
507 #if !defined (HAVE_DEV_FD)
514 #if !defined (HAVE_DEV_FD)
516 if (all_digits (filename
+8) && legal_number (filename
+8, &lfd
) && lfd
== (int)lfd
)
519 fd
= fcntl (fd
, F_DUPFD
, SHELL_FD_BASE
);
522 fd
= AMBIGUOUS_REDIRECT
;
526 #if !defined (HAVE_DEV_STDIN)
528 fd
= fcntl (0, F_DUPFD
, SHELL_FD_BASE
);
531 fd
= fcntl (1, F_DUPFD
, SHELL_FD_BASE
);
534 fd
= fcntl (2, F_DUPFD
, SHELL_FD_BASE
);
538 #if defined (NETWORK_REDIRECTIONS)
541 #if defined (HAVE_NETWORK)
542 fd
= netopen (filename
);
544 internal_warning (_("/dev/(tcp|udp)/host/port not supported without networking"));
545 fd
= open (filename
, flags
, mode
);
548 #endif /* NETWORK_REDIRECTIONS */
554 /* Open FILENAME with FLAGS in noclobber mode, hopefully avoiding most
555 race conditions and avoiding the problem where the file is replaced
556 between the stat(2) and open(2). */
558 noclobber_open (filename
, flags
, mode
, ri
)
561 enum r_instruction ri
;
564 struct stat finfo
, finfo2
;
566 /* If the file exists and is a regular file, return an error
568 r
= stat (filename
, &finfo
);
569 if (r
== 0 && (S_ISREG (finfo
.st_mode
)))
570 return (NOCLOBBER_REDIRECT
);
572 /* If the file was not present (r != 0), make sure we open it
573 exclusively so that if it is created before we open it, our open
574 will fail. Make sure that we do not truncate an existing file.
575 Note that we don't turn on O_EXCL unless the stat failed -- if
576 the file was not a regular file, we leave O_EXCL off. */
580 fd
= open (filename
, flags
|O_EXCL
, mode
);
581 return ((fd
< 0 && errno
== EEXIST
) ? NOCLOBBER_REDIRECT
: fd
);
583 fd
= open (filename
, flags
, mode
);
585 /* If the open failed, return the file descriptor right away. */
587 return (errno
== EEXIST
? NOCLOBBER_REDIRECT
: fd
);
589 /* OK, the open succeeded, but the file may have been changed from a
590 non-regular file to a regular file between the stat and the open.
591 We are assuming that the O_EXCL open handles the case where FILENAME
592 did not exist and is symlinked to an existing file between the stat
595 /* If we can open it and fstat the file descriptor, and neither check
596 revealed that it was a regular file, and the file has not been replaced,
597 return the file descriptor. */
598 if ((fstat (fd
, &finfo2
) == 0) && (S_ISREG (finfo2
.st_mode
) == 0) &&
599 r
== 0 && (S_ISREG (finfo
.st_mode
) == 0) &&
600 same_file (filename
, filename
, &finfo
, &finfo2
))
603 /* The file has been replaced. badness. */
606 return (NOCLOBBER_REDIRECT
);
610 redir_open (filename
, flags
, mode
, ri
)
613 enum r_instruction ri
;
617 r
= find_string_in_alist (filename
, _redir_special_filenames
, 1);
619 return (redir_special_open (r
, filename
, flags
, mode
, ri
));
621 /* If we are in noclobber mode, you are not allowed to overwrite
622 existing files. Check before opening. */
623 if (noclobber
&& CLOBBERING_REDIRECT (ri
))
625 fd
= noclobber_open (filename
, flags
, mode
, ri
);
626 if (fd
== NOCLOBBER_REDIRECT
)
627 return (NOCLOBBER_REDIRECT
);
631 fd
= open (filename
, flags
, mode
);
633 if ((fd
< 0) && (errno
== EACCES
))
635 fd
= open (filename
, flags
& ~O_CREAT
, mode
);
636 errno
= EACCES
; /* restore errno */
650 clexec
= fcntl (fd
, F_GETFD
, 0);
651 if (clexec
== -1 || (fd
>= SHELL_FD_BASE
&& clexec
== 1))
656 /* Do the specific redirection requested. Returns errno or one of the
657 special redirection errors (*_REDIRECT) in case of error, 0 on success.
658 If flags & RX_ACTIVE is zero, then just do whatever is neccessary to
659 produce the appropriate side effects. flags & RX_UNDOABLE, if non-zero,
660 says to remember how to undo each redirection. If flags & RX_CLEXEC is
661 non-zero, then we set all file descriptors > 2 that we open to be
664 do_redirection_internal (redirect
, flags
)
668 WORD_DESC
*redirectee
;
669 int redir_fd
, fd
, redirector
, r
, oflags
;
671 char *redirectee_word
;
672 enum r_instruction ri
;
673 REDIRECT
*new_redirect
;
676 redirectee
= redirect
->redirectee
.filename
;
677 redir_fd
= redirect
->redirectee
.dest
;
678 redirector
= redirect
->redirector
.dest
;
679 ri
= redirect
->instruction
;
681 if (redirect
->flags
& RX_INTERNAL
)
682 flags
|= RX_INTERNAL
;
684 if (TRANSLATE_REDIRECT (ri
))
686 /* We have [N]>&WORD[-] or [N]<&WORD[-] (or {V}>&WORD[-] or {V}<&WORD-).
687 and WORD, then translate the redirection into a new one and
689 redirectee_word
= redirection_expand (redirectee
);
691 /* XXX - what to do with [N]<&$w- where w is unset or null? ksh93
693 if (redirectee_word
== 0)
694 return (AMBIGUOUS_REDIRECT
);
695 else if (redirectee_word
[0] == '-' && redirectee_word
[1] == '\0')
697 sd
= redirect
->redirector
;
699 new_redirect
= make_redirection (sd
, r_close_this
, rd
, 0);
701 else if (all_digits (redirectee_word
))
703 sd
= redirect
->redirector
;
704 if (legal_number (redirectee_word
, &lfd
) && (int)lfd
== lfd
)
707 rd
.dest
= -1; /* XXX */
710 case r_duplicating_input_word
:
711 new_redirect
= make_redirection (sd
, r_duplicating_input
, rd
, 0);
713 case r_duplicating_output_word
:
714 new_redirect
= make_redirection (sd
, r_duplicating_output
, rd
, 0);
716 case r_move_input_word
:
717 new_redirect
= make_redirection (sd
, r_move_input
, rd
, 0);
719 case r_move_output_word
:
720 new_redirect
= make_redirection (sd
, r_move_output
, rd
, 0);
724 else if (ri
== r_duplicating_output_word
&& (redirect
->rflags
& REDIR_VARASSIGN
) == 0 && redirector
== 1)
726 sd
= redirect
->redirector
;
727 rd
.filename
= make_bare_word (redirectee_word
);
728 new_redirect
= make_redirection (sd
, r_err_and_out
, rd
, 0);
732 free (redirectee_word
);
733 return (AMBIGUOUS_REDIRECT
);
736 free (redirectee_word
);
738 /* Set up the variables needed by the rest of the function from the
740 if (new_redirect
->instruction
== r_err_and_out
)
744 /* Copy the word without allocating any memory that must be
746 redirectee
= (WORD_DESC
*)alloca (sizeof (WORD_DESC
));
747 xbcopy ((char *)new_redirect
->redirectee
.filename
,
748 (char *)redirectee
, sizeof (WORD_DESC
));
750 alloca_hack
= (char *)
751 alloca (1 + strlen (new_redirect
->redirectee
.filename
->word
));
752 redirectee
->word
= alloca_hack
;
753 strcpy (redirectee
->word
, new_redirect
->redirectee
.filename
->word
);
756 /* It's guaranteed to be an integer, and shouldn't be freed. */
757 redirectee
= new_redirect
->redirectee
.filename
;
759 redir_fd
= new_redirect
->redirectee
.dest
;
760 redirector
= new_redirect
->redirector
.dest
;
761 ri
= new_redirect
->instruction
;
763 /* Overwrite the flags element of the old redirect with the new value. */
764 redirect
->flags
= new_redirect
->flags
;
765 dispose_redirects (new_redirect
);
770 case r_output_direction
:
772 case r_input_direction
:
773 case r_inputa_direction
:
774 case r_err_and_out
: /* command &>filename */
775 case r_append_err_and_out
: /* command &>> filename */
778 if (posixly_correct
&& interactive_shell
== 0)
780 oflags
= redirectee
->flags
;
781 redirectee
->flags
|= W_NOGLOB
;
783 redirectee_word
= redirection_expand (redirectee
);
784 if (posixly_correct
&& interactive_shell
== 0)
785 redirectee
->flags
= oflags
;
787 if (redirectee_word
== 0)
788 return (AMBIGUOUS_REDIRECT
);
790 #if defined (RESTRICTED_SHELL)
791 if (restricted
&& (WRITE_REDIRECT (ri
)))
793 free (redirectee_word
);
794 return (RESTRICTED_REDIRECT
);
796 #endif /* RESTRICTED_SHELL */
798 fd
= redir_open (redirectee_word
, redirect
->flags
, 0666, ri
);
799 free (redirectee_word
);
801 if (fd
== NOCLOBBER_REDIRECT
)
807 if (flags
& RX_ACTIVE
)
809 if (redirect
->rflags
& REDIR_VARASSIGN
)
810 redirector
= fcntl (fd
, F_DUPFD
, SHELL_FD_BASE
); /* XXX try this for now */
812 if (flags
& RX_UNDOABLE
)
814 /* Only setup to undo it if the thing to undo is active. */
815 if ((fd
!= redirector
) && (fcntl (redirector
, F_GETFD
, 0) != -1))
816 add_undo_redirect (redirector
, ri
, -1);
818 add_undo_close_redirect (redirector
);
821 #if defined (BUFFERED_INPUT)
822 check_bash_input (redirector
);
825 /* Make sure there is no pending output before we change the state
826 of the underlying file descriptor, since the builtins use stdio
828 if (redirector
== 1 && fileno (stdout
) == redirector
)
833 else if (redirector
== 2 && fileno (stderr
) == redirector
)
839 if (redirect
->rflags
& REDIR_VARASSIGN
)
841 if ((r
= redir_varassign (redirect
, redirector
)) < 0)
845 return (r
); /* XXX */
848 else if ((fd
!= redirector
) && (dup2 (fd
, redirector
) < 0))
851 #if defined (BUFFERED_INPUT)
852 /* Do not change the buffered stream for an implicit redirection
853 of /dev/null to fd 0 for asynchronous commands without job
854 control (r_inputa_direction). */
855 if (ri
== r_input_direction
|| ri
== r_input_output
)
856 duplicate_buffered_stream (fd
, redirector
);
857 #endif /* BUFFERED_INPUT */
860 * If we're remembering, then this is the result of a while, for
861 * or until loop with a loop redirection, or a function/builtin
862 * executing in the parent shell with a redirection. In the
863 * function/builtin case, we want to set all file descriptors > 2
864 * to be close-on-exec to duplicate the effect of the old
865 * for i = 3 to NOFILE close(i) loop. In the case of the loops,
866 * both sh and ksh leave the file descriptors open across execs.
867 * The Posix standard mentions only the exec builtin.
869 if ((flags
& RX_CLEXEC
) && (redirector
> 2))
870 SET_CLOSE_ON_EXEC (redirector
);
873 if (fd
!= redirector
)
875 #if defined (BUFFERED_INPUT)
876 if (INPUT_REDIRECT (ri
))
877 close_buffered_fd (fd
);
879 #endif /* !BUFFERED_INPUT */
880 close (fd
); /* Don't close what we just opened! */
883 /* If we are hacking both stdout and stderr, do the stderr
884 redirection here. XXX - handle {var} here? */
885 if (ri
== r_err_and_out
|| ri
== r_append_err_and_out
)
887 if (flags
& RX_ACTIVE
)
889 if (flags
& RX_UNDOABLE
)
890 add_undo_redirect (2, ri
, -1);
897 case r_reading_until
:
898 case r_deblank_reading_until
:
899 case r_reading_string
:
900 /* REDIRECTEE is a pointer to a WORD_DESC containing the text of
901 the new input. Place it in a temporary file. */
904 fd
= here_document_to_fd (redirectee
, ri
);
908 heredoc_errno
= errno
;
909 return (HEREDOC_REDIRECT
);
912 if (redirect
->rflags
& REDIR_VARASSIGN
)
913 redirector
= fcntl (fd
, F_DUPFD
, SHELL_FD_BASE
); /* XXX try this for now */
915 if (flags
& RX_ACTIVE
)
917 if (flags
& RX_UNDOABLE
)
919 /* Only setup to undo it if the thing to undo is active. */
920 if ((fd
!= redirector
) && (fcntl (redirector
, F_GETFD
, 0) != -1))
921 add_undo_redirect (redirector
, ri
, -1);
923 add_undo_close_redirect (redirector
);
926 #if defined (BUFFERED_INPUT)
927 check_bash_input (redirector
);
929 if (redirect
->rflags
& REDIR_VARASSIGN
)
931 if ((r
= redir_varassign (redirect
, redirector
)) < 0)
935 return (r
); /* XXX */
938 else if (fd
!= redirector
&& dup2 (fd
, redirector
) < 0)
945 #if defined (BUFFERED_INPUT)
946 duplicate_buffered_stream (fd
, redirector
);
949 if ((flags
& RX_CLEXEC
) && (redirector
> 2))
950 SET_CLOSE_ON_EXEC (redirector
);
953 if (fd
!= redirector
)
954 #if defined (BUFFERED_INPUT)
955 close_buffered_fd (fd
);
962 case r_duplicating_input
:
963 case r_duplicating_output
:
966 if ((flags
& RX_ACTIVE
) && (redirect
->rflags
& REDIR_VARASSIGN
))
967 redirector
= fcntl (redir_fd
, F_DUPFD
, SHELL_FD_BASE
); /* XXX try this for now */
969 if ((flags
& RX_ACTIVE
) && (redir_fd
!= redirector
))
971 if (flags
& RX_UNDOABLE
)
973 /* Only setup to undo it if the thing to undo is active. */
974 if (fcntl (redirector
, F_GETFD
, 0) != -1)
975 add_undo_redirect (redirector
, ri
, redir_fd
);
977 add_undo_close_redirect (redirector
);
979 #if defined (BUFFERED_INPUT)
980 check_bash_input (redirector
);
982 if (redirect
->rflags
& REDIR_VARASSIGN
)
984 if ((r
= redir_varassign (redirect
, redirector
)) < 0)
987 return (r
); /* XXX */
990 /* This is correct. 2>&1 means dup2 (1, 2); */
991 else if (dup2 (redir_fd
, redirector
) < 0)
994 #if defined (BUFFERED_INPUT)
995 if (ri
== r_duplicating_input
|| ri
== r_move_input
)
996 duplicate_buffered_stream (redir_fd
, redirector
);
997 #endif /* BUFFERED_INPUT */
999 /* First duplicate the close-on-exec state of redirectee. dup2
1000 leaves the flag unset on the new descriptor, which means it
1001 stays open. Only set the close-on-exec bit for file descriptors
1002 greater than 2 in any case, since 0-2 should always be open
1003 unless closed by something like `exec 2<&-'. It should always
1004 be safe to set fds > 2 to close-on-exec if they're being used to
1005 save file descriptors < 2, since we don't need to preserve the
1006 state of the close-on-exec flag for those fds -- they should
1008 /* if ((already_set || set_unconditionally) && (ok_to_set))
1011 if (((fcntl (redir_fd
, F_GETFD
, 0) == 1) || redir_fd
< 2 || (flags
& RX_CLEXEC
)) &&
1014 if (((fcntl (redir_fd
, F_GETFD
, 0) == 1) || (redir_fd
< 2 && (flags
& RX_INTERNAL
)) || (flags
& RX_CLEXEC
)) &&
1017 SET_CLOSE_ON_EXEC (redirector
);
1019 /* When undoing saving of non-standard file descriptors (>=3) using
1020 file descriptors >= SHELL_FD_BASE, we set the saving fd to be
1021 close-on-exec and use a flag to decide how to set close-on-exec
1022 when the fd is restored. */
1023 if ((redirect
->flags
& RX_INTERNAL
) && (redirect
->flags
& RX_SAVCLEXEC
) && redirector
>= 3 && redir_fd
>= SHELL_FD_BASE
)
1024 SET_OPEN_ON_EXEC (redirector
);
1026 /* dup-and-close redirection */
1027 if (ri
== r_move_input
|| ri
== r_move_output
)
1029 xtrace_fdchk (redir_fd
);
1032 #if defined (COPROCESS_SUPPORT)
1033 coproc_fdchk (redir_fd
); /* XXX - loses coproc fds */
1040 if (flags
& RX_ACTIVE
)
1042 if (redirect
->rflags
& REDIR_VARASSIGN
)
1044 redirector
= redir_varvalue (redirect
);
1046 return AMBIGUOUS_REDIRECT
;
1049 if ((flags
& RX_UNDOABLE
) && (fcntl (redirector
, F_GETFD
, 0) != -1))
1050 add_undo_redirect (redirector
, ri
, -1);
1052 #if defined (COPROCESS_SUPPORT)
1053 coproc_fdchk (redirector
);
1055 xtrace_fdchk (redirector
);
1057 #if defined (BUFFERED_INPUT)
1058 check_bash_input (redirector
);
1059 close_buffered_fd (redirector
);
1060 #else /* !BUFFERED_INPUT */
1062 #endif /* !BUFFERED_INPUT */
1066 case r_duplicating_input_word
:
1067 case r_duplicating_output_word
:
1073 /* Remember the file descriptor associated with the slot FD,
1074 on REDIRECTION_UNDO_LIST. Note that the list will be reversed
1075 before it is executed. Any redirections that need to be undone
1076 even if REDIRECTION_UNDO_LIST is discarded by the exec builtin
1077 are also saved on EXEC_REDIRECTION_UNDO_LIST. FDBASE says where to
1078 start the duplicating. If it's less than SHELL_FD_BASE, we're ok,
1079 and can use SHELL_FD_BASE (-1 == don't care). If it's >= SHELL_FD_BASE,
1080 we have to make sure we don't use fdbase to save a file descriptor,
1081 since we're going to use it later (e.g., make sure we don't save fd 0
1082 to fd 10 if we have a redirection like 0<&10). If the value of fdbase
1083 puts the process over its fd limit, causing fcntl to fail, we try
1084 again with SHELL_FD_BASE. */
1086 add_undo_redirect (fd
, ri
, fdbase
)
1088 enum r_instruction ri
;
1091 int new_fd
, clexec_flag
;
1092 REDIRECT
*new_redirect
, *closer
, *dummy_redirect
;
1095 new_fd
= fcntl (fd
, F_DUPFD
, (fdbase
< SHELL_FD_BASE
) ? SHELL_FD_BASE
: fdbase
+1);
1097 new_fd
= fcntl (fd
, F_DUPFD
, SHELL_FD_BASE
);
1101 sys_error (_("redirection error: cannot duplicate fd"));
1105 clexec_flag
= fcntl (fd
, F_GETFD
, 0);
1109 closer
= make_redirection (sd
, r_close_this
, rd
, 0);
1110 closer
->flags
|= RX_INTERNAL
;
1111 dummy_redirect
= copy_redirects (closer
);
1116 new_redirect
= make_redirection (sd
, r_duplicating_input
, rd
, 0);
1118 new_redirect
= make_redirection (sd
, r_duplicating_output
, rd
, 0);
1119 new_redirect
->flags
|= RX_INTERNAL
;
1120 if (clexec_flag
== 0 && fd
>= 3 && new_fd
>= SHELL_FD_BASE
)
1121 new_redirect
->flags
|= RX_SAVCLEXEC
;
1122 new_redirect
->next
= closer
;
1124 closer
->next
= redirection_undo_list
;
1125 redirection_undo_list
= new_redirect
;
1127 /* Save redirections that need to be undone even if the undo list
1128 is thrown away by the `exec' builtin. */
1129 add_exec_redirect (dummy_redirect
);
1131 /* experimental: if we're saving a redirection to undo for a file descriptor
1132 above SHELL_FD_BASE, add a redirection to be undone if the exec builtin
1133 causes redirections to be discarded. There needs to be a difference
1134 between fds that are used to save other fds and then are the target of
1135 user redirctions and fds that are just the target of user redirections.
1136 We use the close-on-exec flag to tell the difference; fds > SHELL_FD_BASE
1137 that have the close-on-exec flag set are assumed to be fds used internally
1139 if (fd
>= SHELL_FD_BASE
&& ri
!= r_close_this
&& clexec_flag
)
1143 new_redirect
= make_redirection (sd
, r_duplicating_output
, rd
, 0);
1144 new_redirect
->flags
|= RX_INTERNAL
;
1146 add_exec_redirect (new_redirect
);
1149 /* File descriptors used only for saving others should always be
1150 marked close-on-exec. Unfortunately, we have to preserve the
1151 close-on-exec state of the file descriptor we are saving, since
1152 fcntl (F_DUPFD) sets the new file descriptor to remain open
1153 across execs. If, however, the file descriptor whose state we
1154 are saving is <= 2, we can just set the close-on-exec flag,
1155 because file descriptors 0-2 should always be open-on-exec,
1156 and the restore above in do_redirection() will take care of it. */
1157 if (clexec_flag
|| fd
< 3)
1158 SET_CLOSE_ON_EXEC (new_fd
);
1159 else if (redirection_undo_list
->flags
& RX_SAVCLEXEC
)
1160 SET_CLOSE_ON_EXEC (new_fd
);
1165 /* Set up to close FD when we are finished with the current command
1166 and its redirections. */
1168 add_undo_close_redirect (fd
)
1176 closer
= make_redirection (sd
, r_close_this
, rd
, 0);
1177 closer
->flags
|= RX_INTERNAL
;
1178 closer
->next
= redirection_undo_list
;
1179 redirection_undo_list
= closer
;
1183 add_exec_redirect (dummy_redirect
)
1184 REDIRECT
*dummy_redirect
;
1186 dummy_redirect
->next
= exec_redirection_undo_list
;
1187 exec_redirection_undo_list
= dummy_redirect
;
1190 /* Return 1 if the redirection specified by RI and REDIRECTOR alters the
1193 stdin_redirection (ri
, redirector
)
1194 enum r_instruction ri
;
1199 case r_input_direction
:
1200 case r_inputa_direction
:
1201 case r_input_output
:
1202 case r_reading_until
:
1203 case r_deblank_reading_until
:
1204 case r_reading_string
:
1206 case r_duplicating_input
:
1207 case r_duplicating_input_word
:
1209 return (redirector
== 0);
1210 case r_output_direction
:
1211 case r_appending_to
:
1212 case r_duplicating_output
:
1214 case r_append_err_and_out
:
1215 case r_output_force
:
1216 case r_duplicating_output_word
:
1222 /* Return non-zero if any of the redirections in REDIRS alter the standard
1225 stdin_redirects (redirs
)
1231 for (n
= 0, rp
= redirs
; rp
; rp
= rp
->next
)
1232 if ((rp
->rflags
& REDIR_VARASSIGN
) == 0)
1233 n
+= stdin_redirection (rp
->instruction
, rp
->redirector
.dest
);
1237 /* These don't yet handle array references */
1239 redir_varassign (redir
, fd
)
1246 w
= redir
->redirector
.filename
;
1247 v
= bind_var_to_int (w
->word
, fd
);
1248 if (v
== 0 || readonly_p (v
) || noassign_p (v
))
1249 return BADVAR_REDIRECT
;
1255 redir_varvalue (redir
)
1263 /* XXX - handle set -u here? */
1264 v
= find_variable (redir
->redirector
.filename
->word
);
1265 if (v
== 0 || invisible_p (v
))
1268 val
= get_variable_value (v
);
1269 if (val
== 0 || *val
== 0)
1272 if (legal_number (val
, &vmax
) < 0)
1275 i
= vmax
; /* integer truncation */