Bash-4.3 distribution sources and documentation
[platform/upstream/bash.git] / redir.c
1 /* redir.c -- Functions to perform input and output redirection. */
2
3 /* Copyright (C) 1997-2012 Free Software Foundation, Inc.
4
5    This file is part of GNU Bash, the Bourne Again SHell.
6
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.
11
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.
16
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/>.
19 */
20
21 #include "config.h"
22
23 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
24   #pragma alloca
25 #endif /* _AIX && RISC6000 && !__GNUC__ */
26
27 #include <stdio.h>
28 #include "bashtypes.h"
29 #if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
30 #  include <sys/file.h>
31 #endif
32 #include "filecntl.h"
33 #include "posixstat.h"
34
35 #if defined (HAVE_UNISTD_H)
36 #  include <unistd.h>
37 #endif
38
39 #include <errno.h>
40
41 #if !defined (errno)
42 extern int errno;
43 #endif
44
45 #include "bashansi.h"
46 #include "bashintl.h"
47 #include "memalloc.h"
48
49 #define NEED_FPURGE_DECL
50
51 #include "shell.h"
52 #include "flags.h"
53 #include "execute_cmd.h"
54 #include "redir.h"
55
56 #if defined (BUFFERED_INPUT)
57 #  include "input.h"
58 #endif
59
60 #define SHELL_FD_BASE   10
61
62 int expanding_redir;
63
64 extern int posixly_correct;
65 extern int last_command_exit_value;
66 extern int executing_builtin;
67 extern REDIRECT *redirection_undo_list;
68 extern REDIRECT *exec_redirection_undo_list;
69
70 /* Static functions defined and used in this file. */
71 static void add_exec_redirect __P((REDIRECT *));
72 static int add_undo_redirect __P((int, enum r_instruction, int));
73 static int add_undo_close_redirect __P((int));
74 static int expandable_redirection_filename __P((REDIRECT *));
75 static int stdin_redirection __P((enum r_instruction, int));
76 static int undoablefd __P((int));
77 static int do_redirection_internal __P((REDIRECT *, int));
78
79 static int write_here_document __P((int, WORD_DESC *));
80 static int write_here_string __P((int, WORD_DESC *));
81 static int here_document_to_fd __P((WORD_DESC *, enum r_instruction));
82
83 static int redir_special_open __P((int, char *, int, int, enum r_instruction));
84 static int noclobber_open __P((char *, int, int, enum r_instruction));
85 static int redir_open __P((char *, int, int, enum r_instruction));
86
87 static int redir_varassign __P((REDIRECT *, int));
88 static int redir_varvalue __P((REDIRECT *));
89
90 /* Spare redirector used when translating [N]>&WORD[-] or [N]<&WORD[-] to
91    a new redirection and when creating the redirection undo list. */
92 static REDIRECTEE rd;
93
94 /* Set to errno when a here document cannot be created for some reason.
95    Used to print a reasonable error message. */
96 static int heredoc_errno;
97
98 #define REDIRECTION_ERROR(r, e, fd) \
99 do { \
100   if ((r) < 0) \
101     { \
102       if (fd >= 0) \
103         close (fd); \
104       last_command_exit_value = EXECUTION_FAILURE;\
105       return ((e) == 0 ? EINVAL : (e));\
106     } \
107 } while (0)
108
109 void
110 redirection_error (temp, error)
111      REDIRECT *temp;
112      int error;
113 {
114   char *filename, *allocname;
115   int oflags;
116
117   allocname = 0;
118   if (temp->rflags & REDIR_VARASSIGN)
119     filename = allocname = savestring (temp->redirector.filename->word);
120   else if (temp->redirector.dest < 0)
121     /* This can happen when read_token_word encounters overflow, like in
122        exec 4294967297>x */
123     filename = _("file descriptor out of range");
124 #ifdef EBADF
125   /* This error can never involve NOCLOBBER */
126   else if (error != NOCLOBBER_REDIRECT && temp->redirector.dest >= 0 && error == EBADF)
127     {
128       /* If we're dealing with two file descriptors, we have to guess about
129          which one is invalid; in the cases of r_{duplicating,move}_input and
130          r_{duplicating,move}_output we're here because dup2() failed. */
131       switch (temp->instruction)
132         {
133         case r_duplicating_input:
134         case r_duplicating_output:
135         case r_move_input:
136         case r_move_output:
137           filename = allocname = itos (temp->redirectee.dest);
138           break;
139         case r_duplicating_input_word:
140           if (temp->redirector.dest == 0)       /* Guess */
141             filename = temp->redirectee.filename->word; /* XXX */
142           else
143             filename = allocname = itos (temp->redirector.dest);
144           break;
145         case r_duplicating_output_word:
146           if (temp->redirector.dest == 1)       /* Guess */
147             filename = temp->redirectee.filename->word; /* XXX */
148           else
149             filename = allocname = itos (temp->redirector.dest);
150           break;
151         default:
152           filename = allocname = itos (temp->redirector.dest);
153           break;
154         }
155     }
156 #endif
157   else if (expandable_redirection_filename (temp))
158     {
159 expandable_filename:
160       oflags = temp->redirectee.filename->flags;
161       if (posixly_correct && interactive_shell == 0)
162         temp->redirectee.filename->flags |= W_NOGLOB;
163       temp->redirectee.filename->flags |= W_NOCOMSUB;
164       filename = allocname = redirection_expand (temp->redirectee.filename);
165       temp->redirectee.filename->flags = oflags;
166       if (filename == 0)
167         filename = temp->redirectee.filename->word;
168     }
169   else if (temp->redirectee.dest < 0)
170     filename = _("file descriptor out of range");
171   else
172     filename = allocname = itos (temp->redirectee.dest);
173
174   switch (error)
175     {
176     case AMBIGUOUS_REDIRECT:
177       internal_error (_("%s: ambiguous redirect"), filename);
178       break;
179
180     case NOCLOBBER_REDIRECT:
181       internal_error (_("%s: cannot overwrite existing file"), filename);
182       break;
183
184 #if defined (RESTRICTED_SHELL)
185     case RESTRICTED_REDIRECT:
186       internal_error (_("%s: restricted: cannot redirect output"), filename);
187       break;
188 #endif /* RESTRICTED_SHELL */
189
190     case HEREDOC_REDIRECT:
191       internal_error (_("cannot create temp file for here-document: %s"), strerror (heredoc_errno));
192       break;
193
194     case BADVAR_REDIRECT:
195       internal_error (_("%s: cannot assign fd to variable"), filename);
196       break;
197
198     default:
199       internal_error ("%s: %s", filename, strerror (error));
200       break;
201     }
202
203   FREE (allocname);
204 }
205
206 /* Perform the redirections on LIST.  If flags & RX_ACTIVE, then actually
207    make input and output file descriptors, otherwise just do whatever is
208    necessary for side effecting.  flags & RX_UNDOABLE says to remember
209    how to undo the redirections later, if non-zero.  If flags & RX_CLEXEC
210    is non-zero, file descriptors opened in do_redirection () have their
211    close-on-exec flag set. */
212 int
213 do_redirections (list, flags)
214      REDIRECT *list;
215      int flags;
216 {
217   int error;
218   REDIRECT *temp;
219
220   if (flags & RX_UNDOABLE)
221     {
222       if (redirection_undo_list)
223         {
224           dispose_redirects (redirection_undo_list);
225           redirection_undo_list = (REDIRECT *)NULL;
226         }
227       if (exec_redirection_undo_list)
228         dispose_exec_redirects ();
229     }
230
231   for (temp = list; temp; temp = temp->next)
232     {
233       error = do_redirection_internal (temp, flags);
234       if (error)
235         {
236           redirection_error (temp, error);
237           return (error);
238         }
239     }
240   return (0);
241 }
242
243 /* Return non-zero if the redirection pointed to by REDIRECT has a
244    redirectee.filename that can be expanded. */
245 static int
246 expandable_redirection_filename (redirect)
247      REDIRECT *redirect;
248 {
249   switch (redirect->instruction)
250     {
251     case r_output_direction:
252     case r_appending_to:
253     case r_input_direction:
254     case r_inputa_direction:
255     case r_err_and_out:
256     case r_append_err_and_out:
257     case r_input_output:
258     case r_output_force:
259     case r_duplicating_input_word:
260     case r_duplicating_output_word:
261     case r_move_input_word:
262     case r_move_output_word:
263       return 1;
264
265     default:
266       return 0;
267     }
268 }
269
270 /* Expand the word in WORD returning a string.  If WORD expands to
271    multiple words (or no words), then return NULL. */
272 char *
273 redirection_expand (word)
274      WORD_DESC *word;
275 {
276   char *result;
277   WORD_LIST *tlist1, *tlist2;
278   WORD_DESC *w;
279   int old;
280
281   w = copy_word (word);
282   if (posixly_correct)
283     w->flags |= W_NOSPLIT;
284
285   tlist1 = make_word_list (w, (WORD_LIST *)NULL);
286   expanding_redir = 1;
287   /* Now that we've changed the variable search order to ignore the temp
288      environment, see if we need to change the cached IFS values. */
289   sv_ifs ("IFS");
290   tlist2 = expand_words_no_vars (tlist1);
291   expanding_redir = 0;
292   /* Now we need to change the variable search order back to include the temp
293      environment.  We force the temp environment search by forcing
294      executing_builtin to 1.  This is what makes `read' get the right values
295      for the IFS-related cached variables, for example. */
296   old = executing_builtin;
297   executing_builtin = 1;
298   sv_ifs ("IFS");
299   executing_builtin = old;
300   dispose_words (tlist1);
301
302   if (tlist2 == 0 || tlist2->next)
303     {
304       /* We expanded to no words, or to more than a single word.
305          Dispose of the word list and return NULL. */
306       if (tlist2)
307         dispose_words (tlist2);
308       return ((char *)NULL);
309     }
310   result = string_list (tlist2);  /* XXX savestring (tlist2->word->word)? */
311   dispose_words (tlist2);
312   return (result);
313 }
314
315 static int
316 write_here_string (fd, redirectee)
317      int fd;
318      WORD_DESC *redirectee;
319 {
320   char *herestr;
321   int herelen, n, e, old;
322
323   expanding_redir = 1;
324   /* Now that we've changed the variable search order to ignore the temp
325      environment, see if we need to change the cached IFS values. */
326   sv_ifs ("IFS");
327   herestr = expand_string_to_string (redirectee->word, 0);
328   expanding_redir = 0;
329   /* Now we need to change the variable search order back to include the temp
330      environment.  We force the temp environment search by forcing
331      executing_builtin to 1.  This is what makes `read' get the right values
332      for the IFS-related cached variables, for example. */
333   old = executing_builtin;
334   executing_builtin = 1;
335   sv_ifs ("IFS");
336   executing_builtin = old;
337
338   herelen = STRLEN (herestr);
339
340   n = write (fd, herestr, herelen);
341   if (n == herelen)
342     {
343       n = write (fd, "\n", 1);
344       herelen = 1;
345     }
346   e = errno;
347   FREE (herestr);
348   if (n != herelen)
349     {
350       if (e == 0)
351         e = ENOSPC;
352       return e;
353     }
354   return 0;
355 }  
356
357 /* Write the text of the here document pointed to by REDIRECTEE to the file
358    descriptor FD, which is already open to a temp file.  Return 0 if the
359    write is successful, otherwise return errno. */
360 static int
361 write_here_document (fd, redirectee)
362      int fd;
363      WORD_DESC *redirectee;
364 {
365   char *document;
366   int document_len, fd2, old;
367   FILE *fp;
368   register WORD_LIST *t, *tlist;
369
370   /* Expand the text if the word that was specified had
371      no quoting.  The text that we expand is treated
372      exactly as if it were surrounded by double quotes. */
373
374   if (redirectee->flags & W_QUOTED)
375     {
376       document = redirectee->word;
377       document_len = strlen (document);
378       /* Set errno to something reasonable if the write fails. */
379       if (write (fd, document, document_len) < document_len)
380         {
381           if (errno == 0)
382             errno = ENOSPC;
383           return (errno);
384         }
385       else
386         return 0;
387     }
388
389   expanding_redir = 1;
390   /* Now that we've changed the variable search order to ignore the temp
391      environment, see if we need to change the cached IFS values. */
392   sv_ifs ("IFS");
393   tlist = expand_string (redirectee->word, Q_HERE_DOCUMENT);
394   expanding_redir = 0;
395   /* Now we need to change the variable search order back to include the temp
396      environment.  We force the temp environment search by forcing
397      executing_builtin to 1.  This is what makes `read' get the right values
398      for the IFS-related cached variables, for example. */
399   old = executing_builtin;
400   executing_builtin = 1;
401   sv_ifs ("IFS");
402   executing_builtin = old;
403
404   if (tlist)
405     {
406       /* Try using buffered I/O (stdio) and writing a word
407          at a time, letting stdio do the work of buffering
408          for us rather than managing our own strings.  Most
409          stdios are not particularly fast, however -- this
410          may need to be reconsidered later. */
411       if ((fd2 = dup (fd)) < 0 || (fp = fdopen (fd2, "w")) == NULL)
412         {
413           if (fd2 >= 0)
414             close (fd2);
415           return (errno);
416         }
417       errno = 0;
418       for (t = tlist; t; t = t->next)
419         {
420           /* This is essentially the body of
421              string_list_internal expanded inline. */
422           document = t->word->word;
423           document_len = strlen (document);
424           if (t != tlist)
425             putc (' ', fp);     /* separator */
426           fwrite (document, document_len, 1, fp);
427           if (ferror (fp))
428             {
429               if (errno == 0)
430                 errno = ENOSPC;
431               fd2 = errno;
432               fclose(fp);
433               dispose_words (tlist);
434               return (fd2);
435             }
436         }
437       dispose_words (tlist);
438       if (fclose (fp) != 0)
439         {
440           if (errno == 0)
441             errno = ENOSPC;
442           return (errno);
443         }
444     }
445   return 0;
446 }
447
448 /* Create a temporary file holding the text of the here document pointed to
449    by REDIRECTEE, and return a file descriptor open for reading to the temp
450    file.  Return -1 on any error, and make sure errno is set appropriately. */
451 static int
452 here_document_to_fd (redirectee, ri)
453      WORD_DESC *redirectee;
454      enum r_instruction ri;
455 {
456   char *filename;
457   int r, fd, fd2;
458
459   fd = sh_mktmpfd ("sh-thd", MT_USERANDOM|MT_USETMPDIR, &filename);
460
461   /* If we failed for some reason other than the file existing, abort */
462   if (fd < 0)
463     {
464       FREE (filename);
465       return (fd);
466     }
467
468   errno = r = 0;                /* XXX */
469   /* write_here_document returns 0 on success, errno on failure. */
470   if (redirectee->word)
471     r = (ri != r_reading_string) ? write_here_document (fd, redirectee)
472                                  : write_here_string (fd, redirectee);
473
474   if (r)
475     {
476       close (fd);
477       unlink (filename);
478       free (filename);
479       errno = r;
480       return (-1);
481     }
482
483   /* In an attempt to avoid races, we close the first fd only after opening
484      the second. */
485   /* Make the document really temporary.  Also make it the input. */
486   fd2 = open (filename, O_RDONLY|O_BINARY, 0600);
487
488   if (fd2 < 0)
489     {
490       r = errno;
491       unlink (filename);
492       free (filename);
493       close (fd);
494       errno = r;
495       return -1;
496     }
497
498   close (fd);
499   if (unlink (filename) < 0)
500     {
501       r = errno;
502       close (fd2);
503       free (filename);
504       errno = r;
505       return (-1);
506     }
507
508   free (filename);
509   return (fd2);
510 }
511
512 #define RF_DEVFD        1
513 #define RF_DEVSTDERR    2
514 #define RF_DEVSTDIN     3
515 #define RF_DEVSTDOUT    4
516 #define RF_DEVTCP       5
517 #define RF_DEVUDP       6
518
519 /* A list of pattern/value pairs for filenames that the redirection
520    code handles specially. */
521 static STRING_INT_ALIST _redir_special_filenames[] = {
522 #if !defined (HAVE_DEV_FD)
523   { "/dev/fd/[0-9]*", RF_DEVFD },
524 #endif
525 #if !defined (HAVE_DEV_STDIN)
526   { "/dev/stderr", RF_DEVSTDERR },
527   { "/dev/stdin", RF_DEVSTDIN },
528   { "/dev/stdout", RF_DEVSTDOUT },
529 #endif
530 #if defined (NETWORK_REDIRECTIONS)
531   { "/dev/tcp/*/*", RF_DEVTCP },
532   { "/dev/udp/*/*", RF_DEVUDP },
533 #endif
534   { (char *)NULL, -1 }
535 };
536
537 static int
538 redir_special_open (spec, filename, flags, mode, ri)
539      int spec;
540      char *filename;
541      int flags, mode;
542      enum r_instruction ri;
543 {
544   int fd;
545 #if !defined (HAVE_DEV_FD)
546   intmax_t lfd;
547 #endif
548
549   fd = -1;
550   switch (spec)
551     {
552 #if !defined (HAVE_DEV_FD)
553     case RF_DEVFD:
554       if (all_digits (filename+8) && legal_number (filename+8, &lfd) && lfd == (int)lfd)
555         {
556           fd = lfd;
557           fd = fcntl (fd, F_DUPFD, SHELL_FD_BASE);
558         }
559       else
560         fd = AMBIGUOUS_REDIRECT;
561       break;
562 #endif
563
564 #if !defined (HAVE_DEV_STDIN)
565     case RF_DEVSTDIN:
566       fd = fcntl (0, F_DUPFD, SHELL_FD_BASE);
567       break;
568     case RF_DEVSTDOUT:
569       fd = fcntl (1, F_DUPFD, SHELL_FD_BASE);
570       break;
571     case RF_DEVSTDERR:
572       fd = fcntl (2, F_DUPFD, SHELL_FD_BASE);
573       break;
574 #endif
575
576 #if defined (NETWORK_REDIRECTIONS)
577     case RF_DEVTCP:
578     case RF_DEVUDP:
579 #if defined (HAVE_NETWORK)
580       fd = netopen (filename);
581 #else
582       internal_warning (_("/dev/(tcp|udp)/host/port not supported without networking"));
583       fd = open (filename, flags, mode);
584 #endif
585       break;
586 #endif /* NETWORK_REDIRECTIONS */
587     }
588
589   return fd;
590 }
591       
592 /* Open FILENAME with FLAGS in noclobber mode, hopefully avoiding most
593    race conditions and avoiding the problem where the file is replaced
594    between the stat(2) and open(2). */
595 static int
596 noclobber_open (filename, flags, mode, ri)
597      char *filename;
598      int flags, mode;
599      enum r_instruction ri;
600 {
601   int r, fd;
602   struct stat finfo, finfo2;
603
604   /* If the file exists and is a regular file, return an error
605      immediately. */
606   r = stat (filename, &finfo);
607   if (r == 0 && (S_ISREG (finfo.st_mode)))
608     return (NOCLOBBER_REDIRECT);
609
610   /* If the file was not present (r != 0), make sure we open it
611      exclusively so that if it is created before we open it, our open
612      will fail.  Make sure that we do not truncate an existing file.
613      Note that we don't turn on O_EXCL unless the stat failed -- if
614      the file was not a regular file, we leave O_EXCL off. */
615   flags &= ~O_TRUNC;
616   if (r != 0)
617     {
618       fd = open (filename, flags|O_EXCL, mode);
619       return ((fd < 0 && errno == EEXIST) ? NOCLOBBER_REDIRECT : fd);
620     }
621   fd = open (filename, flags, mode);
622
623   /* If the open failed, return the file descriptor right away. */
624   if (fd < 0)
625     return (errno == EEXIST ? NOCLOBBER_REDIRECT : fd);
626
627   /* OK, the open succeeded, but the file may have been changed from a
628      non-regular file to a regular file between the stat and the open.
629      We are assuming that the O_EXCL open handles the case where FILENAME
630      did not exist and is symlinked to an existing file between the stat
631      and open. */
632
633   /* If we can open it and fstat the file descriptor, and neither check
634      revealed that it was a regular file, and the file has not been replaced,
635      return the file descriptor. */
636   if ((fstat (fd, &finfo2) == 0) && (S_ISREG (finfo2.st_mode) == 0) &&
637       r == 0 && (S_ISREG (finfo.st_mode) == 0) &&
638       same_file (filename, filename, &finfo, &finfo2))
639     return fd;
640
641   /* The file has been replaced.  badness. */
642   close (fd);  
643   errno = EEXIST;
644   return (NOCLOBBER_REDIRECT);
645 }
646
647 static int
648 redir_open (filename, flags, mode, ri)
649      char *filename;
650      int flags, mode;
651      enum r_instruction ri;
652 {
653   int fd, r, e;
654
655   r = find_string_in_alist (filename, _redir_special_filenames, 1);
656   if (r >= 0)
657     return (redir_special_open (r, filename, flags, mode, ri));
658
659   /* If we are in noclobber mode, you are not allowed to overwrite
660      existing files.  Check before opening. */
661   if (noclobber && CLOBBERING_REDIRECT (ri))
662     {
663       fd = noclobber_open (filename, flags, mode, ri);
664       if (fd == NOCLOBBER_REDIRECT)
665         return (NOCLOBBER_REDIRECT);
666     }
667   else
668     {
669       do
670         {
671           fd = open (filename, flags, mode);
672           e = errno;
673           if (fd < 0 && e == EINTR)
674             QUIT;
675           errno = e;
676         }
677       while (fd < 0 && errno == EINTR);
678
679 #if defined (AFS)
680       if ((fd < 0) && (errno == EACCES))
681         {
682           fd = open (filename, flags & ~O_CREAT, mode);
683           errno = EACCES;       /* restore errno */
684         }
685 #endif /* AFS */
686     }
687
688   return fd;
689 }
690
691 static int
692 undoablefd (fd)
693      int fd;
694 {
695   int clexec;
696
697   clexec = fcntl (fd, F_GETFD, 0);
698   if (clexec == -1 || (fd >= SHELL_FD_BASE && clexec == 1))
699     return 0;
700   return 1;
701 }
702
703 /* Do the specific redirection requested.  Returns errno or one of the
704    special redirection errors (*_REDIRECT) in case of error, 0 on success.
705    If flags & RX_ACTIVE is zero, then just do whatever is necessary to
706    produce the appropriate side effects.   flags & RX_UNDOABLE, if non-zero,
707    says to remember how to undo each redirection.  If flags & RX_CLEXEC is
708    non-zero, then we set all file descriptors > 2 that we open to be
709    close-on-exec.  */
710 static int
711 do_redirection_internal (redirect, flags)
712      REDIRECT *redirect;
713      int flags;
714 {
715   WORD_DESC *redirectee;
716   int redir_fd, fd, redirector, r, oflags;
717   intmax_t lfd;
718   char *redirectee_word;
719   enum r_instruction ri;
720   REDIRECT *new_redirect;
721   REDIRECTEE sd;
722
723   redirectee = redirect->redirectee.filename;
724   redir_fd = redirect->redirectee.dest;
725   redirector = redirect->redirector.dest;
726   ri = redirect->instruction;
727
728   if (redirect->flags & RX_INTERNAL)
729     flags |= RX_INTERNAL;
730
731   if (TRANSLATE_REDIRECT (ri))
732     {
733       /* We have [N]>&WORD[-] or [N]<&WORD[-] (or {V}>&WORD[-] or {V}<&WORD-).
734          and WORD, then translate the redirection into a new one and 
735          continue. */
736       redirectee_word = redirection_expand (redirectee);
737
738       /* XXX - what to do with [N]<&$w- where w is unset or null?  ksh93
739                closes N. */
740       if (redirectee_word == 0)
741         return (AMBIGUOUS_REDIRECT);
742       else if (redirectee_word[0] == '-' && redirectee_word[1] == '\0')
743         {
744           sd = redirect->redirector;
745           rd.dest = 0;
746           new_redirect = make_redirection (sd, r_close_this, rd, 0);
747         }
748       else if (all_digits (redirectee_word))
749         {
750           sd = redirect->redirector;
751           if (legal_number (redirectee_word, &lfd) && (int)lfd == lfd)
752             rd.dest = lfd;
753           else
754             rd.dest = -1;       /* XXX */
755           switch (ri)
756             {
757             case r_duplicating_input_word:
758               new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
759               break;
760             case r_duplicating_output_word:
761               new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
762               break;
763             case r_move_input_word:
764               new_redirect = make_redirection (sd, r_move_input, rd, 0);
765               break;
766             case r_move_output_word:
767               new_redirect = make_redirection (sd, r_move_output, rd, 0);
768               break;
769             }
770         }
771       else if (ri == r_duplicating_output_word && (redirect->rflags & REDIR_VARASSIGN) == 0 && redirector == 1)
772         {
773           sd = redirect->redirector;
774           rd.filename = make_bare_word (redirectee_word);
775           new_redirect = make_redirection (sd, r_err_and_out, rd, 0);
776         }
777       else
778         {
779           free (redirectee_word);
780           return (AMBIGUOUS_REDIRECT);
781         }
782
783       free (redirectee_word);
784
785       /* Set up the variables needed by the rest of the function from the
786          new redirection. */
787       if (new_redirect->instruction == r_err_and_out)
788         {
789           char *alloca_hack;
790
791           /* Copy the word without allocating any memory that must be
792              explicitly freed. */
793           redirectee = (WORD_DESC *)alloca (sizeof (WORD_DESC));
794           xbcopy ((char *)new_redirect->redirectee.filename,
795                  (char *)redirectee, sizeof (WORD_DESC));
796
797           alloca_hack = (char *)
798             alloca (1 + strlen (new_redirect->redirectee.filename->word));
799           redirectee->word = alloca_hack;
800           strcpy (redirectee->word, new_redirect->redirectee.filename->word);
801         }
802       else
803         /* It's guaranteed to be an integer, and shouldn't be freed. */
804         redirectee = new_redirect->redirectee.filename;
805
806       redir_fd = new_redirect->redirectee.dest;
807       redirector = new_redirect->redirector.dest;
808       ri = new_redirect->instruction;
809
810       /* Overwrite the flags element of the old redirect with the new value. */
811       redirect->flags = new_redirect->flags;
812       dispose_redirects (new_redirect);
813     }
814
815   switch (ri)
816     {
817     case r_output_direction:
818     case r_appending_to:
819     case r_input_direction:
820     case r_inputa_direction:
821     case r_err_and_out:         /* command &>filename */
822     case r_append_err_and_out:  /* command &>> filename */
823     case r_input_output:
824     case r_output_force:
825       if (posixly_correct && interactive_shell == 0)
826         {
827           oflags = redirectee->flags;
828           redirectee->flags |= W_NOGLOB;
829         }
830       redirectee_word = redirection_expand (redirectee);
831       if (posixly_correct && interactive_shell == 0)
832         redirectee->flags = oflags;
833
834       if (redirectee_word == 0)
835         return (AMBIGUOUS_REDIRECT);
836
837 #if defined (RESTRICTED_SHELL)
838       if (restricted && (WRITE_REDIRECT (ri)))
839         {
840           free (redirectee_word);
841           return (RESTRICTED_REDIRECT);
842         }
843 #endif /* RESTRICTED_SHELL */
844
845       fd = redir_open (redirectee_word, redirect->flags, 0666, ri);
846       free (redirectee_word);
847
848       if (fd == NOCLOBBER_REDIRECT)
849         return (fd);
850
851       if (fd < 0)
852         return (errno);
853
854       if (flags & RX_ACTIVE)
855         {
856           if (redirect->rflags & REDIR_VARASSIGN)
857             {
858               redirector = fcntl (fd, F_DUPFD, SHELL_FD_BASE);          /* XXX try this for now */
859               r = errno;
860               if (redirector < 0)
861                 sys_error (_("redirection error: cannot duplicate fd"));
862               REDIRECTION_ERROR (redirector, r, fd);
863             }
864
865           if ((flags & RX_UNDOABLE) && (redirect->rflags & REDIR_VARASSIGN) == 0)
866             {
867               /* Only setup to undo it if the thing to undo is active. */
868               if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1))
869                 r = add_undo_redirect (redirector, ri, -1);
870               else
871                 r = add_undo_close_redirect (redirector);
872               REDIRECTION_ERROR (r, errno, fd);
873             }
874
875 #if defined (BUFFERED_INPUT)
876           /* inhibit call to sync_buffered_stream() for async processes */
877           if (redirector != 0 || (subshell_environment & SUBSHELL_ASYNC) == 0)
878             check_bash_input (redirector);
879 #endif
880
881           /* Make sure there is no pending output before we change the state
882              of the underlying file descriptor, since the builtins use stdio
883              for output. */
884           if (redirector == 1 && fileno (stdout) == redirector)
885             {
886               fflush (stdout);
887               fpurge (stdout);
888             }
889           else if (redirector == 2 && fileno (stderr) == redirector)
890             {
891               fflush (stderr);
892               fpurge (stderr);
893             }
894
895           if (redirect->rflags & REDIR_VARASSIGN)
896             {
897               if ((r = redir_varassign (redirect, redirector)) < 0)
898                 {
899                   close (redirector);
900                   close (fd);
901                   return (r);   /* XXX */
902                 }
903             }
904           else if ((fd != redirector) && (dup2 (fd, redirector) < 0))
905             return (errno);
906
907 #if defined (BUFFERED_INPUT)
908           /* Do not change the buffered stream for an implicit redirection
909              of /dev/null to fd 0 for asynchronous commands without job
910              control (r_inputa_direction). */
911           if (ri == r_input_direction || ri == r_input_output)
912             duplicate_buffered_stream (fd, redirector);
913 #endif /* BUFFERED_INPUT */
914
915           /*
916            * If we're remembering, then this is the result of a while, for
917            * or until loop with a loop redirection, or a function/builtin
918            * executing in the parent shell with a redirection.  In the
919            * function/builtin case, we want to set all file descriptors > 2
920            * to be close-on-exec to duplicate the effect of the old
921            * for i = 3 to NOFILE close(i) loop.  In the case of the loops,
922            * both sh and ksh leave the file descriptors open across execs.
923            * The Posix standard mentions only the exec builtin.
924            */
925           if ((flags & RX_CLEXEC) && (redirector > 2))
926             SET_CLOSE_ON_EXEC (redirector);
927         }
928
929       if (fd != redirector)
930         {
931 #if defined (BUFFERED_INPUT)
932           if (INPUT_REDIRECT (ri))
933             close_buffered_fd (fd);
934           else
935 #endif /* !BUFFERED_INPUT */
936             close (fd);         /* Don't close what we just opened! */
937         }
938
939       /* If we are hacking both stdout and stderr, do the stderr
940          redirection here.  XXX - handle {var} here? */
941       if (ri == r_err_and_out || ri == r_append_err_and_out)
942         {
943           if (flags & RX_ACTIVE)
944             {
945               if (flags & RX_UNDOABLE)
946                 add_undo_redirect (2, ri, -1);
947               if (dup2 (1, 2) < 0)
948                 return (errno);
949             }
950         }
951       break;
952
953     case r_reading_until:
954     case r_deblank_reading_until:
955     case r_reading_string:
956       /* REDIRECTEE is a pointer to a WORD_DESC containing the text of
957          the new input.  Place it in a temporary file. */
958       if (redirectee)
959         {
960           fd = here_document_to_fd (redirectee, ri);
961
962           if (fd < 0)
963             {
964               heredoc_errno = errno;
965               return (HEREDOC_REDIRECT);
966             }
967
968           if (redirect->rflags & REDIR_VARASSIGN)
969             {
970               redirector = fcntl (fd, F_DUPFD, SHELL_FD_BASE);          /* XXX try this for now */
971               r = errno;
972               if (redirector < 0)
973                 sys_error (_("redirection error: cannot duplicate fd"));
974               REDIRECTION_ERROR (redirector, r, fd);
975             }
976
977           if (flags & RX_ACTIVE)
978             {
979               if ((flags & RX_UNDOABLE) && (redirect->rflags & REDIR_VARASSIGN) == 0)
980                 {
981                   /* Only setup to undo it if the thing to undo is active. */
982                   if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1))
983                     r = add_undo_redirect (redirector, ri, -1);
984                   else
985                     r = add_undo_close_redirect (redirector);
986                   REDIRECTION_ERROR (r, errno, fd);
987                 }
988
989 #if defined (BUFFERED_INPUT)
990               check_bash_input (redirector);
991 #endif
992               if (redirect->rflags & REDIR_VARASSIGN)
993                 {
994                   if ((r = redir_varassign (redirect, redirector)) < 0)
995                     {
996                       close (redirector);
997                       close (fd);
998                       return (r);       /* XXX */
999                     }
1000                 }
1001               else if (fd != redirector && dup2 (fd, redirector) < 0)
1002                 {
1003                   r = errno;
1004                   close (fd);
1005                   return (r);
1006                 }
1007
1008 #if defined (BUFFERED_INPUT)
1009               duplicate_buffered_stream (fd, redirector);
1010 #endif
1011
1012               if ((flags & RX_CLEXEC) && (redirector > 2))
1013                 SET_CLOSE_ON_EXEC (redirector);
1014             }
1015
1016           if (fd != redirector)
1017 #if defined (BUFFERED_INPUT)
1018             close_buffered_fd (fd);
1019 #else
1020             close (fd);
1021 #endif
1022         }
1023       break;
1024
1025     case r_duplicating_input:
1026     case r_duplicating_output:
1027     case r_move_input:
1028     case r_move_output:
1029       if ((flags & RX_ACTIVE) && (redirect->rflags & REDIR_VARASSIGN))
1030         {
1031           redirector = fcntl (redir_fd, F_DUPFD, SHELL_FD_BASE);                /* XXX try this for now */
1032           r = errno;
1033           if (redirector < 0)
1034             sys_error (_("redirection error: cannot duplicate fd"));
1035           REDIRECTION_ERROR (redirector, r, -1);
1036         }
1037
1038       if ((flags & RX_ACTIVE) && (redir_fd != redirector))
1039         {
1040           if ((flags & RX_UNDOABLE) && (redirect->rflags & REDIR_VARASSIGN) == 0)
1041             {
1042               /* Only setup to undo it if the thing to undo is active. */
1043               if (fcntl (redirector, F_GETFD, 0) != -1)
1044                 r = add_undo_redirect (redirector, ri, redir_fd);
1045               else
1046                 r = add_undo_close_redirect (redirector);
1047               REDIRECTION_ERROR (r, errno, -1);
1048             }
1049           if ((flags & RX_UNDOABLE) && (ri == r_move_input || ri == r_move_output))
1050             {
1051               /* r_move_input and r_move_output add an additional close()
1052                  that needs to be undone */
1053               if (fcntl (redirector, F_GETFD, 0) != -1)
1054                 {
1055                   r = add_undo_redirect (redir_fd, r_close_this, -1);
1056                   REDIRECTION_ERROR (r, errno, -1);
1057                 }
1058             }
1059 #if defined (BUFFERED_INPUT)
1060           /* inhibit call to sync_buffered_stream() for async processes */
1061           if (redirector != 0 || (subshell_environment & SUBSHELL_ASYNC) == 0)
1062             check_bash_input (redirector);
1063 #endif
1064           if (redirect->rflags & REDIR_VARASSIGN)
1065             {
1066               if ((r = redir_varassign (redirect, redirector)) < 0)
1067                 {
1068                   close (redirector);
1069                   return (r);   /* XXX */
1070                 }
1071             }
1072           /* This is correct.  2>&1 means dup2 (1, 2); */
1073           else if (dup2 (redir_fd, redirector) < 0)
1074             return (errno);
1075
1076 #if defined (BUFFERED_INPUT)
1077           if (ri == r_duplicating_input || ri == r_move_input)
1078             duplicate_buffered_stream (redir_fd, redirector);
1079 #endif /* BUFFERED_INPUT */
1080
1081           /* First duplicate the close-on-exec state of redirectee.  dup2
1082              leaves the flag unset on the new descriptor, which means it
1083              stays open.  Only set the close-on-exec bit for file descriptors
1084              greater than 2 in any case, since 0-2 should always be open
1085              unless closed by something like `exec 2<&-'.  It should always
1086              be safe to set fds > 2 to close-on-exec if they're being used to
1087              save file descriptors < 2, since we don't need to preserve the
1088              state of the close-on-exec flag for those fds -- they should
1089              always be open. */
1090           /* if ((already_set || set_unconditionally) && (ok_to_set))
1091                 set_it () */
1092 #if 0
1093           if (((fcntl (redir_fd, F_GETFD, 0) == 1) || redir_fd < 2 || (flags & RX_CLEXEC)) &&
1094                (redirector > 2))
1095 #else
1096           if (((fcntl (redir_fd, F_GETFD, 0) == 1) || (redir_fd < 2 && (flags & RX_INTERNAL)) || (flags & RX_CLEXEC)) &&
1097                (redirector > 2))
1098 #endif
1099             SET_CLOSE_ON_EXEC (redirector);
1100
1101           /* When undoing saving of non-standard file descriptors (>=3) using
1102              file descriptors >= SHELL_FD_BASE, we set the saving fd to be
1103              close-on-exec and use a flag to decide how to set close-on-exec
1104              when the fd is restored. */
1105           if ((redirect->flags & RX_INTERNAL) && (redirect->flags & RX_SAVCLEXEC) && redirector >= 3 && (redir_fd >= SHELL_FD_BASE || (redirect->flags & RX_SAVEFD)))
1106             SET_OPEN_ON_EXEC (redirector);
1107             
1108           /* dup-and-close redirection */
1109           if (ri == r_move_input || ri == r_move_output)
1110             {
1111               xtrace_fdchk (redir_fd);
1112
1113               close (redir_fd);
1114 #if defined (COPROCESS_SUPPORT)
1115               coproc_fdchk (redir_fd);  /* XXX - loses coproc fds */
1116 #endif
1117             }
1118         }
1119       break;
1120
1121     case r_close_this:
1122       if (flags & RX_ACTIVE)
1123         {
1124           if (redirect->rflags & REDIR_VARASSIGN)
1125             {
1126               redirector = redir_varvalue (redirect);
1127               if (redirector < 0)
1128                 return AMBIGUOUS_REDIRECT;
1129             }
1130
1131           r = 0;
1132           /* XXX - only if REDIR_VARASSIGN not set? */
1133           if ((flags & RX_UNDOABLE) && (fcntl (redirector, F_GETFD, 0) != -1))
1134             {
1135               r = add_undo_redirect (redirector, ri, -1);
1136               REDIRECTION_ERROR (r, errno, redirector);
1137             }
1138
1139 #if defined (COPROCESS_SUPPORT)
1140           coproc_fdchk (redirector);
1141 #endif
1142           xtrace_fdchk (redirector);
1143
1144 #if defined (BUFFERED_INPUT)
1145           /* inhibit call to sync_buffered_stream() for async processes */
1146           if (redirector != 0 || (subshell_environment & SUBSHELL_ASYNC) == 0)
1147             check_bash_input (redirector);
1148           r = close_buffered_fd (redirector);
1149 #else /* !BUFFERED_INPUT */
1150           r = close (redirector);
1151 #endif /* !BUFFERED_INPUT */
1152
1153           if (r < 0 && (flags & RX_INTERNAL) && (errno == EIO || errno == ENOSPC))
1154             REDIRECTION_ERROR (r, errno, -1);
1155         }
1156       break;
1157
1158     case r_duplicating_input_word:
1159     case r_duplicating_output_word:
1160       break;
1161     }
1162   return (0);
1163 }
1164
1165 /* Remember the file descriptor associated with the slot FD,
1166    on REDIRECTION_UNDO_LIST.  Note that the list will be reversed
1167    before it is executed.  Any redirections that need to be undone
1168    even if REDIRECTION_UNDO_LIST is discarded by the exec builtin
1169    are also saved on EXEC_REDIRECTION_UNDO_LIST.  FDBASE says where to
1170    start the duplicating.  If it's less than SHELL_FD_BASE, we're ok,
1171    and can use SHELL_FD_BASE (-1 == don't care).  If it's >= SHELL_FD_BASE,
1172    we have to make sure we don't use fdbase to save a file descriptor,
1173    since we're going to use it later (e.g., make sure we don't save fd 0
1174    to fd 10 if we have a redirection like 0<&10).  If the value of fdbase
1175    puts the process over its fd limit, causing fcntl to fail, we try
1176    again with SHELL_FD_BASE.  Return 0 on success, -1 on error. */
1177 static int
1178 add_undo_redirect (fd, ri, fdbase)
1179      int fd;
1180      enum r_instruction ri;
1181      int fdbase;
1182 {
1183   int new_fd, clexec_flag, savefd_flag;
1184   REDIRECT *new_redirect, *closer, *dummy_redirect;
1185   REDIRECTEE sd;
1186
1187   savefd_flag = 0;
1188   new_fd = fcntl (fd, F_DUPFD, (fdbase < SHELL_FD_BASE) ? SHELL_FD_BASE : fdbase+1);
1189   if (new_fd < 0)
1190     new_fd = fcntl (fd, F_DUPFD, SHELL_FD_BASE);
1191   if (new_fd < 0)
1192     {
1193       new_fd = fcntl (fd, F_DUPFD, 0);
1194       savefd_flag = 1;
1195     }
1196
1197   if (new_fd < 0)
1198     {
1199       sys_error (_("redirection error: cannot duplicate fd"));
1200       return (-1);
1201     }
1202
1203   clexec_flag = fcntl (fd, F_GETFD, 0);
1204
1205   sd.dest = new_fd;
1206   rd.dest = 0;
1207   closer = make_redirection (sd, r_close_this, rd, 0);
1208   closer->flags |= RX_INTERNAL;
1209   dummy_redirect = copy_redirects (closer);
1210
1211   sd.dest = fd;
1212   rd.dest = new_fd;
1213   if (fd == 0)
1214     new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
1215   else
1216     new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
1217   new_redirect->flags |= RX_INTERNAL;
1218   if (savefd_flag)
1219     new_redirect->flags |= RX_SAVEFD;
1220   if (clexec_flag == 0 && fd >= 3 && (new_fd >= SHELL_FD_BASE || savefd_flag))
1221     new_redirect->flags |= RX_SAVCLEXEC;
1222   new_redirect->next = closer;
1223
1224   closer->next = redirection_undo_list;
1225   redirection_undo_list = new_redirect;
1226
1227   /* Save redirections that need to be undone even if the undo list
1228      is thrown away by the `exec' builtin. */
1229   add_exec_redirect (dummy_redirect);
1230
1231   /* experimental:  if we're saving a redirection to undo for a file descriptor
1232      above SHELL_FD_BASE, add a redirection to be undone if the exec builtin
1233      causes redirections to be discarded.  There needs to be a difference
1234      between fds that are used to save other fds and then are the target of
1235      user redirections and fds that are just the target of user redirections.
1236      We use the close-on-exec flag to tell the difference; fds > SHELL_FD_BASE
1237      that have the close-on-exec flag set are assumed to be fds used internally
1238      to save others. */
1239   if (fd >= SHELL_FD_BASE && ri != r_close_this && clexec_flag)
1240     {
1241       sd.dest = fd;
1242       rd.dest = new_fd;
1243       new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
1244       new_redirect->flags |= RX_INTERNAL;
1245
1246       add_exec_redirect (new_redirect);
1247     }
1248
1249   /* File descriptors used only for saving others should always be
1250      marked close-on-exec.  Unfortunately, we have to preserve the
1251      close-on-exec state of the file descriptor we are saving, since
1252      fcntl (F_DUPFD) sets the new file descriptor to remain open
1253      across execs.  If, however, the file descriptor whose state we
1254      are saving is <= 2, we can just set the close-on-exec flag,
1255      because file descriptors 0-2 should always be open-on-exec,
1256      and the restore above in do_redirection() will take care of it. */
1257   if (clexec_flag || fd < 3)
1258     SET_CLOSE_ON_EXEC (new_fd);
1259   else if (redirection_undo_list->flags & RX_SAVCLEXEC)
1260     SET_CLOSE_ON_EXEC (new_fd);
1261
1262   return (0);
1263 }
1264
1265 /* Set up to close FD when we are finished with the current command
1266    and its redirections.  Return 0 on success, -1 on error. */
1267 static int
1268 add_undo_close_redirect (fd)
1269      int fd;
1270 {
1271   REDIRECT *closer;
1272   REDIRECTEE sd;
1273
1274   sd.dest = fd;
1275   rd.dest = 0;
1276   closer = make_redirection (sd, r_close_this, rd, 0);
1277   closer->flags |= RX_INTERNAL;
1278   closer->next = redirection_undo_list;
1279   redirection_undo_list = closer;
1280
1281   return 0;
1282 }
1283
1284 static void
1285 add_exec_redirect (dummy_redirect)
1286      REDIRECT *dummy_redirect;
1287 {
1288   dummy_redirect->next = exec_redirection_undo_list;
1289   exec_redirection_undo_list = dummy_redirect;
1290 }
1291
1292 /* Return 1 if the redirection specified by RI and REDIRECTOR alters the
1293    standard input. */
1294 static int
1295 stdin_redirection (ri, redirector)
1296      enum r_instruction ri;
1297      int redirector;
1298 {
1299   switch (ri)
1300     {
1301     case r_input_direction:
1302     case r_inputa_direction:
1303     case r_input_output:
1304     case r_reading_until:
1305     case r_deblank_reading_until:
1306     case r_reading_string:
1307       return (1);
1308     case r_duplicating_input:
1309     case r_duplicating_input_word:
1310     case r_close_this:
1311       return (redirector == 0);
1312     case r_output_direction:
1313     case r_appending_to:
1314     case r_duplicating_output:
1315     case r_err_and_out:
1316     case r_append_err_and_out:
1317     case r_output_force:
1318     case r_duplicating_output_word:
1319       return (0);
1320     }
1321   return (0);
1322 }
1323
1324 /* Return non-zero if any of the redirections in REDIRS alter the standard
1325    input. */
1326 int
1327 stdin_redirects (redirs)
1328      REDIRECT *redirs;
1329 {
1330   REDIRECT *rp;
1331   int n;
1332
1333   for (n = 0, rp = redirs; rp; rp = rp->next)
1334     if ((rp->rflags & REDIR_VARASSIGN) == 0)
1335       n += stdin_redirection (rp->instruction, rp->redirector.dest);
1336   return n;
1337 }
1338 /* bind_var_to_int handles array references */
1339 static int
1340 redir_varassign (redir, fd)
1341      REDIRECT *redir;
1342      int fd;
1343 {
1344   WORD_DESC *w;
1345   SHELL_VAR *v;
1346
1347   w = redir->redirector.filename;
1348   v = bind_var_to_int (w->word, fd);
1349   if (v == 0 || readonly_p (v) || noassign_p (v))
1350     return BADVAR_REDIRECT;
1351
1352   stupidly_hack_special_variables (w->word);
1353   return 0;
1354 }
1355
1356 /* Handles {array[ind]} for redirection words */
1357 static int
1358 redir_varvalue (redir)
1359      REDIRECT *redir;
1360 {
1361   SHELL_VAR *v;
1362   char *val, *w;
1363   intmax_t vmax;
1364   int i;
1365 #if defined (ARRAY_VARS)
1366   char *sub;
1367   int len, vr;
1368 #endif
1369
1370   w = redir->redirector.filename->word;         /* shorthand */
1371   /* XXX - handle set -u here? */
1372 #if defined (ARRAY_VARS)
1373   if (vr = valid_array_reference (w))
1374     v = array_variable_part (w, &sub, &len);
1375   else
1376 #endif
1377   v = find_variable (w);
1378   if (v == 0 || invisible_p (v))
1379     return -1;
1380
1381 #if defined (ARRAY_VARS)
1382   /* get_variable_value handles references to array variables without
1383      subscripts */
1384   if (vr && (array_p (v) || assoc_p (v)))
1385     val = get_array_value (w, 0, (int *)NULL, (arrayind_t *)0);
1386   else
1387 #endif
1388   val = get_variable_value (v);
1389   if (val == 0 || *val == 0)
1390     return -1;
1391
1392   if (legal_number (val, &vmax) < 0)
1393     return -1;
1394
1395   i = vmax;     /* integer truncation */
1396   return i;
1397 }