blob: ce8087f77b86555891dace28dce8e18f8c3c14f0 [file] [log] [blame]
Jari Aaltobb706242000-03-17 21:46:59 +00001/* shell.c -- GNU's idea of the POSIX shell specification. */
Jari Aalto726f6381996-08-26 18:22:31 +00002
Chet Ramey8868eda2020-12-06 15:51:17 -05003/* Copyright (C) 1987-2019 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00004
Jari Aaltobb706242000-03-17 21:46:59 +00005 This file is part of GNU Bash, the Bourne Again SHell.
Jari Aalto726f6381996-08-26 18:22:31 +00006
Jari Aalto31859422009-01-12 13:36:28 +00007 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.
Jari Aalto726f6381996-08-26 18:22:31 +000011
Jari Aalto31859422009-01-12 13:36:28 +000012 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.
Jari Aalto726f6381996-08-26 18:22:31 +000016
Jari Aaltobb706242000-03-17 21:46:59 +000017 You should have received a copy of the GNU General Public License
Jari Aalto31859422009-01-12 13:36:28 +000018 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
Jari Aalto726f6381996-08-26 18:22:31 +000020
Jari Aalto31859422009-01-12 13:36:28 +000021/*
Jari Aalto726f6381996-08-26 18:22:31 +000022 Birthdate:
23 Sunday, January 10th, 1988.
24 Initial author: Brian Fox
25*/
26#define INSTALL_DEBUG_MODE
27
Jari Aaltoccc6cda1996-12-23 17:02:34 +000028#include "config.h"
29
Jari Aalto726f6381996-08-26 18:22:31 +000030#include "bashtypes.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000031#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000032# include <sys/file.h>
33#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +000034#include "posixstat.h"
Jari Aaltof73dda02001-11-13 17:56:06 +000035#include "posixtime.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000036#include "bashansi.h"
Jari Aalto726f6381996-08-26 18:22:31 +000037#include <stdio.h>
38#include <signal.h>
39#include <errno.h>
Jari Aalto726f6381996-08-26 18:22:31 +000040#include "filecntl.h"
Chet Rameya0c0a002016-09-15 16:59:08 -040041#if defined (HAVE_PWD_H)
42# include <pwd.h>
43#endif
Jari Aalto726f6381996-08-26 18:22:31 +000044
Jari Aaltoccc6cda1996-12-23 17:02:34 +000045#if defined (HAVE_UNISTD_H)
46# include <unistd.h>
Jari Aalto726f6381996-08-26 18:22:31 +000047#endif
48
Jari Aaltob80f6442004-07-27 13:29:18 +000049#include "bashintl.h"
50
Jari Aaltof73dda02001-11-13 17:56:06 +000051#define NEED_SH_SETLINEBUF_DECL /* used in externs.h */
52
Jari Aalto726f6381996-08-26 18:22:31 +000053#include "shell.h"
Chet Rameyd233b482019-01-07 09:27:52 -050054#include "parser.h"
Jari Aalto726f6381996-08-26 18:22:31 +000055#include "flags.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000056#include "trap.h"
57#include "mailcheck.h"
58#include "builtins.h"
59#include "builtins/common.h"
Jari Aalto726f6381996-08-26 18:22:31 +000060
61#if defined (JOB_CONTROL)
62#include "jobs.h"
Chet Rameya0c0a002016-09-15 16:59:08 -040063#else
Chet Rameyd233b482019-01-07 09:27:52 -050064extern int running_in_background;
Chet Ramey8868eda2020-12-06 15:51:17 -050065extern int initialize_job_control PARAMS((int));
66extern int get_tty_state PARAMS((void));
Jari Aalto726f6381996-08-26 18:22:31 +000067#endif /* JOB_CONTROL */
68
69#include "input.h"
70#include "execute_cmd.h"
Jari Aaltocce855b1998-04-17 19:52:44 +000071#include "findcmd.h"
Jari Aalto726f6381996-08-26 18:22:31 +000072
Jari Aalto7117c2d2002-07-17 14:10:11 +000073#if defined (USING_BASH_MALLOC) && defined (DEBUG) && !defined (DISABLE_MALLOC_WRAPPERS)
74# include <malloc/shmalloc.h>
75#endif
76
Jari Aalto726f6381996-08-26 18:22:31 +000077#if defined (HISTORY)
78# include "bashhist.h"
79# include <readline/history.h>
80#endif
81
Jari Aalto31859422009-01-12 13:36:28 +000082#if defined (READLINE)
Chet Ramey84c617e2015-01-15 10:21:08 -050083# include <readline/readline.h>
Jari Aalto31859422009-01-12 13:36:28 +000084# include "bashline.h"
85#endif
86
Jari Aalto726f6381996-08-26 18:22:31 +000087#include <tilde/tilde.h>
Jari Aaltof73dda02001-11-13 17:56:06 +000088#include <glob/strmatch.h>
Jari Aalto726f6381996-08-26 18:22:31 +000089
Jari Aaltob72432f1999-02-19 17:11:39 +000090#if defined (__OPENNT)
91# include <opennt/opennt.h>
92#endif
93
Jari Aaltoccc6cda1996-12-23 17:02:34 +000094#if !defined (HAVE_GETPW_DECLS)
Jari Aalto726f6381996-08-26 18:22:31 +000095extern struct passwd *getpwuid ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +000096#endif /* !HAVE_GETPW_DECLS */
Jari Aalto726f6381996-08-26 18:22:31 +000097
Jari Aalto726f6381996-08-26 18:22:31 +000098#if !defined (errno)
99extern int errno;
100#endif
101
Jari Aaltob72432f1999-02-19 17:11:39 +0000102#if defined (NO_MAIN_ENV_ARG)
103extern char **environ; /* used if no third argument to main() */
104#endif
105
Jari Aalto95732b42005-12-07 14:08:12 +0000106extern int gnu_error_format;
Jari Aalto726f6381996-08-26 18:22:31 +0000107
108/* Non-zero means that this shell has already been run; i.e. you should
109 call shell_reinitialize () if you need to start afresh. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000110int shell_initialized = 0;
Chet Rameyd233b482019-01-07 09:27:52 -0500111int bash_argv_initialized = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000112
113COMMAND *global_command = (COMMAND *)NULL;
114
Jari Aalto726f6381996-08-26 18:22:31 +0000115/* Information about the current user. */
116struct user_info current_user =
117{
Jari Aaltof73dda02001-11-13 17:56:06 +0000118 (uid_t)-1, (uid_t)-1, (gid_t)-1, (gid_t)-1,
119 (char *)NULL, (char *)NULL, (char *)NULL
Jari Aalto726f6381996-08-26 18:22:31 +0000120};
121
122/* The current host's name. */
123char *current_host_name = (char *)NULL;
124
125/* Non-zero means that this shell is a login shell.
126 Specifically:
127 0 = not login shell.
128 1 = login shell from getty (or equivalent fake out)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000129 -1 = login shell from "--login" (or -l) flag.
Jari Aalto726f6381996-08-26 18:22:31 +0000130 -2 = both from getty, and from flag.
131 */
132int login_shell = 0;
133
134/* Non-zero means that at this moment, the shell is interactive. In
135 general, this means that the shell is at this moment reading input
136 from the keyboard. */
137int interactive = 0;
138
139/* Non-zero means that the shell was started as an interactive shell. */
140int interactive_shell = 0;
141
Jari Aaltocce855b1998-04-17 19:52:44 +0000142/* Non-zero means to send a SIGHUP to all jobs when an interactive login
143 shell exits. */
144int hup_on_exit = 0;
145
Jari Aalto31859422009-01-12 13:36:28 +0000146/* Non-zero means to list status of running and stopped jobs at shell exit */
147int check_jobs_at_exit = 0;
148
149/* Non-zero means to change to a directory name supplied as a command name */
150int autocd = 0;
151
Jari Aalto726f6381996-08-26 18:22:31 +0000152/* Tells what state the shell was in when it started:
153 0 = non-interactive shell script
154 1 = interactive
155 2 = -c command
Jari Aalto7117c2d2002-07-17 14:10:11 +0000156 3 = wordexp evaluation
Jari Aalto726f6381996-08-26 18:22:31 +0000157 This is a superset of the information provided by interactive_shell.
158*/
159int startup_state = 0;
Chet Rameya0c0a002016-09-15 16:59:08 -0400160int reading_shell_script = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000161
162/* Special debugging helper. */
163int debugging_login_shell = 0;
164
165/* The environment that the shell passes to other commands. */
166char **shell_environment;
167
168/* Non-zero when we are executing a top-level command. */
169int executing = 0;
170
171/* The number of commands executed so far. */
172int current_command_number = 1;
173
Jari Aalto726f6381996-08-26 18:22:31 +0000174/* Non-zero is the recursion depth for commands. */
175int indirection_level = 0;
176
Jari Aalto726f6381996-08-26 18:22:31 +0000177/* The name of this shell, as taken from argv[0]. */
178char *shell_name = (char *)NULL;
179
180/* time in seconds when the shell was started */
181time_t shell_start_time;
Chet Ramey8868eda2020-12-06 15:51:17 -0500182struct timeval shellstart;
Jari Aalto726f6381996-08-26 18:22:31 +0000183
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000184/* Are we running in an emacs shell window? */
185int running_under_emacs;
186
Jari Aalto31859422009-01-12 13:36:28 +0000187/* Do we have /dev/fd? */
188#ifdef HAVE_DEV_FD
189int have_devfd = HAVE_DEV_FD;
190#else
191int have_devfd = 0;
192#endif
193
Jari Aalto726f6381996-08-26 18:22:31 +0000194/* The name of the .(shell)rc file. */
Chet Rameya0c0a002016-09-15 16:59:08 -0400195static char *bashrc_file = DEFAULT_BASHRC;
Jari Aalto726f6381996-08-26 18:22:31 +0000196
197/* Non-zero means to act more like the Bourne shell on startup. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000198static int act_like_sh;
199
200/* Non-zero if this shell is being run by `su'. */
201static int su_shell;
202
203/* Non-zero if we have already expanded and sourced $ENV. */
204static int sourced_env;
205
206/* Is this shell running setuid? */
207static int running_setuid;
Jari Aalto726f6381996-08-26 18:22:31 +0000208
209/* Values for the long-winded argument names. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000210static int debugging; /* Do debugging things. */
211static int no_rc; /* Don't execute ~/.bashrc */
212static int no_profile; /* Don't execute .profile */
213static int do_version; /* Display interesting version info. */
214static int make_login_shell; /* Make this shell be a `-bash' shell. */
215static int want_initial_help; /* --help option */
Jari Aalto726f6381996-08-26 18:22:31 +0000216
Jari Aaltob80f6442004-07-27 13:29:18 +0000217int debugging_mode = 0; /* In debugging mode with --debugger */
Chet Rameyac50fba2014-02-26 09:36:43 -0500218#if defined (READLINE)
219int no_line_editing = 0; /* non-zero -> don't do fancy line editing. */
220#else
221int no_line_editing = 1; /* can't have line editing without readline */
222#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000223int dump_translatable_strings; /* Dump strings in $"...", don't execute. */
Jari Aaltocce855b1998-04-17 19:52:44 +0000224int dump_po_strings; /* Dump strings in $"..." in po format */
225int wordexp_only = 0; /* Do word expansion only */
Jari Aaltob80f6442004-07-27 13:29:18 +0000226int protected_mode = 0; /* No command substitution with --wordexp */
Jari Aalto726f6381996-08-26 18:22:31 +0000227
Chet Rameyd233b482019-01-07 09:27:52 -0500228int pretty_print_mode = 0; /* pretty-print a shell script */
229
Jari Aalto95732b42005-12-07 14:08:12 +0000230#if defined (STRICT_POSIX)
231int posixly_correct = 1; /* Non-zero means posix.2 superset. */
232#else
233int posixly_correct = 0; /* Non-zero means posix.2 superset. */
234#endif
235
Jari Aalto726f6381996-08-26 18:22:31 +0000236/* Some long-winded argument names. These are obviously new. */
237#define Int 1
238#define Charp 2
Jari Aalto31859422009-01-12 13:36:28 +0000239static const struct {
240 const char *name;
Jari Aalto726f6381996-08-26 18:22:31 +0000241 int type;
242 int *int_value;
243 char **char_value;
244} long_args[] = {
245 { "debug", Int, &debugging, (char **)0x0 },
Jari Aaltob80f6442004-07-27 13:29:18 +0000246#if defined (DEBUGGER)
247 { "debugger", Int, &debugging_mode, (char **)0x0 },
248#endif
Jari Aaltocce855b1998-04-17 19:52:44 +0000249 { "dump-po-strings", Int, &dump_po_strings, (char **)0x0 },
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000250 { "dump-strings", Int, &dump_translatable_strings, (char **)0x0 },
251 { "help", Int, &want_initial_help, (char **)0x0 },
Jari Aalto28ef6c32001-04-06 19:14:31 +0000252 { "init-file", Charp, (int *)0x0, &bashrc_file },
Jari Aalto726f6381996-08-26 18:22:31 +0000253 { "login", Int, &make_login_shell, (char **)0x0 },
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000254 { "noediting", Int, &no_line_editing, (char **)0x0 },
255 { "noprofile", Int, &no_profile, (char **)0x0 },
256 { "norc", Int, &no_rc, (char **)0x0 },
Jari Aalto726f6381996-08-26 18:22:31 +0000257 { "posix", Int, &posixly_correct, (char **)0x0 },
Chet Rameyd233b482019-01-07 09:27:52 -0500258 { "pretty-print", Int, &pretty_print_mode, (char **)0x0 },
Chet Rameyac50fba2014-02-26 09:36:43 -0500259#if defined (WORDEXP_OPTION)
Jari Aaltob80f6442004-07-27 13:29:18 +0000260 { "protected", Int, &protected_mode, (char **)0x0 },
Chet Rameyac50fba2014-02-26 09:36:43 -0500261#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000262 { "rcfile", Charp, (int *)0x0, &bashrc_file },
263#if defined (RESTRICTED_SHELL)
264 { "restricted", Int, &restricted, (char **)0x0 },
265#endif
Chet Rameya0c0a002016-09-15 16:59:08 -0400266 { "verbose", Int, &verbose_flag, (char **)0x0 },
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000267 { "version", Int, &do_version, (char **)0x0 },
Chet Ramey00018032011-11-21 20:51:19 -0500268#if defined (WORDEXP_OPTION)
Jari Aaltocce855b1998-04-17 19:52:44 +0000269 { "wordexp", Int, &wordexp_only, (char **)0x0 },
Chet Ramey00018032011-11-21 20:51:19 -0500270#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000271 { (char *)0x0, Int, (int *)0x0, (char **)0x0 }
272};
273
274/* These are extern so execute_simple_command can set them, and then
275 longjmp back to main to execute a shell script, instead of calling
276 main () again and resulting in indefinite, possibly fatal, stack
277 growth. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000278procenv_t subshell_top_level;
Jari Aalto726f6381996-08-26 18:22:31 +0000279int subshell_argc;
280char **subshell_argv;
281char **subshell_envp;
282
Chet Ramey495aee42011-11-22 19:11:26 -0500283char *exec_argv0;
284
Jari Aalto726f6381996-08-26 18:22:31 +0000285#if defined (BUFFERED_INPUT)
286/* The file descriptor from which the shell is reading input. */
287int default_buffered_input = -1;
288#endif
289
Jari Aaltobb706242000-03-17 21:46:59 +0000290/* The following two variables are not static so they can show up in $-. */
291int read_from_stdin; /* -s flag supplied */
292int want_pending_command; /* -c flag supplied */
293
Jari Aaltob80f6442004-07-27 13:29:18 +0000294/* This variable is not static so it can be bound to $BASH_EXECUTION_STRING */
295char *command_execution_string; /* argument to -c option */
Chet Rameyd233b482019-01-07 09:27:52 -0500296char *shell_script_filename; /* shell script */
Jari Aaltob80f6442004-07-27 13:29:18 +0000297
Jari Aalto7117c2d2002-07-17 14:10:11 +0000298int malloc_trace_at_exit = 0;
299
Jari Aalto28ef6c32001-04-06 19:14:31 +0000300static int shell_reinitialized = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000301
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000302static FILE *default_input;
Jari Aalto726f6381996-08-26 18:22:31 +0000303
Jari Aaltof73dda02001-11-13 17:56:06 +0000304static STRING_INT_ALIST *shopt_alist;
305static int shopt_ind = 0, shopt_len = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000306
Chet Ramey8868eda2020-12-06 15:51:17 -0500307static int parse_long_options PARAMS((char **, int, int));
308static int parse_shell_options PARAMS((char **, int, int));
309static int bind_args PARAMS((char **, int, int, int));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000310
Chet Ramey8868eda2020-12-06 15:51:17 -0500311static void start_debugger PARAMS((void));
Jari Aaltob80f6442004-07-27 13:29:18 +0000312
Chet Ramey8868eda2020-12-06 15:51:17 -0500313static void add_shopt_to_alist PARAMS((char *, int));
314static void run_shopt_alist PARAMS((void));
Jari Aalto726f6381996-08-26 18:22:31 +0000315
Chet Ramey8868eda2020-12-06 15:51:17 -0500316static void execute_env_file PARAMS((char *));
317static void run_startup_files PARAMS((void));
318static int open_shell_script PARAMS((char *));
319static void set_bash_input PARAMS((void));
320static int run_one_command PARAMS((char *));
Chet Ramey00018032011-11-21 20:51:19 -0500321#if defined (WORDEXP_OPTION)
Chet Ramey8868eda2020-12-06 15:51:17 -0500322static int run_wordexp PARAMS((char *));
Chet Ramey00018032011-11-21 20:51:19 -0500323#endif
Jari Aaltof73dda02001-11-13 17:56:06 +0000324
Chet Ramey8868eda2020-12-06 15:51:17 -0500325static int uidget PARAMS((void));
Jari Aaltof73dda02001-11-13 17:56:06 +0000326
Chet Ramey8868eda2020-12-06 15:51:17 -0500327static void set_option_defaults PARAMS((void));
328static void reset_option_defaults PARAMS((void));
Jari Aaltof73dda02001-11-13 17:56:06 +0000329
Chet Ramey8868eda2020-12-06 15:51:17 -0500330static void init_interactive PARAMS((void));
331static void init_noninteractive PARAMS((void));
332static void init_interactive_script PARAMS((void));
Jari Aaltof73dda02001-11-13 17:56:06 +0000333
Chet Ramey8868eda2020-12-06 15:51:17 -0500334static void set_shell_name PARAMS((char *));
335static void shell_initialize PARAMS((void));
336static void shell_reinitialize PARAMS((void));
337
338static void show_shell_usage PARAMS((FILE *, int));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000339
Jari Aalto28ef6c32001-04-06 19:14:31 +0000340#ifdef __CYGWIN__
Jari Aaltocce855b1998-04-17 19:52:44 +0000341static void
342_cygwin32_check_tmp ()
343{
344 struct stat sb;
345
346 if (stat ("/tmp", &sb) < 0)
Jari Aaltob80f6442004-07-27 13:29:18 +0000347 internal_warning (_("could not find /tmp, please create!"));
Jari Aaltocce855b1998-04-17 19:52:44 +0000348 else
349 {
350 if (S_ISDIR (sb.st_mode) == 0)
Jari Aaltob80f6442004-07-27 13:29:18 +0000351 internal_warning (_("/tmp must be a valid directory name"));
Jari Aaltocce855b1998-04-17 19:52:44 +0000352 }
353}
Jari Aalto28ef6c32001-04-06 19:14:31 +0000354#endif /* __CYGWIN__ */
Jari Aaltocce855b1998-04-17 19:52:44 +0000355
Jari Aaltob72432f1999-02-19 17:11:39 +0000356#if defined (NO_MAIN_ENV_ARG)
357/* systems without third argument to main() */
358int
359main (argc, argv)
360 int argc;
361 char **argv;
362#else /* !NO_MAIN_ENV_ARG */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000363int
Jari Aalto726f6381996-08-26 18:22:31 +0000364main (argc, argv, env)
365 int argc;
366 char **argv, **env;
Jari Aaltob72432f1999-02-19 17:11:39 +0000367#endif /* !NO_MAIN_ENV_ARG */
Jari Aalto726f6381996-08-26 18:22:31 +0000368{
369 register int i;
Jari Aaltof73dda02001-11-13 17:56:06 +0000370 int code, old_errexit_flag;
371#if defined (RESTRICTED_SHELL)
372 int saverst;
373#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000374 volatile int locally_skip_execution;
375 volatile int arg_index, top_level_arg_index;
Jari Aaltob72432f1999-02-19 17:11:39 +0000376#ifdef __OPENNT
377 char **env;
378
379 env = environ;
380#endif /* __OPENNT */
Jari Aalto726f6381996-08-26 18:22:31 +0000381
Jari Aaltof73dda02001-11-13 17:56:06 +0000382 USE_VAR(argc);
383 USE_VAR(argv);
384 USE_VAR(env);
385 USE_VAR(code);
386 USE_VAR(old_errexit_flag);
387#if defined (RESTRICTED_SHELL)
388 USE_VAR(saverst);
389#endif
390
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000391 /* Catch early SIGINTs. */
Chet Rameyac50fba2014-02-26 09:36:43 -0500392 code = setjmp_nosigs (top_level);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000393 if (code)
394 exit (2);
Jari Aalto726f6381996-08-26 18:22:31 +0000395
Chet Ramey00018032011-11-21 20:51:19 -0500396 xtrace_init ();
397
Jari Aalto7117c2d2002-07-17 14:10:11 +0000398#if defined (USING_BASH_MALLOC) && defined (DEBUG) && !defined (DISABLE_MALLOC_WRAPPERS)
Chet Rameya0c0a002016-09-15 16:59:08 -0400399 malloc_set_register (1); /* XXX - change to 1 for malloc debugging */
Jari Aaltof73dda02001-11-13 17:56:06 +0000400#endif
401
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000402 check_dev_tty ();
Jari Aalto726f6381996-08-26 18:22:31 +0000403
Jari Aalto28ef6c32001-04-06 19:14:31 +0000404#ifdef __CYGWIN__
Jari Aaltocce855b1998-04-17 19:52:44 +0000405 _cygwin32_check_tmp ();
Jari Aalto28ef6c32001-04-06 19:14:31 +0000406#endif /* __CYGWIN__ */
Jari Aaltocce855b1998-04-17 19:52:44 +0000407
Jari Aalto726f6381996-08-26 18:22:31 +0000408 /* Wait forever if we are debugging a login shell. */
Jari Aalto95732b42005-12-07 14:08:12 +0000409 while (debugging_login_shell) sleep (3);
Jari Aalto726f6381996-08-26 18:22:31 +0000410
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000411 set_default_locale ();
Jari Aalto726f6381996-08-26 18:22:31 +0000412
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000413 running_setuid = uidget ();
Jari Aalto726f6381996-08-26 18:22:31 +0000414
Jari Aalto28ef6c32001-04-06 19:14:31 +0000415 if (getenv ("POSIXLY_CORRECT") || getenv ("POSIX_PEDANTIC"))
416 posixly_correct = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000417
418#if defined (USE_GNU_MALLOC_LIBRARY)
419 mcheck (programming_error, (void (*) ())0);
420#endif /* USE_GNU_MALLOC_LIBRARY */
421
Chet Rameya0c0a002016-09-15 16:59:08 -0400422 if (setjmp_sigs (subshell_top_level))
Jari Aalto726f6381996-08-26 18:22:31 +0000423 {
424 argc = subshell_argc;
425 argv = subshell_argv;
426 env = subshell_envp;
427 sourced_env = 0;
428 }
429
Jari Aalto28ef6c32001-04-06 19:14:31 +0000430 shell_reinitialized = 0;
431
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000432 /* Initialize `local' variables for all `invocations' of main (). */
Jari Aalto726f6381996-08-26 18:22:31 +0000433 arg_index = 1;
Jari Aalto95732b42005-12-07 14:08:12 +0000434 if (arg_index > argc)
435 arg_index = argc;
Chet Rameyd233b482019-01-07 09:27:52 -0500436 command_execution_string = shell_script_filename = (char *)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000437 want_pending_command = locally_skip_execution = read_from_stdin = 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000438 default_input = stdin;
439#if defined (BUFFERED_INPUT)
440 default_buffered_input = -1;
441#endif
442
443 /* Fix for the `infinite process creation' bug when running shell scripts
444 from startup files on System V. */
445 login_shell = make_login_shell = 0;
446
447 /* If this shell has already been run, then reinitialize it to a
448 vanilla state. */
449 if (shell_initialized || shell_name)
450 {
451 /* Make sure that we do not infinitely recurse as a login shell. */
452 if (*shell_name == '-')
453 shell_name++;
454
455 shell_reinitialize ();
Chet Rameyac50fba2014-02-26 09:36:43 -0500456 if (setjmp_nosigs (top_level))
Jari Aalto726f6381996-08-26 18:22:31 +0000457 exit (2);
458 }
459
Jari Aalto726f6381996-08-26 18:22:31 +0000460 shell_environment = env;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000461 set_shell_name (argv[0]);
Chet Ramey8868eda2020-12-06 15:51:17 -0500462
463 gettimeofday (&shellstart, 0);
464 shell_start_time = shellstart.tv_sec;
Jari Aalto726f6381996-08-26 18:22:31 +0000465
Jari Aalto726f6381996-08-26 18:22:31 +0000466 /* Parse argument flags from the input line. */
467
468 /* Find full word arguments first. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000469 arg_index = parse_long_options (argv, arg_index, argc);
Chet Rameya0c0a002016-09-15 16:59:08 -0400470
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000471 if (want_initial_help)
Jari Aalto726f6381996-08-26 18:22:31 +0000472 {
Jari Aaltod166f041997-06-05 14:59:13 +0000473 show_shell_usage (stdout, 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000474 exit (EXECUTION_SUCCESS);
Jari Aalto726f6381996-08-26 18:22:31 +0000475 }
476
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000477 if (do_version)
478 {
479 show_shell_version (1);
480 exit (EXECUTION_SUCCESS);
481 }
Jari Aalto726f6381996-08-26 18:22:31 +0000482
Chet Rameya0c0a002016-09-15 16:59:08 -0400483 echo_input_at_read = verbose_flag; /* --verbose given */
484
Jari Aalto7117c2d2002-07-17 14:10:11 +0000485 /* All done with full word options; do standard shell option parsing.*/
486 this_command_name = shell_name; /* for error reporting */
487 arg_index = parse_shell_options (argv, arg_index, argc);
488
489 /* If user supplied the "--login" (or -l) flag, then set and invert
490 LOGIN_SHELL. */
Jari Aalto726f6381996-08-26 18:22:31 +0000491 if (make_login_shell)
492 {
493 login_shell++;
494 login_shell = -login_shell;
495 }
496
Chet Ramey00018032011-11-21 20:51:19 -0500497 set_login_shell ("login_shell", login_shell != 0);
Jari Aaltof73dda02001-11-13 17:56:06 +0000498
Jari Aaltocce855b1998-04-17 19:52:44 +0000499 if (dump_po_strings)
500 dump_translatable_strings = 1;
501
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000502 if (dump_translatable_strings)
503 read_but_dont_execute = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000504
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000505 if (running_setuid && privileged_mode == 0)
506 disable_priv_mode ();
Jari Aalto726f6381996-08-26 18:22:31 +0000507
508 /* Need to get the argument to a -c option processed in the
509 above loop. The next arg is a command to execute, and the
510 following args are $0...$n respectively. */
511 if (want_pending_command)
512 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000513 command_execution_string = argv[arg_index];
514 if (command_execution_string == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000515 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000516 report_error (_("%s: option requires an argument"), "-c");
517 exit (EX_BADUSAGE);
Jari Aalto726f6381996-08-26 18:22:31 +0000518 }
519 arg_index++;
520 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000521 this_command_name = (char *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +0000522
523 /* First, let the outside world know about our interactive status.
524 A shell is interactive if the `-i' flag was given, or if all of
525 the following conditions are met:
526 no -c command
527 no arguments remaining or the -s flag given
528 standard input is a terminal
Jari Aaltob80f6442004-07-27 13:29:18 +0000529 standard error is a terminal
Jari Aalto726f6381996-08-26 18:22:31 +0000530 Refer to Posix.2, the description of the `sh' utility. */
531
532 if (forced_interactive || /* -i flag */
Jari Aaltob80f6442004-07-27 13:29:18 +0000533 (!command_execution_string && /* No -c command and ... */
Jari Aaltocce855b1998-04-17 19:52:44 +0000534 wordexp_only == 0 && /* No --wordexp and ... */
Jari Aalto726f6381996-08-26 18:22:31 +0000535 ((arg_index == argc) || /* no remaining args or... */
536 read_from_stdin) && /* -s flag with args, and */
537 isatty (fileno (stdin)) && /* Input is a terminal and */
Jari Aaltob80f6442004-07-27 13:29:18 +0000538 isatty (fileno (stderr)))) /* error output is a terminal. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000539 init_interactive ();
Jari Aalto726f6381996-08-26 18:22:31 +0000540 else
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000541 init_noninteractive ();
Jari Aalto726f6381996-08-26 18:22:31 +0000542
Jari Aalto726f6381996-08-26 18:22:31 +0000543 /*
544 * Some systems have the bad habit of starting login shells with lots of open
545 * file descriptors. For instance, most systems that have picked up the
546 * pre-4.0 Sun YP code leave a file descriptor open each time you call one
547 * of the getpw* functions, and it's set to be open across execs. That
Chet Ramey495aee42011-11-22 19:11:26 -0500548 * means one for login, one for xterm, one for shelltool, etc. There are
549 * also systems that open persistent FDs to other agents or files as part
550 * of process startup; these need to be set to be close-on-exec.
Jari Aalto726f6381996-08-26 18:22:31 +0000551 */
552 if (login_shell && interactive_shell)
553 {
554 for (i = 3; i < 20; i++)
Chet Ramey495aee42011-11-22 19:11:26 -0500555 SET_CLOSE_ON_EXEC (i);
Jari Aalto726f6381996-08-26 18:22:31 +0000556 }
Jari Aalto726f6381996-08-26 18:22:31 +0000557
Jari Aalto7117c2d2002-07-17 14:10:11 +0000558 /* If we're in a strict Posix.2 mode, turn on interactive comments,
559 alias expansion in non-interactive shells, and other Posix.2 things. */
Jari Aaltod166f041997-06-05 14:59:13 +0000560 if (posixly_correct)
561 {
Jari Aalto95732b42005-12-07 14:08:12 +0000562 bind_variable ("POSIXLY_CORRECT", "y", 0);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000563 sv_strict_posix ("POSIXLY_CORRECT");
Jari Aaltod166f041997-06-05 14:59:13 +0000564 }
565
Jari Aaltof73dda02001-11-13 17:56:06 +0000566 /* Now we run the shopt_alist and process the options. */
567 if (shopt_alist)
568 run_shopt_alist ();
569
Jari Aalto726f6381996-08-26 18:22:31 +0000570 /* From here on in, the shell must be a normal functioning shell.
571 Variables from the environment are expected to be set, etc. */
572 shell_initialize ();
573
Jari Aalto06285672006-10-10 14:15:34 +0000574 set_default_lang ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000575 set_default_locale_vars ();
576
Jari Aalto31859422009-01-12 13:36:28 +0000577 /*
Chet Rameya0c0a002016-09-15 16:59:08 -0400578 * M-x term -> TERM=eterm-color INSIDE_EMACS='251,term:0.96' (eterm)
579 * M-x shell -> TERM='dumb' INSIDE_EMACS='25.1,comint' (no line editing)
580 *
581 * Older versions of Emacs may set EMACS to 't' or to something like
582 * '22.1 (term:0.96)' instead of (or in addition to) setting INSIDE_EMACS.
583 * They may set TERM to 'eterm' instead of 'eterm-color'. They may have
584 * a now-obsolete command that sets neither EMACS nor INSIDE_EMACS:
585 * M-x terminal -> TERM='emacs-em7955' (line editing)
Jari Aalto31859422009-01-12 13:36:28 +0000586 */
Jari Aalto726f6381996-08-26 18:22:31 +0000587 if (interactive_shell)
588 {
Chet Rameyd233b482019-01-07 09:27:52 -0500589 char *term, *emacs, *inside_emacs;
Chet Rameya0c0a002016-09-15 16:59:08 -0400590 int emacs_term, in_emacs;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000591
Jari Aaltob80f6442004-07-27 13:29:18 +0000592 term = get_string_value ("TERM");
Jari Aaltob80f6442004-07-27 13:29:18 +0000593 emacs = get_string_value ("EMACS");
Chet Rameya0c0a002016-09-15 16:59:08 -0400594 inside_emacs = get_string_value ("INSIDE_EMACS");
595
596 if (inside_emacs)
597 {
598 emacs_term = strstr (inside_emacs, ",term:") != 0;
599 in_emacs = 1;
600 }
601 else if (emacs)
602 {
603 /* Infer whether we are in an older Emacs. */
604 emacs_term = strstr (emacs, " (term:") != 0;
605 in_emacs = emacs_term || STREQ (emacs, "t");
606 }
607 else
608 in_emacs = emacs_term = 0;
Jari Aalto31859422009-01-12 13:36:28 +0000609
610 /* Not sure any emacs terminal emulator sets TERM=emacs any more */
Chet Rameya0c0a002016-09-15 16:59:08 -0400611 no_line_editing |= STREQ (term, "emacs");
612 no_line_editing |= in_emacs && STREQ (term, "dumb");
Jari Aalto31859422009-01-12 13:36:28 +0000613
614 /* running_under_emacs == 2 for `eterm' */
Chet Rameya0c0a002016-09-15 16:59:08 -0400615 running_under_emacs = in_emacs || STREQN (term, "emacs", 5);
616 running_under_emacs += emacs_term && STREQN (term, "eterm", 5);
Jari Aalto31859422009-01-12 13:36:28 +0000617
Jari Aalto95732b42005-12-07 14:08:12 +0000618 if (running_under_emacs)
619 gnu_error_format = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000620 }
621
622 top_level_arg_index = arg_index;
Jari Aaltob72432f1999-02-19 17:11:39 +0000623 old_errexit_flag = exit_immediately_on_error;
Jari Aalto726f6381996-08-26 18:22:31 +0000624
Jari Aalto726f6381996-08-26 18:22:31 +0000625 /* Give this shell a place to longjmp to before executing the
626 startup files. This allows users to press C-c to abort the
627 lengthy startup. */
Chet Rameya0c0a002016-09-15 16:59:08 -0400628 code = setjmp_sigs (top_level);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000629 if (code)
630 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000631 if (code == EXITPROG || code == ERREXIT)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000632 exit_shell (last_command_exit_value);
633 else
Jari Aaltod166f041997-06-05 14:59:13 +0000634 {
635#if defined (JOB_CONTROL)
636 /* Reset job control, since run_startup_files turned it off. */
637 set_job_control (interactive_shell);
638#endif
Jari Aaltob72432f1999-02-19 17:11:39 +0000639 /* Reset value of `set -e', since it's turned off before running
640 the startup files. */
641 exit_immediately_on_error += old_errexit_flag;
Jari Aaltod166f041997-06-05 14:59:13 +0000642 locally_skip_execution++;
643 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000644 }
Jari Aalto726f6381996-08-26 18:22:31 +0000645
646 arg_index = top_level_arg_index;
647
648 /* Execute the start-up scripts. */
649
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000650 if (interactive_shell == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000651 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000652 unbind_variable ("PS1");
653 unbind_variable ("PS2");
Jari Aalto28ef6c32001-04-06 19:14:31 +0000654 interactive = 0;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000655#if 0
656 /* This has already been done by init_noninteractive */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000657 expand_aliases = posixly_correct;
Jari Aalto7117c2d2002-07-17 14:10:11 +0000658#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000659 }
660 else
661 {
662 change_flag ('i', FLAG_ON);
663 interactive = 1;
664 }
665
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000666#if defined (RESTRICTED_SHELL)
Jari Aaltob72432f1999-02-19 17:11:39 +0000667 /* Set restricted_shell based on whether the basename of $0 indicates that
668 the shell should be restricted or if the `-r' option was supplied at
669 startup. */
670 restricted_shell = shell_is_restricted (shell_name);
671
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000672 /* If the `-r' option is supplied at invocation, make sure that the shell
673 is not in restricted mode when running the startup files. */
Jari Aaltob72432f1999-02-19 17:11:39 +0000674 saverst = restricted;
675 restricted = 0;
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000676#endif
677
Chet Rameyd233b482019-01-07 09:27:52 -0500678 /* Set positional parameters before running startup files. top_level_arg_index
679 holds the index of the current argument before setting the positional
680 parameters, so any changes performed in the startup files won't affect
681 later option processing. */
682 if (wordexp_only)
683 ; /* nothing yet */
684 else if (command_execution_string)
685 arg_index = bind_args (argv, arg_index, argc, 0); /* $0 ... $n */
686 else if (arg_index != argc && read_from_stdin == 0)
687 {
688 shell_script_filename = argv[arg_index++];
689 arg_index = bind_args (argv, arg_index, argc, 1); /* $1 ... $n */
690 }
691 else
692 arg_index = bind_args (argv, arg_index, argc, 1); /* $1 ... $n */
693
Jari Aaltob72432f1999-02-19 17:11:39 +0000694 /* The startup files are run with `set -e' temporarily disabled. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000695 if (locally_skip_execution == 0 && running_setuid == 0)
Jari Aaltob72432f1999-02-19 17:11:39 +0000696 {
697 old_errexit_flag = exit_immediately_on_error;
698 exit_immediately_on_error = 0;
699
700 run_startup_files ();
Jari Aaltob72432f1999-02-19 17:11:39 +0000701 exit_immediately_on_error += old_errexit_flag;
702 }
Jari Aalto726f6381996-08-26 18:22:31 +0000703
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000704 /* If we are invoked as `sh', turn on Posix mode. */
705 if (act_like_sh)
Jari Aaltod166f041997-06-05 14:59:13 +0000706 {
Jari Aalto95732b42005-12-07 14:08:12 +0000707 bind_variable ("POSIXLY_CORRECT", "y", 0);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000708 sv_strict_posix ("POSIXLY_CORRECT");
Jari Aaltod166f041997-06-05 14:59:13 +0000709 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000710
Jari Aalto726f6381996-08-26 18:22:31 +0000711#if defined (RESTRICTED_SHELL)
Jari Aaltocce855b1998-04-17 19:52:44 +0000712 /* Turn on the restrictions after executing the startup files. This
Jari Aaltoe8ce7751997-09-22 20:22:27 +0000713 means that `bash -r' or `set -r' invoked from a startup file will
714 turn on the restrictions after the startup files are executed. */
715 restricted = saverst || restricted;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000716 if (shell_reinitialized == 0)
717 maybe_make_restricted (shell_name);
Jari Aalto726f6381996-08-26 18:22:31 +0000718#endif /* RESTRICTED_SHELL */
719
Chet Ramey00018032011-11-21 20:51:19 -0500720#if defined (WORDEXP_OPTION)
Jari Aaltocce855b1998-04-17 19:52:44 +0000721 if (wordexp_only)
722 {
723 startup_state = 3;
Chet Rameyd233b482019-01-07 09:27:52 -0500724 last_command_exit_value = run_wordexp (argv[top_level_arg_index]);
Jari Aaltocce855b1998-04-17 19:52:44 +0000725 exit_shell (last_command_exit_value);
726 }
Chet Ramey00018032011-11-21 20:51:19 -0500727#endif
Jari Aaltocce855b1998-04-17 19:52:44 +0000728
Chet Rameya0c0a002016-09-15 16:59:08 -0400729 cmd_init (); /* initialize the command object caches */
730 uwp_init ();
731
Jari Aaltob80f6442004-07-27 13:29:18 +0000732 if (command_execution_string)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000733 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000734 startup_state = 2;
Jari Aaltob80f6442004-07-27 13:29:18 +0000735
736 if (debugging_mode)
737 start_debugger ();
738
Jari Aalto726f6381996-08-26 18:22:31 +0000739#if defined (ONESHOT)
Jari Aaltof73dda02001-11-13 17:56:06 +0000740 executing = 1;
Jari Aaltob80f6442004-07-27 13:29:18 +0000741 run_one_command (command_execution_string);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000742 exit_shell (last_command_exit_value);
Jari Aalto726f6381996-08-26 18:22:31 +0000743#else /* ONESHOT */
Jari Aaltob80f6442004-07-27 13:29:18 +0000744 with_input_from_string (command_execution_string, "-c");
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000745 goto read_and_execute;
Jari Aalto726f6381996-08-26 18:22:31 +0000746#endif /* !ONESHOT */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000747 }
748
749 /* Get possible input filename and set up default_buffered_input or
750 default_input as appropriate. */
Chet Rameyd233b482019-01-07 09:27:52 -0500751 if (shell_script_filename)
752 open_shell_script (shell_script_filename);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000753 else if (interactive == 0)
Chet Rameya0c0a002016-09-15 16:59:08 -0400754 {
755 /* In this mode, bash is reading a script from stdin, which is a
756 pipe or redirected file. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000757#if defined (BUFFERED_INPUT)
Chet Rameya0c0a002016-09-15 16:59:08 -0400758 default_buffered_input = fileno (stdin); /* == 0 */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000759#else
Chet Rameya0c0a002016-09-15 16:59:08 -0400760 setbuf (default_input, (char *)NULL);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000761#endif /* !BUFFERED_INPUT */
Chet Rameya0c0a002016-09-15 16:59:08 -0400762 read_from_stdin = 1;
763 }
Chet Rameyd233b482019-01-07 09:27:52 -0500764 else if (top_level_arg_index == argc) /* arg index before startup files */
Chet Rameya0c0a002016-09-15 16:59:08 -0400765 /* "If there are no operands and the -c option is not specified, the -s
766 option shall be assumed." */
767 read_from_stdin = 1;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000768
769 set_bash_input ();
770
Chet Rameya0c0a002016-09-15 16:59:08 -0400771 if (debugging_mode && locally_skip_execution == 0 && running_setuid == 0 && (reading_shell_script || interactive_shell == 0))
Jari Aaltob80f6442004-07-27 13:29:18 +0000772 start_debugger ();
773
Jari Aalto726f6381996-08-26 18:22:31 +0000774 /* Do the things that should be done only for interactive shells. */
775 if (interactive_shell)
776 {
777 /* Set up for checking for presence of mail. */
Jari Aalto726f6381996-08-26 18:22:31 +0000778 reset_mail_timer ();
Jari Aalto31859422009-01-12 13:36:28 +0000779 init_mail_dates ();
Jari Aalto726f6381996-08-26 18:22:31 +0000780
781#if defined (HISTORY)
782 /* Initialize the interactive history stuff. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000783 bash_initialize_history ();
Jari Aalto7117c2d2002-07-17 14:10:11 +0000784 /* Don't load the history from the history file if we've already
785 saved some lines in this session (e.g., by putting `history -s xx'
786 into one of the startup files). */
787 if (shell_initialized == 0 && history_lines_this_session == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000788 load_history ();
789#endif /* HISTORY */
790
791 /* Initialize terminal state for interactive shells after the
792 .bash_profile and .bashrc are interpreted. */
793 get_tty_state ();
794 }
795
Jari Aalto726f6381996-08-26 18:22:31 +0000796#if !defined (ONESHOT)
797 read_and_execute:
798#endif /* !ONESHOT */
799
800 shell_initialized = 1;
801
Chet Rameyd233b482019-01-07 09:27:52 -0500802 if (pretty_print_mode && interactive_shell)
803 {
804 internal_warning (_("pretty-printing mode ignored in interactive shells"));
805 pretty_print_mode = 0;
806 }
807 if (pretty_print_mode)
808 exit_shell (pretty_print_loop ());
809
Jari Aalto726f6381996-08-26 18:22:31 +0000810 /* Read commands until exit condition. */
811 reader_loop ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000812 exit_shell (last_command_exit_value);
813}
Jari Aalto726f6381996-08-26 18:22:31 +0000814
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000815static int
816parse_long_options (argv, arg_start, arg_end)
817 char **argv;
818 int arg_start, arg_end;
819{
820 int arg_index, longarg, i;
821 char *arg_string;
822
823 arg_index = arg_start;
824 while ((arg_index != arg_end) && (arg_string = argv[arg_index]) &&
825 (*arg_string == '-'))
826 {
827 longarg = 0;
828
829 /* Make --login equivalent to -login. */
830 if (arg_string[1] == '-' && arg_string[2])
831 {
832 longarg = 1;
833 arg_string++;
834 }
835
836 for (i = 0; long_args[i].name; i++)
837 {
838 if (STREQ (arg_string + 1, long_args[i].name))
839 {
840 if (long_args[i].type == Int)
841 *long_args[i].int_value = 1;
842 else if (argv[++arg_index] == 0)
843 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000844 report_error (_("%s: option requires an argument"), long_args[i].name);
845 exit (EX_BADUSAGE);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000846 }
847 else
848 *long_args[i].char_value = argv[arg_index];
849
850 break;
851 }
852 }
853 if (long_args[i].name == 0)
854 {
855 if (longarg)
856 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000857 report_error (_("%s: invalid option"), argv[arg_index]);
Jari Aaltod166f041997-06-05 14:59:13 +0000858 show_shell_usage (stderr, 0);
Jari Aaltob80f6442004-07-27 13:29:18 +0000859 exit (EX_BADUSAGE);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000860 }
861 break; /* No such argument. Maybe flag arg. */
862 }
863
864 arg_index++;
865 }
866
867 return (arg_index);
868}
869
870static int
871parse_shell_options (argv, arg_start, arg_end)
872 char **argv;
873 int arg_start, arg_end;
874{
875 int arg_index;
876 int arg_character, on_or_off, next_arg, i;
877 char *o_option, *arg_string;
878
879 arg_index = arg_start;
880 while (arg_index != arg_end && (arg_string = argv[arg_index]) &&
881 (*arg_string == '-' || *arg_string == '+'))
882 {
883 /* There are flag arguments, so parse them. */
884 next_arg = arg_index + 1;
885
886 /* A single `-' signals the end of options. From the 4.3 BSD sh.
887 An option `--' means the same thing; this is the standard
888 getopt(3) meaning. */
889 if (arg_string[0] == '-' &&
890 (arg_string[1] == '\0' ||
891 (arg_string[1] == '-' && arg_string[2] == '\0')))
892 return (next_arg);
893
894 i = 1;
895 on_or_off = arg_string[0];
896 while (arg_character = arg_string[i++])
897 {
898 switch (arg_character)
899 {
900 case 'c':
901 want_pending_command = 1;
902 break;
903
Jari Aalto7117c2d2002-07-17 14:10:11 +0000904 case 'l':
905 make_login_shell = 1;
906 break;
907
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000908 case 's':
909 read_from_stdin = 1;
910 break;
911
912 case 'o':
913 o_option = argv[next_arg];
914 if (o_option == 0)
915 {
Chet Ramey8868eda2020-12-06 15:51:17 -0500916 set_option_defaults ();
Jari Aaltocce855b1998-04-17 19:52:44 +0000917 list_minus_o_opts (-1, (on_or_off == '-') ? 0 : 1);
Chet Ramey8868eda2020-12-06 15:51:17 -0500918 reset_option_defaults ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000919 break;
920 }
921 if (set_minus_o_option (on_or_off, o_option) != EXECUTION_SUCCESS)
Jari Aaltob80f6442004-07-27 13:29:18 +0000922 exit (EX_BADUSAGE);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000923 next_arg++;
924 break;
925
Jari Aaltof73dda02001-11-13 17:56:06 +0000926 case 'O':
927 /* Since some of these can be overridden by the normal
928 interactive/non-interactive shell initialization or
929 initializing posix mode, we save the options and process
930 them after initialization. */
931 o_option = argv[next_arg];
932 if (o_option == 0)
933 {
934 shopt_listopt (o_option, (on_or_off == '-') ? 0 : 1);
935 break;
936 }
937 add_shopt_to_alist (o_option, on_or_off);
938 next_arg++;
939 break;
940
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000941 case 'D':
942 dump_translatable_strings = 1;
943 break;
944
945 default:
946 if (change_flag (arg_character, on_or_off) == FLAG_ERROR)
947 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000948 report_error (_("%c%c: invalid option"), on_or_off, arg_character);
Jari Aaltod166f041997-06-05 14:59:13 +0000949 show_shell_usage (stderr, 0);
Jari Aaltob80f6442004-07-27 13:29:18 +0000950 exit (EX_BADUSAGE);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000951 }
952 }
953 }
954 /* Can't do just a simple increment anymore -- what about
955 "bash -abouo emacs ignoreeof -hP"? */
956 arg_index = next_arg;
957 }
958
959 return (arg_index);
960}
961
962/* Exit the shell with status S. */
Jari Aaltocce855b1998-04-17 19:52:44 +0000963void
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000964exit_shell (s)
965 int s;
966{
Chet Ramey00018032011-11-21 20:51:19 -0500967 fflush (stdout); /* XXX */
968 fflush (stderr);
969
Chet Ramey84c617e2015-01-15 10:21:08 -0500970 /* Clean up the terminal if we are in a state where it's been modified. */
971#if defined (READLINE)
972 if (RL_ISSTATE (RL_STATE_TERMPREPPED) && rl_deprep_term_function)
973 (*rl_deprep_term_function) ();
974#endif
975 if (read_tty_modified ())
976 read_tty_cleanup ();
977
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000978 /* Do trap[0] if defined. Allow it to override the exit status
979 passed to us. */
Jari Aalto726f6381996-08-26 18:22:31 +0000980 if (signal_is_trapped (0))
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000981 s = run_exit_trap ();
Jari Aalto726f6381996-08-26 18:22:31 +0000982
983#if defined (PROCESS_SUBSTITUTION)
Chet Ramey8868eda2020-12-06 15:51:17 -0500984 unlink_all_fifos ();
Jari Aalto726f6381996-08-26 18:22:31 +0000985#endif /* PROCESS_SUBSTITUTION */
986
987#if defined (HISTORY)
Chet Rameyac50fba2014-02-26 09:36:43 -0500988 if (remember_on_history)
Jari Aalto726f6381996-08-26 18:22:31 +0000989 maybe_save_shell_history ();
990#endif /* HISTORY */
991
Jari Aalto31859422009-01-12 13:36:28 +0000992#if defined (COPROCESS_SUPPORT)
993 coproc_flush ();
994#endif
995
Jari Aalto726f6381996-08-26 18:22:31 +0000996#if defined (JOB_CONTROL)
Jari Aaltocce855b1998-04-17 19:52:44 +0000997 /* If the user has run `shopt -s huponexit', hangup all jobs when we exit
998 an interactive login shell. ksh does this unconditionally. */
999 if (interactive_shell && login_shell && hup_on_exit)
1000 hangup_all_jobs ();
1001
Chet Rameya0c0a002016-09-15 16:59:08 -04001002 /* If this shell is interactive, or job control is active, terminate all
1003 stopped jobs and restore the original terminal process group. Don't do
1004 this if we're in a subshell and calling exit_shell after, for example,
1005 a failed word expansion. We want to do this even if the shell is not
1006 interactive because we set the terminal's process group when job control
1007 is enabled regardless of the interactive status. */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001008 if (subshell_environment == 0)
1009 end_job_control ();
Jari Aalto726f6381996-08-26 18:22:31 +00001010#endif /* JOB_CONTROL */
1011
1012 /* Always return the exit status of the last command to our parent. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00001013 sh_exit (s);
Jari Aalto726f6381996-08-26 18:22:31 +00001014}
1015
Jari Aaltobb706242000-03-17 21:46:59 +00001016/* A wrapper for exit that (optionally) can do other things, like malloc
1017 statistics tracing. */
1018void
1019sh_exit (s)
1020 int s;
1021{
Jari Aalto7117c2d2002-07-17 14:10:11 +00001022#if defined (MALLOC_DEBUG) && defined (USING_BASH_MALLOC)
Chet Rameyd233b482019-01-07 09:27:52 -05001023 if (malloc_trace_at_exit && (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
Jari Aalto7117c2d2002-07-17 14:10:11 +00001024 trace_malloc_stats (get_name_for_error (), (char *)NULL);
Chet Rameya0c0a002016-09-15 16:59:08 -04001025 /* mlocation_write_table (); */
Jari Aalto7117c2d2002-07-17 14:10:11 +00001026#endif
1027
Jari Aaltobb706242000-03-17 21:46:59 +00001028 exit (s);
1029}
1030
Chet Rameyac50fba2014-02-26 09:36:43 -05001031/* Exit a subshell, which includes calling the exit trap. We don't want to
1032 do any more cleanup, since a subshell is created as an exact copy of its
1033 parent. */
1034void
1035subshell_exit (s)
1036 int s;
1037{
1038 fflush (stdout);
1039 fflush (stderr);
1040
1041 /* Do trap[0] if defined. Allow it to override the exit status
1042 passed to us. */
1043 if (signal_is_trapped (0))
1044 s = run_exit_trap ();
1045
1046 sh_exit (s);
1047}
1048
Chet Ramey8868eda2020-12-06 15:51:17 -05001049void
1050set_exit_status (s)
1051 int s;
1052{
1053 set_pipestatus_from_exit (last_command_exit_value = s);
1054}
1055
Jari Aalto726f6381996-08-26 18:22:31 +00001056/* Source the bash startup files. If POSIXLY_CORRECT is non-zero, we obey
1057 the Posix.2 startup file rules: $ENV is expanded, and if the file it
1058 names exists, that file is sourced. The Posix.2 rules are in effect
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001059 for interactive shells only. (section 4.56.5.3) */
Jari Aalto726f6381996-08-26 18:22:31 +00001060
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001061/* Execute ~/.bashrc for most shells. Never execute it if
1062 ACT_LIKE_SH is set, or if NO_RC is set.
Jari Aalto726f6381996-08-26 18:22:31 +00001063
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001064 If the executable file "/usr/gnu/src/bash/foo" contains:
Jari Aalto726f6381996-08-26 18:22:31 +00001065
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001066 #!/usr/gnu/bin/bash
1067 echo hello
Jari Aalto726f6381996-08-26 18:22:31 +00001068
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001069 then:
Jari Aalto726f6381996-08-26 18:22:31 +00001070
Jari Aalto28ef6c32001-04-06 19:14:31 +00001071 COMMAND EXECUTE BASHRC
1072 --------------------------------
1073 bash -c foo NO
1074 bash foo NO
1075 foo NO
1076 rsh machine ls YES (for rsh, which calls `bash -c')
1077 rsh machine foo YES (for shell started by rsh) NO (for foo!)
1078 echo ls | bash NO
1079 login NO
1080 bash YES
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001081*/
Jari Aalto726f6381996-08-26 18:22:31 +00001082
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001083static void
1084execute_env_file (env_file)
1085 char *env_file;
1086{
1087 char *fn;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001088
1089 if (env_file && *env_file)
Jari Aalto726f6381996-08-26 18:22:31 +00001090 {
Jari Aaltof73dda02001-11-13 17:56:06 +00001091 fn = expand_string_unsplit_to_string (env_file, Q_DOUBLE_QUOTES);
1092 if (fn && *fn)
1093 maybe_execute_file (fn, 1);
1094 FREE (fn);
Jari Aalto726f6381996-08-26 18:22:31 +00001095 }
1096}
1097
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001098static void
1099run_startup_files ()
1100{
Jari Aaltod166f041997-06-05 14:59:13 +00001101#if defined (JOB_CONTROL)
1102 int old_job_control;
1103#endif
Jari Aaltocce855b1998-04-17 19:52:44 +00001104 int sourced_login, run_by_ssh;
Jari Aaltod166f041997-06-05 14:59:13 +00001105
Jari Aaltocce855b1998-04-17 19:52:44 +00001106 /* get the rshd/sshd case out of the way first. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001107 if (interactive_shell == 0 && no_rc == 0 && login_shell == 0 &&
Jari Aaltob80f6442004-07-27 13:29:18 +00001108 act_like_sh == 0 && command_execution_string)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001109 {
Jari Aaltof73dda02001-11-13 17:56:06 +00001110#ifdef SSH_SOURCE_BASHRC
1111 run_by_ssh = (find_variable ("SSH_CLIENT") != (SHELL_VAR *)0) ||
1112 (find_variable ("SSH2_CLIENT") != (SHELL_VAR *)0);
1113#else
1114 run_by_ssh = 0;
1115#endif
Jari Aaltocce855b1998-04-17 19:52:44 +00001116
1117 /* If we were run by sshd or we think we were run by rshd, execute
Jari Aaltobb706242000-03-17 21:46:59 +00001118 ~/.bashrc if we are a top-level shell. */
1119 if ((run_by_ssh || isnetconn (fileno (stdin))) && shell_level < 2)
Jari Aaltocce855b1998-04-17 19:52:44 +00001120 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001121#ifdef SYS_BASHRC
Jari Aaltob72432f1999-02-19 17:11:39 +00001122# if defined (__OPENNT)
1123 maybe_execute_file (_prefixInstallPath(SYS_BASHRC, NULL, 0), 1);
1124# else
Jari Aaltocce855b1998-04-17 19:52:44 +00001125 maybe_execute_file (SYS_BASHRC, 1);
Jari Aaltob72432f1999-02-19 17:11:39 +00001126# endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001127#endif
Jari Aaltocce855b1998-04-17 19:52:44 +00001128 maybe_execute_file (bashrc_file, 1);
1129 return;
1130 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001131 }
1132
Jari Aaltocce855b1998-04-17 19:52:44 +00001133#if defined (JOB_CONTROL)
1134 /* Startup files should be run without job control enabled. */
1135 old_job_control = interactive_shell ? set_job_control (0) : 0;
1136#endif
1137
1138 sourced_login = 0;
1139
Jari Aalto7117c2d2002-07-17 14:10:11 +00001140 /* A shell begun with the --login (or -l) flag that is not in posix mode
1141 runs the login shell startup files, no matter whether or not it is
Jari Aaltobb706242000-03-17 21:46:59 +00001142 interactive. If NON_INTERACTIVE_LOGIN_SHELLS is defined, run the
1143 startup files if argv[0][0] == '-' as well. */
1144#if defined (NON_INTERACTIVE_LOGIN_SHELLS)
1145 if (login_shell && posixly_correct == 0)
1146#else
1147 if (login_shell < 0 && posixly_correct == 0)
1148#endif
Jari Aaltocce855b1998-04-17 19:52:44 +00001149 {
1150 /* We don't execute .bashrc for login shells. */
1151 no_rc++;
1152
1153 /* Execute /etc/profile and one of the personal login shell
1154 initialization files. */
1155 if (no_profile == 0)
1156 {
1157 maybe_execute_file (SYS_PROFILE, 1);
1158
1159 if (act_like_sh) /* sh */
1160 maybe_execute_file ("~/.profile", 1);
1161 else if ((maybe_execute_file ("~/.bash_profile", 1) == 0) &&
1162 (maybe_execute_file ("~/.bash_login", 1) == 0)) /* bash */
1163 maybe_execute_file ("~/.profile", 1);
1164 }
1165
1166 sourced_login = 1;
1167 }
Jari Aaltocce855b1998-04-17 19:52:44 +00001168
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001169 /* A non-interactive shell not named `sh' and not in posix mode reads and
1170 executes commands from $BASH_ENV. If `su' starts a shell with `-c cmd'
1171 and `-su' as the name of the shell, we want to read the startup files.
1172 No other non-interactive shells read any startup files. */
1173 if (interactive_shell == 0 && !(su_shell && login_shell))
1174 {
1175 if (posixly_correct == 0 && act_like_sh == 0 && privileged_mode == 0 &&
1176 sourced_env++ == 0)
1177 execute_env_file (get_string_value ("BASH_ENV"));
1178 return;
1179 }
1180
1181 /* Interactive shell or `-su' shell. */
1182 if (posixly_correct == 0) /* bash, sh */
1183 {
Jari Aaltocce855b1998-04-17 19:52:44 +00001184 if (login_shell && sourced_login++ == 0)
1185 {
1186 /* We don't execute .bashrc for login shells. */
1187 no_rc++;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001188
Jari Aaltocce855b1998-04-17 19:52:44 +00001189 /* Execute /etc/profile and one of the personal login shell
1190 initialization files. */
1191 if (no_profile == 0)
1192 {
1193 maybe_execute_file (SYS_PROFILE, 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001194
Jari Aaltocce855b1998-04-17 19:52:44 +00001195 if (act_like_sh) /* sh */
1196 maybe_execute_file ("~/.profile", 1);
1197 else if ((maybe_execute_file ("~/.bash_profile", 1) == 0) &&
1198 (maybe_execute_file ("~/.bash_login", 1) == 0)) /* bash */
1199 maybe_execute_file ("~/.profile", 1);
1200 }
1201 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001202
1203 /* bash */
1204 if (act_like_sh == 0 && no_rc == 0)
1205 {
1206#ifdef SYS_BASHRC
Jari Aaltob72432f1999-02-19 17:11:39 +00001207# if defined (__OPENNT)
1208 maybe_execute_file (_prefixInstallPath(SYS_BASHRC, NULL, 0), 1);
1209# else
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001210 maybe_execute_file (SYS_BASHRC, 1);
Jari Aaltobb706242000-03-17 21:46:59 +00001211# endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001212#endif
Jari Aalto28ef6c32001-04-06 19:14:31 +00001213 maybe_execute_file (bashrc_file, 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001214 }
1215 /* sh */
1216 else if (act_like_sh && privileged_mode == 0 && sourced_env++ == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001217 execute_env_file (get_string_value ("ENV"));
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001218 }
1219 else /* bash --posix, sh --posix */
1220 {
1221 /* bash and sh */
1222 if (interactive_shell && privileged_mode == 0 && sourced_env++ == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001223 execute_env_file (get_string_value ("ENV"));
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001224 }
Jari Aaltod166f041997-06-05 14:59:13 +00001225
1226#if defined (JOB_CONTROL)
1227 set_job_control (old_job_control);
1228#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001229}
1230
Jari Aalto726f6381996-08-26 18:22:31 +00001231#if defined (RESTRICTED_SHELL)
Jari Aaltob72432f1999-02-19 17:11:39 +00001232/* Return 1 if the shell should be a restricted one based on NAME or the
1233 value of `restricted'. Don't actually do anything, just return a
1234 boolean value. */
1235int
1236shell_is_restricted (name)
1237 char *name;
1238{
1239 char *temp;
1240
1241 if (restricted)
1242 return 1;
1243 temp = base_pathname (name);
Jari Aalto95732b42005-12-07 14:08:12 +00001244 if (*temp == '-')
1245 temp++;
Jari Aaltob72432f1999-02-19 17:11:39 +00001246 return (STREQ (temp, RESTRICTED_SHELL_NAME));
1247}
1248
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001249/* Perhaps make this shell a `restricted' one, based on NAME. If the
1250 basename of NAME is "rbash", then this shell is restricted. The
1251 name of the restricted shell is a configurable option, see config.h.
Jari Aaltob72432f1999-02-19 17:11:39 +00001252 In a restricted shell, PATH, SHELL, ENV, and BASH_ENV are read-only
1253 and non-unsettable.
Jari Aalto726f6381996-08-26 18:22:31 +00001254 Do this also if `restricted' is already set to 1; maybe the shell was
1255 started with -r. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001256int
Jari Aalto726f6381996-08-26 18:22:31 +00001257maybe_make_restricted (name)
1258 char *name;
1259{
1260 char *temp;
1261
Jari Aalto7117c2d2002-07-17 14:10:11 +00001262 temp = base_pathname (name);
Jari Aaltob80f6442004-07-27 13:29:18 +00001263 if (*temp == '-')
1264 temp++;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001265 if (restricted || (STREQ (temp, RESTRICTED_SHELL_NAME)))
Jari Aalto726f6381996-08-26 18:22:31 +00001266 {
Chet Rameyd233b482019-01-07 09:27:52 -05001267#if defined (RBASH_STATIC_PATH_VALUE)
1268 bind_variable ("PATH", RBASH_STATIC_PATH_VALUE, 0);
1269 stupidly_hack_special_variables ("PATH"); /* clear hash table */
1270#endif
Jari Aalto726f6381996-08-26 18:22:31 +00001271 set_var_read_only ("PATH");
Jari Aalto726f6381996-08-26 18:22:31 +00001272 set_var_read_only ("SHELL");
Jari Aaltob72432f1999-02-19 17:11:39 +00001273 set_var_read_only ("ENV");
1274 set_var_read_only ("BASH_ENV");
Chet Ramey8868eda2020-12-06 15:51:17 -05001275 set_var_read_only ("HISTFILE");
Jari Aalto28ef6c32001-04-06 19:14:31 +00001276 restricted = 1;
Jari Aalto726f6381996-08-26 18:22:31 +00001277 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001278 return (restricted);
Jari Aalto726f6381996-08-26 18:22:31 +00001279}
1280#endif /* RESTRICTED_SHELL */
1281
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001282/* Fetch the current set of uids and gids and return 1 if we're running
1283 setuid or setgid. */
1284static int
1285uidget ()
Jari Aalto726f6381996-08-26 18:22:31 +00001286{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001287 uid_t u;
Jari Aalto726f6381996-08-26 18:22:31 +00001288
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001289 u = getuid ();
1290 if (current_user.uid != u)
Jari Aalto726f6381996-08-26 18:22:31 +00001291 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001292 FREE (current_user.user_name);
1293 FREE (current_user.shell);
1294 FREE (current_user.home_dir);
1295 current_user.user_name = current_user.shell = current_user.home_dir = (char *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00001296 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001297 current_user.uid = u;
1298 current_user.gid = getgid ();
1299 current_user.euid = geteuid ();
1300 current_user.egid = getegid ();
Jari Aalto726f6381996-08-26 18:22:31 +00001301
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001302 /* See whether or not we are running setuid or setgid. */
1303 return (current_user.uid != current_user.euid) ||
1304 (current_user.gid != current_user.egid);
1305}
Jari Aalto726f6381996-08-26 18:22:31 +00001306
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001307void
1308disable_priv_mode ()
1309{
Chet Rameya0c0a002016-09-15 16:59:08 -04001310 int e;
1311
Chet Ramey8868eda2020-12-06 15:51:17 -05001312#if HAVE_SETRESUID
1313 if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
1314#else
Chet Rameya0c0a002016-09-15 16:59:08 -04001315 if (setuid (current_user.uid) < 0)
Chet Ramey8868eda2020-12-06 15:51:17 -05001316#endif
Chet Rameya0c0a002016-09-15 16:59:08 -04001317 {
1318 e = errno;
1319 sys_error (_("cannot set uid to %d: effective uid %d"), current_user.uid, current_user.euid);
1320#if defined (EXIT_ON_SETUID_FAILURE)
1321 if (e == EAGAIN)
1322 exit (e);
1323#endif
1324 }
Chet Ramey8868eda2020-12-06 15:51:17 -05001325#if HAVE_SETRESGID
1326 if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
1327#else
Chet Rameya0c0a002016-09-15 16:59:08 -04001328 if (setgid (current_user.gid) < 0)
Chet Ramey8868eda2020-12-06 15:51:17 -05001329#endif
Chet Rameya0c0a002016-09-15 16:59:08 -04001330 sys_error (_("cannot set gid to %d: effective gid %d"), current_user.gid, current_user.egid);
1331
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001332 current_user.euid = current_user.uid;
1333 current_user.egid = current_user.gid;
Jari Aalto726f6381996-08-26 18:22:31 +00001334}
1335
Chet Ramey00018032011-11-21 20:51:19 -05001336#if defined (WORDEXP_OPTION)
Jari Aaltocce855b1998-04-17 19:52:44 +00001337static int
1338run_wordexp (words)
1339 char *words;
1340{
1341 int code, nw, nb;
Jari Aaltob80f6442004-07-27 13:29:18 +00001342 WORD_LIST *wl, *tl, *result;
Jari Aaltocce855b1998-04-17 19:52:44 +00001343
Chet Rameyac50fba2014-02-26 09:36:43 -05001344 code = setjmp_nosigs (top_level);
Jari Aaltocce855b1998-04-17 19:52:44 +00001345
1346 if (code != NOT_JUMPED)
1347 {
1348 switch (code)
1349 {
Chet Rameyac50fba2014-02-26 09:36:43 -05001350 /* Some kind of throw to top_level has occurred. */
Jari Aaltocce855b1998-04-17 19:52:44 +00001351 case FORCE_EOF:
1352 return last_command_exit_value = 127;
Jari Aaltob80f6442004-07-27 13:29:18 +00001353 case ERREXIT:
Jari Aaltocce855b1998-04-17 19:52:44 +00001354 case EXITPROG:
1355 return last_command_exit_value;
1356 case DISCARD:
1357 return last_command_exit_value = 1;
1358 default:
Jari Aaltob72432f1999-02-19 17:11:39 +00001359 command_error ("run_wordexp", CMDERR_BADJUMP, code, 0);
Jari Aaltocce855b1998-04-17 19:52:44 +00001360 }
1361 }
1362
1363 /* Run it through the parser to get a list of words and expand them */
1364 if (words && *words)
1365 {
1366 with_input_from_string (words, "--wordexp");
1367 if (parse_command () != 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001368 return (126);
Jari Aaltocce855b1998-04-17 19:52:44 +00001369 if (global_command == 0)
1370 {
1371 printf ("0\n0\n");
1372 return (0);
1373 }
1374 if (global_command->type != cm_simple)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001375 return (126);
Jari Aaltocce855b1998-04-17 19:52:44 +00001376 wl = global_command->value.Simple->words;
Jari Aaltob80f6442004-07-27 13:29:18 +00001377 if (protected_mode)
1378 for (tl = wl; tl; tl = tl->next)
Jari Aalto06285672006-10-10 14:15:34 +00001379 tl->word->flags |= W_NOCOMSUB|W_NOPROCSUB;
Jari Aaltocce855b1998-04-17 19:52:44 +00001380 result = wl ? expand_words_no_vars (wl) : (WORD_LIST *)0;
1381 }
1382 else
1383 result = (WORD_LIST *)0;
1384
1385 last_command_exit_value = 0;
1386
1387 if (result == 0)
1388 {
1389 printf ("0\n0\n");
1390 return (0);
1391 }
1392
1393 /* Count up the number of words and bytes, and print them. Don't count
1394 the trailing NUL byte. */
1395 for (nw = nb = 0, wl = result; wl; wl = wl->next)
1396 {
1397 nw++;
1398 nb += strlen (wl->word->word);
1399 }
1400 printf ("%u\n%u\n", nw, nb);
1401 /* Print each word on a separate line. This will have to be changed when
1402 the interface to glibc is completed. */
1403 for (wl = result; wl; wl = wl->next)
1404 printf ("%s\n", wl->word->word);
1405
1406 return (0);
1407}
Chet Ramey00018032011-11-21 20:51:19 -05001408#endif
Jari Aaltocce855b1998-04-17 19:52:44 +00001409
Jari Aalto726f6381996-08-26 18:22:31 +00001410#if defined (ONESHOT)
1411/* Run one command, given as the argument to the -c option. Tell
1412 parse_and_execute not to fork for a simple command. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001413static int
Jari Aalto726f6381996-08-26 18:22:31 +00001414run_one_command (command)
1415 char *command;
1416{
1417 int code;
1418
Chet Rameyac50fba2014-02-26 09:36:43 -05001419 code = setjmp_nosigs (top_level);
Jari Aalto726f6381996-08-26 18:22:31 +00001420
1421 if (code != NOT_JUMPED)
1422 {
1423#if defined (PROCESS_SUBSTITUTION)
1424 unlink_fifo_list ();
1425#endif /* PROCESS_SUBSTITUTION */
1426 switch (code)
1427 {
Chet Rameyac50fba2014-02-26 09:36:43 -05001428 /* Some kind of throw to top_level has occurred. */
Jari Aalto726f6381996-08-26 18:22:31 +00001429 case FORCE_EOF:
1430 return last_command_exit_value = 127;
Jari Aaltob80f6442004-07-27 13:29:18 +00001431 case ERREXIT:
Jari Aalto726f6381996-08-26 18:22:31 +00001432 case EXITPROG:
1433 return last_command_exit_value;
1434 case DISCARD:
1435 return last_command_exit_value = 1;
1436 default:
Jari Aaltob72432f1999-02-19 17:11:39 +00001437 command_error ("run_one_command", CMDERR_BADJUMP, code, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00001438 }
1439 }
Chet Ramey8868eda2020-12-06 15:51:17 -05001440 return (parse_and_execute (savestring (command), "-c", SEVAL_NOHIST|SEVAL_RESETLINE));
Jari Aalto726f6381996-08-26 18:22:31 +00001441}
1442#endif /* ONESHOT */
1443
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001444static int
1445bind_args (argv, arg_start, arg_end, start_index)
1446 char **argv;
1447 int arg_start, arg_end, start_index;
Jari Aalto726f6381996-08-26 18:22:31 +00001448{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001449 register int i;
Chet Rameyd233b482019-01-07 09:27:52 -05001450 WORD_LIST *args, *tl;
Jari Aalto726f6381996-08-26 18:22:31 +00001451
Chet Rameyd233b482019-01-07 09:27:52 -05001452 for (i = arg_start, args = tl = (WORD_LIST *)NULL; i < arg_end; i++)
1453 {
1454 if (args == 0)
1455 args = tl = make_word_list (make_word (argv[i]), args);
1456 else
1457 {
1458 tl->next = make_word_list (make_word (argv[i]), (WORD_LIST *)NULL);
1459 tl = tl->next;
1460 }
1461 }
1462
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001463 if (args)
Jari Aalto726f6381996-08-26 18:22:31 +00001464 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001465 if (start_index == 0) /* bind to $0...$n for sh -c command */
Jari Aalto726f6381996-08-26 18:22:31 +00001466 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001467 /* Posix.2 4.56.3 says that the first argument after sh -c command
1468 becomes $0, and the rest of the arguments become $1...$n */
1469 shell_name = savestring (args->word->word);
Jari Aaltod166f041997-06-05 14:59:13 +00001470 FREE (dollar_vars[0]);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001471 dollar_vars[0] = savestring (args->word->word);
1472 remember_args (args->next, 1);
Chet Rameyd233b482019-01-07 09:27:52 -05001473 if (debugging_mode)
1474 {
1475 push_args (args->next); /* BASH_ARGV and BASH_ARGC */
1476 bash_argv_initialized = 1;
1477 }
Jari Aalto726f6381996-08-26 18:22:31 +00001478 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001479 else /* bind to $1...$n for shell script */
Jari Aaltob80f6442004-07-27 13:29:18 +00001480 {
1481 remember_args (args, 1);
Chet Rameyd233b482019-01-07 09:27:52 -05001482 /* We do this unconditionally so something like -O extdebug doesn't
1483 do it first. We're setting the definitive positional params
1484 here. */
1485 if (debugging_mode)
1486 {
1487 push_args (args); /* BASH_ARGV and BASH_ARGC */
1488 bash_argv_initialized = 1;
1489 }
Jari Aaltob80f6442004-07-27 13:29:18 +00001490 }
Jari Aalto726f6381996-08-26 18:22:31 +00001491
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001492 dispose_words (args);
1493 }
Jari Aalto726f6381996-08-26 18:22:31 +00001494
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001495 return (i);
1496}
1497
1498void
1499unbind_args ()
1500{
1501 remember_args ((WORD_LIST *)NULL, 1);
Jari Aaltob80f6442004-07-27 13:29:18 +00001502 pop_args (); /* Reset BASH_ARGV and BASH_ARGC */
1503}
1504
1505static void
1506start_debugger ()
1507{
1508#if defined (DEBUGGER) && defined (DEBUGGER_START_FILE)
1509 int old_errexit;
Chet Rameya0c0a002016-09-15 16:59:08 -04001510 int r;
Jari Aaltob80f6442004-07-27 13:29:18 +00001511
1512 old_errexit = exit_immediately_on_error;
1513 exit_immediately_on_error = 0;
1514
Chet Rameya0c0a002016-09-15 16:59:08 -04001515 r = force_execute_file (DEBUGGER_START_FILE, 1);
1516 if (r < 0)
1517 {
1518 internal_warning (_("cannot start debugger; debugging mode disabled"));
1519 debugging_mode = 0;
1520 }
1521 error_trace_mode = function_trace_mode = debugging_mode;
1522
1523 set_shellopts ();
1524 set_bashopts ();
Jari Aaltob80f6442004-07-27 13:29:18 +00001525
1526 exit_immediately_on_error += old_errexit;
1527#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001528}
1529
1530static int
1531open_shell_script (script_name)
1532 char *script_name;
1533{
Jari Aalto28ef6c32001-04-06 19:14:31 +00001534 int fd, e, fd_is_tty;
Jari Aaltob80f6442004-07-27 13:29:18 +00001535 char *filename, *path_filename, *t;
Jari Aaltof73dda02001-11-13 17:56:06 +00001536 char sample[80];
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001537 int sample_len;
Jari Aaltod166f041997-06-05 14:59:13 +00001538 struct stat sb;
Jari Aaltob80f6442004-07-27 13:29:18 +00001539#if defined (ARRAY_VARS)
1540 SHELL_VAR *funcname_v, *bash_source_v, *bash_lineno_v;
1541 ARRAY *funcname_a, *bash_source_a, *bash_lineno_a;
1542#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001543
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001544 filename = savestring (script_name);
1545
1546 fd = open (filename, O_RDONLY);
1547 if ((fd < 0) && (errno == ENOENT) && (absolute_program (filename) == 0))
1548 {
Jari Aaltod166f041997-06-05 14:59:13 +00001549 e = errno;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001550 /* If it's not in the current directory, try looking through PATH
1551 for it. */
1552 path_filename = find_path_file (script_name);
1553 if (path_filename)
1554 {
1555 free (filename);
1556 filename = path_filename;
1557 fd = open (filename, O_RDONLY);
1558 }
Jari Aaltod166f041997-06-05 14:59:13 +00001559 else
1560 errno = e;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001561 }
1562
1563 if (fd < 0)
1564 {
Jari Aaltod166f041997-06-05 14:59:13 +00001565 e = errno;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001566 file_error (filename);
Chet Rameyd233b482019-01-07 09:27:52 -05001567#if defined (JOB_CONTROL)
1568 end_job_control (); /* just in case we were run as bash -i script */
1569#endif
Chet Rameya0c0a002016-09-15 16:59:08 -04001570 sh_exit ((e == ENOENT) ? EX_NOTFOUND : EX_NOINPUT);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001571 }
1572
Jari Aaltob80f6442004-07-27 13:29:18 +00001573 free (dollar_vars[0]);
Chet Ramey495aee42011-11-22 19:11:26 -05001574 dollar_vars[0] = exec_argv0 ? savestring (exec_argv0) : savestring (script_name);
1575 if (exec_argv0)
1576 {
1577 free (exec_argv0);
1578 exec_argv0 = (char *)NULL;
1579 }
Jari Aaltob80f6442004-07-27 13:29:18 +00001580
Chet Rameya0c0a002016-09-15 16:59:08 -04001581 if (file_isdir (filename))
1582 {
1583#if defined (EISDIR)
1584 errno = EISDIR;
1585#else
1586 errno = EINVAL;
1587#endif
1588 file_error (filename);
Chet Rameyd233b482019-01-07 09:27:52 -05001589#if defined (JOB_CONTROL)
1590 end_job_control (); /* just in case we were run as bash -i script */
1591#endif
Chet Rameya0c0a002016-09-15 16:59:08 -04001592 sh_exit (EX_NOINPUT);
1593 }
1594
Jari Aaltob80f6442004-07-27 13:29:18 +00001595#if defined (ARRAY_VARS)
1596 GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
1597 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
1598 GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);
1599
1600 array_push (bash_source_a, filename);
1601 if (bash_lineno_a)
1602 {
1603 t = itos (executing_line_number ());
1604 array_push (bash_lineno_a, t);
1605 free (t);
1606 }
1607 array_push (funcname_a, "main");
1608#endif
1609
Jari Aalto28ef6c32001-04-06 19:14:31 +00001610#ifdef HAVE_DEV_FD
1611 fd_is_tty = isatty (fd);
1612#else
1613 fd_is_tty = 0;
1614#endif
1615
1616 /* Only do this with non-tty file descriptors we can seek on. */
1617 if (fd_is_tty == 0 && (lseek (fd, 0L, 1) != -1))
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001618 {
1619 /* Check to see if the `file' in `bash file' is a binary file
1620 according to the same tests done by execute_simple_command (),
1621 and report an error and exit if it is. */
1622 sample_len = read (fd, sample, sizeof (sample));
Jari Aaltod166f041997-06-05 14:59:13 +00001623 if (sample_len < 0)
1624 {
1625 e = errno;
1626 if ((fstat (fd, &sb) == 0) && S_ISDIR (sb.st_mode))
Chet Rameya0c0a002016-09-15 16:59:08 -04001627 {
1628#if defined (EISDIR)
1629 errno = EISDIR;
1630 file_error (filename);
1631#else
1632 internal_error (_("%s: Is a directory"), filename);
1633#endif
1634 }
Jari Aalto28ef6c32001-04-06 19:14:31 +00001635 else
Jari Aaltod166f041997-06-05 14:59:13 +00001636 {
1637 errno = e;
1638 file_error (filename);
1639 }
Chet Rameyd233b482019-01-07 09:27:52 -05001640#if defined (JOB_CONTROL)
1641 end_job_control (); /* just in case we were run as bash -i script */
1642#endif
Jari Aaltod166f041997-06-05 14:59:13 +00001643 exit (EX_NOEXEC);
1644 }
1645 else if (sample_len > 0 && (check_binary_file (sample, sample_len)))
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001646 {
Jari Aalto31859422009-01-12 13:36:28 +00001647 internal_error (_("%s: cannot execute binary file"), filename);
Chet Rameyd233b482019-01-07 09:27:52 -05001648#if defined (JOB_CONTROL)
1649 end_job_control (); /* just in case we were run as bash -i script */
1650#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001651 exit (EX_BINARY_FILE);
1652 }
1653 /* Now rewind the file back to the beginning. */
1654 lseek (fd, 0L, 0);
1655 }
1656
Jari Aaltobb706242000-03-17 21:46:59 +00001657 /* Open the script. But try to move the file descriptor to a randomly
1658 large one, in the hopes that any descriptors used by the script will
1659 not match with ours. */
Jari Aalto31859422009-01-12 13:36:28 +00001660 fd = move_to_high_fd (fd, 1, -1);
Jari Aaltobb706242000-03-17 21:46:59 +00001661
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001662#if defined (BUFFERED_INPUT)
1663 default_buffered_input = fd;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001664 SET_CLOSE_ON_EXEC (default_buffered_input);
1665#else /* !BUFFERED_INPUT */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001666 default_input = fdopen (fd, "r");
1667
1668 if (default_input == 0)
1669 {
1670 file_error (filename);
1671 exit (EX_NOTFOUND);
1672 }
1673
1674 SET_CLOSE_ON_EXEC (fd);
1675 if (fileno (default_input) != fd)
1676 SET_CLOSE_ON_EXEC (fileno (default_input));
1677#endif /* !BUFFERED_INPUT */
1678
Jari Aalto28ef6c32001-04-06 19:14:31 +00001679 /* Just about the only way for this code to be executed is if something
1680 like `bash -i /dev/stdin' is executed. */
1681 if (interactive_shell && fd_is_tty)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001682 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001683 dup2 (fd, 0);
1684 close (fd);
1685 fd = 0;
1686#if defined (BUFFERED_INPUT)
1687 default_buffered_input = 0;
1688#else
1689 fclose (default_input);
1690 default_input = stdin;
1691#endif
1692 }
Jari Aaltof73dda02001-11-13 17:56:06 +00001693 else if (forced_interactive && fd_is_tty == 0)
1694 /* But if a script is called with something like `bash -i scriptname',
1695 we need to do a non-interactive setup here, since we didn't do it
1696 before. */
Jari Aalto31859422009-01-12 13:36:28 +00001697 init_interactive_script ();
Jari Aalto28ef6c32001-04-06 19:14:31 +00001698
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001699 free (filename);
Chet Rameya0c0a002016-09-15 16:59:08 -04001700
1701 reading_shell_script = 1;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001702 return (fd);
1703}
1704
1705/* Initialize the input routines for the parser. */
1706static void
1707set_bash_input ()
1708{
1709 /* Make sure the fd from which we are reading input is not in
1710 no-delay mode. */
1711#if defined (BUFFERED_INPUT)
1712 if (interactive == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001713 sh_unset_nodelay_mode (default_buffered_input);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001714 else
1715#endif /* !BUFFERED_INPUT */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001716 sh_unset_nodelay_mode (fileno (stdin));
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001717
1718 /* with_input_from_stdin really means `with_input_from_readline' */
1719 if (interactive && no_line_editing == 0)
1720 with_input_from_stdin ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001721#if defined (BUFFERED_INPUT)
Jari Aalto95732b42005-12-07 14:08:12 +00001722 else if (interactive == 0)
1723 with_input_from_buffered_stream (default_buffered_input, dollar_vars[0]);
1724#endif /* BUFFERED_INPUT */
1725 else
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001726 with_input_from_stream (default_input, dollar_vars[0]);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001727}
1728
Jari Aaltocce855b1998-04-17 19:52:44 +00001729/* Close the current shell script input source and forget about it. This is
1730 extern so execute_cmd.c:initialize_subshell() can call it. If CHECK_ZERO
1731 is non-zero, we close default_buffered_input even if it's the standard
1732 input (fd 0). */
1733void
1734unset_bash_input (check_zero)
1735 int check_zero;
1736{
1737#if defined (BUFFERED_INPUT)
1738 if ((check_zero && default_buffered_input >= 0) ||
1739 (check_zero == 0 && default_buffered_input > 0))
1740 {
1741 close_buffered_fd (default_buffered_input);
1742 default_buffered_input = bash_input.location.buffered_fd = -1;
Jari Aalto31859422009-01-12 13:36:28 +00001743 bash_input.type = st_none; /* XXX */
Jari Aaltocce855b1998-04-17 19:52:44 +00001744 }
1745#else /* !BUFFERED_INPUT */
1746 if (default_input)
1747 {
1748 fclose (default_input);
1749 default_input = (FILE *)NULL;
1750 }
1751#endif /* !BUFFERED_INPUT */
1752}
1753
1754
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001755#if !defined (PROGRAM)
1756# define PROGRAM "bash"
Jari Aalto726f6381996-08-26 18:22:31 +00001757#endif
1758
Jari Aalto726f6381996-08-26 18:22:31 +00001759static void
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001760set_shell_name (argv0)
1761 char *argv0;
Jari Aalto726f6381996-08-26 18:22:31 +00001762{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001763 /* Here's a hack. If the name of this shell is "sh", then don't do
1764 any startup files; just try to be more like /bin/sh. */
Jari Aalto95732b42005-12-07 14:08:12 +00001765 shell_name = argv0 ? base_pathname (argv0) : PROGRAM;
Jari Aalto7117c2d2002-07-17 14:10:11 +00001766
Jari Aalto06285672006-10-10 14:15:34 +00001767 if (argv0 && *argv0 == '-')
Jari Aalto7117c2d2002-07-17 14:10:11 +00001768 {
Jari Aalto06285672006-10-10 14:15:34 +00001769 if (*shell_name == '-')
1770 shell_name++;
Chet Rameyac50fba2014-02-26 09:36:43 -05001771 login_shell = 1;
Jari Aalto7117c2d2002-07-17 14:10:11 +00001772 }
1773
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001774 if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
1775 act_like_sh++;
1776 if (shell_name[0] == 's' && shell_name[1] == 'u' && shell_name[2] == '\0')
1777 su_shell++;
1778
Jari Aalto95732b42005-12-07 14:08:12 +00001779 shell_name = argv0 ? argv0 : PROGRAM;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001780 FREE (dollar_vars[0]);
1781 dollar_vars[0] = savestring (shell_name);
1782
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001783 /* A program may start an interactive shell with
1784 "execl ("/bin/bash", "-", NULL)".
1785 If so, default the name of this shell to our name. */
1786 if (!shell_name || !*shell_name || (shell_name[0] == '-' && !shell_name[1]))
1787 shell_name = PROGRAM;
1788}
1789
Chet Ramey8868eda2020-12-06 15:51:17 -05001790/* Some options are initialized to -1 so we have a way to determine whether
1791 they were set on the command line. This is an issue when listing the option
1792 values at invocation (`bash -o'), so we set the defaults here and reset
1793 them after the call to list_minus_o_options (). */
1794/* XXX - could also do this for histexp_flag, jobs_m_flag */
1795static void
1796set_option_defaults ()
1797{
1798#if defined (HISTORY)
1799 enable_history_list = 0;
1800#endif
1801}
1802
1803static void
1804reset_option_defaults ()
1805{
1806#if defined (HISTORY)
1807 enable_history_list = -1;
1808#endif
1809}
1810
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001811static void
1812init_interactive ()
1813{
Jari Aalto31859422009-01-12 13:36:28 +00001814 expand_aliases = interactive_shell = startup_state = 1;
1815 interactive = 1;
Chet Rameya0c0a002016-09-15 16:59:08 -04001816#if defined (HISTORY)
Chet Ramey8868eda2020-12-06 15:51:17 -05001817 if (enable_history_list == -1)
1818 enable_history_list = 1; /* set default */
1819 remember_on_history = enable_history_list;
1820# if defined (BANG_HISTORY)
Chet Rameyd233b482019-01-07 09:27:52 -05001821 histexp_flag = history_expansion; /* XXX */
Chet Ramey8868eda2020-12-06 15:51:17 -05001822# endif
Chet Rameya0c0a002016-09-15 16:59:08 -04001823#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001824}
1825
1826static void
1827init_noninteractive ()
1828{
1829#if defined (HISTORY)
Chet Ramey8868eda2020-12-06 15:51:17 -05001830 if (enable_history_list == -1) /* set default */
1831 enable_history_list = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001832 bash_history_reinit (0);
1833#endif /* HISTORY */
1834 interactive_shell = startup_state = interactive = 0;
Jari Aalto7117c2d2002-07-17 14:10:11 +00001835 expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001836 no_line_editing = 1;
1837#if defined (JOB_CONTROL)
Chet Rameyac50fba2014-02-26 09:36:43 -05001838 /* Even if the shell is not interactive, enable job control if the -i or
1839 -m option is supplied at startup. */
1840 set_job_control (forced_interactive||jobs_m_flag);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001841#endif /* JOB_CONTROL */
Jari Aalto726f6381996-08-26 18:22:31 +00001842}
1843
Jari Aalto31859422009-01-12 13:36:28 +00001844static void
1845init_interactive_script ()
1846{
Chet Ramey8868eda2020-12-06 15:51:17 -05001847#if defined (HISTORY)
1848 if (enable_history_list == -1)
1849 enable_history_list = 1;
1850#endif
Jari Aalto31859422009-01-12 13:36:28 +00001851 init_noninteractive ();
1852 expand_aliases = interactive_shell = startup_state = 1;
Chet Rameya0c0a002016-09-15 16:59:08 -04001853#if defined (HISTORY)
Chet Ramey8868eda2020-12-06 15:51:17 -05001854 remember_on_history = enable_history_list; /* XXX */
Chet Rameya0c0a002016-09-15 16:59:08 -04001855#endif
Jari Aalto31859422009-01-12 13:36:28 +00001856}
1857
Jari Aaltod166f041997-06-05 14:59:13 +00001858void
1859get_current_user_info ()
Jari Aalto726f6381996-08-26 18:22:31 +00001860{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001861 struct passwd *entry;
Jari Aalto726f6381996-08-26 18:22:31 +00001862
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001863 /* Don't fetch this more than once. */
1864 if (current_user.user_name == 0)
1865 {
Chet Rameyac50fba2014-02-26 09:36:43 -05001866#if defined (__TANDEM)
1867 entry = getpwnam (getlogin ());
1868#else
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001869 entry = getpwuid (current_user.uid);
Chet Rameyac50fba2014-02-26 09:36:43 -05001870#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001871 if (entry)
1872 {
1873 current_user.user_name = savestring (entry->pw_name);
1874 current_user.shell = (entry->pw_shell && entry->pw_shell[0])
1875 ? savestring (entry->pw_shell)
1876 : savestring ("/bin/sh");
1877 current_user.home_dir = savestring (entry->pw_dir);
1878 }
1879 else
1880 {
Jari Aaltob80f6442004-07-27 13:29:18 +00001881 current_user.user_name = _("I have no name!");
1882 current_user.user_name = savestring (current_user.user_name);
Jari Aalto726f6381996-08-26 18:22:31 +00001883 current_user.shell = savestring ("/bin/sh");
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001884 current_user.home_dir = savestring ("/");
1885 }
Chet Rameya0c0a002016-09-15 16:59:08 -04001886#if defined (HAVE_GETPWENT)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001887 endpwent ();
Chet Rameya0c0a002016-09-15 16:59:08 -04001888#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001889 }
Jari Aaltod166f041997-06-05 14:59:13 +00001890}
1891
1892/* Do whatever is necessary to initialize the shell.
1893 Put new initializations in here. */
1894static void
1895shell_initialize ()
1896{
1897 char hostname[256];
Chet Rameya0c0a002016-09-15 16:59:08 -04001898 int should_be_restricted;
Jari Aaltod166f041997-06-05 14:59:13 +00001899
1900 /* Line buffer output for stderr and stdout. */
Jari Aaltocce855b1998-04-17 19:52:44 +00001901 if (shell_initialized == 0)
Jari Aaltocce855b1998-04-17 19:52:44 +00001902 {
Jari Aaltobb706242000-03-17 21:46:59 +00001903 sh_setlinebuf (stderr);
1904 sh_setlinebuf (stdout);
Jari Aaltocce855b1998-04-17 19:52:44 +00001905 }
Jari Aaltod166f041997-06-05 14:59:13 +00001906
1907 /* Sort the array of shell builtins so that the binary search in
1908 find_shell_builtin () works correctly. */
1909 initialize_shell_builtins ();
1910
1911 /* Initialize the trap signal handlers before installing our own
1912 signal handlers. traps.c:restore_original_signals () is responsible
1913 for restoring the original default signal handlers. That function
1914 is called when we make a new child. */
1915 initialize_traps ();
Jari Aalto7117c2d2002-07-17 14:10:11 +00001916 initialize_signals (0);
Jari Aaltod166f041997-06-05 14:59:13 +00001917
1918 /* It's highly unlikely that this will change. */
1919 if (current_host_name == 0)
1920 {
1921 /* Initialize current_host_name. */
1922 if (gethostname (hostname, 255) < 0)
1923 current_host_name = "??host??";
1924 else
1925 current_host_name = savestring (hostname);
1926 }
1927
1928 /* Initialize the stuff in current_user that comes from the password
1929 file. We don't need to do this right away if the shell is not
1930 interactive. */
1931 if (interactive_shell)
1932 get_current_user_info ();
Jari Aalto726f6381996-08-26 18:22:31 +00001933
1934 /* Initialize our interface to the tilde expander. */
1935 tilde_initialize ();
1936
Chet Rameya0c0a002016-09-15 16:59:08 -04001937#if defined (RESTRICTED_SHELL)
1938 should_be_restricted = shell_is_restricted (shell_name);
1939#endif
1940
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001941 /* Initialize internal and environment variables. Don't import shell
1942 functions from the environment if we are running in privileged or
1943 restricted mode or if the shell is running setuid. */
1944#if defined (RESTRICTED_SHELL)
Chet Rameya0c0a002016-09-15 16:59:08 -04001945 initialize_shell_variables (shell_environment, privileged_mode||restricted||should_be_restricted||running_setuid);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001946#else
1947 initialize_shell_variables (shell_environment, privileged_mode||running_setuid);
1948#endif
Jari Aalto726f6381996-08-26 18:22:31 +00001949
Jari Aalto726f6381996-08-26 18:22:31 +00001950 /* Initialize the data structures for storing and running jobs. */
Chet Rameyac50fba2014-02-26 09:36:43 -05001951 initialize_job_control (jobs_m_flag);
Jari Aalto726f6381996-08-26 18:22:31 +00001952
1953 /* Initialize input streams to null. */
1954 initialize_bash_input ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001955
Jari Aalto7117c2d2002-07-17 14:10:11 +00001956 initialize_flags ();
1957
Jari Aaltocce855b1998-04-17 19:52:44 +00001958 /* Initialize the shell options. Don't import the shell options
Chet Ramey495aee42011-11-22 19:11:26 -05001959 from the environment variables $SHELLOPTS or $BASHOPTS if we are
1960 running in privileged or restricted mode or if the shell is running
1961 setuid. */
Jari Aaltocce855b1998-04-17 19:52:44 +00001962#if defined (RESTRICTED_SHELL)
Chet Rameya0c0a002016-09-15 16:59:08 -04001963 initialize_shell_options (privileged_mode||restricted||should_be_restricted||running_setuid);
1964 initialize_bashopts (privileged_mode||restricted||should_be_restricted||running_setuid);
Jari Aaltocce855b1998-04-17 19:52:44 +00001965#else
1966 initialize_shell_options (privileged_mode||running_setuid);
Chet Ramey00018032011-11-21 20:51:19 -05001967 initialize_bashopts (privileged_mode||running_setuid);
Jari Aaltocce855b1998-04-17 19:52:44 +00001968#endif
Jari Aalto726f6381996-08-26 18:22:31 +00001969}
1970
1971/* Function called by main () when it appears that the shell has already
1972 had some initialization performed. This is supposed to reset the world
1973 back to a pristine state, as if we had been exec'ed. */
1974static void
1975shell_reinitialize ()
1976{
1977 /* The default shell prompts. */
1978 primary_prompt = PPROMPT;
1979 secondary_prompt = SPROMPT;
1980
1981 /* Things that get 1. */
1982 current_command_number = 1;
1983
1984 /* We have decided that the ~/.bashrc file should not be executed
1985 for the invocation of each shell script. If the variable $ENV
1986 (or $BASH_ENV) is set, its value is used as the name of a file
1987 to source. */
1988 no_rc = no_profile = 1;
1989
1990 /* Things that get 0. */
1991 login_shell = make_login_shell = interactive = executing = 0;
1992 debugging = do_version = line_number = last_command_exit_value = 0;
Chet Rameya0c0a002016-09-15 16:59:08 -04001993 forced_interactive = interactive_shell = 0;
1994 subshell_environment = running_in_background = 0;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001995 expand_aliases = 0;
Chet Rameyd233b482019-01-07 09:27:52 -05001996 bash_argv_initialized = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001997
Chet Rameyac50fba2014-02-26 09:36:43 -05001998 /* XXX - should we set jobs_m_flag to 0 here? */
1999
Jari Aalto726f6381996-08-26 18:22:31 +00002000#if defined (HISTORY)
Chet Rameya0c0a002016-09-15 16:59:08 -04002001 bash_history_reinit (enable_history_list = 0);
Jari Aalto726f6381996-08-26 18:22:31 +00002002#endif /* HISTORY */
2003
2004#if defined (RESTRICTED_SHELL)
2005 restricted = 0;
2006#endif /* RESTRICTED_SHELL */
2007
2008 /* Ensure that the default startup file is used. (Except that we don't
2009 execute this file for reinitialized shells). */
Chet Rameya0c0a002016-09-15 16:59:08 -04002010 bashrc_file = DEFAULT_BASHRC;
Jari Aalto726f6381996-08-26 18:22:31 +00002011
2012 /* Delete all variables and functions. They will be reinitialized when
2013 the environment is parsed. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00002014 delete_all_contexts (shell_variables);
Jari Aalto726f6381996-08-26 18:22:31 +00002015 delete_all_variables (shell_functions);
2016
Jari Aalto31859422009-01-12 13:36:28 +00002017 reinit_special_variables ();
2018
2019#if defined (READLINE)
2020 bashline_reinitialize ();
2021#endif
2022
Jari Aalto28ef6c32001-04-06 19:14:31 +00002023 shell_reinitialized = 1;
Jari Aalto726f6381996-08-26 18:22:31 +00002024}
2025
2026static void
Jari Aaltod166f041997-06-05 14:59:13 +00002027show_shell_usage (fp, extra)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002028 FILE *fp;
Jari Aaltod166f041997-06-05 14:59:13 +00002029 int extra;
Jari Aalto726f6381996-08-26 18:22:31 +00002030{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002031 int i;
2032 char *set_opts, *s, *t;
Jari Aalto726f6381996-08-26 18:22:31 +00002033
Jari Aaltod166f041997-06-05 14:59:13 +00002034 if (extra)
Jari Aalto31859422009-01-12 13:36:28 +00002035 fprintf (fp, _("GNU bash, version %s-(%s)\n"), shell_version_string (), MACHTYPE);
Jari Aaltob80f6442004-07-27 13:29:18 +00002036 fprintf (fp, _("Usage:\t%s [GNU long option] [option] ...\n\t%s [GNU long option] [option] script-file ...\n"),
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002037 shell_name, shell_name);
Jari Aaltob80f6442004-07-27 13:29:18 +00002038 fputs (_("GNU long options:\n"), fp);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002039 for (i = 0; long_args[i].name; i++)
2040 fprintf (fp, "\t--%s\n", long_args[i].name);
Jari Aalto726f6381996-08-26 18:22:31 +00002041
Jari Aaltob80f6442004-07-27 13:29:18 +00002042 fputs (_("Shell options:\n"), fp);
Chet Rameyac50fba2014-02-26 09:36:43 -05002043 fputs (_("\t-ilrsD or -c command or -O shopt_option\t\t(invocation only)\n"), fp);
Jari Aalto726f6381996-08-26 18:22:31 +00002044
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002045 for (i = 0, set_opts = 0; shell_builtins[i].name; i++)
2046 if (STREQ (shell_builtins[i].name, "set"))
Chet Rameyd233b482019-01-07 09:27:52 -05002047 {
2048 set_opts = savestring (shell_builtins[i].short_doc);
2049 break;
2050 }
2051
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002052 if (set_opts)
Jari Aalto726f6381996-08-26 18:22:31 +00002053 {
Chet Ramey00018032011-11-21 20:51:19 -05002054 s = strchr (set_opts, '[');
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002055 if (s == 0)
2056 s = set_opts;
2057 while (*++s == '-')
2058 ;
Chet Ramey00018032011-11-21 20:51:19 -05002059 t = strchr (s, ']');
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002060 if (t)
2061 *t = '\0';
Jari Aaltob80f6442004-07-27 13:29:18 +00002062 fprintf (fp, _("\t-%s or -o option\n"), s);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002063 free (set_opts);
Jari Aalto726f6381996-08-26 18:22:31 +00002064 }
2065
Jari Aaltod166f041997-06-05 14:59:13 +00002066 if (extra)
2067 {
Jari Aaltob80f6442004-07-27 13:29:18 +00002068 fprintf (fp, _("Type `%s -c \"help set\"' for more information about shell options.\n"), shell_name);
2069 fprintf (fp, _("Type `%s -c help' for more information about shell builtin commands.\n"), shell_name);
2070 fprintf (fp, _("Use the `bashbug' command to report bugs.\n"));
Chet Rameya0c0a002016-09-15 16:59:08 -04002071 fprintf (fp, "\n");
2072 fprintf (fp, _("bash home page: <http://www.gnu.org/software/bash>\n"));
2073 fprintf (fp, _("General help using GNU software: <http://www.gnu.org/gethelp/>\n"));
Jari Aaltod166f041997-06-05 14:59:13 +00002074 }
Jari Aalto726f6381996-08-26 18:22:31 +00002075}
2076
Jari Aaltof73dda02001-11-13 17:56:06 +00002077static void
2078add_shopt_to_alist (opt, on_or_off)
2079 char *opt;
2080 int on_or_off;
2081{
2082 if (shopt_ind >= shopt_len)
2083 {
2084 shopt_len += 8;
2085 shopt_alist = (STRING_INT_ALIST *)xrealloc (shopt_alist, shopt_len * sizeof (shopt_alist[0]));
2086 }
2087 shopt_alist[shopt_ind].word = opt;
2088 shopt_alist[shopt_ind].token = on_or_off;
2089 shopt_ind++;
2090}
2091
2092static void
2093run_shopt_alist ()
2094{
2095 register int i;
2096
2097 for (i = 0; i < shopt_ind; i++)
2098 if (shopt_setopt (shopt_alist[i].word, (shopt_alist[i].token == '-')) != EXECUTION_SUCCESS)
Jari Aaltob80f6442004-07-27 13:29:18 +00002099 exit (EX_BADUSAGE);
Jari Aaltof73dda02001-11-13 17:56:06 +00002100 free (shopt_alist);
2101 shopt_alist = 0;
2102 shopt_ind = shopt_len = 0;
2103}