From: Tom Tromey Date: Fri, 14 Sep 2018 16:35:45 +0000 (-0600) Subject: Unify shell-finding logic X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=974e68446388769f023c6c9bfb1e67ed75199618;p=binutils-gdb.git Unify shell-finding logic I noticed several places in gdb that were using getenv("SHELL") and then falling back to "/bin/sh" if it returned NULL. This unifies these into a single function. gdb/ChangeLog 2018-10-27 Tom Tromey * procfs.c (procfs_target::create_inferior): Use get_shell. * cli/cli-cmds.c (shell_escape): Use get_shell. * windows-nat.c (windows_nat_target::create_inferior): Use get_shell. * common/pathstuff.c (get_shell): New function. * nat/fork-inferior.c (SHELL_FILE, get_startup_shell): Remove. (fork_inferior): Use get_shell. * common/pathstuff.h (get_shell): Declare. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e9491358faa..5c5c8b12a6b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2018-10-27 Tom Tromey + + * procfs.c (procfs_target::create_inferior): Use get_shell. + * cli/cli-cmds.c (shell_escape): Use get_shell. + * windows-nat.c (windows_nat_target::create_inferior): Use + get_shell. + * common/pathstuff.c (get_shell): New function. + * nat/fork-inferior.c (SHELL_FILE, get_startup_shell): Remove. + (fork_inferior): Use get_shell. + * common/pathstuff.h (get_shell): Declare. + 2018-10-27 Philippe Waroquiers * NEWS: Mention changes to 'info [args|functions|locals|variables]' diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index b871e476d39..135f550b801 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -50,6 +50,7 @@ #include "cli/cli-utils.h" #include "extension.h" +#include "common/pathstuff.h" #ifdef TUI #include "tui/tui.h" /* For tui_active et.al. */ @@ -726,13 +727,10 @@ shell_escape (const char *arg, int from_tty) if ((pid = vfork ()) == 0) { - const char *p, *user_shell; + const char *p, *user_shell = get_shell (); close_most_fds (); - if ((user_shell = getenv ("SHELL")) == NULL) - user_shell = "/bin/sh"; - /* Get the name of the shell for arg0. */ p = lbasename (user_shell); diff --git a/gdb/common/pathstuff.c b/gdb/common/pathstuff.c index 82905c9e687..6d8e53f4e1b 100644 --- a/gdb/common/pathstuff.c +++ b/gdb/common/pathstuff.c @@ -190,3 +190,15 @@ get_standard_cache_dir () return {}; } + +/* See common/pathstuff.h. */ + +const char * +get_shell () +{ + const char *ret = getenv ("SHELL"); + if (ret == NULL) + ret = "/bin/sh"; + + return ret; +} diff --git a/gdb/common/pathstuff.h b/gdb/common/pathstuff.h index a43b9636514..0a8caeacba7 100644 --- a/gdb/common/pathstuff.h +++ b/gdb/common/pathstuff.h @@ -64,4 +64,9 @@ extern bool contains_dir_separator (const char *path); extern std::string get_standard_cache_dir (); +/* Return the file name of the user's shell. Normally this comes from + the SHELL environment variable. */ + +extern const char *get_shell (); + #endif /* PATHSTUFF_H */ diff --git a/gdb/nat/fork-inferior.c b/gdb/nat/fork-inferior.c index 40cd05a0f8f..f1032b43c9e 100644 --- a/gdb/nat/fork-inferior.c +++ b/gdb/nat/fork-inferior.c @@ -24,16 +24,13 @@ #include "target/target.h" #include "common-inferior.h" #include "common-gdbthread.h" +#include "common/pathstuff.h" #include "signals-state-save-restore.h" #include "gdb_tilde_expand.h" #include extern char **environ; -/* Default shell file to be used if 'startup-with-shell' is set but - $SHELL is not. */ -#define SHELL_FILE "/bin/sh" - /* Build the argument vector for execv(3). */ class execv_argv @@ -265,20 +262,6 @@ execv_argv::init_for_shell (const char *exec_file, m_argv.push_back (NULL); } -/* Return the shell that must be used to startup the inferior. The - first attempt is the environment variable SHELL; if it is not set, - then we default to SHELL_FILE. */ - -static const char * -get_startup_shell () -{ - const char *ret = getenv ("SHELL"); - if (ret == NULL) - ret = SHELL_FILE; - - return ret; -} - /* See nat/fork-inferior.h. */ pid_t @@ -316,7 +299,7 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs, /* Figure out what shell to start up the user program under. */ if (shell_file == NULL) - shell_file = get_startup_shell (); + shell_file = get_shell (); gdb_assert (shell_file != NULL); } diff --git a/gdb/procfs.c b/gdb/procfs.c index 6ffe569e690..ca381a71ae5 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -3035,11 +3035,11 @@ procfs_target::create_inferior (const char *exec_file, const std::string &allargs, char **env, int from_tty) { - char *shell_file = getenv ("SHELL"); + const char *shell_file = get_shell (); char *tryname; int pid; - if (shell_file != NULL && strchr (shell_file, '/') == NULL) + if (strchr (shell_file, '/') == NULL) { /* We will be looking down the PATH to find shell_file. If we diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 0047a264189..8292cf42122 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -68,6 +68,7 @@ #include "complaints.h" #include "inf-child.h" #include "gdb_tilde_expand.h" +#include "common/pathstuff.h" #define AdjustTokenPrivileges dyn_AdjustTokenPrivileges #define DebugActiveProcessStop dyn_DebugActiveProcessStop @@ -2578,9 +2579,7 @@ windows_nat_target::create_inferior (const char *exec_file, } else { - sh = getenv ("SHELL"); - if (!sh) - sh = "/bin/sh"; + sh = get_shell (); if (cygwin_conv_path (CCP_POSIX_TO_WIN_W, sh, shell, __PMAX) < 0) error (_("Error starting executable via shell: %d"), errno); #ifdef __USEWIDE