1e93f7393Sniklas /* Low level interface to ptrace, for GDB when running under Unix.
2b725ae77Skettenis Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3b725ae77Skettenis 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4b725ae77Skettenis Free Software Foundation, Inc.
5e93f7393Sniklas
6e93f7393Sniklas This file is part of GDB.
7e93f7393Sniklas
8e93f7393Sniklas This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas it under the terms of the GNU General Public License as published by
10e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas (at your option) any later version.
12e93f7393Sniklas
13e93f7393Sniklas This program is distributed in the hope that it will be useful,
14e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16e93f7393Sniklas GNU General Public License for more details.
17e93f7393Sniklas
18e93f7393Sniklas You should have received a copy of the GNU General Public License
19e93f7393Sniklas along with this program; if not, write to the Free Software
20b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis Boston, MA 02111-1307, USA. */
22e93f7393Sniklas
23e93f7393Sniklas #include "defs.h"
24e93f7393Sniklas #include "frame.h"
25e93f7393Sniklas #include "inferior.h"
26e93f7393Sniklas #include "command.h"
27e93f7393Sniklas #include "serial.h"
28e93f7393Sniklas #include "terminal.h"
29e93f7393Sniklas #include "target.h"
30e93f7393Sniklas #include "gdbthread.h"
31e93f7393Sniklas
32e93f7393Sniklas #include "gdb_string.h"
33e93f7393Sniklas #include <signal.h>
34e93f7393Sniklas #include <fcntl.h>
35b725ae77Skettenis #ifdef HAVE_SYS_SELECT_H
36b725ae77Skettenis #include <sys/select.h>
37e93f7393Sniklas #endif
38e93f7393Sniklas
39b725ae77Skettenis #include "inflow.h"
40e93f7393Sniklas
41b725ae77Skettenis #ifdef HAVE_SYS_IOCTL_H
42b725ae77Skettenis #include <sys/ioctl.h>
43e93f7393Sniklas #endif
44e93f7393Sniklas
45*63addd46Skettenis #ifndef O_NOCTTY
46*63addd46Skettenis #define O_NOCTTY 0
47*63addd46Skettenis #endif
48*63addd46Skettenis
49e93f7393Sniklas #if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN)
50b725ae77Skettenis static void handle_sigio (int);
51e93f7393Sniklas #endif
52e93f7393Sniklas
53b725ae77Skettenis extern void _initialize_inflow (void);
54e93f7393Sniklas
55b725ae77Skettenis static void pass_signal (int);
56e93f7393Sniklas
57b725ae77Skettenis static void kill_command (char *, int);
58b725ae77Skettenis
59b725ae77Skettenis static void terminal_ours_1 (int);
60e93f7393Sniklas
61e93f7393Sniklas /* Record terminal status separately for debugger and inferior. */
62e93f7393Sniklas
63b725ae77Skettenis static struct serial *stdin_serial;
64e93f7393Sniklas
65e93f7393Sniklas /* TTY state for the inferior. We save it whenever the inferior stops, and
66e93f7393Sniklas restore it when it resumes. */
67e93f7393Sniklas static serial_ttystate inferior_ttystate;
68e93f7393Sniklas
69e93f7393Sniklas /* Our own tty state, which we restore every time we need to deal with the
70e93f7393Sniklas terminal. We only set it once, when GDB first starts. The settings of
71e93f7393Sniklas flags which readline saves and restores and unimportant. */
72e93f7393Sniklas static serial_ttystate our_ttystate;
73e93f7393Sniklas
74e93f7393Sniklas /* fcntl flags for us and the inferior. Saved and restored just like
75e93f7393Sniklas {our,inferior}_ttystate. */
76e93f7393Sniklas static int tflags_inferior;
77e93f7393Sniklas static int tflags_ours;
78e93f7393Sniklas
79e93f7393Sniklas #ifdef PROCESS_GROUP_TYPE
80e93f7393Sniklas /* Process group for us and the inferior. Saved and restored just like
81e93f7393Sniklas {our,inferior}_ttystate. */
82e93f7393Sniklas PROCESS_GROUP_TYPE our_process_group;
83e93f7393Sniklas PROCESS_GROUP_TYPE inferior_process_group;
84e93f7393Sniklas #endif
85e93f7393Sniklas
86e93f7393Sniklas /* While the inferior is running, we want SIGINT and SIGQUIT to go to the
87e93f7393Sniklas inferior only. If we have job control, that takes care of it. If not,
88e93f7393Sniklas we save our handlers in these two variables and set SIGINT and SIGQUIT
89e93f7393Sniklas to SIG_IGN. */
90e93f7393Sniklas
91e93f7393Sniklas static void (*sigint_ours) ();
92e93f7393Sniklas static void (*sigquit_ours) ();
93e93f7393Sniklas
94e93f7393Sniklas /* The name of the tty (from the `tty' command) that we gave to the inferior
95e93f7393Sniklas when it was last started. */
96e93f7393Sniklas
97e93f7393Sniklas static char *inferior_thisrun_terminal;
98e93f7393Sniklas
99e93f7393Sniklas /* Nonzero if our terminal settings are in effect. Zero if the
100e93f7393Sniklas inferior's settings are in effect. Ignored if !gdb_has_a_terminal
101e93f7393Sniklas (). */
102e93f7393Sniklas
103b725ae77Skettenis int terminal_is_ours;
104e93f7393Sniklas
105b725ae77Skettenis enum
106b725ae77Skettenis {
107b725ae77Skettenis yes, no, have_not_checked
108b725ae77Skettenis }
109b725ae77Skettenis gdb_has_a_terminal_flag = have_not_checked;
110e93f7393Sniklas
111e93f7393Sniklas /* Does GDB have a terminal (on stdin)? */
112e93f7393Sniklas int
gdb_has_a_terminal(void)113b725ae77Skettenis gdb_has_a_terminal (void)
114e93f7393Sniklas {
115e93f7393Sniklas switch (gdb_has_a_terminal_flag)
116e93f7393Sniklas {
117e93f7393Sniklas case yes:
118e93f7393Sniklas return 1;
119e93f7393Sniklas case no:
120e93f7393Sniklas return 0;
121e93f7393Sniklas case have_not_checked:
122b725ae77Skettenis /* Get all the current tty settings (including whether we have a
123b725ae77Skettenis tty at all!). Can't do this in _initialize_inflow because
124b725ae77Skettenis serial_fdopen() won't work until the serial_ops_list is
125b725ae77Skettenis initialized. */
126e93f7393Sniklas
127e93f7393Sniklas #ifdef F_GETFL
128e93f7393Sniklas tflags_ours = fcntl (0, F_GETFL, 0);
129e93f7393Sniklas #endif
130e93f7393Sniklas
131e93f7393Sniklas gdb_has_a_terminal_flag = no;
132b725ae77Skettenis stdin_serial = serial_fdopen (0);
133e93f7393Sniklas if (stdin_serial != NULL)
134e93f7393Sniklas {
135b725ae77Skettenis our_ttystate = serial_get_tty_state (stdin_serial);
136e93f7393Sniklas
137e93f7393Sniklas if (our_ttystate != NULL)
138e93f7393Sniklas {
139e93f7393Sniklas gdb_has_a_terminal_flag = yes;
140e93f7393Sniklas #ifdef HAVE_TERMIOS
141e93f7393Sniklas our_process_group = tcgetpgrp (0);
142e93f7393Sniklas #endif
143b725ae77Skettenis #ifdef HAVE_TERMIO
144b725ae77Skettenis our_process_group = getpgrp ();
145b725ae77Skettenis #endif
146e93f7393Sniklas #ifdef HAVE_SGTTY
147e93f7393Sniklas ioctl (0, TIOCGPGRP, &our_process_group);
148e93f7393Sniklas #endif
149e93f7393Sniklas }
150e93f7393Sniklas }
151e93f7393Sniklas
152e93f7393Sniklas return gdb_has_a_terminal_flag == yes;
153e93f7393Sniklas default:
154e93f7393Sniklas /* "Can't happen". */
155e93f7393Sniklas return 0;
156e93f7393Sniklas }
157e93f7393Sniklas }
158e93f7393Sniklas
159e93f7393Sniklas /* Macro for printing errors from ioctl operations */
160e93f7393Sniklas
161e93f7393Sniklas #define OOPSY(what) \
162e93f7393Sniklas if (result == -1) \
163e93f7393Sniklas fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \
164b725ae77Skettenis what, safe_strerror (errno))
165e93f7393Sniklas
166b725ae77Skettenis static void terminal_ours_1 (int);
167e93f7393Sniklas
168e93f7393Sniklas /* Initialize the terminal settings we record for the inferior,
169e93f7393Sniklas before we actually run the inferior. */
170e93f7393Sniklas
171e93f7393Sniklas void
terminal_init_inferior_with_pgrp(int pgrp)172b725ae77Skettenis terminal_init_inferior_with_pgrp (int pgrp)
173e93f7393Sniklas {
174e93f7393Sniklas if (gdb_has_a_terminal ())
175e93f7393Sniklas {
176b725ae77Skettenis /* We could just as well copy our_ttystate (if we felt like
177b725ae77Skettenis adding a new function serial_copy_tty_state()). */
178e93f7393Sniklas if (inferior_ttystate)
179b725ae77Skettenis xfree (inferior_ttystate);
180b725ae77Skettenis inferior_ttystate = serial_get_tty_state (stdin_serial);
181e93f7393Sniklas
182e93f7393Sniklas #ifdef PROCESS_GROUP_TYPE
183e93f7393Sniklas inferior_process_group = pgrp;
184e93f7393Sniklas #endif
185e93f7393Sniklas
186e93f7393Sniklas /* Make sure that next time we call terminal_inferior (which will be
187e93f7393Sniklas before the program runs, as it needs to be), we install the new
188e93f7393Sniklas process group. */
189e93f7393Sniklas terminal_is_ours = 1;
190e93f7393Sniklas }
191e93f7393Sniklas }
192e93f7393Sniklas
193b725ae77Skettenis /* Save the terminal settings again. This is necessary for the TUI
194b725ae77Skettenis when it switches to TUI or non-TUI mode; curses changes the terminal
195b725ae77Skettenis and gdb must be able to restore it correctly. */
196b725ae77Skettenis
197e93f7393Sniklas void
terminal_save_ours(void)198b725ae77Skettenis terminal_save_ours (void)
199b725ae77Skettenis {
200b725ae77Skettenis if (gdb_has_a_terminal ())
201b725ae77Skettenis {
202b725ae77Skettenis /* We could just as well copy our_ttystate (if we felt like adding
203b725ae77Skettenis a new function serial_copy_tty_state). */
204b725ae77Skettenis if (our_ttystate)
205b725ae77Skettenis xfree (our_ttystate);
206b725ae77Skettenis our_ttystate = serial_get_tty_state (stdin_serial);
207b725ae77Skettenis }
208b725ae77Skettenis }
209b725ae77Skettenis
210b725ae77Skettenis void
terminal_init_inferior(void)211b725ae77Skettenis terminal_init_inferior (void)
212e93f7393Sniklas {
213e93f7393Sniklas #ifdef PROCESS_GROUP_TYPE
214e93f7393Sniklas /* This is for Lynx, and should be cleaned up by having Lynx be a separate
215e93f7393Sniklas debugging target with a version of target_terminal_init_inferior which
216e93f7393Sniklas passes in the process group to a generic routine which does all the work
217e93f7393Sniklas (and the non-threaded child_terminal_init_inferior can just pass in
218b725ae77Skettenis inferior_ptid to the same routine). */
219b725ae77Skettenis /* We assume INFERIOR_PID is also the child's process group. */
220b725ae77Skettenis terminal_init_inferior_with_pgrp (PIDGET (inferior_ptid));
221e93f7393Sniklas #endif /* PROCESS_GROUP_TYPE */
222e93f7393Sniklas }
223e93f7393Sniklas
224e93f7393Sniklas /* Put the inferior's terminal settings into effect.
225e93f7393Sniklas This is preparation for starting or resuming the inferior. */
226e93f7393Sniklas
227e93f7393Sniklas void
terminal_inferior(void)228b725ae77Skettenis terminal_inferior (void)
229e93f7393Sniklas {
230e93f7393Sniklas if (gdb_has_a_terminal () && terminal_is_ours
231b725ae77Skettenis && inferior_ttystate != NULL
232e93f7393Sniklas && inferior_thisrun_terminal == 0)
233e93f7393Sniklas {
234e93f7393Sniklas int result;
235e93f7393Sniklas
236e93f7393Sniklas #ifdef F_GETFL
237e93f7393Sniklas /* Is there a reason this is being done twice? It happens both
238e93f7393Sniklas places we use F_SETFL, so I'm inclined to think perhaps there
239e93f7393Sniklas is some reason, however perverse. Perhaps not though... */
240e93f7393Sniklas result = fcntl (0, F_SETFL, tflags_inferior);
241e93f7393Sniklas result = fcntl (0, F_SETFL, tflags_inferior);
242e93f7393Sniklas OOPSY ("fcntl F_SETFL");
243e93f7393Sniklas #endif
244e93f7393Sniklas
245e93f7393Sniklas /* Because we were careful to not change in or out of raw mode in
246e93f7393Sniklas terminal_ours, we will not change in our out of raw mode with
247e93f7393Sniklas this call, so we don't flush any input. */
248b725ae77Skettenis result = serial_set_tty_state (stdin_serial, inferior_ttystate);
249e93f7393Sniklas OOPSY ("setting tty state");
250e93f7393Sniklas
251e93f7393Sniklas if (!job_control)
252e93f7393Sniklas {
253e93f7393Sniklas sigint_ours = (void (*)()) signal (SIGINT, SIG_IGN);
254e93f7393Sniklas #ifdef SIGQUIT
255e93f7393Sniklas sigquit_ours = (void (*)()) signal (SIGQUIT, SIG_IGN);
256e93f7393Sniklas #endif
257e93f7393Sniklas }
258e93f7393Sniklas
259e93f7393Sniklas /* If attach_flag is set, we don't know whether we are sharing a
260e93f7393Sniklas terminal with the inferior or not. (attaching a process
261e93f7393Sniklas without a terminal is one case where we do not; attaching a
262e93f7393Sniklas process which we ran from the same shell as GDB via `&' is
263e93f7393Sniklas one case where we do, I think (but perhaps this is not
264e93f7393Sniklas `sharing' in the sense that we need to save and restore tty
265e93f7393Sniklas state)). I don't know if there is any way to tell whether we
266e93f7393Sniklas are sharing a terminal. So what we do is to go through all
267e93f7393Sniklas the saving and restoring of the tty state, but ignore errors
268e93f7393Sniklas setting the process group, which will happen if we are not
269e93f7393Sniklas sharing a terminal). */
270e93f7393Sniklas
271e93f7393Sniklas if (job_control)
272e93f7393Sniklas {
273e93f7393Sniklas #ifdef HAVE_TERMIOS
274e93f7393Sniklas result = tcsetpgrp (0, inferior_process_group);
275e93f7393Sniklas if (!attach_flag)
276e93f7393Sniklas OOPSY ("tcsetpgrp");
277e93f7393Sniklas #endif
278e93f7393Sniklas
279e93f7393Sniklas #ifdef HAVE_SGTTY
280e93f7393Sniklas result = ioctl (0, TIOCSPGRP, &inferior_process_group);
281e93f7393Sniklas if (!attach_flag)
282e93f7393Sniklas OOPSY ("TIOCSPGRP");
283e93f7393Sniklas #endif
284e93f7393Sniklas }
285e93f7393Sniklas
286e93f7393Sniklas }
287e93f7393Sniklas terminal_is_ours = 0;
288e93f7393Sniklas }
289e93f7393Sniklas
290e93f7393Sniklas /* Put some of our terminal settings into effect,
291e93f7393Sniklas enough to get proper results from our output,
292e93f7393Sniklas but do not change into or out of RAW mode
293e93f7393Sniklas so that no input is discarded.
294e93f7393Sniklas
295e93f7393Sniklas After doing this, either terminal_ours or terminal_inferior
296e93f7393Sniklas should be called to get back to a normal state of affairs. */
297e93f7393Sniklas
298e93f7393Sniklas void
terminal_ours_for_output(void)299b725ae77Skettenis terminal_ours_for_output (void)
300e93f7393Sniklas {
301e93f7393Sniklas terminal_ours_1 (1);
302e93f7393Sniklas }
303e93f7393Sniklas
304e93f7393Sniklas /* Put our terminal settings into effect.
305e93f7393Sniklas First record the inferior's terminal settings
306e93f7393Sniklas so they can be restored properly later. */
307e93f7393Sniklas
308e93f7393Sniklas void
terminal_ours(void)309b725ae77Skettenis terminal_ours (void)
310e93f7393Sniklas {
311e93f7393Sniklas terminal_ours_1 (0);
312e93f7393Sniklas }
313e93f7393Sniklas
314e93f7393Sniklas /* output_only is not used, and should not be used unless we introduce
315e93f7393Sniklas separate terminal_is_ours and terminal_is_ours_for_output
316e93f7393Sniklas flags. */
317e93f7393Sniklas
318e93f7393Sniklas static void
terminal_ours_1(int output_only)319b725ae77Skettenis terminal_ours_1 (int output_only)
320e93f7393Sniklas {
321e93f7393Sniklas /* Checking inferior_thisrun_terminal is necessary so that
322e93f7393Sniklas if GDB is running in the background, it won't block trying
323e93f7393Sniklas to do the ioctl()'s below. Checking gdb_has_a_terminal
324e93f7393Sniklas avoids attempting all the ioctl's when running in batch. */
325e93f7393Sniklas if (inferior_thisrun_terminal != 0 || gdb_has_a_terminal () == 0)
326e93f7393Sniklas return;
327e93f7393Sniklas
328e93f7393Sniklas if (!terminal_is_ours)
329e93f7393Sniklas {
330b725ae77Skettenis #ifdef SIGTTOU
331e93f7393Sniklas /* Ignore this signal since it will happen when we try to set the
332e93f7393Sniklas pgrp. */
333b725ae77Skettenis void (*osigttou) () = NULL;
334b725ae77Skettenis #endif
335e93f7393Sniklas int result;
336e93f7393Sniklas
337e93f7393Sniklas terminal_is_ours = 1;
338e93f7393Sniklas
339e93f7393Sniklas #ifdef SIGTTOU
340e93f7393Sniklas if (job_control)
341e93f7393Sniklas osigttou = (void (*)()) signal (SIGTTOU, SIG_IGN);
342e93f7393Sniklas #endif
343e93f7393Sniklas
344e93f7393Sniklas if (inferior_ttystate)
345b725ae77Skettenis xfree (inferior_ttystate);
346b725ae77Skettenis inferior_ttystate = serial_get_tty_state (stdin_serial);
347e93f7393Sniklas #ifdef HAVE_TERMIOS
348e93f7393Sniklas inferior_process_group = tcgetpgrp (0);
349e93f7393Sniklas #endif
350b725ae77Skettenis #ifdef HAVE_TERMIO
351b725ae77Skettenis inferior_process_group = getpgrp ();
352b725ae77Skettenis #endif
353e93f7393Sniklas #ifdef HAVE_SGTTY
354e93f7393Sniklas ioctl (0, TIOCGPGRP, &inferior_process_group);
355e93f7393Sniklas #endif
356e93f7393Sniklas
357e93f7393Sniklas /* Here we used to set ICANON in our ttystate, but I believe this
358e93f7393Sniklas was an artifact from before when we used readline. Readline sets
359e93f7393Sniklas the tty state when it needs to.
360e93f7393Sniklas FIXME-maybe: However, query() expects non-raw mode and doesn't
361e93f7393Sniklas use readline. Maybe query should use readline (on the other hand,
362e93f7393Sniklas this only matters for HAVE_SGTTY, not termio or termios, I think). */
363e93f7393Sniklas
364e93f7393Sniklas /* Set tty state to our_ttystate. We don't change in our out of raw
365e93f7393Sniklas mode, to avoid flushing input. We need to do the same thing
366e93f7393Sniklas regardless of output_only, because we don't have separate
367e93f7393Sniklas terminal_is_ours and terminal_is_ours_for_output flags. It's OK,
368e93f7393Sniklas though, since readline will deal with raw mode when/if it needs to.
369e93f7393Sniklas */
370e93f7393Sniklas
371b725ae77Skettenis serial_noflush_set_tty_state (stdin_serial, our_ttystate,
372e93f7393Sniklas inferior_ttystate);
373e93f7393Sniklas
374e93f7393Sniklas if (job_control)
375e93f7393Sniklas {
376e93f7393Sniklas #ifdef HAVE_TERMIOS
377e93f7393Sniklas result = tcsetpgrp (0, our_process_group);
378e93f7393Sniklas #if 0
379e93f7393Sniklas /* This fails on Ultrix with EINVAL if you run the testsuite
380e93f7393Sniklas in the background with nohup, and then log out. GDB never
381e93f7393Sniklas used to check for an error here, so perhaps there are other
382e93f7393Sniklas such situations as well. */
383e93f7393Sniklas if (result == -1)
384e93f7393Sniklas fprintf_unfiltered (gdb_stderr, "[tcsetpgrp failed in terminal_ours: %s]\n",
385b725ae77Skettenis safe_strerror (errno));
386e93f7393Sniklas #endif
387e93f7393Sniklas #endif /* termios */
388e93f7393Sniklas
389e93f7393Sniklas #ifdef HAVE_SGTTY
390e93f7393Sniklas result = ioctl (0, TIOCSPGRP, &our_process_group);
391e93f7393Sniklas #endif
392e93f7393Sniklas }
393e93f7393Sniklas
394e93f7393Sniklas #ifdef SIGTTOU
395e93f7393Sniklas if (job_control)
396e93f7393Sniklas signal (SIGTTOU, osigttou);
397e93f7393Sniklas #endif
398e93f7393Sniklas
399e93f7393Sniklas if (!job_control)
400e93f7393Sniklas {
401e93f7393Sniklas signal (SIGINT, sigint_ours);
402e93f7393Sniklas #ifdef SIGQUIT
403e93f7393Sniklas signal (SIGQUIT, sigquit_ours);
404e93f7393Sniklas #endif
405e93f7393Sniklas }
406e93f7393Sniklas
407e93f7393Sniklas #ifdef F_GETFL
408e93f7393Sniklas tflags_inferior = fcntl (0, F_GETFL, 0);
409e93f7393Sniklas
410e93f7393Sniklas /* Is there a reason this is being done twice? It happens both
411e93f7393Sniklas places we use F_SETFL, so I'm inclined to think perhaps there
412e93f7393Sniklas is some reason, however perverse. Perhaps not though... */
413e93f7393Sniklas result = fcntl (0, F_SETFL, tflags_ours);
414e93f7393Sniklas result = fcntl (0, F_SETFL, tflags_ours);
415e93f7393Sniklas #endif
416e93f7393Sniklas
417e93f7393Sniklas result = result; /* lint */
418e93f7393Sniklas }
419e93f7393Sniklas }
420e93f7393Sniklas
421e93f7393Sniklas void
term_info(char * arg,int from_tty)422b725ae77Skettenis term_info (char *arg, int from_tty)
423e93f7393Sniklas {
424e93f7393Sniklas target_terminal_info (arg, from_tty);
425e93f7393Sniklas }
426e93f7393Sniklas
427e93f7393Sniklas void
child_terminal_info(char * args,int from_tty)428b725ae77Skettenis child_terminal_info (char *args, int from_tty)
429e93f7393Sniklas {
430e93f7393Sniklas if (!gdb_has_a_terminal ())
431e93f7393Sniklas {
432e93f7393Sniklas printf_filtered ("This GDB does not control a terminal.\n");
433e93f7393Sniklas return;
434e93f7393Sniklas }
435e93f7393Sniklas
436e93f7393Sniklas printf_filtered ("Inferior's terminal status (currently saved by GDB):\n");
437e93f7393Sniklas
438e93f7393Sniklas /* First the fcntl flags. */
439e93f7393Sniklas {
440e93f7393Sniklas int flags;
441e93f7393Sniklas
442e93f7393Sniklas flags = tflags_inferior;
443e93f7393Sniklas
444e93f7393Sniklas printf_filtered ("File descriptor flags = ");
445e93f7393Sniklas
446e93f7393Sniklas #ifndef O_ACCMODE
447e93f7393Sniklas #define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
448e93f7393Sniklas #endif
449e93f7393Sniklas /* (O_ACCMODE) parens are to avoid Ultrix header file bug */
450e93f7393Sniklas switch (flags & (O_ACCMODE))
451e93f7393Sniklas {
452b725ae77Skettenis case O_RDONLY:
453b725ae77Skettenis printf_filtered ("O_RDONLY");
454b725ae77Skettenis break;
455b725ae77Skettenis case O_WRONLY:
456b725ae77Skettenis printf_filtered ("O_WRONLY");
457b725ae77Skettenis break;
458b725ae77Skettenis case O_RDWR:
459b725ae77Skettenis printf_filtered ("O_RDWR");
460b725ae77Skettenis break;
461e93f7393Sniklas }
462e93f7393Sniklas flags &= ~(O_ACCMODE);
463e93f7393Sniklas
464e93f7393Sniklas #ifdef O_NONBLOCK
465e93f7393Sniklas if (flags & O_NONBLOCK)
466e93f7393Sniklas printf_filtered (" | O_NONBLOCK");
467e93f7393Sniklas flags &= ~O_NONBLOCK;
468e93f7393Sniklas #endif
469e93f7393Sniklas
470e93f7393Sniklas #if defined (O_NDELAY)
471e93f7393Sniklas /* If O_NDELAY and O_NONBLOCK are defined to the same thing, we will
472e93f7393Sniklas print it as O_NONBLOCK, which is good cause that is what POSIX
473e93f7393Sniklas has, and the flag will already be cleared by the time we get here. */
474e93f7393Sniklas if (flags & O_NDELAY)
475e93f7393Sniklas printf_filtered (" | O_NDELAY");
476e93f7393Sniklas flags &= ~O_NDELAY;
477e93f7393Sniklas #endif
478e93f7393Sniklas
479e93f7393Sniklas if (flags & O_APPEND)
480e93f7393Sniklas printf_filtered (" | O_APPEND");
481e93f7393Sniklas flags &= ~O_APPEND;
482e93f7393Sniklas
483e93f7393Sniklas #if defined (O_BINARY)
484e93f7393Sniklas if (flags & O_BINARY)
485e93f7393Sniklas printf_filtered (" | O_BINARY");
486e93f7393Sniklas flags &= ~O_BINARY;
487e93f7393Sniklas #endif
488e93f7393Sniklas
489e93f7393Sniklas if (flags)
490e93f7393Sniklas printf_filtered (" | 0x%x", flags);
491e93f7393Sniklas printf_filtered ("\n");
492e93f7393Sniklas }
493e93f7393Sniklas
494e93f7393Sniklas #ifdef PROCESS_GROUP_TYPE
495b725ae77Skettenis printf_filtered ("Process group = %d\n",
496b725ae77Skettenis (int) inferior_process_group);
497e93f7393Sniklas #endif
498e93f7393Sniklas
499b725ae77Skettenis serial_print_tty_state (stdin_serial, inferior_ttystate, gdb_stdout);
500e93f7393Sniklas }
501e93f7393Sniklas
502e93f7393Sniklas /* NEW_TTY_PREFORK is called before forking a new child process,
503e93f7393Sniklas so we can record the state of ttys in the child to be formed.
504e93f7393Sniklas TTYNAME is null if we are to share the terminal with gdb;
505e93f7393Sniklas or points to a string containing the name of the desired tty.
506e93f7393Sniklas
507e93f7393Sniklas NEW_TTY is called in new child processes under Unix, which will
508e93f7393Sniklas become debugger target processes. This actually switches to
509e93f7393Sniklas the terminal specified in the NEW_TTY_PREFORK call. */
510e93f7393Sniklas
511e93f7393Sniklas void
new_tty_prefork(char * ttyname)512b725ae77Skettenis new_tty_prefork (char *ttyname)
513e93f7393Sniklas {
514e93f7393Sniklas /* Save the name for later, for determining whether we and the child
515e93f7393Sniklas are sharing a tty. */
516e93f7393Sniklas inferior_thisrun_terminal = ttyname;
517e93f7393Sniklas }
518e93f7393Sniklas
519e93f7393Sniklas void
new_tty(void)520b725ae77Skettenis new_tty (void)
521e93f7393Sniklas {
522b725ae77Skettenis int tty;
523e93f7393Sniklas
524e93f7393Sniklas if (inferior_thisrun_terminal == 0)
525e93f7393Sniklas return;
526e93f7393Sniklas #if !defined(__GO32__) && !defined(_WIN32)
527e93f7393Sniklas #ifdef TIOCNOTTY
528e93f7393Sniklas /* Disconnect the child process from our controlling terminal. On some
529e93f7393Sniklas systems (SVR4 for example), this may cause a SIGTTOU, so temporarily
530e93f7393Sniklas ignore SIGTTOU. */
531e93f7393Sniklas tty = open ("/dev/tty", O_RDWR);
532e93f7393Sniklas if (tty > 0)
533e93f7393Sniklas {
534e93f7393Sniklas void (*osigttou) ();
535e93f7393Sniklas
536e93f7393Sniklas osigttou = (void (*)()) signal (SIGTTOU, SIG_IGN);
537e93f7393Sniklas ioctl (tty, TIOCNOTTY, 0);
538e93f7393Sniklas close (tty);
539e93f7393Sniklas signal (SIGTTOU, osigttou);
540e93f7393Sniklas }
541e93f7393Sniklas #endif
542e93f7393Sniklas
543e93f7393Sniklas /* Now open the specified new terminal. */
544e93f7393Sniklas tty = open (inferior_thisrun_terminal, O_RDWR | O_NOCTTY);
545e93f7393Sniklas if (tty == -1)
546e93f7393Sniklas {
547e93f7393Sniklas print_sys_errmsg (inferior_thisrun_terminal, errno);
548e93f7393Sniklas _exit (1);
549e93f7393Sniklas }
550e93f7393Sniklas
551e93f7393Sniklas /* Avoid use of dup2; doesn't exist on all systems. */
552e93f7393Sniklas if (tty != 0)
553b725ae77Skettenis {
554b725ae77Skettenis close (0);
555b725ae77Skettenis dup (tty);
556b725ae77Skettenis }
557e93f7393Sniklas if (tty != 1)
558b725ae77Skettenis {
559b725ae77Skettenis close (1);
560b725ae77Skettenis dup (tty);
561b725ae77Skettenis }
562e93f7393Sniklas if (tty != 2)
563b725ae77Skettenis {
564b725ae77Skettenis close (2);
565b725ae77Skettenis dup (tty);
566b725ae77Skettenis }
567e93f7393Sniklas if (tty > 2)
568e93f7393Sniklas close (tty);
569e93f7393Sniklas #endif /* !go32 && !win32 */
570e93f7393Sniklas }
571e93f7393Sniklas
572e93f7393Sniklas /* Kill the inferior process. Make us have no inferior. */
573e93f7393Sniklas
574e93f7393Sniklas static void
kill_command(char * arg,int from_tty)575b725ae77Skettenis kill_command (char *arg, int from_tty)
576e93f7393Sniklas {
577b725ae77Skettenis /* FIXME: This should not really be inferior_ptid (or target_has_execution).
578e93f7393Sniklas It should be a distinct flag that indicates that a target is active, cuz
579e93f7393Sniklas some targets don't have processes! */
580e93f7393Sniklas
581b725ae77Skettenis if (ptid_equal (inferior_ptid, null_ptid))
582e93f7393Sniklas error ("The program is not being run.");
583e93f7393Sniklas if (!query ("Kill the program being debugged? "))
584e93f7393Sniklas error ("Not confirmed.");
585e93f7393Sniklas target_kill ();
586e93f7393Sniklas
587e93f7393Sniklas init_thread_list (); /* Destroy thread info */
588e93f7393Sniklas
589e93f7393Sniklas /* Killing off the inferior can leave us with a core file. If so,
590e93f7393Sniklas print the state we are left in. */
591b725ae77Skettenis if (target_has_stack)
592b725ae77Skettenis {
593e93f7393Sniklas printf_filtered ("In %s,\n", target_longname);
594b725ae77Skettenis if (deprecated_selected_frame == NULL)
595e93f7393Sniklas fputs_filtered ("No selected stack frame.\n", gdb_stdout);
596e93f7393Sniklas else
597*63addd46Skettenis print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC);
598e93f7393Sniklas }
599*63addd46Skettenis bfd_cache_close_all ();
600e93f7393Sniklas }
601e93f7393Sniklas
602e93f7393Sniklas /* Call set_sigint_trap when you need to pass a signal on to an attached
603e93f7393Sniklas process when handling SIGINT */
604e93f7393Sniklas
605e93f7393Sniklas static void
pass_signal(int signo)606b725ae77Skettenis pass_signal (int signo)
607e93f7393Sniklas {
608e93f7393Sniklas #ifndef _WIN32
609b725ae77Skettenis kill (PIDGET (inferior_ptid), SIGINT);
610e93f7393Sniklas #endif
611e93f7393Sniklas }
612e93f7393Sniklas
613e93f7393Sniklas static void (*osig) ();
614e93f7393Sniklas
615e93f7393Sniklas void
set_sigint_trap(void)616b725ae77Skettenis set_sigint_trap (void)
617e93f7393Sniklas {
618e93f7393Sniklas if (attach_flag || inferior_thisrun_terminal)
619e93f7393Sniklas {
620e93f7393Sniklas osig = (void (*)()) signal (SIGINT, pass_signal);
621e93f7393Sniklas }
622e93f7393Sniklas }
623e93f7393Sniklas
624e93f7393Sniklas void
clear_sigint_trap(void)625b725ae77Skettenis clear_sigint_trap (void)
626e93f7393Sniklas {
627e93f7393Sniklas if (attach_flag || inferior_thisrun_terminal)
628e93f7393Sniklas {
629e93f7393Sniklas signal (SIGINT, osig);
630e93f7393Sniklas }
631e93f7393Sniklas }
632e93f7393Sniklas
633e93f7393Sniklas #if defined (SIGIO) && defined (FASYNC) && defined (FD_SET) && defined (F_SETOWN)
634e93f7393Sniklas static void (*old_sigio) ();
635e93f7393Sniklas
636e93f7393Sniklas static void
handle_sigio(int signo)637b725ae77Skettenis handle_sigio (int signo)
638e93f7393Sniklas {
639e93f7393Sniklas int numfds;
640e93f7393Sniklas fd_set readfds;
641e93f7393Sniklas
642e93f7393Sniklas signal (SIGIO, handle_sigio);
643e93f7393Sniklas
644e93f7393Sniklas FD_ZERO (&readfds);
645e93f7393Sniklas FD_SET (target_activity_fd, &readfds);
646e93f7393Sniklas numfds = select (target_activity_fd + 1, &readfds, NULL, NULL, NULL);
647e93f7393Sniklas if (numfds >= 0 && FD_ISSET (target_activity_fd, &readfds))
648e93f7393Sniklas {
649e93f7393Sniklas #ifndef _WIN32
650e93f7393Sniklas if ((*target_activity_function) ())
651b725ae77Skettenis kill (PIDGET (inferior_ptid), SIGINT);
652e93f7393Sniklas #endif
653e93f7393Sniklas }
654e93f7393Sniklas }
655e93f7393Sniklas
656e93f7393Sniklas static int old_fcntl_flags;
657e93f7393Sniklas
658e93f7393Sniklas void
set_sigio_trap(void)659b725ae77Skettenis set_sigio_trap (void)
660e93f7393Sniklas {
661e93f7393Sniklas if (target_activity_function)
662e93f7393Sniklas {
663e93f7393Sniklas old_sigio = (void (*)()) signal (SIGIO, handle_sigio);
664e93f7393Sniklas fcntl (target_activity_fd, F_SETOWN, getpid ());
665e93f7393Sniklas old_fcntl_flags = fcntl (target_activity_fd, F_GETFL, 0);
666e93f7393Sniklas fcntl (target_activity_fd, F_SETFL, old_fcntl_flags | FASYNC);
667e93f7393Sniklas }
668e93f7393Sniklas }
669e93f7393Sniklas
670e93f7393Sniklas void
clear_sigio_trap(void)671b725ae77Skettenis clear_sigio_trap (void)
672e93f7393Sniklas {
673e93f7393Sniklas if (target_activity_function)
674e93f7393Sniklas {
675e93f7393Sniklas signal (SIGIO, old_sigio);
676e93f7393Sniklas fcntl (target_activity_fd, F_SETFL, old_fcntl_flags);
677e93f7393Sniklas }
678e93f7393Sniklas }
679e93f7393Sniklas #else /* No SIGIO. */
680e93f7393Sniklas void
set_sigio_trap(void)681b725ae77Skettenis set_sigio_trap (void)
682e93f7393Sniklas {
683e93f7393Sniklas if (target_activity_function)
684b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
685e93f7393Sniklas }
686e93f7393Sniklas
687e93f7393Sniklas void
clear_sigio_trap(void)688b725ae77Skettenis clear_sigio_trap (void)
689e93f7393Sniklas {
690e93f7393Sniklas if (target_activity_function)
691b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
692e93f7393Sniklas }
693e93f7393Sniklas #endif /* No SIGIO. */
694e93f7393Sniklas
695e93f7393Sniklas
696e93f7393Sniklas /* This is here because this is where we figure out whether we (probably)
697e93f7393Sniklas have job control. Just using job_control only does part of it because
698e93f7393Sniklas setpgid or setpgrp might not exist on a system without job control.
699e93f7393Sniklas It might be considered misplaced (on the other hand, process groups and
700e93f7393Sniklas job control are closely related to ttys).
701e93f7393Sniklas
702e93f7393Sniklas For a more clean implementation, in libiberty, put a setpgid which merely
703e93f7393Sniklas calls setpgrp and a setpgrp which does nothing (any system with job control
704e93f7393Sniklas will have one or the other). */
705e93f7393Sniklas int
gdb_setpgid(void)706b725ae77Skettenis gdb_setpgid (void)
707e93f7393Sniklas {
708e93f7393Sniklas int retval = 0;
709e93f7393Sniklas
710e93f7393Sniklas if (job_control)
711e93f7393Sniklas {
712b725ae77Skettenis #if defined (HAVE_TERMIOS) || defined (TIOCGPGRP)
713b725ae77Skettenis #ifdef HAVE_SETPGID
714b725ae77Skettenis /* The call setpgid (0, 0) is supposed to work and mean the same
715b725ae77Skettenis thing as this, but on Ultrix 4.2A it fails with EPERM (and
716e93f7393Sniklas setpgid (getpid (), getpid ()) succeeds). */
717e93f7393Sniklas retval = setpgid (getpid (), getpid ());
718e93f7393Sniklas #else
719b725ae77Skettenis #ifdef HAVE_SETPGRP
720b725ae77Skettenis #ifdef SETPGRP_VOID
721e93f7393Sniklas retval = setpgrp ();
722e93f7393Sniklas #else
723e93f7393Sniklas retval = setpgrp (getpid (), getpid ());
724b725ae77Skettenis #endif
725b725ae77Skettenis #endif /* HAVE_SETPGRP */
726b725ae77Skettenis #endif /* HAVE_SETPGID */
727b725ae77Skettenis #endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */
728e93f7393Sniklas }
729b725ae77Skettenis
730e93f7393Sniklas return retval;
731e93f7393Sniklas }
732e93f7393Sniklas
733e93f7393Sniklas void
_initialize_inflow(void)734b725ae77Skettenis _initialize_inflow (void)
735e93f7393Sniklas {
736e93f7393Sniklas add_info ("terminal", term_info,
737e93f7393Sniklas "Print inferior's saved terminal status.");
738e93f7393Sniklas
739e93f7393Sniklas add_com ("kill", class_run, kill_command,
740e93f7393Sniklas "Kill execution of program being debugged.");
741e93f7393Sniklas
742b725ae77Skettenis inferior_ptid = null_ptid;
743e93f7393Sniklas
744e93f7393Sniklas terminal_is_ours = 1;
745e93f7393Sniklas
746e93f7393Sniklas /* OK, figure out whether we have job control. If neither termios nor
747e93f7393Sniklas sgtty (i.e. termio or go32), leave job_control 0. */
748e93f7393Sniklas
749e93f7393Sniklas #if defined (HAVE_TERMIOS)
750e93f7393Sniklas /* Do all systems with termios have the POSIX way of identifying job
751e93f7393Sniklas control? I hope so. */
752e93f7393Sniklas #ifdef _POSIX_JOB_CONTROL
753e93f7393Sniklas job_control = 1;
754e93f7393Sniklas #else
755e93f7393Sniklas #ifdef _SC_JOB_CONTROL
756e93f7393Sniklas job_control = sysconf (_SC_JOB_CONTROL);
757e93f7393Sniklas #else
758e93f7393Sniklas job_control = 0; /* have to assume the worst */
759e93f7393Sniklas #endif /* _SC_JOB_CONTROL */
760e93f7393Sniklas #endif /* _POSIX_JOB_CONTROL */
761e93f7393Sniklas #endif /* HAVE_TERMIOS */
762e93f7393Sniklas
763e93f7393Sniklas #ifdef HAVE_SGTTY
764e93f7393Sniklas #ifdef TIOCGPGRP
765e93f7393Sniklas job_control = 1;
766e93f7393Sniklas #else
767e93f7393Sniklas job_control = 0;
768e93f7393Sniklas #endif /* TIOCGPGRP */
769e93f7393Sniklas #endif /* sgtty */
770e93f7393Sniklas }
771