1 /* evalfile.c - read and evaluate commands from a file or file descriptor */
3 /* Copyright (C) 1996-2009 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
23 #if defined (HAVE_UNISTD_H)
27 #include "../bashtypes.h"
28 #include "posixstat.h"
35 #include "../bashansi.h"
36 #include "../bashintl.h"
40 #include "../builtins.h"
43 #include "../execute_cmd.h"
47 # include "../bashhist.h"
58 /* Flags for _evalfile() */
59 #define FEVAL_ENOENTOK 0x001
60 #define FEVAL_BUILTIN 0x002
61 #define FEVAL_UNWINDPROT 0x004
62 #define FEVAL_NONINT 0x008
63 #define FEVAL_LONGJMP 0x010
64 #define FEVAL_HISTORY 0x020
65 #define FEVAL_CHECKBINARY 0x040
66 #define FEVAL_REGFILE 0x080
67 #define FEVAL_NOPUSHARGS 0x100
69 extern int posixly_correct
;
70 extern int indirection_level
, subshell_environment
;
71 extern int return_catch_flag
, return_catch_value
;
72 extern int last_command_exit_value
;
73 extern int executing_command_builtin
;
75 /* How many `levels' of sourced files we have. */
79 _evalfile (filename
, flags
)
83 volatile int old_interactive
;
84 procenv_t old_return_catch
;
85 int return_val
, fd
, result
, pflags
, i
, nnull
;
86 ssize_t nr
; /* return value from read(2) */
90 sh_vmsg_func_t
*errfunc
;
91 #if defined (ARRAY_VARS)
92 SHELL_VAR
*funcname_v
, *nfv
, *bash_source_v
, *bash_lineno_v
;
93 ARRAY
*funcname_a
, *bash_source_a
, *bash_lineno_a
;
94 # if defined (DEBUGGER)
95 SHELL_VAR
*bash_argv_v
, *bash_argc_v
;
96 ARRAY
*bash_argv_a
, *bash_argc_a
;
103 #if defined (ARRAY_VARS)
104 GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v
, funcname_a
);
105 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v
, bash_source_a
);
106 GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v
, bash_lineno_a
);
107 # if defined (DEBUGGER)
108 GET_ARRAY_FROM_VAR ("BASH_ARGV", bash_argv_v
, bash_argv_a
);
109 GET_ARRAY_FROM_VAR ("BASH_ARGC", bash_argc_v
, bash_argc_a
);
113 fd
= open (filename
, O_RDONLY
);
115 if (fd
< 0 || (fstat (fd
, &finfo
) == -1))
118 if (((flags
& FEVAL_ENOENTOK
) == 0) || errno
!= ENOENT
)
119 file_error (filename
);
121 if (flags
& FEVAL_LONGJMP
)
123 last_command_exit_value
= 1;
124 jump_to_top_level (EXITPROG
);
127 return ((flags
& FEVAL_BUILTIN
) ? EXECUTION_FAILURE
128 : ((errno
== ENOENT
) ? 0 : -1));
131 errfunc
= ((flags
& FEVAL_BUILTIN
) ? builtin_error
: internal_error
);
133 if (S_ISDIR (finfo
.st_mode
))
135 (*errfunc
) (_("%s: is a directory"), filename
);
136 return ((flags
& FEVAL_BUILTIN
) ? EXECUTION_FAILURE
: -1);
138 else if ((flags
& FEVAL_REGFILE
) && S_ISREG (finfo
.st_mode
) == 0)
140 (*errfunc
) (_("%s: not a regular file"), filename
);
141 return ((flags
& FEVAL_BUILTIN
) ? EXECUTION_FAILURE
: -1);
144 file_size
= (size_t)finfo
.st_size
;
145 /* Check for overflow with large files. */
146 if (file_size
!= finfo
.st_size
|| file_size
+ 1 < file_size
)
148 (*errfunc
) (_("%s: file is too large"), filename
);
149 return ((flags
& FEVAL_BUILTIN
) ? EXECUTION_FAILURE
: -1);
152 if (S_ISREG (finfo
.st_mode
) && file_size
<= SSIZE_MAX
)
154 string
= (char *)xmalloc (1 + file_size
);
155 nr
= read (fd
, string
, file_size
);
160 nr
= zmapfd (fd
, &string
, 0);
166 if (nr
< 0) /* XXX was != file_size, not < 0 */
169 goto file_error_and_exit
;
175 return ((flags
& FEVAL_BUILTIN
) ? EXECUTION_SUCCESS
: 1);
178 if ((flags
& FEVAL_CHECKBINARY
) &&
179 check_binary_file (string
, (nr
> 80) ? 80 : nr
))
182 (*errfunc
) (_("%s: cannot execute binary file"), filename
);
183 return ((flags
& FEVAL_BUILTIN
) ? EX_BINARY_FILE
: -1);
189 for (nnull
= i
= 0; i
< nr
; i
++)
190 if (string
[i
] == '\0')
192 memmove (string
+i
, string
+i
+1, nr
- i
);
194 /* Even if the `check binary' flag is not set, we want to avoid
195 sourcing files with more than 256 null characters -- that
196 probably indicates a binary file. */
197 if ((flags
& FEVAL_BUILTIN
) && ++nnull
> 256)
200 (*errfunc
) (_("%s: cannot execute binary file"), filename
);
201 return ((flags
& FEVAL_BUILTIN
) ? EX_BINARY_FILE
: -1);
206 if (flags
& FEVAL_UNWINDPROT
)
208 begin_unwind_frame ("_evalfile");
210 unwind_protect_int (return_catch_flag
);
211 unwind_protect_jmp_buf (return_catch
);
212 if (flags
& FEVAL_NONINT
)
213 unwind_protect_int (interactive
);
214 unwind_protect_int (sourcelevel
);
218 COPY_PROCENV (return_catch
, old_return_catch
);
219 if (flags
& FEVAL_NONINT
)
220 old_interactive
= interactive
;
223 if (flags
& FEVAL_NONINT
)
229 #if defined (ARRAY_VARS)
230 array_push (bash_source_a
, (char *)filename
);
231 t
= itos (executing_line_number ());
232 array_push (bash_lineno_a
, t
);
234 array_push (funcname_a
, "source"); /* not exactly right */
235 # if defined (DEBUGGER)
236 /* Have to figure out a better way to do this when `source' is supplied
238 if ((flags
& FEVAL_NOPUSHARGS
) == 0)
240 array_push (bash_argv_a
, (char *)filename
);
241 tt
[0] = '1'; tt
[1] = '\0';
242 array_push (bash_argc_a
, tt
);
247 /* set the flags to be passed to parse_and_execute */
248 pflags
= SEVAL_RESETLINE
;
249 pflags
|= (flags
& FEVAL_HISTORY
) ? 0 : SEVAL_NOHIST
;
251 if (flags
& FEVAL_BUILTIN
)
252 result
= EXECUTION_SUCCESS
;
254 return_val
= setjmp (return_catch
);
256 /* If `return' was seen outside of a function, but in the script, then
257 force parse_and_execute () to clean up. */
260 parse_and_execute_cleanup ();
261 result
= return_catch_value
;
264 result
= parse_and_execute (string
, filename
, pflags
);
266 if (flags
& FEVAL_UNWINDPROT
)
267 run_unwind_frame ("_evalfile");
270 if (flags
& FEVAL_NONINT
)
271 interactive
= old_interactive
;
274 COPY_PROCENV (old_return_catch
, return_catch
);
277 #if defined (ARRAY_VARS)
278 /* These two variables cannot be unset, and cannot be affected by the
280 array_pop (bash_source_a
);
281 array_pop (bash_lineno_a
);
283 /* FUNCNAME can be unset, and so can potentially be changed by the
285 GET_ARRAY_FROM_VAR ("FUNCNAME", nfv
, funcname_a
);
286 if (nfv
== funcname_v
)
287 array_pop (funcname_a
);
288 # if defined (DEBUGGER)
289 if ((flags
& FEVAL_NOPUSHARGS
) == 0)
291 array_pop (bash_argc_a
);
292 array_pop (bash_argv_a
);
297 return ((flags
& FEVAL_BUILTIN
) ? result
: 1);
301 maybe_execute_file (fname
, force_noninteractive
)
303 int force_noninteractive
;
308 filename
= bash_tilde_expand (fname
, 0);
309 flags
= FEVAL_ENOENTOK
;
310 if (force_noninteractive
)
311 flags
|= FEVAL_NONINT
;
312 result
= _evalfile (filename
, flags
);
317 #if defined (HISTORY)
319 fc_execute_file (filename
)
320 const char *filename
;
324 /* We want these commands to show up in the history list if
325 remember_on_history is set. */
326 flags
= FEVAL_ENOENTOK
|FEVAL_HISTORY
|FEVAL_REGFILE
;
327 return (_evalfile (filename
, flags
));
332 source_file (filename
, sflags
)
333 const char *filename
;
338 flags
= FEVAL_BUILTIN
|FEVAL_UNWINDPROT
|FEVAL_NONINT
;
340 flags
|= FEVAL_NOPUSHARGS
;
341 /* POSIX shells exit if non-interactive and file error. */
342 if (posixly_correct
&& interactive_shell
== 0 && executing_command_builtin
== 0)
343 flags
|= FEVAL_LONGJMP
;
344 rval
= _evalfile (filename
, flags
);