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