xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/inflow.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Low level interface to ptrace, for GDB when running under Unix.
2    Copyright (C) 1986-2023 Free Software Foundation, Inc.
3 
4    This file is part of GDB.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18 
19 #include "defs.h"
20 #include "frame.h"
21 #include "inferior.h"
22 #include "command.h"
23 #include "serial.h"
24 #include "terminal.h"
25 #include "target.h"
26 #include "gdbthread.h"
27 #include "observable.h"
28 #include <signal.h>
29 #include <fcntl.h>
30 #include "gdbsupport/gdb_select.h"
31 
32 #include "gdbcmd.h"
33 #ifdef HAVE_TERMIOS_H
34 #include <termios.h>
35 #endif
36 #include "gdbsupport/job-control.h"
37 #include "gdbsupport/scoped_ignore_sigttou.h"
38 
39 #ifdef HAVE_SYS_IOCTL_H
40 #include <sys/ioctl.h>
41 #endif
42 
43 #ifndef O_NOCTTY
44 #define O_NOCTTY 0
45 #endif
46 
47 static void pass_signal (int);
48 
49 static void child_terminal_ours_1 (target_terminal_state);
50 
51 /* Record terminal status separately for debugger and inferior.  */
52 
53 static struct serial *stdin_serial;
54 
55 /* Terminal related info we need to keep track of.  Each inferior
56    holds an instance of this structure --- we save it whenever the
57    corresponding inferior stops, and restore it to the terminal when
58    the inferior is resumed in the foreground.  */
59 struct terminal_info
60 {
61   terminal_info () = default;
62   ~terminal_info ();
63 
64   terminal_info &operator= (const terminal_info &) = default;
65 
66   /* The name of the tty (from the `tty' command) that we gave to the
67      inferior when it was started.  */
68   std::string run_terminal;
69 
70   /* TTY state.  We save it whenever the inferior stops, and restore
71      it when it resumes in the foreground.  */
72   serial_ttystate ttystate {};
73 
74 #ifdef HAVE_TERMIOS_H
75   /* The terminal's foreground process group.  Saved whenever the
76      inferior stops.  This is the pgrp displayed by "info terminal".
77      Note that this may be not the inferior's actual process group,
78      since each inferior that we spawn has its own process group, and
79      only one can be in the foreground at a time.  When the inferior
80      resumes, if we can determine the inferior's actual pgrp, then we
81      make that the foreground pgrp instead of what was saved here.
82      While it's a bit arbitrary which inferior's pgrp ends up in the
83      foreground when we resume several inferiors, this at least makes
84      'resume inf1+inf2' + 'stop all' + 'resume inf2' end up with
85      inf2's pgrp in the foreground instead of inf1's (which would be
86      problematic since it would be left stopped: Ctrl-C wouldn't work,
87      for example).  */
88   pid_t process_group = 0;
89 #endif
90 
91   /* fcntl flags.  Saved and restored just like ttystate.  */
92   int tflags = 0;
93 };
94 
95 /* Our own tty state, which we restore every time we need to deal with
96    the terminal.  This is set once, when GDB first starts, and then
97    whenever we enter/leave TUI mode (gdb_save_tty_state).  The
98    settings of flags which readline saves and restores are
99    unimportant.  */
100 static struct terminal_info our_terminal_info;
101 
102 /* Snapshot of the initial tty state taken during initialization of
103    GDB, before readline/ncurses have had a chance to change it.  This
104    is used as the initial tty state given to each new spawned
105    inferior.  Unlike our_terminal_info, this is only ever set
106    once.  */
107 static serial_ttystate initial_gdb_ttystate;
108 
109 static struct terminal_info *get_inflow_inferior_data (struct inferior *);
110 
111 /* While the inferior is running, we want SIGINT and SIGQUIT to go to the
112    inferior only.  If we have job control, that takes care of it.  If not,
113    we save our handlers in these two variables and set SIGINT and SIGQUIT
114    to SIG_IGN.  */
115 
116 static gdb::optional<sighandler_t> sigint_ours;
117 #ifdef SIGQUIT
118 static gdb::optional<sighandler_t> sigquit_ours;
119 #endif
120 
121 /* The name of the tty (from the `tty' command) that we're giving to
122    the inferior when starting it up.  This is only (and should only
123    be) used as a transient global by new_tty_prefork,
124    create_tty_session, new_tty and new_tty_postfork, all called from
125    fork_inferior, while forking a new child.  */
126 static std::string inferior_thisrun_terminal;
127 
128 /* Track who owns GDB's terminal (is it GDB or some inferior?).  While
129    target_terminal::is_ours() etc. tracks the core's intention and is
130    independent of the target backend, this tracks the actual state of
131    GDB's own tty.  So for example,
132 
133      (target_terminal::is_inferior () && gdb_tty_state == terminal_is_ours)
134 
135    is true when the (native) inferior is not sharing a terminal with
136    GDB (e.g., because we attached to an inferior that is running on a
137    different terminal).  */
138 static target_terminal_state gdb_tty_state = target_terminal_state::is_ours;
139 
140 /* See terminal.h.  */
141 
142 void
143 set_initial_gdb_ttystate (void)
144 {
145   /* Note we can't do any of this in _initialize_inflow because at
146      that point stdin_serial has not been created yet.  */
147 
148   initial_gdb_ttystate = serial_get_tty_state (stdin_serial);
149 
150   if (initial_gdb_ttystate != NULL)
151     {
152       our_terminal_info.ttystate
153 	= serial_copy_tty_state (stdin_serial, initial_gdb_ttystate);
154 #ifdef F_GETFL
155       our_terminal_info.tflags = fcntl (0, F_GETFL, 0);
156 #endif
157 #ifdef HAVE_TERMIOS_H
158       our_terminal_info.process_group = tcgetpgrp (0);
159 #endif
160     }
161 }
162 
163 /* Does GDB have a terminal (on stdin)?  */
164 
165 static int
166 gdb_has_a_terminal (void)
167 {
168   return initial_gdb_ttystate != NULL;
169 }
170 
171 /* Macro for printing errors from ioctl operations */
172 
173 #define	OOPSY(what)	\
174   if (result == -1)	\
175     gdb_printf(gdb_stderr, "[%s failed in terminal_inferior: %s]\n",	\
176 	       what, safe_strerror (errno))
177 
178 /* Initialize the terminal settings we record for the inferior,
179    before we actually run the inferior.  */
180 
181 void
182 child_terminal_init (struct target_ops *self)
183 {
184   if (!gdb_has_a_terminal ())
185     return;
186 
187   inferior *inf = current_inferior ();
188   terminal_info *tinfo = get_inflow_inferior_data (inf);
189 
190 #ifdef HAVE_TERMIOS_H
191   /* A child we spawn should be a process group leader (PGID==PID) at
192      this point, though that may not be true if we're attaching to an
193      existing process.  */
194   tinfo->process_group = inf->pid;
195 #endif
196 
197   xfree (tinfo->ttystate);
198   tinfo->ttystate = serial_copy_tty_state (stdin_serial, initial_gdb_ttystate);
199 }
200 
201 /* Save the terminal settings again.  This is necessary for the TUI
202    when it switches to TUI or non-TUI mode;  curses changes the terminal
203    and gdb must be able to restore it correctly.  */
204 
205 void
206 gdb_save_tty_state (void)
207 {
208   if (gdb_has_a_terminal ())
209     {
210       xfree (our_terminal_info.ttystate);
211       our_terminal_info.ttystate = serial_get_tty_state (stdin_serial);
212     }
213 }
214 
215 /* See inferior.h.  */
216 
217 tribool
218 is_gdb_terminal (const char *tty)
219 {
220   struct stat gdb_tty;
221   struct stat other_tty;
222   int res;
223 
224   res = stat (tty, &other_tty);
225   if (res == -1)
226     return TRIBOOL_UNKNOWN;
227 
228   res = fstat (STDIN_FILENO, &gdb_tty);
229   if (res == -1)
230     return TRIBOOL_UNKNOWN;
231 
232   return ((gdb_tty.st_dev == other_tty.st_dev
233 	   && gdb_tty.st_ino == other_tty.st_ino)
234 	  ? TRIBOOL_TRUE
235 	  : TRIBOOL_FALSE);
236 }
237 
238 /* Return true if the inferior is using the same TTY for input as GDB
239    is.  If this is true, then we save/restore terminal flags/state.
240 
241    This is necessary because if inf->attach_flag is set, we don't
242    offhand know whether we are sharing a terminal with the inferior or
243    not.  Attaching a process without a terminal is one case where we
244    do not; attaching a process which we ran from the same shell as GDB
245    via `&' is one case where we do.
246 
247    If we can't determine, we assume the TTY is being shared.  This
248    works OK if you're only debugging one inferior.  However, if you're
249    debugging more than one inferior, and e.g., one is spawned by GDB
250    with "run" (sharing terminal with GDB), and another is attached to
251    (and running on a different terminal, as is most common), then it
252    matters, because we can only restore the terminal settings of one
253    of the inferiors, and in that scenario, we want to restore the
254    settings of the "run"'ed inferior.
255 
256    Note, this is not the same as determining whether GDB and the
257    inferior are in the same session / connected to the same
258    controlling tty.  An inferior (fork child) may call setsid,
259    disconnecting itself from the ctty, while still leaving
260    stdin/stdout/stderr associated with the original terminal.  If
261    we're debugging that process, we should also save/restore terminal
262    settings.  */
263 
264 static bool
265 sharing_input_terminal (inferior *inf)
266 {
267   terminal_info *tinfo = get_inflow_inferior_data (inf);
268 
269   tribool res = sharing_input_terminal (inf->pid);
270 
271   if (res == TRIBOOL_UNKNOWN)
272     {
273       /* As fallback, if we can't determine by stat'ing the inferior's
274 	 tty directly (because it's not supported on this host) and
275 	 the child was spawned, check whether run_terminal is our tty.
276 	 This isn't ideal, since this is checking the child's
277 	 controlling terminal, not the input terminal (which may have
278 	 been redirected), but is still better than nothing.  A false
279 	 positive ("set inferior-tty" points to our terminal, but I/O
280 	 was redirected) is much more likely than a false negative
281 	 ("set inferior-tty" points to some other terminal, and then
282 	 output was redirected to our terminal), and with a false
283 	 positive we just end up trying to save/restore terminal
284 	 settings when we didn't need to or we actually can't.  */
285       if (!tinfo->run_terminal.empty ())
286 	res = is_gdb_terminal (tinfo->run_terminal.c_str ());
287 
288       /* If we still can't determine, assume yes.  */
289       if (res == TRIBOOL_UNKNOWN)
290 	return true;
291     }
292 
293   return res == TRIBOOL_TRUE;
294 }
295 
296 /* Put the inferior's terminal settings into effect.  This is
297    preparation for starting or resuming the inferior.  */
298 
299 void
300 child_terminal_inferior (struct target_ops *self)
301 {
302   /* If we resume more than one inferior in the foreground on GDB's
303      terminal, then the first inferior's terminal settings "win".
304      Note that every child process is put in its own process group, so
305      the first process that ends up resumed ends up determining which
306      process group the kernel forwards Ctrl-C/Ctrl-Z (SIGINT/SIGTTOU)
307      to.  */
308   if (gdb_tty_state == target_terminal_state::is_inferior)
309     return;
310 
311   inferior *inf = current_inferior ();
312   terminal_info *tinfo = get_inflow_inferior_data (inf);
313 
314   if (gdb_has_a_terminal ()
315       && tinfo->ttystate != NULL
316       && sharing_input_terminal (inf))
317     {
318       int result;
319 
320       /* Ignore SIGTTOU since it will happen when we try to set the
321 	 terminal's state (if gdb_tty_state is currently
322 	 ours_for_output).  */
323       scoped_ignore_sigttou ignore_sigttou;
324 
325 #ifdef F_GETFL
326       result = fcntl (0, F_SETFL, tinfo->tflags);
327       OOPSY ("fcntl F_SETFL");
328 #endif
329 
330       result = serial_set_tty_state (stdin_serial, tinfo->ttystate);
331       OOPSY ("setting tty state");
332 
333       if (!job_control)
334 	{
335 	  sigint_ours = install_sigint_handler (SIG_IGN);
336 #ifdef SIGQUIT
337 	  sigquit_ours = signal (SIGQUIT, SIG_IGN);
338 #endif
339 	}
340 
341       if (job_control)
342 	{
343 #ifdef HAVE_TERMIOS_H
344 	  /* If we can't tell the inferior's actual process group,
345 	     then restore whatever was the foreground pgrp the last
346 	     time the inferior was running.  See also comments
347 	     describing terminal_state::process_group.  */
348 #ifdef HAVE_GETPGID
349 	  result = tcsetpgrp (0, getpgid (inf->pid));
350 #else
351 	  result = tcsetpgrp (0, tinfo->process_group);
352 #endif
353 	  if (result == -1)
354 	    {
355 #if 0
356 	      /* This fails if either GDB has no controlling terminal,
357 		 e.g., running under 'setsid(1)', or if the inferior
358 		 is not attached to GDB's controlling terminal.  E.g.,
359 		 if it called setsid to create a new session or used
360 		 the TIOCNOTTY ioctl, or simply if we've attached to a
361 		 process running on another terminal and we couldn't
362 		 tell whether it was sharing GDB's terminal (and so
363 		 assumed yes).  */
364 	      gdb_printf
365 		(gdb_stderr,
366 		 "[tcsetpgrp failed in child_terminal_inferior: %s]\n",
367 		 safe_strerror (errno));
368 #endif
369 	    }
370 #endif
371 	}
372 
373       gdb_tty_state = target_terminal_state::is_inferior;
374     }
375 }
376 
377 /* Put some of our terminal settings into effect,
378    enough to get proper results from our output,
379    but do not change into or out of RAW mode
380    so that no input is discarded.
381 
382    After doing this, either terminal_ours or terminal_inferior
383    should be called to get back to a normal state of affairs.
384 
385    N.B. The implementation is (currently) no different than
386    child_terminal_ours.  See child_terminal_ours_1.  */
387 
388 void
389 child_terminal_ours_for_output (struct target_ops *self)
390 {
391   child_terminal_ours_1 (target_terminal_state::is_ours_for_output);
392 }
393 
394 /* Put our terminal settings into effect.
395    First record the inferior's terminal settings
396    so they can be restored properly later.
397 
398    N.B. Targets that want to use this with async support must build that
399    support on top of this (e.g., the caller still needs to add stdin to the
400    event loop).  E.g., see linux_nat_terminal_ours.  */
401 
402 void
403 child_terminal_ours (struct target_ops *self)
404 {
405   child_terminal_ours_1 (target_terminal_state::is_ours);
406 }
407 
408 /* Save the current terminal settings in the inferior's terminal_info
409    cache.  */
410 
411 void
412 child_terminal_save_inferior (struct target_ops *self)
413 {
414   /* Avoid attempting all the ioctl's when running in batch.  */
415   if (!gdb_has_a_terminal ())
416     return;
417 
418   inferior *inf = current_inferior ();
419   terminal_info *tinfo = get_inflow_inferior_data (inf);
420 
421   /* No need to save/restore if the inferior is not sharing GDB's
422      tty.  */
423   if (!sharing_input_terminal (inf))
424     return;
425 
426   xfree (tinfo->ttystate);
427   tinfo->ttystate = serial_get_tty_state (stdin_serial);
428 
429 #ifdef HAVE_TERMIOS_H
430   tinfo->process_group = tcgetpgrp (0);
431 #endif
432 
433 #ifdef F_GETFL
434   tinfo->tflags = fcntl (0, F_GETFL, 0);
435 #endif
436 }
437 
438 /* Switch terminal state to DESIRED_STATE, either is_ours, or
439    is_ours_for_output.  */
440 
441 static void
442 child_terminal_ours_1 (target_terminal_state desired_state)
443 {
444   gdb_assert (desired_state != target_terminal_state::is_inferior);
445 
446   /* Avoid attempting all the ioctl's when running in batch.  */
447   if (!gdb_has_a_terminal ())
448     return;
449 
450   if (gdb_tty_state != desired_state)
451     {
452       int result ATTRIBUTE_UNUSED;
453 
454       /* Ignore SIGTTOU since it will happen when we try to set the
455 	 terminal's pgrp.  */
456       scoped_ignore_sigttou ignore_sigttou;
457 
458       /* Set tty state to our_ttystate.  */
459       serial_set_tty_state (stdin_serial, our_terminal_info.ttystate);
460 
461       /* If we only want output, then leave the inferior's pgrp in the
462 	 foreground, so that Ctrl-C/Ctrl-Z reach the inferior
463 	 directly.  */
464       if (job_control && desired_state == target_terminal_state::is_ours)
465 	{
466 #ifdef HAVE_TERMIOS_H
467 	  result = tcsetpgrp (0, our_terminal_info.process_group);
468 #if 0
469 	  /* This fails on Ultrix with EINVAL if you run the testsuite
470 	     in the background with nohup, and then log out.  GDB never
471 	     used to check for an error here, so perhaps there are other
472 	     such situations as well.  */
473 	  if (result == -1)
474 	    gdb_printf (gdb_stderr,
475 			"[tcsetpgrp failed in child_terminal_ours: %s]\n",
476 			safe_strerror (errno));
477 #endif
478 #endif /* termios */
479 	}
480 
481       if (!job_control && desired_state == target_terminal_state::is_ours)
482 	{
483 	  if (sigint_ours.has_value ())
484 	    install_sigint_handler (*sigint_ours);
485 	  sigint_ours.reset ();
486 #ifdef SIGQUIT
487 	  if (sigquit_ours.has_value ())
488 	    signal (SIGQUIT, *sigquit_ours);
489 	  sigquit_ours.reset ();
490 #endif
491 	}
492 
493 #ifdef F_GETFL
494       result = fcntl (0, F_SETFL, our_terminal_info.tflags);
495 #endif
496 
497       gdb_tty_state = desired_state;
498     }
499 }
500 
501 /* Interrupt the inferior.  Implementation of target_interrupt for
502    child/native targets.  */
503 
504 void
505 child_interrupt (struct target_ops *self)
506 {
507   /* Interrupt the first inferior that has a resumed thread.  */
508   thread_info *resumed = NULL;
509   for (thread_info *thr : all_non_exited_threads ())
510     {
511       if (thr->executing ())
512 	{
513 	  resumed = thr;
514 	  break;
515 	}
516       if (thr->has_pending_waitstatus ())
517 	resumed = thr;
518     }
519 
520   if (resumed != NULL)
521     {
522       /* Note that unlike pressing Ctrl-C on the controlling terminal,
523 	 here we only interrupt one process, not the whole process
524 	 group.  This is because interrupting a process group (with
525 	 either Ctrl-C or with kill(3) with negative PID) sends a
526 	 SIGINT to each process in the process group, and we may not
527 	 be debugging all processes in the process group.  */
528 #ifndef _WIN32
529       kill (resumed->inf->pid, SIGINT);
530 #endif
531     }
532 }
533 
534 /* Pass a Ctrl-C to the inferior as-if a Ctrl-C was pressed while the
535    inferior was in the foreground.  Implementation of
536    target_pass_ctrlc for child/native targets.  */
537 
538 void
539 child_pass_ctrlc (struct target_ops *self)
540 {
541   gdb_assert (!target_terminal::is_ours ());
542 
543 #ifdef HAVE_TERMIOS_H
544   if (job_control)
545     {
546       pid_t term_pgrp = tcgetpgrp (0);
547 
548       /* If there's any inferior sharing our terminal, pass the SIGINT
549 	 to the terminal's foreground process group.  This acts just
550 	 like the user typed a ^C on the terminal while the inferior
551 	 was in the foreground.  Note that using a negative process
552 	 number in kill() is a System V-ism.  The proper BSD interface
553 	 is killpg().  However, all modern BSDs support the System V
554 	 interface too.  */
555 
556       if (term_pgrp != -1 && term_pgrp != our_terminal_info.process_group)
557 	{
558 	  kill (-term_pgrp, SIGINT);
559 	  return;
560 	}
561     }
562 #endif
563 
564   /* Otherwise, pass the Ctrl-C to the first inferior that was resumed
565      in the foreground.  */
566   for (inferior *inf : all_inferiors ())
567     {
568       if (inf->terminal_state != target_terminal_state::is_ours)
569 	{
570 	  gdb_assert (inf->pid != 0);
571 
572 #ifndef _WIN32
573 	  kill (inf->pid, SIGINT);
574 #endif
575 	  return;
576 	}
577     }
578 
579   /* If no inferior was resumed in the foreground, then how did the
580      !is_ours assert above pass?  */
581   gdb_assert_not_reached ("no inferior resumed in the fg found");
582 }
583 
584 /* Per-inferior data key.  */
585 static const registry<inferior>::key<terminal_info> inflow_inferior_data;
586 
587 terminal_info::~terminal_info ()
588 {
589   xfree (ttystate);
590 }
591 
592 /* Get the current svr4 data.  If none is found yet, add it now.  This
593    function always returns a valid object.  */
594 
595 static struct terminal_info *
596 get_inflow_inferior_data (struct inferior *inf)
597 {
598   struct terminal_info *info;
599 
600   info = inflow_inferior_data.get (inf);
601   if (info == NULL)
602     info = inflow_inferior_data.emplace (inf);
603 
604   return info;
605 }
606 
607 /* This is a "inferior_exit" observer.  Releases the TERMINAL_INFO member
608    of the inferior structure.  This field is private to inflow.c, and
609    its type is opaque to the rest of GDB.  PID is the target pid of
610    the inferior that is about to be removed from the inferior
611    list.  */
612 
613 static void
614 inflow_inferior_exit (struct inferior *inf)
615 {
616   inf->terminal_state = target_terminal_state::is_ours;
617   inflow_inferior_data.clear (inf);
618 }
619 
620 void
621 copy_terminal_info (struct inferior *to, struct inferior *from)
622 {
623   struct terminal_info *tinfo_to, *tinfo_from;
624 
625   tinfo_to = get_inflow_inferior_data (to);
626   tinfo_from = get_inflow_inferior_data (from);
627 
628   xfree (tinfo_to->ttystate);
629 
630   *tinfo_to = *tinfo_from;
631 
632   if (tinfo_from->ttystate)
633     tinfo_to->ttystate
634       = serial_copy_tty_state (stdin_serial, tinfo_from->ttystate);
635 
636   to->terminal_state = from->terminal_state;
637 }
638 
639 /* See terminal.h.  */
640 
641 void
642 swap_terminal_info (inferior *a, inferior *b)
643 {
644   terminal_info *info_a = inflow_inferior_data.get (a);
645   terminal_info *info_b = inflow_inferior_data.get (b);
646 
647   inflow_inferior_data.set (a, info_b);
648   inflow_inferior_data.set (b, info_a);
649 
650   std::swap (a->terminal_state, b->terminal_state);
651 }
652 
653 static void
654 info_terminal_command (const char *arg, int from_tty)
655 {
656   target_terminal::info (arg, from_tty);
657 }
658 
659 void
660 child_terminal_info (struct target_ops *self, const char *args, int from_tty)
661 {
662   struct inferior *inf;
663   struct terminal_info *tinfo;
664 
665   if (!gdb_has_a_terminal ())
666     {
667       gdb_printf (_("This GDB does not control a terminal.\n"));
668       return;
669     }
670 
671   if (inferior_ptid == null_ptid)
672     return;
673 
674   inf = current_inferior ();
675   tinfo = get_inflow_inferior_data (inf);
676 
677   gdb_printf (_("Inferior's terminal status "
678 		"(currently saved by GDB):\n"));
679 
680   /* First the fcntl flags.  */
681   {
682     int flags;
683 
684     flags = tinfo->tflags;
685 
686     gdb_printf ("File descriptor flags = ");
687 
688 #ifndef O_ACCMODE
689 #define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
690 #endif
691     /* (O_ACCMODE) parens are to avoid Ultrix header file bug.  */
692     switch (flags & (O_ACCMODE))
693       {
694       case O_RDONLY:
695 	gdb_printf ("O_RDONLY");
696 	break;
697       case O_WRONLY:
698 	gdb_printf ("O_WRONLY");
699 	break;
700       case O_RDWR:
701 	gdb_printf ("O_RDWR");
702 	break;
703       }
704     flags &= ~(O_ACCMODE);
705 
706 #ifdef O_NONBLOCK
707     if (flags & O_NONBLOCK)
708       gdb_printf (" | O_NONBLOCK");
709     flags &= ~O_NONBLOCK;
710 #endif
711 
712 #if defined (O_NDELAY)
713     /* If O_NDELAY and O_NONBLOCK are defined to the same thing, we will
714        print it as O_NONBLOCK, which is good cause that is what POSIX
715        has, and the flag will already be cleared by the time we get here.  */
716     if (flags & O_NDELAY)
717       gdb_printf (" | O_NDELAY");
718     flags &= ~O_NDELAY;
719 #endif
720 
721     if (flags & O_APPEND)
722       gdb_printf (" | O_APPEND");
723     flags &= ~O_APPEND;
724 
725 #if defined (O_BINARY)
726     if (flags & O_BINARY)
727       gdb_printf (" | O_BINARY");
728     flags &= ~O_BINARY;
729 #endif
730 
731     if (flags)
732       gdb_printf (" | 0x%x", flags);
733     gdb_printf ("\n");
734   }
735 
736 #ifdef HAVE_TERMIOS_H
737   gdb_printf ("Process group = %d\n", (int) tinfo->process_group);
738 #endif
739 
740   serial_print_tty_state (stdin_serial, tinfo->ttystate, gdb_stdout);
741 }
742 
743 /* NEW_TTY_PREFORK is called before forking a new child process,
744    so we can record the state of ttys in the child to be formed.
745    TTYNAME is empty if we are to share the terminal with gdb;
746    otherwise it contains the name of the desired tty.
747 
748    NEW_TTY is called in new child processes under Unix, which will
749    become debugger target processes.  This actually switches to
750    the terminal specified in the NEW_TTY_PREFORK call.  */
751 
752 void
753 new_tty_prefork (std::string ttyname)
754 {
755   /* Save the name for later, for determining whether we and the child
756      are sharing a tty.  */
757   inferior_thisrun_terminal = std::move (ttyname);
758 }
759 
760 #if !defined(__GO32__) && !defined(_WIN32)
761 /* If RESULT, assumed to be the return value from a system call, is
762    negative, print the error message indicated by errno and exit.
763    MSG should identify the operation that failed.  */
764 static void
765 check_syscall (const char *msg, int result)
766 {
767   if (result < 0)
768     {
769       print_sys_errmsg (msg, errno);
770       _exit (1);
771     }
772 }
773 #endif
774 
775 void
776 new_tty (void)
777 {
778   if (inferior_thisrun_terminal.empty ())
779     return;
780 #if !defined(__GO32__) && !defined(_WIN32)
781   int tty;
782 
783 #ifdef TIOCNOTTY
784   /* Disconnect the child process from our controlling terminal.  On some
785      systems (SVR4 for example), this may cause a SIGTTOU, so temporarily
786      ignore SIGTTOU.  */
787   tty = open ("/dev/tty", O_RDWR);
788   if (tty >= 0)
789     {
790       scoped_ignore_sigttou ignore_sigttou;
791 
792       ioctl (tty, TIOCNOTTY, 0);
793       close (tty);
794     }
795 #endif
796 
797   /* Now open the specified new terminal.  */
798   tty = open (inferior_thisrun_terminal.c_str (), O_RDWR | O_NOCTTY);
799   check_syscall (inferior_thisrun_terminal.c_str (), tty);
800 
801   /* Avoid use of dup2; doesn't exist on all systems.  */
802   if (tty != 0)
803     {
804       close (0);
805       check_syscall ("dup'ing tty into fd 0", dup (tty));
806     }
807   if (tty != 1)
808     {
809       close (1);
810       check_syscall ("dup'ing tty into fd 1", dup (tty));
811     }
812   if (tty != 2)
813     {
814       close (2);
815       check_syscall ("dup'ing tty into fd 2", dup (tty));
816     }
817 
818 #ifdef TIOCSCTTY
819   /* Make tty our new controlling terminal.  */
820   if (ioctl (tty, TIOCSCTTY, 0) == -1)
821     /* Mention GDB in warning because it will appear in the inferior's
822        terminal instead of GDB's.  */
823     warning (_("GDB: Failed to set controlling terminal: %s"),
824 	     safe_strerror (errno));
825 #endif
826 
827   if (tty > 2)
828     close (tty);
829 #endif /* !go32 && !win32 */
830 }
831 
832 /* NEW_TTY_POSTFORK is called after forking a new child process, and
833    adding it to the inferior table, to store the TTYNAME being used by
834    the child, or empty if it sharing the terminal with gdb.  */
835 
836 void
837 new_tty_postfork (void)
838 {
839   /* Save the name for later, for determining whether we and the child
840      are sharing a tty.  */
841 
842   struct inferior *inf = current_inferior ();
843   struct terminal_info *tinfo = get_inflow_inferior_data (inf);
844 
845   tinfo->run_terminal = std::move (inferior_thisrun_terminal);
846   inferior_thisrun_terminal.clear ();
847 }
848 
849 
850 /* Call set_sigint_trap when you need to pass a signal on to an attached
851    process when handling SIGINT.  */
852 
853 static void
854 pass_signal (int signo)
855 {
856 #ifndef _WIN32
857   kill (inferior_ptid.pid (), SIGINT);
858 #endif
859 }
860 
861 static sighandler_t osig;
862 static int osig_set;
863 
864 void
865 set_sigint_trap (void)
866 {
867   struct inferior *inf = current_inferior ();
868   struct terminal_info *tinfo = get_inflow_inferior_data (inf);
869 
870   if (inf->attach_flag || !tinfo->run_terminal.empty ())
871     {
872       osig = install_sigint_handler (pass_signal);
873       osig_set = 1;
874     }
875   else
876     osig_set = 0;
877 }
878 
879 void
880 clear_sigint_trap (void)
881 {
882   if (osig_set)
883     {
884       install_sigint_handler (osig);
885       osig_set = 0;
886     }
887 }
888 
889 
890 /* Create a new session if the inferior will run in a different tty.
891    A session is UNIX's way of grouping processes that share a controlling
892    terminal, so a new one is needed if the inferior terminal will be
893    different from GDB's.
894 
895    Returns the session id of the new session, 0 if no session was created
896    or -1 if an error occurred.  */
897 pid_t
898 create_tty_session (void)
899 {
900 #ifdef HAVE_SETSID
901   pid_t ret;
902 
903   if (!job_control || inferior_thisrun_terminal.empty ())
904     return 0;
905 
906   ret = setsid ();
907   if (ret == -1)
908     warning (_("Failed to create new terminal session: setsid: %s"),
909 	     safe_strerror (errno));
910 
911   return ret;
912 #else
913   return 0;
914 #endif /* HAVE_SETSID */
915 }
916 
917 /* Get all the current tty settings (including whether we have a
918    tty at all!).  We can't do this in _initialize_inflow because
919    serial_fdopen() won't work until the serial_ops_list is
920    initialized, but we don't want to do it lazily either, so
921    that we can guarantee stdin_serial is opened if there is
922    a terminal.  */
923 void
924 initialize_stdin_serial (void)
925 {
926   stdin_serial = serial_fdopen (0);
927 }
928 
929 void _initialize_inflow ();
930 void
931 _initialize_inflow ()
932 {
933   add_info ("terminal", info_terminal_command,
934 	    _("Print inferior's saved terminal status."));
935 
936   /* OK, figure out whether we have job control.  */
937   have_job_control ();
938 
939   gdb::observers::inferior_exit.attach (inflow_inferior_exit, "inflow");
940 }
941