]> git.ipfire.org Git - thirdparty/bash.git/blob - redir.c
Bash-4.1 distribution source
[thirdparty/bash.git] / redir.c
1 /* redir.c -- Functions to perform input and output redirection. */
2
3 /* Copyright (C) 1997-2009 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 REDIRECT *redirection_undo_list;
66 extern REDIRECT *exec_redirection_undo_list;
67
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));
76
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));
80
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));
84
85 static int redir_varassign __P((REDIRECT *, int));
86 static int redir_varvalue __P((REDIRECT *));
87
88 /* Spare redirector used when translating [N]>&WORD[-] or [N]<&WORD[-] to
89 a new redirection and when creating the redirection undo list. */
90 static REDIRECTEE rd;
91
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;
95
96 void
97 redirection_error (temp, error)
98 REDIRECT *temp;
99 int error;
100 {
101 char *filename, *allocname;
102 int oflags;
103
104 allocname = 0;
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
109 exec 4294967297>x */
110 filename = _("file descriptor out of range");
111 #ifdef EBADF
112 /* This error can never involve NOCLOBBER */
113 else if (error != NOCLOBBER_REDIRECT && temp->redirector.dest >= 0 && error == EBADF)
114 {
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)
119 {
120 case r_duplicating_input:
121 case r_duplicating_output:
122 case r_move_input:
123 case r_move_output:
124 filename = allocname = itos (temp->redirectee.dest);
125 break;
126 case r_duplicating_input_word:
127 if (temp->redirector.dest == 0) /* Guess */
128 filename = temp->redirectee.filename->word; /* XXX */
129 else
130 filename = allocname = itos (temp->redirector.dest);
131 break;
132 case r_duplicating_output_word:
133 if (temp->redirector.dest == 1) /* Guess */
134 filename = temp->redirectee.filename->word; /* XXX */
135 else
136 filename = allocname = itos (temp->redirector.dest);
137 break;
138 default:
139 filename = allocname = itos (temp->redirector.dest);
140 break;
141 }
142 }
143 #endif
144 else if (expandable_redirection_filename (temp))
145 {
146 expandable_filename:
147 if (posixly_correct && interactive_shell == 0)
148 {
149 oflags = temp->redirectee.filename->flags;
150 temp->redirectee.filename->flags |= W_NOGLOB;
151 }
152 filename = allocname = redirection_expand (temp->redirectee.filename);
153 if (posixly_correct && interactive_shell == 0)
154 temp->redirectee.filename->flags = oflags;
155 if (filename == 0)
156 filename = temp->redirectee.filename->word;
157 }
158 else if (temp->redirectee.dest < 0)
159 filename = "file descriptor out of range";
160 else
161 filename = allocname = itos (temp->redirectee.dest);
162
163 switch (error)
164 {
165 case AMBIGUOUS_REDIRECT:
166 internal_error (_("%s: ambiguous redirect"), filename);
167 break;
168
169 case NOCLOBBER_REDIRECT:
170 internal_error (_("%s: cannot overwrite existing file"), filename);
171 break;
172
173 #if defined (RESTRICTED_SHELL)
174 case RESTRICTED_REDIRECT:
175 internal_error (_("%s: restricted: cannot redirect output"), filename);
176 break;
177 #endif /* RESTRICTED_SHELL */
178
179 case HEREDOC_REDIRECT:
180 internal_error (_("cannot create temp file for here-document: %s"), strerror (heredoc_errno));
181 break;
182
183 case BADVAR_REDIRECT:
184 internal_error (_("%s: cannot assign fd to variable"), filename);
185 break;
186
187 default:
188 internal_error ("%s: %s", filename, strerror (error));
189 break;
190 }
191
192 FREE (allocname);
193 }
194
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. */
201 int
202 do_redirections (list, flags)
203 REDIRECT *list;
204 int flags;
205 {
206 int error;
207 REDIRECT *temp;
208
209 if (flags & RX_UNDOABLE)
210 {
211 if (redirection_undo_list)
212 {
213 dispose_redirects (redirection_undo_list);
214 redirection_undo_list = (REDIRECT *)NULL;
215 }
216 if (exec_redirection_undo_list)
217 dispose_exec_redirects ();
218 }
219
220 for (temp = list; temp; temp = temp->next)
221 {
222 error = do_redirection_internal (temp, flags);
223 if (error)
224 {
225 redirection_error (temp, error);
226 return (error);
227 }
228 }
229 return (0);
230 }
231
232 /* Return non-zero if the redirection pointed to by REDIRECT has a
233 redirectee.filename that can be expanded. */
234 static int
235 expandable_redirection_filename (redirect)
236 REDIRECT *redirect;
237 {
238 switch (redirect->instruction)
239 {
240 case r_output_direction:
241 case r_appending_to:
242 case r_input_direction:
243 case r_inputa_direction:
244 case r_err_and_out:
245 case r_append_err_and_out:
246 case r_input_output:
247 case r_output_force:
248 case r_duplicating_input_word:
249 case r_duplicating_output_word:
250 case r_move_input_word:
251 case r_move_output_word:
252 return 1;
253
254 default:
255 return 0;
256 }
257 }
258
259 /* Expand the word in WORD returning a string. If WORD expands to
260 multiple words (or no words), then return NULL. */
261 char *
262 redirection_expand (word)
263 WORD_DESC *word;
264 {
265 char *result;
266 WORD_LIST *tlist1, *tlist2;
267 WORD_DESC *w;
268
269 w = copy_word (word);
270 if (posixly_correct)
271 w->flags |= W_NOSPLIT;
272
273 tlist1 = make_word_list (w, (WORD_LIST *)NULL);
274 expanding_redir = 1;
275 tlist2 = expand_words_no_vars (tlist1);
276 expanding_redir = 0;
277 dispose_words (tlist1);
278
279 if (!tlist2 || tlist2->next)
280 {
281 /* We expanded to no words, or to more than a single word.
282 Dispose of the word list and return NULL. */
283 if (tlist2)
284 dispose_words (tlist2);
285 return ((char *)NULL);
286 }
287 result = string_list (tlist2); /* XXX savestring (tlist2->word->word)? */
288 dispose_words (tlist2);
289 return (result);
290 }
291
292 static int
293 write_here_string (fd, redirectee)
294 int fd;
295 WORD_DESC *redirectee;
296 {
297 char *herestr;
298 int herelen, n, e;
299
300 expanding_redir = 1;
301 herestr = expand_string_to_string (redirectee->word, 0);
302 expanding_redir = 0;
303 herelen = STRLEN (herestr);
304
305 n = write (fd, herestr, herelen);
306 if (n == herelen)
307 {
308 n = write (fd, "\n", 1);
309 herelen = 1;
310 }
311 e = errno;
312 FREE (herestr);
313 if (n != herelen)
314 {
315 if (e == 0)
316 e = ENOSPC;
317 return e;
318 }
319 return 0;
320 }
321
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. */
325 static int
326 write_here_document (fd, redirectee)
327 int fd;
328 WORD_DESC *redirectee;
329 {
330 char *document;
331 int document_len, fd2;
332 FILE *fp;
333 register WORD_LIST *t, *tlist;
334
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. */
338
339 if (redirectee->flags & W_QUOTED)
340 {
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)
345 {
346 if (errno == 0)
347 errno = ENOSPC;
348 return (errno);
349 }
350 else
351 return 0;
352 }
353
354 expanding_redir = 1;
355 tlist = expand_string (redirectee->word, Q_HERE_DOCUMENT);
356 expanding_redir = 0;
357
358 if (tlist)
359 {
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)
366 {
367 if (fd2 >= 0)
368 close (fd2);
369 return (errno);
370 }
371 errno = 0;
372 for (t = tlist; t; t = t->next)
373 {
374 /* This is essentially the body of
375 string_list_internal expanded inline. */
376 document = t->word->word;
377 document_len = strlen (document);
378 if (t != tlist)
379 putc (' ', fp); /* separator */
380 fwrite (document, document_len, 1, fp);
381 if (ferror (fp))
382 {
383 if (errno == 0)
384 errno = ENOSPC;
385 fd2 = errno;
386 fclose(fp);
387 dispose_words (tlist);
388 return (fd2);
389 }
390 }
391 dispose_words (tlist);
392 if (fclose (fp) != 0)
393 {
394 if (errno == 0)
395 errno = ENOSPC;
396 return (errno);
397 }
398 }
399 return 0;
400 }
401
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. */
405 static int
406 here_document_to_fd (redirectee, ri)
407 WORD_DESC *redirectee;
408 enum r_instruction ri;
409 {
410 char *filename;
411 int r, fd, fd2;
412
413 fd = sh_mktmpfd ("sh-thd", MT_USERANDOM|MT_USETMPDIR, &filename);
414
415 /* If we failed for some reason other than the file existing, abort */
416 if (fd < 0)
417 {
418 FREE (filename);
419 return (fd);
420 }
421
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);
427
428 if (r)
429 {
430 close (fd);
431 unlink (filename);
432 free (filename);
433 errno = r;
434 return (-1);
435 }
436
437 /* In an attempt to avoid races, we close the first fd only after opening
438 the second. */
439 /* Make the document really temporary. Also make it the input. */
440 fd2 = open (filename, O_RDONLY, 0600);
441
442 if (fd2 < 0)
443 {
444 r = errno;
445 unlink (filename);
446 free (filename);
447 close (fd);
448 errno = r;
449 return -1;
450 }
451
452 close (fd);
453 if (unlink (filename) < 0)
454 {
455 r = errno;
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. */
461 if (r == EACCES)
462 return (fd2);
463 #endif /* __CYGWIN__ */
464 close (fd2);
465 free (filename);
466 errno = r;
467 return (-1);
468 }
469
470 free (filename);
471 return (fd2);
472 }
473
474 #define RF_DEVFD 1
475 #define RF_DEVSTDERR 2
476 #define RF_DEVSTDIN 3
477 #define RF_DEVSTDOUT 4
478 #define RF_DEVTCP 5
479 #define RF_DEVUDP 6
480
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 },
486 #endif
487 #if !defined (HAVE_DEV_STDIN)
488 { "/dev/stderr", RF_DEVSTDERR },
489 { "/dev/stdin", RF_DEVSTDIN },
490 { "/dev/stdout", RF_DEVSTDOUT },
491 #endif
492 #if defined (NETWORK_REDIRECTIONS)
493 { "/dev/tcp/*/*", RF_DEVTCP },
494 { "/dev/udp/*/*", RF_DEVUDP },
495 #endif
496 { (char *)NULL, -1 }
497 };
498
499 static int
500 redir_special_open (spec, filename, flags, mode, ri)
501 int spec;
502 char *filename;
503 int flags, mode;
504 enum r_instruction ri;
505 {
506 int fd;
507 #if !defined (HAVE_DEV_FD)
508 intmax_t lfd;
509 #endif
510
511 fd = -1;
512 switch (spec)
513 {
514 #if !defined (HAVE_DEV_FD)
515 case RF_DEVFD:
516 if (all_digits (filename+8) && legal_number (filename+8, &lfd) && lfd == (int)lfd)
517 {
518 fd = lfd;
519 fd = fcntl (fd, F_DUPFD, SHELL_FD_BASE);
520 }
521 else
522 fd = AMBIGUOUS_REDIRECT;
523 break;
524 #endif
525
526 #if !defined (HAVE_DEV_STDIN)
527 case RF_DEVSTDIN:
528 fd = fcntl (0, F_DUPFD, SHELL_FD_BASE);
529 break;
530 case RF_DEVSTDOUT:
531 fd = fcntl (1, F_DUPFD, SHELL_FD_BASE);
532 break;
533 case RF_DEVSTDERR:
534 fd = fcntl (2, F_DUPFD, SHELL_FD_BASE);
535 break;
536 #endif
537
538 #if defined (NETWORK_REDIRECTIONS)
539 case RF_DEVTCP:
540 case RF_DEVUDP:
541 #if defined (HAVE_NETWORK)
542 fd = netopen (filename);
543 #else
544 internal_warning (_("/dev/(tcp|udp)/host/port not supported without networking"));
545 fd = open (filename, flags, mode);
546 #endif
547 break;
548 #endif /* NETWORK_REDIRECTIONS */
549 }
550
551 return fd;
552 }
553
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). */
557 static int
558 noclobber_open (filename, flags, mode, ri)
559 char *filename;
560 int flags, mode;
561 enum r_instruction ri;
562 {
563 int r, fd;
564 struct stat finfo, finfo2;
565
566 /* If the file exists and is a regular file, return an error
567 immediately. */
568 r = stat (filename, &finfo);
569 if (r == 0 && (S_ISREG (finfo.st_mode)))
570 return (NOCLOBBER_REDIRECT);
571
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. */
577 flags &= ~O_TRUNC;
578 if (r != 0)
579 {
580 fd = open (filename, flags|O_EXCL, mode);
581 return ((fd < 0 && errno == EEXIST) ? NOCLOBBER_REDIRECT : fd);
582 }
583 fd = open (filename, flags, mode);
584
585 /* If the open failed, return the file descriptor right away. */
586 if (fd < 0)
587 return (errno == EEXIST ? NOCLOBBER_REDIRECT : fd);
588
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
593 and open. */
594
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))
601 return fd;
602
603 /* The file has been replaced. badness. */
604 close (fd);
605 errno = EEXIST;
606 return (NOCLOBBER_REDIRECT);
607 }
608
609 static int
610 redir_open (filename, flags, mode, ri)
611 char *filename;
612 int flags, mode;
613 enum r_instruction ri;
614 {
615 int fd, r;
616
617 r = find_string_in_alist (filename, _redir_special_filenames, 1);
618 if (r >= 0)
619 return (redir_special_open (r, filename, flags, mode, ri));
620
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))
624 {
625 fd = noclobber_open (filename, flags, mode, ri);
626 if (fd == NOCLOBBER_REDIRECT)
627 return (NOCLOBBER_REDIRECT);
628 }
629 else
630 {
631 fd = open (filename, flags, mode);
632 #if defined (AFS)
633 if ((fd < 0) && (errno == EACCES))
634 {
635 fd = open (filename, flags & ~O_CREAT, mode);
636 errno = EACCES; /* restore errno */
637 }
638 #endif /* AFS */
639 }
640
641 return fd;
642 }
643
644 static int
645 undoablefd (fd)
646 int fd;
647 {
648 int clexec;
649
650 clexec = fcntl (fd, F_GETFD, 0);
651 if (clexec == -1 || (fd >= SHELL_FD_BASE && clexec == 1))
652 return 0;
653 return 1;
654 }
655
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
662 close-on-exec. */
663 static int
664 do_redirection_internal (redirect, flags)
665 REDIRECT *redirect;
666 int flags;
667 {
668 WORD_DESC *redirectee;
669 int redir_fd, fd, redirector, r, oflags;
670 intmax_t lfd;
671 char *redirectee_word;
672 enum r_instruction ri;
673 REDIRECT *new_redirect;
674 REDIRECTEE sd;
675
676 redirectee = redirect->redirectee.filename;
677 redir_fd = redirect->redirectee.dest;
678 redirector = redirect->redirector.dest;
679 ri = redirect->instruction;
680
681 if (redirect->flags & RX_INTERNAL)
682 flags |= RX_INTERNAL;
683
684 if (TRANSLATE_REDIRECT (ri))
685 {
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
688 continue. */
689 redirectee_word = redirection_expand (redirectee);
690
691 /* XXX - what to do with [N]<&$w- where w is unset or null? ksh93
692 closes N. */
693 if (redirectee_word == 0)
694 return (AMBIGUOUS_REDIRECT);
695 else if (redirectee_word[0] == '-' && redirectee_word[1] == '\0')
696 {
697 sd = redirect->redirector;
698 rd.dest = 0;
699 new_redirect = make_redirection (sd, r_close_this, rd, 0);
700 }
701 else if (all_digits (redirectee_word))
702 {
703 sd = redirect->redirector;
704 if (legal_number (redirectee_word, &lfd) && (int)lfd == lfd)
705 rd.dest = lfd;
706 else
707 rd.dest = -1; /* XXX */
708 switch (ri)
709 {
710 case r_duplicating_input_word:
711 new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
712 break;
713 case r_duplicating_output_word:
714 new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
715 break;
716 case r_move_input_word:
717 new_redirect = make_redirection (sd, r_move_input, rd, 0);
718 break;
719 case r_move_output_word:
720 new_redirect = make_redirection (sd, r_move_output, rd, 0);
721 break;
722 }
723 }
724 else if (ri == r_duplicating_output_word && (redirect->rflags & REDIR_VARASSIGN) == 0 && redirector == 1)
725 {
726 sd = redirect->redirector;
727 rd.filename = make_bare_word (redirectee_word);
728 new_redirect = make_redirection (sd, r_err_and_out, rd, 0);
729 }
730 else
731 {
732 free (redirectee_word);
733 return (AMBIGUOUS_REDIRECT);
734 }
735
736 free (redirectee_word);
737
738 /* Set up the variables needed by the rest of the function from the
739 new redirection. */
740 if (new_redirect->instruction == r_err_and_out)
741 {
742 char *alloca_hack;
743
744 /* Copy the word without allocating any memory that must be
745 explicitly freed. */
746 redirectee = (WORD_DESC *)alloca (sizeof (WORD_DESC));
747 xbcopy ((char *)new_redirect->redirectee.filename,
748 (char *)redirectee, sizeof (WORD_DESC));
749
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);
754 }
755 else
756 /* It's guaranteed to be an integer, and shouldn't be freed. */
757 redirectee = new_redirect->redirectee.filename;
758
759 redir_fd = new_redirect->redirectee.dest;
760 redirector = new_redirect->redirector.dest;
761 ri = new_redirect->instruction;
762
763 /* Overwrite the flags element of the old redirect with the new value. */
764 redirect->flags = new_redirect->flags;
765 dispose_redirects (new_redirect);
766 }
767
768 switch (ri)
769 {
770 case r_output_direction:
771 case r_appending_to:
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 */
776 case r_input_output:
777 case r_output_force:
778 if (posixly_correct && interactive_shell == 0)
779 {
780 oflags = redirectee->flags;
781 redirectee->flags |= W_NOGLOB;
782 }
783 redirectee_word = redirection_expand (redirectee);
784 if (posixly_correct && interactive_shell == 0)
785 redirectee->flags = oflags;
786
787 if (redirectee_word == 0)
788 return (AMBIGUOUS_REDIRECT);
789
790 #if defined (RESTRICTED_SHELL)
791 if (restricted && (WRITE_REDIRECT (ri)))
792 {
793 free (redirectee_word);
794 return (RESTRICTED_REDIRECT);
795 }
796 #endif /* RESTRICTED_SHELL */
797
798 fd = redir_open (redirectee_word, redirect->flags, 0666, ri);
799 free (redirectee_word);
800
801 if (fd == NOCLOBBER_REDIRECT)
802 return (fd);
803
804 if (fd < 0)
805 return (errno);
806
807 if (flags & RX_ACTIVE)
808 {
809 if (redirect->rflags & REDIR_VARASSIGN)
810 redirector = fcntl (fd, F_DUPFD, SHELL_FD_BASE); /* XXX try this for now */
811
812 if (flags & RX_UNDOABLE)
813 {
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);
817 else
818 add_undo_close_redirect (redirector);
819 }
820
821 #if defined (BUFFERED_INPUT)
822 check_bash_input (redirector);
823 #endif
824
825 /* Make sure there is no pending output before we change the state
826 of the underlying file descriptor, since the builtins use stdio
827 for output. */
828 if (redirector == 1 && fileno (stdout) == redirector)
829 {
830 fflush (stdout);
831 fpurge (stdout);
832 }
833 else if (redirector == 2 && fileno (stderr) == redirector)
834 {
835 fflush (stderr);
836 fpurge (stderr);
837 }
838
839 if (redirect->rflags & REDIR_VARASSIGN)
840 {
841 if ((r = redir_varassign (redirect, redirector)) < 0)
842 {
843 close (redirector);
844 close (fd);
845 return (r); /* XXX */
846 }
847 }
848 else if ((fd != redirector) && (dup2 (fd, redirector) < 0))
849 return (errno);
850
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 */
858
859 /*
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.
868 */
869 if ((flags & RX_CLEXEC) && (redirector > 2))
870 SET_CLOSE_ON_EXEC (redirector);
871 }
872
873 if (fd != redirector)
874 {
875 #if defined (BUFFERED_INPUT)
876 if (INPUT_REDIRECT (ri))
877 close_buffered_fd (fd);
878 else
879 #endif /* !BUFFERED_INPUT */
880 close (fd); /* Don't close what we just opened! */
881 }
882
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)
886 {
887 if (flags & RX_ACTIVE)
888 {
889 if (flags & RX_UNDOABLE)
890 add_undo_redirect (2, ri, -1);
891 if (dup2 (1, 2) < 0)
892 return (errno);
893 }
894 }
895 break;
896
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. */
902 if (redirectee)
903 {
904 fd = here_document_to_fd (redirectee, ri);
905
906 if (fd < 0)
907 {
908 heredoc_errno = errno;
909 return (HEREDOC_REDIRECT);
910 }
911
912 if (redirect->rflags & REDIR_VARASSIGN)
913 redirector = fcntl (fd, F_DUPFD, SHELL_FD_BASE); /* XXX try this for now */
914
915 if (flags & RX_ACTIVE)
916 {
917 if (flags & RX_UNDOABLE)
918 {
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);
922 else
923 add_undo_close_redirect (redirector);
924 }
925
926 #if defined (BUFFERED_INPUT)
927 check_bash_input (redirector);
928 #endif
929 if (redirect->rflags & REDIR_VARASSIGN)
930 {
931 if ((r = redir_varassign (redirect, redirector)) < 0)
932 {
933 close (redirector);
934 close (fd);
935 return (r); /* XXX */
936 }
937 }
938 else if (fd != redirector && dup2 (fd, redirector) < 0)
939 {
940 r = errno;
941 close (fd);
942 return (r);
943 }
944
945 #if defined (BUFFERED_INPUT)
946 duplicate_buffered_stream (fd, redirector);
947 #endif
948
949 if ((flags & RX_CLEXEC) && (redirector > 2))
950 SET_CLOSE_ON_EXEC (redirector);
951 }
952
953 if (fd != redirector)
954 #if defined (BUFFERED_INPUT)
955 close_buffered_fd (fd);
956 #else
957 close (fd);
958 #endif
959 }
960 break;
961
962 case r_duplicating_input:
963 case r_duplicating_output:
964 case r_move_input:
965 case r_move_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 */
968
969 if ((flags & RX_ACTIVE) && (redir_fd != redirector))
970 {
971 if (flags & RX_UNDOABLE)
972 {
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);
976 else
977 add_undo_close_redirect (redirector);
978 }
979 #if defined (BUFFERED_INPUT)
980 check_bash_input (redirector);
981 #endif
982 if (redirect->rflags & REDIR_VARASSIGN)
983 {
984 if ((r = redir_varassign (redirect, redirector)) < 0)
985 {
986 close (redirector);
987 return (r); /* XXX */
988 }
989 }
990 /* This is correct. 2>&1 means dup2 (1, 2); */
991 else if (dup2 (redir_fd, redirector) < 0)
992 return (errno);
993
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 */
998
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
1007 always be open. */
1008 /* if ((already_set || set_unconditionally) && (ok_to_set))
1009 set_it () */
1010 #if 0
1011 if (((fcntl (redir_fd, F_GETFD, 0) == 1) || redir_fd < 2 || (flags & RX_CLEXEC)) &&
1012 (redirector > 2))
1013 #else
1014 if (((fcntl (redir_fd, F_GETFD, 0) == 1) || (redir_fd < 2 && (flags & RX_INTERNAL)) || (flags & RX_CLEXEC)) &&
1015 (redirector > 2))
1016 #endif
1017 SET_CLOSE_ON_EXEC (redirector);
1018
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);
1025
1026 /* dup-and-close redirection */
1027 if (ri == r_move_input || ri == r_move_output)
1028 {
1029 xtrace_fdchk (redir_fd);
1030
1031 close (redir_fd);
1032 #if defined (COPROCESS_SUPPORT)
1033 coproc_fdchk (redir_fd); /* XXX - loses coproc fds */
1034 #endif
1035 }
1036 }
1037 break;
1038
1039 case r_close_this:
1040 if (flags & RX_ACTIVE)
1041 {
1042 if (redirect->rflags & REDIR_VARASSIGN)
1043 {
1044 redirector = redir_varvalue (redirect);
1045 if (redirector < 0)
1046 return AMBIGUOUS_REDIRECT;
1047 }
1048
1049 if ((flags & RX_UNDOABLE) && (fcntl (redirector, F_GETFD, 0) != -1))
1050 add_undo_redirect (redirector, ri, -1);
1051
1052 #if defined (COPROCESS_SUPPORT)
1053 coproc_fdchk (redirector);
1054 #endif
1055 xtrace_fdchk (redirector);
1056
1057 #if defined (BUFFERED_INPUT)
1058 check_bash_input (redirector);
1059 close_buffered_fd (redirector);
1060 #else /* !BUFFERED_INPUT */
1061 close (redirector);
1062 #endif /* !BUFFERED_INPUT */
1063 }
1064 break;
1065
1066 case r_duplicating_input_word:
1067 case r_duplicating_output_word:
1068 break;
1069 }
1070 return (0);
1071 }
1072
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. */
1085 static int
1086 add_undo_redirect (fd, ri, fdbase)
1087 int fd;
1088 enum r_instruction ri;
1089 int fdbase;
1090 {
1091 int new_fd, clexec_flag;
1092 REDIRECT *new_redirect, *closer, *dummy_redirect;
1093 REDIRECTEE sd;
1094
1095 new_fd = fcntl (fd, F_DUPFD, (fdbase < SHELL_FD_BASE) ? SHELL_FD_BASE : fdbase+1);
1096 if (new_fd < 0)
1097 new_fd = fcntl (fd, F_DUPFD, SHELL_FD_BASE);
1098
1099 if (new_fd < 0)
1100 {
1101 sys_error (_("redirection error: cannot duplicate fd"));
1102 return (-1);
1103 }
1104
1105 clexec_flag = fcntl (fd, F_GETFD, 0);
1106
1107 sd.dest = new_fd;
1108 rd.dest = 0;
1109 closer = make_redirection (sd, r_close_this, rd, 0);
1110 closer->flags |= RX_INTERNAL;
1111 dummy_redirect = copy_redirects (closer);
1112
1113 sd.dest = fd;
1114 rd.dest = new_fd;
1115 if (fd == 0)
1116 new_redirect = make_redirection (sd, r_duplicating_input, rd, 0);
1117 else
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;
1123
1124 closer->next = redirection_undo_list;
1125 redirection_undo_list = new_redirect;
1126
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);
1130
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
1138 to save others. */
1139 if (fd >= SHELL_FD_BASE && ri != r_close_this && clexec_flag)
1140 {
1141 sd.dest = fd;
1142 rd.dest = new_fd;
1143 new_redirect = make_redirection (sd, r_duplicating_output, rd, 0);
1144 new_redirect->flags |= RX_INTERNAL;
1145
1146 add_exec_redirect (new_redirect);
1147 }
1148
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);
1161
1162 return (0);
1163 }
1164
1165 /* Set up to close FD when we are finished with the current command
1166 and its redirections. */
1167 static void
1168 add_undo_close_redirect (fd)
1169 int fd;
1170 {
1171 REDIRECT *closer;
1172 REDIRECTEE sd;
1173
1174 sd.dest = fd;
1175 rd.dest = 0;
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;
1180 }
1181
1182 static void
1183 add_exec_redirect (dummy_redirect)
1184 REDIRECT *dummy_redirect;
1185 {
1186 dummy_redirect->next = exec_redirection_undo_list;
1187 exec_redirection_undo_list = dummy_redirect;
1188 }
1189
1190 /* Return 1 if the redirection specified by RI and REDIRECTOR alters the
1191 standard input. */
1192 static int
1193 stdin_redirection (ri, redirector)
1194 enum r_instruction ri;
1195 int redirector;
1196 {
1197 switch (ri)
1198 {
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:
1205 return (1);
1206 case r_duplicating_input:
1207 case r_duplicating_input_word:
1208 case r_close_this:
1209 return (redirector == 0);
1210 case r_output_direction:
1211 case r_appending_to:
1212 case r_duplicating_output:
1213 case r_err_and_out:
1214 case r_append_err_and_out:
1215 case r_output_force:
1216 case r_duplicating_output_word:
1217 return (0);
1218 }
1219 return (0);
1220 }
1221
1222 /* Return non-zero if any of the redirections in REDIRS alter the standard
1223 input. */
1224 int
1225 stdin_redirects (redirs)
1226 REDIRECT *redirs;
1227 {
1228 REDIRECT *rp;
1229 int n;
1230
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);
1234 return n;
1235 }
1236
1237 /* These don't yet handle array references */
1238 static int
1239 redir_varassign (redir, fd)
1240 REDIRECT *redir;
1241 int fd;
1242 {
1243 WORD_DESC *w;
1244 SHELL_VAR *v;
1245
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;
1250
1251 return 0;
1252 }
1253
1254 static int
1255 redir_varvalue (redir)
1256 REDIRECT *redir;
1257 {
1258 SHELL_VAR *v;
1259 char *val;
1260 intmax_t vmax;
1261 int i;
1262
1263 /* XXX - handle set -u here? */
1264 v = find_variable (redir->redirector.filename->word);
1265 if (v == 0 || invisible_p (v))
1266 return -1;
1267
1268 val = get_variable_value (v);
1269 if (val == 0 || *val == 0)
1270 return -1;
1271
1272 if (legal_number (val, &vmax) < 0)
1273 return -1;
1274
1275 i = vmax; /* integer truncation */
1276 return i;
1277 }