Eliminate STOP_SIGNAL, use SIGTSTP directly
[deliverable/binutils-gdb.git] / gdb / inflow.c
CommitLineData
c906108c 1/* Low level interface to ptrace, for GDB when running under Unix.
61baf725 2 Copyright (C) 1986-2017 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
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
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
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.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
18
19#include "defs.h"
20#include "frame.h"
21#include "inferior.h"
22#include "command.h"
c906108c
SS
23#include "serial.h"
24#include "terminal.h"
25#include "target.h"
26#include "gdbthread.h"
7e1789f5 27#include "observer.h"
c906108c
SS
28#include <signal.h>
29#include <fcntl.h>
0ea3f30e 30#include "gdb_select.h"
c906108c 31
44270758 32#include "inflow.h"
7bfc9434 33#include "gdbcmd.h"
726e1356
PA
34#ifdef HAVE_TERMIOS_H
35#include <termios.h>
36#endif
15652511 37#include "job-control.h"
c906108c 38
c2d11a7d
JM
39#ifdef HAVE_SYS_IOCTL_H
40#include <sys/ioctl.h>
41#endif
42
f2acbe1c
MK
43#ifndef O_NOCTTY
44#define O_NOCTTY 0
45#endif
46
a14ed312 47static void pass_signal (int);
c906108c 48
d6b64346 49static void child_terminal_ours_1 (int);
c906108c
SS
50\f
51/* Record terminal status separately for debugger and inferior. */
52
819cc324 53static struct serial *stdin_serial;
c906108c 54
7e1789f5
PA
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 foreground
58 inferior when it resumes. */
59struct terminal_info
60{
61 /* The name of the tty (from the `tty' command) that we gave to the
62 inferior when it was started. */
191c4426 63 char *run_terminal;
7e1789f5
PA
64
65 /* TTY state. We save it whenever the inferior stops, and restore
66 it when it resumes. */
67 serial_ttystate ttystate;
68
726e1356 69#ifdef HAVE_TERMIOS_H
7e1789f5 70 /* Process group. Saved and restored just like ttystate. */
726e1356 71 pid_t process_group;
7e1789f5 72#endif
c906108c 73
7e1789f5
PA
74 /* fcntl flags. Saved and restored just like ttystate. */
75 int tflags;
76};
c906108c 77
7e1789f5 78/* Our own tty state, which we restore every time we need to deal with
d9de1fe3
PA
79 the terminal. This is set once, when GDB first starts, and then
80 whenever we enter/leave TUI mode (gdb_save_tty_state). The
81 settings of flags which readline saves and restores are
7e1789f5
PA
82 unimportant. */
83static struct terminal_info our_terminal_info;
c906108c 84
d9de1fe3
PA
85/* Snapshot of the initial tty state taken during initialization of
86 GDB, before readline/ncurses have had a chance to change it. This
87 is used as the initial tty state given to each new spawned
88 inferior. Unlike our_terminal_info, this is only ever set
89 once. */
6a06d660
PP
90static serial_ttystate initial_gdb_ttystate;
91
6c95b8df
PA
92static struct terminal_info *get_inflow_inferior_data (struct inferior *);
93
726e1356 94#ifdef HAVE_TERMIOS_H
7e1789f5
PA
95
96/* Return the process group of the current inferior. */
97
726e1356 98pid_t
7e1789f5
PA
99inferior_process_group (void)
100{
6c95b8df 101 return get_inflow_inferior_data (current_inferior ())->process_group;
7e1789f5 102}
c906108c
SS
103#endif
104
105/* While the inferior is running, we want SIGINT and SIGQUIT to go to the
106 inferior only. If we have job control, that takes care of it. If not,
107 we save our handlers in these two variables and set SIGINT and SIGQUIT
108 to SIG_IGN. */
109
a40805d4
PA
110static sighandler_t sigint_ours;
111static sighandler_t sigquit_ours;
c906108c 112
7e1789f5
PA
113/* The name of the tty (from the `tty' command) that we're giving to
114 the inferior when starting it up. This is only (and should only
191c4426
PA
115 be) used as a transient global by new_tty_prefork,
116 create_tty_session, new_tty and new_tty_postfork, all called from
117 fork_inferior, while forking a new child. */
3cb3b8df 118static const char *inferior_thisrun_terminal;
c906108c
SS
119
120/* Nonzero if our terminal settings are in effect. Zero if the
121 inferior's settings are in effect. Ignored if !gdb_has_a_terminal
122 (). */
123
124int terminal_is_ours;
125
d9de1fe3 126/* See terminal.h. */
ea42d6f8 127
6a06d660
PP
128void
129set_initial_gdb_ttystate (void)
130{
d9de1fe3
PA
131 /* Note we can't do any of this in _initialize_inflow because at
132 that point stdin_serial has not been created yet. */
133
6a06d660 134 initial_gdb_ttystate = serial_get_tty_state (stdin_serial);
6a06d660 135
d9de1fe3 136 if (initial_gdb_ttystate != NULL)
c906108c 137 {
d9de1fe3
PA
138 our_terminal_info.ttystate
139 = serial_copy_tty_state (stdin_serial, initial_gdb_ttystate);
c906108c 140#ifdef F_GETFL
7e1789f5 141 our_terminal_info.tflags = fcntl (0, F_GETFL, 0);
c906108c 142#endif
726e1356
PA
143#ifdef HAVE_TERMIOS_H
144 our_terminal_info.process_group = tcgetpgrp (0);
807bddf3 145#endif
c906108c
SS
146 }
147}
148
d9de1fe3
PA
149/* Does GDB have a terminal (on stdin)? */
150
151static int
152gdb_has_a_terminal (void)
153{
154 return initial_gdb_ttystate != NULL;
155}
156
c906108c
SS
157/* Macro for printing errors from ioctl operations */
158
159#define OOPSY(what) \
160 if (result == -1) \
161 fprintf_unfiltered(gdb_stderr, "[%s failed in terminal_inferior: %s]\n", \
dc672865 162 what, safe_strerror (errno))
c906108c 163
c906108c
SS
164/* Initialize the terminal settings we record for the inferior,
165 before we actually run the inferior. */
166
167void
d6b64346 168child_terminal_init_with_pgrp (int pgrp)
c906108c 169{
6f64ef53
PA
170 struct inferior *inf = current_inferior ();
171 struct terminal_info *tinfo = get_inflow_inferior_data (inf);
172
726e1356 173#ifdef HAVE_TERMIOS_H
6f64ef53
PA
174 /* Store the process group even without a terminal as it is used not
175 only to reset the tty foreground process group, but also to
176 interrupt the inferior. */
177 tinfo->process_group = pgrp;
178#endif
179
c906108c
SS
180 if (gdb_has_a_terminal ())
181 {
6c95b8df 182 xfree (tinfo->ttystate);
1e182ce8 183 tinfo->ttystate = serial_copy_tty_state (stdin_serial,
6a06d660 184 initial_gdb_ttystate);
c906108c 185
c906108c 186 /* Make sure that next time we call terminal_inferior (which will be
c5aa993b
JM
187 before the program runs, as it needs to be), we install the new
188 process group. */
c906108c
SS
189 terminal_is_ours = 1;
190 }
191}
192
a790ad35
SC
193/* Save the terminal settings again. This is necessary for the TUI
194 when it switches to TUI or non-TUI mode; curses changes the terminal
195 and gdb must be able to restore it correctly. */
196
197void
3278a9f5 198gdb_save_tty_state (void)
a790ad35
SC
199{
200 if (gdb_has_a_terminal ())
201 {
7e1789f5
PA
202 xfree (our_terminal_info.ttystate);
203 our_terminal_info.ttystate = serial_get_tty_state (stdin_serial);
a790ad35
SC
204 }
205}
206
c906108c 207void
d6b64346 208child_terminal_init (struct target_ops *self)
c906108c 209{
726e1356 210#ifdef HAVE_TERMIOS_H
d6b64346 211 /* This is for Lynx, and should be cleaned up by having Lynx be a
223ffa71 212 separate debugging target with a version of target_terminal::init
d6b64346
PA
213 which passes in the process group to a generic routine which does
214 all the work (and the non-threaded child_terminal_init can just
215 pass in inferior_ptid to the same routine). */
c906108c 216 /* We assume INFERIOR_PID is also the child's process group. */
d6b64346 217 child_terminal_init_with_pgrp (ptid_get_pid (inferior_ptid));
726e1356 218#endif /* HAVE_TERMIOS_H */
c906108c
SS
219}
220
221/* Put the inferior's terminal settings into effect.
4d4ca2a1
DE
222 This is preparation for starting or resuming the inferior.
223
224 N.B. Targets that want to use this with async support must build that
225 support on top of this (e.g., the caller still needs to remove stdin
226 from the event loop). E.g., see linux_nat_terminal_inferior. */
c906108c
SS
227
228void
d6b64346 229child_terminal_inferior (struct target_ops *self)
c906108c 230{
7e1789f5 231 struct inferior *inf;
6c95b8df 232 struct terminal_info *tinfo;
7e1789f5
PA
233
234 if (!terminal_is_ours)
235 return;
236
237 inf = current_inferior ();
6c95b8df 238 tinfo = get_inflow_inferior_data (inf);
7e1789f5
PA
239
240 if (gdb_has_a_terminal ()
6c95b8df
PA
241 && tinfo->ttystate != NULL
242 && tinfo->run_terminal == NULL)
c906108c
SS
243 {
244 int result;
245
246#ifdef F_GETFL
6c95b8df 247 result = fcntl (0, F_SETFL, tinfo->tflags);
c906108c
SS
248 OOPSY ("fcntl F_SETFL");
249#endif
250
726e1356 251 result = serial_set_tty_state (stdin_serial, tinfo->ttystate);
c906108c
SS
252 OOPSY ("setting tty state");
253
254 if (!job_control)
255 {
a40805d4 256 sigint_ours = signal (SIGINT, SIG_IGN);
c906108c 257#ifdef SIGQUIT
a40805d4 258 sigquit_ours = signal (SIGQUIT, SIG_IGN);
c906108c
SS
259#endif
260 }
261
262 /* If attach_flag is set, we don't know whether we are sharing a
c5aa993b
JM
263 terminal with the inferior or not. (attaching a process
264 without a terminal is one case where we do not; attaching a
265 process which we ran from the same shell as GDB via `&' is
266 one case where we do, I think (but perhaps this is not
267 `sharing' in the sense that we need to save and restore tty
268 state)). I don't know if there is any way to tell whether we
269 are sharing a terminal. So what we do is to go through all
270 the saving and restoring of the tty state, but ignore errors
271 setting the process group, which will happen if we are not
272 sharing a terminal). */
c906108c
SS
273
274 if (job_control)
275 {
726e1356 276#ifdef HAVE_TERMIOS_H
6c95b8df 277 result = tcsetpgrp (0, tinfo->process_group);
181e7f93 278 if (!inf->attach_flag)
c906108c
SS
279 OOPSY ("tcsetpgrp");
280#endif
c906108c 281 }
c906108c
SS
282 }
283 terminal_is_ours = 0;
284}
285
286/* Put some of our terminal settings into effect,
287 enough to get proper results from our output,
288 but do not change into or out of RAW mode
289 so that no input is discarded.
290
291 After doing this, either terminal_ours or terminal_inferior
4d4ca2a1
DE
292 should be called to get back to a normal state of affairs.
293
294 N.B. The implementation is (currently) no different than
295 child_terminal_ours. See child_terminal_ours_1. */
c906108c
SS
296
297void
d6b64346 298child_terminal_ours_for_output (struct target_ops *self)
c906108c 299{
d6b64346 300 child_terminal_ours_1 (1);
c906108c
SS
301}
302
303/* Put our terminal settings into effect.
304 First record the inferior's terminal settings
4d4ca2a1
DE
305 so they can be restored properly later.
306
307 N.B. Targets that want to use this with async support must build that
308 support on top of this (e.g., the caller still needs to add stdin to the
309 event loop). E.g., see linux_nat_terminal_ours. */
c906108c
SS
310
311void
d6b64346 312child_terminal_ours (struct target_ops *self)
c906108c 313{
d6b64346 314 child_terminal_ours_1 (0);
c906108c
SS
315}
316
317/* output_only is not used, and should not be used unless we introduce
318 separate terminal_is_ours and terminal_is_ours_for_output
319 flags. */
320
321static void
d6b64346 322child_terminal_ours_1 (int output_only)
c906108c 323{
7e1789f5 324 struct inferior *inf;
6c95b8df 325 struct terminal_info *tinfo;
7e1789f5
PA
326
327 if (terminal_is_ours)
328 return;
329
d9d2d8b6
PA
330 terminal_is_ours = 1;
331
7e1789f5 332 /* Checking inferior->run_terminal is necessary so that
c906108c
SS
333 if GDB is running in the background, it won't block trying
334 to do the ioctl()'s below. Checking gdb_has_a_terminal
335 avoids attempting all the ioctl's when running in batch. */
7e1789f5
PA
336
337 inf = current_inferior ();
6c95b8df 338 tinfo = get_inflow_inferior_data (inf);
7e1789f5 339
6c95b8df 340 if (tinfo->run_terminal != NULL || gdb_has_a_terminal () == 0)
c906108c 341 return;
a579cd9a 342 else
c906108c 343 {
4b69c284 344#ifdef SIGTTOU
c906108c 345 /* Ignore this signal since it will happen when we try to set the
c5aa993b 346 pgrp. */
a40805d4 347 sighandler_t osigttou = NULL;
4b69c284 348#endif
821fc4ae 349 int result ATTRIBUTE_UNUSED;
c906108c 350
c906108c
SS
351#ifdef SIGTTOU
352 if (job_control)
a40805d4 353 osigttou = signal (SIGTTOU, SIG_IGN);
c906108c
SS
354#endif
355
6c95b8df
PA
356 xfree (tinfo->ttystate);
357 tinfo->ttystate = serial_get_tty_state (stdin_serial);
64a0ac84 358
726e1356 359#ifdef HAVE_TERMIOS_H
181e7f93 360 if (!inf->attach_flag)
726e1356 361 /* If tcsetpgrp failed in terminal_inferior, this would give us
64a0ac84
PA
362 our process group instead of the inferior's. See
363 terminal_inferior for details. */
726e1356 364 tinfo->process_group = tcgetpgrp (0);
49a834f9 365#endif
c906108c 366
726e1356
PA
367 /* Set tty state to our_ttystate. */
368 serial_set_tty_state (stdin_serial, our_terminal_info.ttystate);
c906108c
SS
369
370 if (job_control)
371 {
726e1356 372#ifdef HAVE_TERMIOS_H
7e1789f5 373 result = tcsetpgrp (0, our_terminal_info.process_group);
c906108c
SS
374#if 0
375 /* This fails on Ultrix with EINVAL if you run the testsuite
376 in the background with nohup, and then log out. GDB never
377 used to check for an error here, so perhaps there are other
378 such situations as well. */
379 if (result == -1)
3e43a32a 380 fprintf_unfiltered (gdb_stderr,
d6b64346 381 "[tcsetpgrp failed in child_terminal_ours: %s]\n",
dc672865 382 safe_strerror (errno));
c906108c
SS
383#endif
384#endif /* termios */
c906108c
SS
385 }
386
387#ifdef SIGTTOU
388 if (job_control)
389 signal (SIGTTOU, osigttou);
390#endif
391
392 if (!job_control)
393 {
394 signal (SIGINT, sigint_ours);
395#ifdef SIGQUIT
396 signal (SIGQUIT, sigquit_ours);
397#endif
398 }
399
400#ifdef F_GETFL
6c95b8df 401 tinfo->tflags = fcntl (0, F_GETFL, 0);
7e1789f5 402 result = fcntl (0, F_SETFL, our_terminal_info.tflags);
c906108c 403#endif
c906108c
SS
404 }
405}
406
6c95b8df
PA
407/* Per-inferior data key. */
408static const struct inferior_data *inflow_inferior_data;
7e1789f5
PA
409
410static void
6c95b8df 411inflow_inferior_data_cleanup (struct inferior *inf, void *arg)
7e1789f5 412{
9a3c8263 413 struct terminal_info *info = (struct terminal_info *) arg;
6c95b8df 414
487ad57c
YQ
415 xfree (info->run_terminal);
416 xfree (info->ttystate);
417 xfree (info);
6c95b8df
PA
418}
419
420/* Get the current svr4 data. If none is found yet, add it now. This
421 function always returns a valid object. */
422
423static struct terminal_info *
424get_inflow_inferior_data (struct inferior *inf)
425{
426 struct terminal_info *info;
427
9a3c8263 428 info = (struct terminal_info *) inferior_data (inf, inflow_inferior_data);
6c95b8df
PA
429 if (info == NULL)
430 {
41bf6aca 431 info = XCNEW (struct terminal_info);
6c95b8df
PA
432 set_inferior_data (inf, inflow_inferior_data, info);
433 }
7e1789f5 434
6c95b8df 435 return info;
7e1789f5
PA
436}
437
438/* This is a "inferior_exit" observer. Releases the TERMINAL_INFO member
439 of the inferior structure. This field is private to inflow.c, and
440 its type is opaque to the rest of GDB. PID is the target pid of
441 the inferior that is about to be removed from the inferior
442 list. */
443
444static void
a79b8f6e 445inflow_inferior_exit (struct inferior *inf)
7e1789f5 446{
6c95b8df 447 struct terminal_info *info;
7e1789f5 448
9a3c8263 449 info = (struct terminal_info *) inferior_data (inf, inflow_inferior_data);
6c95b8df
PA
450 if (info != NULL)
451 {
452 xfree (info->run_terminal);
1e182ce8 453 xfree (info->ttystate);
6c95b8df
PA
454 xfree (info);
455 set_inferior_data (inf, inflow_inferior_data, NULL);
456 }
7e1789f5
PA
457}
458
191c4426
PA
459void
460copy_terminal_info (struct inferior *to, struct inferior *from)
461{
6c95b8df
PA
462 struct terminal_info *tinfo_to, *tinfo_from;
463
464 tinfo_to = get_inflow_inferior_data (to);
465 tinfo_from = get_inflow_inferior_data (from);
1e182ce8
UW
466
467 xfree (tinfo_to->run_terminal);
468 xfree (tinfo_to->ttystate);
469
6c95b8df 470 *tinfo_to = *tinfo_from;
1e182ce8 471
6c95b8df
PA
472 if (tinfo_from->run_terminal)
473 tinfo_to->run_terminal
474 = xstrdup (tinfo_from->run_terminal);
1e182ce8
UW
475
476 if (tinfo_from->ttystate)
477 tinfo_to->ttystate
478 = serial_copy_tty_state (stdin_serial, tinfo_from->ttystate);
191c4426
PA
479}
480
c906108c 481void
11db9430 482info_terminal_command (char *arg, int from_tty)
c906108c 483{
223ffa71 484 target_terminal::info (arg, from_tty);
c906108c
SS
485}
486
c906108c 487void
0a4f40a2 488child_terminal_info (struct target_ops *self, const char *args, int from_tty)
c906108c 489{
7e1789f5 490 struct inferior *inf;
6c95b8df 491 struct terminal_info *tinfo;
7e1789f5 492
c906108c
SS
493 if (!gdb_has_a_terminal ())
494 {
a3f17187 495 printf_filtered (_("This GDB does not control a terminal.\n"));
c906108c
SS
496 return;
497 }
498
7e1789f5
PA
499 if (ptid_equal (inferior_ptid, null_ptid))
500 return;
501
502 inf = current_inferior ();
6c95b8df 503 tinfo = get_inflow_inferior_data (inf);
7e1789f5 504
3e43a32a
MS
505 printf_filtered (_("Inferior's terminal status "
506 "(currently saved by GDB):\n"));
c906108c
SS
507
508 /* First the fcntl flags. */
509 {
510 int flags;
c5aa993b 511
6c95b8df 512 flags = tinfo->tflags;
c906108c
SS
513
514 printf_filtered ("File descriptor flags = ");
515
516#ifndef O_ACCMODE
517#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR)
518#endif
1777feb0 519 /* (O_ACCMODE) parens are to avoid Ultrix header file bug. */
c906108c
SS
520 switch (flags & (O_ACCMODE))
521 {
c5aa993b
JM
522 case O_RDONLY:
523 printf_filtered ("O_RDONLY");
524 break;
525 case O_WRONLY:
526 printf_filtered ("O_WRONLY");
527 break;
528 case O_RDWR:
529 printf_filtered ("O_RDWR");
530 break;
c906108c
SS
531 }
532 flags &= ~(O_ACCMODE);
533
534#ifdef O_NONBLOCK
c5aa993b 535 if (flags & O_NONBLOCK)
c906108c
SS
536 printf_filtered (" | O_NONBLOCK");
537 flags &= ~O_NONBLOCK;
538#endif
c5aa993b 539
c906108c
SS
540#if defined (O_NDELAY)
541 /* If O_NDELAY and O_NONBLOCK are defined to the same thing, we will
542 print it as O_NONBLOCK, which is good cause that is what POSIX
543 has, and the flag will already be cleared by the time we get here. */
544 if (flags & O_NDELAY)
545 printf_filtered (" | O_NDELAY");
546 flags &= ~O_NDELAY;
547#endif
548
549 if (flags & O_APPEND)
550 printf_filtered (" | O_APPEND");
551 flags &= ~O_APPEND;
552
553#if defined (O_BINARY)
554 if (flags & O_BINARY)
555 printf_filtered (" | O_BINARY");
556 flags &= ~O_BINARY;
557#endif
558
559 if (flags)
560 printf_filtered (" | 0x%x", flags);
561 printf_filtered ("\n");
562 }
563
726e1356 564#ifdef HAVE_TERMIOS_H
6c95b8df 565 printf_filtered ("Process group = %d\n", (int) tinfo->process_group);
c906108c
SS
566#endif
567
6c95b8df 568 serial_print_tty_state (stdin_serial, tinfo->ttystate, gdb_stdout);
c906108c
SS
569}
570\f
571/* NEW_TTY_PREFORK is called before forking a new child process,
572 so we can record the state of ttys in the child to be formed.
573 TTYNAME is null if we are to share the terminal with gdb;
574 or points to a string containing the name of the desired tty.
575
576 NEW_TTY is called in new child processes under Unix, which will
577 become debugger target processes. This actually switches to
578 the terminal specified in the NEW_TTY_PREFORK call. */
579
580void
3cb3b8df 581new_tty_prefork (const char *ttyname)
c906108c
SS
582{
583 /* Save the name for later, for determining whether we and the child
584 are sharing a tty. */
585 inferior_thisrun_terminal = ttyname;
586}
587
e6d088ec 588#if !defined(__GO32__) && !defined(_WIN32)
bf1d7d9c
JB
589/* If RESULT, assumed to be the return value from a system call, is
590 negative, print the error message indicated by errno and exit.
591 MSG should identify the operation that failed. */
592static void
593check_syscall (const char *msg, int result)
594{
595 if (result < 0)
596 {
597 print_sys_errmsg (msg, errno);
598 _exit (1);
599 }
600}
e6d088ec 601#endif
bf1d7d9c 602
c906108c 603void
fba45db2 604new_tty (void)
c906108c 605{
52f0bd74 606 int tty;
c906108c
SS
607
608 if (inferior_thisrun_terminal == 0)
609 return;
610#if !defined(__GO32__) && !defined(_WIN32)
611#ifdef TIOCNOTTY
612 /* Disconnect the child process from our controlling terminal. On some
613 systems (SVR4 for example), this may cause a SIGTTOU, so temporarily
1777feb0 614 ignore SIGTTOU. */
c5aa993b 615 tty = open ("/dev/tty", O_RDWR);
c906108c
SS
616 if (tty > 0)
617 {
a40805d4 618 sighandler_t osigttou;
c906108c 619
a40805d4 620 osigttou = signal (SIGTTOU, SIG_IGN);
c5aa993b
JM
621 ioctl (tty, TIOCNOTTY, 0);
622 close (tty);
623 signal (SIGTTOU, osigttou);
c906108c
SS
624 }
625#endif
626
627 /* Now open the specified new terminal. */
c5aa993b 628 tty = open (inferior_thisrun_terminal, O_RDWR | O_NOCTTY);
bf1d7d9c 629 check_syscall (inferior_thisrun_terminal, tty);
c906108c
SS
630
631 /* Avoid use of dup2; doesn't exist on all systems. */
632 if (tty != 0)
c5aa993b
JM
633 {
634 close (0);
bf1d7d9c 635 check_syscall ("dup'ing tty into fd 0", dup (tty));
c5aa993b 636 }
c906108c 637 if (tty != 1)
c5aa993b
JM
638 {
639 close (1);
bf1d7d9c 640 check_syscall ("dup'ing tty into fd 1", dup (tty));
c5aa993b 641 }
c906108c 642 if (tty != 2)
c5aa993b
JM
643 {
644 close (2);
bf1d7d9c 645 check_syscall ("dup'ing tty into fd 2", dup (tty));
c5aa993b 646 }
83116857
TJB
647
648#ifdef TIOCSCTTY
649 /* Make tty our new controlling terminal. */
650 if (ioctl (tty, TIOCSCTTY, 0) == -1)
651 /* Mention GDB in warning because it will appear in the inferior's
652 terminal instead of GDB's. */
a73c6dcd 653 warning (_("GDB: Failed to set controlling terminal: %s"),
83116857
TJB
654 safe_strerror (errno));
655#endif
656
c906108c 657 if (tty > 2)
c5aa993b
JM
658 close (tty);
659#endif /* !go32 && !win32 */
c906108c 660}
191c4426
PA
661
662/* NEW_TTY_POSTFORK is called after forking a new child process, and
663 adding it to the inferior table, to store the TTYNAME being used by
664 the child, or null if it sharing the terminal with gdb. */
665
666void
667new_tty_postfork (void)
668{
669 /* Save the name for later, for determining whether we and the child
670 are sharing a tty. */
671
672 if (inferior_thisrun_terminal)
6c95b8df
PA
673 {
674 struct inferior *inf = current_inferior ();
675 struct terminal_info *tinfo = get_inflow_inferior_data (inf);
676
677 tinfo->run_terminal = xstrdup (inferior_thisrun_terminal);
678 }
191c4426
PA
679
680 inferior_thisrun_terminal = NULL;
681}
682
c906108c
SS
683\f
684/* Call set_sigint_trap when you need to pass a signal on to an attached
1777feb0 685 process when handling SIGINT. */
c906108c 686
c906108c 687static void
fba45db2 688pass_signal (int signo)
c906108c
SS
689{
690#ifndef _WIN32
dfd4cc63 691 kill (ptid_get_pid (inferior_ptid), SIGINT);
c906108c
SS
692#endif
693}
694
a40805d4 695static sighandler_t osig;
7e1789f5 696static int osig_set;
c906108c
SS
697
698void
fba45db2 699set_sigint_trap (void)
c906108c 700{
181e7f93 701 struct inferior *inf = current_inferior ();
6c95b8df
PA
702 struct terminal_info *tinfo = get_inflow_inferior_data (inf);
703
704 if (inf->attach_flag || tinfo->run_terminal)
c906108c 705 {
a40805d4 706 osig = signal (SIGINT, pass_signal);
7e1789f5 707 osig_set = 1;
c906108c 708 }
7e1789f5
PA
709 else
710 osig_set = 0;
c906108c
SS
711}
712
713void
fba45db2 714clear_sigint_trap (void)
c906108c 715{
7e1789f5 716 if (osig_set)
c906108c
SS
717 {
718 signal (SIGINT, osig);
7e1789f5 719 osig_set = 0;
c906108c
SS
720 }
721}
722\f
c906108c 723
83116857
TJB
724/* Create a new session if the inferior will run in a different tty.
725 A session is UNIX's way of grouping processes that share a controlling
726 terminal, so a new one is needed if the inferior terminal will be
727 different from GDB's.
728
729 Returns the session id of the new session, 0 if no session was created
730 or -1 if an error occurred. */
731pid_t
732create_tty_session (void)
733{
734#ifdef HAVE_SETSID
735 pid_t ret;
736
737 if (!job_control || inferior_thisrun_terminal == 0)
738 return 0;
739
740 ret = setsid ();
741 if (ret == -1)
a73c6dcd 742 warning (_("Failed to create new terminal session: setsid: %s"),
83116857
TJB
743 safe_strerror (errno));
744
745 return ret;
746#else
747 return 0;
748#endif /* HAVE_SETSID */
749}
750
0ea3f30e
DJ
751/* Get all the current tty settings (including whether we have a
752 tty at all!). We can't do this in _initialize_inflow because
753 serial_fdopen() won't work until the serial_ops_list is
754 initialized, but we don't want to do it lazily either, so
755 that we can guarantee stdin_serial is opened if there is
756 a terminal. */
757void
758initialize_stdin_serial (void)
759{
760 stdin_serial = serial_fdopen (0);
761}
762
c906108c 763void
fba45db2 764_initialize_inflow (void)
c906108c 765{
11db9430 766 add_info ("terminal", info_terminal_command,
1bedd215 767 _("Print inferior's saved terminal status."));
c906108c 768
c906108c
SS
769 terminal_is_ours = 1;
770
15652511
SDJ
771 /* OK, figure out whether we have job control. */
772 have_job_control ();
7e1789f5 773
7e1789f5 774 observer_attach_inferior_exit (inflow_inferior_exit);
6c95b8df
PA
775
776 inflow_inferior_data
8e260fc0 777 = register_inferior_data_with_cleanup (NULL, inflow_inferior_data_cleanup);
c906108c 778}
This page took 1.498757 seconds and 4 git commands to generate.