xref: /openbsd-src/gnu/usr.bin/binutils/gdb/inflow.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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