Line | Source | Count |
1 | This file is source.def, from which is created source.c. | - |
2 | It implements the builtins "." and "source" in Bash. | - |
3 | | - |
4 | Copyright (C) 1987-2015 Free Software Foundation, Inc. | - |
5 | | - |
6 | This file is part of GNU Bash, the Bourne Again SHell. | - |
7 | | - |
8 | Bash is free software: you can redistribute it and/or modify | - |
9 | it under the terms of the GNU General Public License as published by | - |
10 | the Free Software Foundation, either version 3 of the License, or | - |
11 | (at your option) any later version. | - |
12 | | - |
13 | Bash is distributed in the hope that it will be useful, | - |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - |
16 | GNU General Public License for more details. | - |
17 | | - |
18 | You should have received a copy of the GNU General Public License | - |
19 | along with Bash. If not, see <http: | - |
20 | | - |
21 | $PRODUCES source.c | - |
22 | | - |
23 | $BUILTIN source | - |
24 | $FUNCTION source_builtin | - |
25 | $SHORT_DOC source filename [arguments] | - |
26 | Execute commands from a file in the current shell. | - |
27 | | - |
28 | Read and execute commands from FILENAME in the current shell. The | - |
29 | entries in $PATH are used to find the directory containing FILENAME. | - |
30 | If any ARGUMENTS are supplied, they become the positional parameters | - |
31 | when FILENAME is executed. | - |
32 | | - |
33 | Exit Status: | - |
34 | Returns the status of the last command executed in FILENAME; fails if | - |
35 | FILENAME cannot be read. | - |
36 | $END | - |
37 | | - |
38 | $BUILTIN . | - |
39 | $DOCNAME dot | - |
40 | $FUNCTION source_builtin | - |
41 | $SHORT_DOC . filename [arguments] | - |
42 | Execute commands from a file in the current shell. | - |
43 | | - |
44 | Read and execute commands from FILENAME in the current shell. The | - |
45 | entries in $PATH are used to find the directory containing FILENAME. | - |
46 | If any ARGUMENTS are supplied, they become the positional parameters | - |
47 | when FILENAME is executed. | - |
48 | | - |
49 | Exit Status: | - |
50 | Returns the status of the last command executed in FILENAME; fails if | - |
51 | FILENAME cannot be read. | - |
52 | $END | - |
53 | | - |
54 | #include <config.h> | - |
55 | | - |
56 | #include "../bashtypes.h" | - |
57 | #include "posixstat.h" | - |
58 | #include "filecntl.h" | - |
59 | #if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H) | - |
60 | # include <sys/file.h> | - |
61 | #endif | - |
62 | #include <errno.h> | - |
63 | | - |
64 | #if defined (HAVE_UNISTD_H) | - |
65 | # include <unistd.h> | - |
66 | #endif | - |
67 | | - |
68 | #include "../bashansi.h" | - |
69 | #include "../bashintl.h" | - |
70 | | - |
71 | #include "../shell.h" | - |
72 | #include "../execute_cmd.h" | - |
73 | #include "../flags.h" | - |
74 | #include "../findcmd.h" | - |
75 | #include "common.h" | - |
76 | #include "bashgetopt.h" | - |
77 | #include "../trap.h" | - |
78 | | - |
79 | #if !defined (errno) | - |
80 | extern int errno; | - |
81 | #endif /* !errno */ | - |
82 | | - |
83 | static void maybe_pop_dollar_vars __P((void)); | - |
84 | | - |
85 | | - |
86 | int source_uses_path = 1; | - |
87 | | - |
88 | | - |
89 | | - |
90 | int source_searches_cwd = 1; | - |
91 | | - |
92 | | - |
93 | | - |
94 | | - |
95 | | - |
96 | | - |
97 | | - |
98 | static void | - |
99 | maybe_pop_dollar_vars () | - |
100 | { | - |
101 | if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN))TRUE | evaluated 1197 times by 1 test | FALSE | never evaluated |
TRUE | evaluated 7 times by 1 test | FALSE | evaluated 1190 times by 1 test |
| 0-1197 |
102 | dispose_saved_dollar_vars ();executed 7 times by 1 test: dispose_saved_dollar_vars (); | 7 |
103 | else | - |
104 | pop_dollar_vars ();executed 1190 times by 1 test: pop_dollar_vars (); | 1190 |
105 | if (debugging_mode)TRUE | never evaluated | FALSE | evaluated 1197 times by 1 test |
| 0-1197 |
106 | pop_args (); never executed: pop_args (); | 0 |
107 | set_dollar_vars_unchanged (); | - |
108 | invalidate_cached_quoted_dollar_at (); | - |
109 | }executed 1197 times by 1 test: end of block | 1197 |
110 | | - |
111 | | - |
112 | | - |
113 | | - |
114 | | - |
115 | int | - |
116 | source_builtin (list) | - |
117 | WORD_LIST *list; | - |
118 | { | - |
119 | int result; | - |
120 | char *filename, *debug_trap, *x; | - |
121 | | - |
122 | if (no_options (list))TRUE | evaluated 2 times by 1 test | FALSE | evaluated 1403 times by 1 test |
| 2-1403 |
123 | return (EX_USAGE);executed 2 times by 1 test: return (258); | 2 |
124 | list = loptend; | - |
125 | | - |
126 | if (list == 0)TRUE | evaluated 2 times by 1 test | FALSE | evaluated 1401 times by 1 test |
| 2-1401 |
127 | { | - |
128 | builtin_error (_("filename argument required")); | - |
129 | builtin_usage (); | - |
130 | return (EX_USAGE);executed 2 times by 1 test: return (258); | 2 |
131 | } | - |
132 | | - |
133 | #if defined (RESTRICTED_SHELL) | - |
134 | if (restricted && strchr (list->word->word, '/'))TRUE | evaluated 1 time by 1 test | FALSE | evaluated 1400 times by 1 test |
TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
TRUE | evaluated 1 time by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | evaluated 1 time by 1 test |
| 0-1400 |
135 | { | - |
136 | sh_restricted (list->word->word); | - |
137 | return (EXECUTION_FAILURE);executed 1 time by 1 test: return (1); | 1 |
138 | } | - |
139 | #endif | - |
140 | | - |
141 | filename = (char *)NULL; | - |
142 | | - |
143 | if (posixly_correct && strchr (list->word->word, '/'))TRUE | evaluated 9 times by 1 test | FALSE | evaluated 1391 times by 1 test |
TRUE | evaluated 9 times by 1 test | FALSE | never evaluated |
TRUE | evaluated 9 times by 1 test | FALSE | never evaluated |
TRUE | evaluated 9 times by 1 test | FALSE | never evaluated |
TRUE | never evaluated | FALSE | evaluated 9 times by 1 test |
| 0-1391 |
144 | filename = savestring (list->word->word);executed 9 times by 1 test: filename = (char *)strcpy (sh_xmalloc((1 + strlen (list->word->word)), "./source.def", 144), (list->word->word)); | 9 |
145 | else if (absolute_pathname (list->word->word))TRUE | evaluated 1377 times by 1 test | FALSE | evaluated 14 times by 1 test |
| 14-1377 |
146 | filename = savestring (list->word->word);executed 1377 times by 1 test: filename = (char *)strcpy (sh_xmalloc((1 + strlen (list->word->word)), "./source.def", 146), (list->word->word)); | 1377 |
147 | else if (source_uses_path)TRUE | never evaluated | FALSE | evaluated 14 times by 1 test |
| 0-14 |
148 | filename = find_path_file (list->word->word); never executed: filename = find_path_file (list->word->word); | 0 |
149 | if (filename == 0)TRUE | evaluated 14 times by 1 test | FALSE | evaluated 1386 times by 1 test |
| 14-1386 |
150 | { | - |
151 | if (source_searches_cwd == 0)TRUE | never evaluated | FALSE | evaluated 14 times by 1 test |
| 0-14 |
152 | { | - |
153 | x = printable_filename (list->word->word, 0); | - |
154 | builtin_error (_("%s: file not found"), x); | - |
155 | if (x != list->word->word)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
156 | free (x); never executed: sh_xfree((x), "./source.def", 156); | 0 |
157 | if (posixly_correct && interactive_shell == 0 && executing_command_builtin == 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
158 | { | - |
159 | last_command_exit_value = 1; | - |
160 | jump_to_top_level (EXITPROG); | - |
161 | } never executed: end of block | 0 |
162 | return (EXECUTION_FAILURE); never executed: return (1); | 0 |
163 | } | - |
164 | else | - |
165 | filename = savestring (list->word->word);executed 14 times by 1 test: filename = (char *)strcpy (sh_xmalloc((1 + strlen (list->word->word)), "./source.def", 165), (list->word->word)); | 14 |
166 | } | - |
167 | | - |
168 | begin_unwind_frame ("source"); | - |
169 | add_unwind_protect (xfree, filename); | - |
170 | | - |
171 | if (list->next)TRUE | evaluated 1207 times by 1 test | FALSE | evaluated 193 times by 1 test |
| 193-1207 |
172 | { | - |
173 | push_dollar_vars (); | - |
174 | add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL); | - |
175 | if (debugging_mode || shell_compatibility_level <= 44)TRUE | never evaluated | FALSE | evaluated 1207 times by 1 test |
TRUE | never evaluated | FALSE | evaluated 1207 times by 1 test |
| 0-1207 |
176 | init_bash_argv (); never executed: init_bash_argv (); | 0 |
177 | remember_args (list->next, 1); | - |
178 | if (debugging_mode)TRUE | never evaluated | FALSE | evaluated 1207 times by 1 test |
| 0-1207 |
179 | push_args (list->next); never executed: push_args (list->next); | 0 |
180 | }executed 1207 times by 1 test: end of block | 1207 |
181 | set_dollar_vars_unchanged (); | - |
182 | | - |
183 | | - |
184 | | - |
185 | | - |
186 | debug_trap = TRAP_STRING (DEBUG_TRAP);TRUE | evaluated 28 times by 1 test | FALSE | evaluated 1372 times by 1 test |
TRUE | evaluated 28 times by 1 test | FALSE | never evaluated |
| 0-1372 |
187 | if (debug_trap && function_trace_mode == 0)TRUE | evaluated 28 times by 1 test | FALSE | evaluated 1372 times by 1 test |
TRUE | evaluated 3 times by 1 test | FALSE | evaluated 25 times by 1 test |
| 3-1372 |
188 | { | - |
189 | debug_trap = savestring (debug_trap); | - |
190 | add_unwind_protect (xfree, debug_trap); | - |
191 | add_unwind_protect (maybe_set_debug_trap, debug_trap); | - |
192 | restore_default_signal (DEBUG_TRAP); | - |
193 | }executed 3 times by 1 test: end of block | 3 |
194 | | - |
195 | result = source_file (filename, (list && list->next)); | - |
196 | | - |
197 | run_unwind_frame ("source"); | - |
198 | | - |
199 | return (result);executed 1386 times by 1 test: return (result); | 1386 |
200 | } | - |
| | |