Fixes PR 25475: ensure exec-file-mismatch "ask" always asks in case of mismatch.
[deliverable/binutils-gdb.git] / gdb / fork-child.c
CommitLineData
c906108c 1/* Fork a Unix child process, and set up to debug it, for GDB.
74a4fe32 2
b811d2c2 3 Copyright (C) 1990-2020 Free Software Foundation, Inc.
74a4fe32 4
c906108c
SS
5 Contributed by Cygnus Support.
6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
d55e5aa6 23#include "inferior.h"
4de283e4 24#include "gdbcmd.h"
d55e5aa6 25#include "terminal.h"
4de283e4 26#include "gdbthread.h"
d55e5aa6 27#include "top.h"
268a13a5
TT
28#include "gdbsupport/job-control.h"
29#include "gdbsupport/filestuff.h"
4de283e4 30#include "nat/fork-inferior.h"
268a13a5 31#include "gdbsupport/common-inferior.h"
6037b830 32
2090129c
SDJ
33/* The exec-wrapper, if any, that will be used when starting the
34 inferior. */
808480f6 35
2090129c 36static char *exec_wrapper = NULL;
808480f6 37
268a13a5 38/* See gdbsupport/common-inferior.h. */
808480f6 39
2090129c
SDJ
40const char *
41get_exec_wrapper ()
808480f6 42{
2090129c 43 return exec_wrapper;
808480f6
PA
44}
45
2090129c 46/* See nat/fork-inferior.h. */
808480f6
PA
47
48void
2090129c 49gdb_flush_out_err ()
808480f6 50{
2090129c
SDJ
51 gdb_flush (main_ui->m_gdb_stdout);
52 gdb_flush (main_ui->m_gdb_stderr);
6037b830 53}
c906108c 54
2090129c
SDJ
55/* The ui structure that will be saved on 'prefork_hook' and
56 restored on 'postfork_hook'. */
57static struct ui *saved_ui = NULL;
0db8980c 58
2090129c 59/* See nat/fork-inferior.h. */
0db8980c
SDJ
60
61void
2090129c 62prefork_hook (const char *args)
0db8980c 63{
3cb3b8df 64 const char *inferior_io_terminal = get_inferior_io_terminal ();
c906108c 65
2090129c
SDJ
66 gdb_assert (saved_ui == NULL);
67 /* Retain a copy of our UI, since the child will replace this value
68 and if we're vforked, we have to restore it. */
69 saved_ui = current_ui;
49940788 70
c906108c
SS
71 /* Tell the terminal handling subsystem what tty we plan to run on;
72 it will just record the information for later. */
c906108c 73 new_tty_prefork (inferior_io_terminal);
2090129c 74}
c906108c 75
2090129c 76/* See nat/fork-inferior.h. */
c906108c 77
2090129c
SDJ
78void
79postfork_hook (pid_t pid)
80{
08036331 81 inferior *inf = current_inferior ();
6c95b8df
PA
82
83 inferior_appeared (inf, pid);
7f9f62ba 84
2090129c
SDJ
85 gdb_assert (saved_ui != NULL);
86 current_ui = saved_ui;
87 saved_ui = NULL;
191c4426 88
2090129c 89 new_tty_postfork ();
c906108c
SS
90}
91
2090129c 92/* See nat/fork-inferior.h. */
c906108c
SS
93
94void
2090129c 95postfork_child_hook ()
c906108c 96{
2090129c
SDJ
97 /* This is set to the result of setpgrp, which if vforked, will be
98 visible to you in the parent process. It's only used by humans
99 for debugging. */
100 static int debug_setpgrp = 657473;
101
102 /* Make sure we switch to main_ui here in order to be able to
103 use the fprintf_unfiltered/warning/error functions. */
104 current_ui = main_ui;
d90e17a7 105
2090129c
SDJ
106 /* Create a new session for the inferior process, if necessary.
107 It will also place the inferior in a separate process group. */
108 if (create_tty_session () <= 0)
98882a26 109 {
2090129c
SDJ
110 /* No session was created, but we still want to run the inferior
111 in a separate process group. */
112 debug_setpgrp = gdb_setpgid ();
113 if (debug_setpgrp == -1)
114 perror (_("setpgrp failed in child"));
98882a26
PA
115 }
116
2090129c
SDJ
117 /* Ask the tty subsystem to switch to the one we specified
118 earlier (or to share the current terminal, if none was
119 specified). */
120 new_tty ();
121}
c906108c 122
2090129c 123/* See inferior.h. */
ccd213ac 124
2090129c
SDJ
125ptid_t
126gdb_startup_inferior (pid_t pid, int num_traps)
127{
5b6d1e4f
PA
128 inferior *inf = current_inferior ();
129 process_stratum_target *proc_target = inf->process_target ();
130
131 ptid_t ptid = startup_inferior (proc_target, pid, num_traps, NULL, NULL);
2e979b94
PA
132
133 /* Mark all threads non-executing. */
719546c4 134 set_executing (proc_target, ptid, false);
2090129c
SDJ
135
136 return ptid;
c906108c 137}
ccd213ac
DJ
138
139/* Implement the "unset exec-wrapper" command. */
140
141static void
e0b2930c 142unset_exec_wrapper_command (const char *args, int from_tty)
ccd213ac
DJ
143{
144 xfree (exec_wrapper);
145 exec_wrapper = NULL;
146}
147
98882a26
PA
148static void
149show_startup_with_shell (struct ui_file *file, int from_tty,
150 struct cmd_list_element *c, const char *value)
151{
152 fprintf_filtered (file,
153 _("Use of shell to start subprocesses is %s.\n"),
154 value);
155}
156
6c265988 157void _initialize_fork_child ();
ccd213ac 158void
6c265988 159_initialize_fork_child ()
ccd213ac
DJ
160{
161 add_setshow_filename_cmd ("exec-wrapper", class_run, &exec_wrapper, _("\
162Set a wrapper for running programs.\n\
163The wrapper prepares the system and environment for the new program."),
164 _("\
165Show the wrapper for running programs."), NULL,
166 NULL, NULL,
167 &setlist, &showlist);
168
169 add_cmd ("exec-wrapper", class_run, unset_exec_wrapper_command,
170 _("Disable use of an execution wrapper."),
171 &unsetlist);
98882a26
PA
172
173 add_setshow_boolean_cmd ("startup-with-shell", class_support,
174 &startup_with_shell, _("\
175Set use of shell to start subprocesses. The default is on."), _("\
176Show use of shell to start subprocesses."), NULL,
177 NULL,
178 show_startup_with_shell,
179 &setlist, &showlist);
ccd213ac 180}
This page took 1.501199 seconds and 4 git commands to generate.