Upload Tizen:Base source
[external/bash.git] / builtins / source.def
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-2009 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://www.gnu.org/licenses/>.
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 "../flags.h"
73 #include "../findcmd.h"
74 #include "common.h"
75 #include "bashgetopt.h"
76 #include "../trap.h"
77
78 #if !defined (errno)
79 extern int errno;
80 #endif /* !errno */
81
82 extern int posixly_correct;
83
84 static void maybe_pop_dollar_vars __P((void));
85
86 /* If non-zero, `.' uses $PATH to look up the script to be sourced. */
87 int source_uses_path = 1;
88
89 /* If non-zero, `.' looks in the current directory if the filename argument
90    is not found in the $PATH. */
91 int source_searches_cwd = 1;
92
93 /* If this . script is supplied arguments, we save the dollar vars and
94    replace them with the script arguments for the duration of the script's
95    execution.  If the script does not change the dollar vars, we restore
96    what we saved.  If the dollar vars are changed in the script, and we are
97    not executing a shell function, we leave the new values alone and free
98    the saved values. */
99 static void
100 maybe_pop_dollar_vars ()
101 {
102   if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN))
103     dispose_saved_dollar_vars ();
104   else
105     pop_dollar_vars ();
106   if (debugging_mode)
107     pop_args ();        /* restore BASH_ARGC and BASH_ARGV */
108   set_dollar_vars_unchanged ();
109 }
110
111 /* Read and execute commands from the file passed as argument.  Guess what.
112    This cannot be done in a subshell, since things like variable assignments
113    take place in there.  So, I open the file, place it into a large string,
114    close the file, and then execute the string. */
115 int
116 source_builtin (list)
117      WORD_LIST *list;
118 {
119   int result;
120   char *filename, *debug_trap;
121
122   if (no_options (list))
123     return (EX_USAGE);
124   list = loptend;
125
126   if (list == 0)
127     {
128       builtin_error (_("filename argument required"));
129       builtin_usage ();
130       return (EX_USAGE);
131     }
132
133 #if defined (RESTRICTED_SHELL)
134   if (restricted && strchr (list->word->word, '/'))
135     {
136       sh_restricted (list->word->word);
137       return (EXECUTION_FAILURE);
138     }
139 #endif
140
141   filename = (char *)NULL;
142   /* XXX -- should this be absolute_pathname? */
143   if (posixly_correct && strchr (list->word->word, '/'))
144     filename = savestring (list->word->word);
145   else if (absolute_pathname (list->word->word))
146     filename = savestring (list->word->word);
147   else if (source_uses_path)
148     filename = find_path_file (list->word->word);
149   if (filename == 0)
150     {
151       if (source_searches_cwd == 0)
152         {
153           builtin_error (_("%s: file not found"), list->word->word);
154           return (EXECUTION_FAILURE);
155         }
156       else
157         filename = savestring (list->word->word);
158     }
159
160   begin_unwind_frame ("source");
161   add_unwind_protect ((Function *)xfree, filename);
162
163   if (list->next)
164     {
165       push_dollar_vars ();
166       add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL);
167       remember_args (list->next, 1);
168       if (debugging_mode)
169         push_args (list->next); /* Update BASH_ARGV and BASH_ARGC */
170     }
171   set_dollar_vars_unchanged ();
172
173   /* Don't inherit the DEBUG trap unless function_trace_mode (overloaded)
174      is set.  XXX - should sourced files inherit the RETURN trap?  Functions
175      don't. */
176   debug_trap = TRAP_STRING (DEBUG_TRAP);
177   if (debug_trap && function_trace_mode == 0)
178     {
179       debug_trap = savestring (debug_trap);
180       add_unwind_protect (xfree, debug_trap);
181       add_unwind_protect (set_debug_trap, debug_trap);
182       restore_default_signal (DEBUG_TRAP);
183     }
184
185   result = source_file (filename, (list && list->next));
186
187   run_unwind_frame ("source");
188
189   return (result);
190 }