/* Fork a Unix child process, and set up to debug it, for GDB and GDBserver.
- Copyright (C) 1990-2018 Free Software Foundation, Inc.
+ Copyright (C) 1990-2020 Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#include "common-defs.h"
+#include "gdbsupport/common-defs.h"
#include "fork-inferior.h"
#include "target/waitstatus.h"
-#include "filestuff.h"
+#include "gdbsupport/filestuff.h"
#include "target/target.h"
-#include "common-inferior.h"
-#include "common-gdbthread.h"
-#include "signals-state-save-restore.h"
-#include "gdb_tilde_expand.h"
+#include "gdbsupport/common-inferior.h"
+#include "gdbsupport/common-gdbthread.h"
+#include "gdbsupport/pathstuff.h"
+#include "gdbsupport/signals-state-save-restore.h"
+#include "gdbsupport/gdb_tilde_expand.h"
#include <vector>
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
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
fork_inferior (const char *exec_file_arg, const std::string &allargs,
char **env, void (*traceme_fun) (),
- void (*init_trace_fun) (int), void (*pre_trace_fun) (),
+ gdb::function_view<void (int)> init_trace_fun,
+ void (*pre_trace_fun) (),
const char *shell_file_arg,
void (*exec_fun)(const char *file, char * const *argv,
char * const *env))
/* 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);
}
for (i = 1; argv[i] != NULL; i++)
warning (" %s", argv[i]);
- warning ("Error: %s\n", safe_strerror (save_errno));
+ warning ("Error: %s", safe_strerror (save_errno));
_exit (0177);
}
initialize anything target-vector-specific that needs
initializing. */
if (init_trace_fun)
- (*init_trace_fun) (pid);
+ init_trace_fun (pid);
/* We are now in the child process of interest, having exec'd the
correct program, and are poised at the first instruction of the
/* See nat/fork-inferior.h. */
ptid_t
-startup_inferior (pid_t pid, int ntraps,
+startup_inferior (process_stratum_target *proc_target, pid_t pid, int ntraps,
struct target_waitstatus *last_waitstatus,
ptid_t *last_ptid)
{
case TARGET_WAITKIND_SYSCALL_ENTRY:
case TARGET_WAITKIND_SYSCALL_RETURN:
/* Ignore gracefully during startup of the inferior. */
- switch_to_thread (event_ptid);
+ switch_to_thread (proc_target, event_ptid);
break;
case TARGET_WAITKIND_SIGNALLED:
/* Handle EXEC signals as if they were SIGTRAP signals. */
xfree (ws.value.execd_pathname);
resume_signal = GDB_SIGNAL_TRAP;
- switch_to_thread (event_ptid);
+ switch_to_thread (proc_target, event_ptid);
break;
case TARGET_WAITKIND_STOPPED:
resume_signal = ws.value.sig;
- switch_to_thread (event_ptid);
+ switch_to_thread (proc_target, event_ptid);
break;
}
va_list ap;
va_start (ap, fmt);
- warning ("Could not trace the inferior process.\nError: ");
+ warning ("Could not trace the inferior process.");
vwarning (fmt, ap);
va_end (ap);