/* Fork a Unix child process, and set up to debug it, for GDB.
- Copyright (C) 1990-2018 Free Software Foundation, Inc.
+ Copyright (C) 1990-2023 Free Software Foundation, Inc.
Contributed by Cygnus Support.
#include "gdbcmd.h"
#include "terminal.h"
#include "gdbthread.h"
-#include "top.h"
-#include "job-control.h"
-#include "filestuff.h"
+#include "ui.h"
+#include "gdbsupport/job-control.h"
+#include "gdbsupport/filestuff.h"
#include "nat/fork-inferior.h"
-#include "common/common-inferior.h"
+#include "gdbsupport/common-inferior.h"
/* The exec-wrapper, if any, that will be used when starting the
inferior. */
-static char *exec_wrapper = NULL;
+static std::string exec_wrapper;
-/* See common/common-inferior.h. */
+/* See gdbsupport/common-inferior.h. */
const char *
get_exec_wrapper ()
{
- return exec_wrapper;
+ return !exec_wrapper.empty () ? exec_wrapper.c_str () : nullptr;
}
/* See nat/fork-inferior.h. */
void
prefork_hook (const char *args)
{
- const char *inferior_io_terminal = get_inferior_io_terminal ();
-
gdb_assert (saved_ui == NULL);
/* Retain a copy of our UI, since the child will replace this value
and if we're vforked, we have to restore it. */
/* Tell the terminal handling subsystem what tty we plan to run on;
it will just record the information for later. */
- new_tty_prefork (inferior_io_terminal);
+ new_tty_prefork (current_inferior ()->tty ());
}
/* See nat/fork-inferior.h. */
void
postfork_hook (pid_t pid)
{
- struct inferior *inf;
-
- if (!have_inferiors ())
- init_thread_list ();
-
- inf = current_inferior ();
+ inferior *inf = current_inferior ();
inferior_appeared (inf, pid);
- /* Needed for wait_for_inferior stuff. */
- inferior_ptid = ptid_t (pid);
-
gdb_assert (saved_ui != NULL);
current_ui = saved_ui;
saved_ui = NULL;
static int debug_setpgrp = 657473;
/* Make sure we switch to main_ui here in order to be able to
- use the fprintf_unfiltered/warning/error functions. */
+ use the gdb_printf/warning/error functions. */
current_ui = main_ui;
/* Create a new session for the inferior process, if necessary.
ptid_t
gdb_startup_inferior (pid_t pid, int num_traps)
{
- ptid_t ptid = startup_inferior (pid, num_traps, NULL, NULL);
+ inferior *inf = current_inferior ();
+ process_stratum_target *proc_target = inf->process_target ();
+
+ scoped_restore save_starting_up
+ = make_scoped_restore (&inf->starting_up, true);
+
+ ptid_t ptid = startup_inferior (proc_target, pid, num_traps, NULL, NULL);
/* Mark all threads non-executing. */
- set_executing (ptid, 0);
+ set_executing (proc_target, ptid, false);
return ptid;
}
static void
unset_exec_wrapper_command (const char *args, int from_tty)
{
- xfree (exec_wrapper);
- exec_wrapper = NULL;
+ exec_wrapper.clear ();
}
static void
show_startup_with_shell (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- fprintf_filtered (file,
- _("Use of shell to start subprocesses is %s.\n"),
- value);
+ gdb_printf (file,
+ _("Use of shell to start subprocesses is %s.\n"),
+ value);
}
+void _initialize_fork_child ();
void
-_initialize_fork_child (void)
+_initialize_fork_child ()
{
add_setshow_filename_cmd ("exec-wrapper", class_run, &exec_wrapper, _("\
Set a wrapper for running programs.\n\
&setlist, &showlist);
add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
- _("Disable use of an execution wrapper."),
- &unsetlist);
+ _("Disable use of an execution wrapper."),
+ &unsetlist);
add_setshow_boolean_cmd ("startup-with-shell", class_support,
&startup_with_shell, _("\