forked from Imagelibrary/binutils-gdb
* inflow.c: Remove unused includes of sys/param.h, etc.
* inflow.c, ser-unix.c, ser-go32.c, ser-tcp.c, serial.h, terminal.h: Move all the process group stuff back to inflow.c; that's a better place for it and fixes problems with trying to get/set the process group of a tty we're doing remote debugging on. * terminal.h: Skip the redefine crap if HAVE_TERMIOS.
This commit is contained in:
166
gdb/inflow.c
166
gdb/inflow.c
@@ -23,18 +23,33 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#include "command.h"
|
||||
#include "signals.h"
|
||||
#include "serial.h"
|
||||
#include "terminal.h"
|
||||
#include "target.h"
|
||||
|
||||
#ifdef USG
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
/* Some USG-esque systems (some of which are BSD-esque enough so that USG
|
||||
is not defined) want this header, and it won't do any harm. */
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <signal.h>
|
||||
#if !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) && !defined (HAVE_SGTTY) && !defined (__GO32__)
|
||||
#define HAVE_SGTTY
|
||||
#endif
|
||||
|
||||
#if defined (HAVE_TERMIOS)
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TERMIOS
|
||||
#define PROCESS_GROUP_TYPE pid_t
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
#ifdef SHORT_PGRP
|
||||
/* This is only used for the ultra. Does it have pid_t? */
|
||||
#define PROCESS_GROUP_TYPE short
|
||||
#else
|
||||
#define PROCESS_GROUP_TYPE int
|
||||
#endif
|
||||
#endif /* sgtty */
|
||||
|
||||
static void
|
||||
kill_command PARAMS ((char *, int));
|
||||
@@ -66,6 +81,13 @@ static serial_ttystate our_ttystate;
|
||||
static int tflags_inferior;
|
||||
static int tflags_ours;
|
||||
|
||||
#ifdef PROCESS_GROUP_TYPE
|
||||
/* Process group for us and the inferior. Saved and restored just like
|
||||
{our,inferior}_ttystate. */
|
||||
PROCESS_GROUP_TYPE our_process_group;
|
||||
PROCESS_GROUP_TYPE inferior_process_group;
|
||||
#endif
|
||||
|
||||
/* While the inferior is running, we want SIGINT and SIGQUIT to go to the
|
||||
inferior only. If we have job control, that takes care of it. If not,
|
||||
we save our handlers in these two variables and set SIGINT and SIGQUIT
|
||||
@@ -110,8 +132,17 @@ gdb_has_a_terminal ()
|
||||
if (stdin_serial != NULL)
|
||||
{
|
||||
our_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
||||
|
||||
if (our_ttystate != NULL)
|
||||
gdb_has_a_terminal_flag = yes;
|
||||
{
|
||||
gdb_has_a_terminal_flag = yes;
|
||||
#ifdef HAVE_TERMIOS
|
||||
our_process_group = tcgetpgrp (0);
|
||||
#endif
|
||||
#ifdef HAVE_SGTTY
|
||||
ioctl (scb->fd, TIOCGPGRP, &our_process_group);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return gdb_has_a_terminal_flag == yes;
|
||||
@@ -140,7 +171,9 @@ terminal_init_inferior ()
|
||||
if (inferior_ttystate)
|
||||
free (inferior_ttystate);
|
||||
inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
||||
SERIAL_SET_PROCESS_GROUP (stdin_serial, inferior_ttystate, inferior_pid);
|
||||
#ifdef PROCESS_GROUP_TYPE
|
||||
inferior_process_group = inferior_pid;
|
||||
#endif
|
||||
|
||||
/* Make sure that next time we call terminal_inferior (which will be
|
||||
before the program runs, as it needs to be), we install the new
|
||||
@@ -173,6 +206,13 @@ terminal_inferior ()
|
||||
terminal_ours, we will not change in our out of raw mode with
|
||||
this call, so we don't flush any input. */
|
||||
result = SERIAL_SET_TTY_STATE (stdin_serial, inferior_ttystate);
|
||||
OOPSY ("setting tty state");
|
||||
|
||||
if (!job_control)
|
||||
{
|
||||
sigint_ours = (void (*) ()) signal (SIGINT, SIG_IGN);
|
||||
sigquit_ours = (void (*) ()) signal (SIGQUIT, SIG_IGN);
|
||||
}
|
||||
|
||||
/* If attach_flag is set, we don't know whether we are sharing a
|
||||
terminal with the inferior or not. (attaching a process
|
||||
@@ -182,18 +222,25 @@ terminal_inferior ()
|
||||
`sharing' in the sense that we need to save and restore tty
|
||||
state)). I don't know if there is any way to tell whether we
|
||||
are sharing a terminal. So what we do is to go through all
|
||||
the saving and restoring of terminal state, but ignore errors
|
||||
(which will occur, in tcsetpgrp, if we are not sharing a
|
||||
terminal). */
|
||||
the saving and restoring of the tty state, but ignore errors
|
||||
setting the process group, which will happen if we are not
|
||||
sharing a terminal). */
|
||||
|
||||
if (!attach_flag)
|
||||
OOPSY ("setting tty state");
|
||||
|
||||
if (!job_control)
|
||||
if (job_control)
|
||||
{
|
||||
sigint_ours = (void (*) ()) signal (SIGINT, SIG_IGN);
|
||||
sigquit_ours = (void (*) ()) signal (SIGQUIT, SIG_IGN);
|
||||
#ifdef HAVE_TERMIOS
|
||||
result = tcsetpgrp (0, inferior_process_group);
|
||||
if (!attach_flag)
|
||||
OOPSY ("tcsetpgrp");
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
result = ioctl (0, TIOCSPGRP, inferior_process_group);
|
||||
if (!attach_flag)
|
||||
OOPSY ("TIOCSPGRP");
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
terminal_is_ours = 0;
|
||||
}
|
||||
@@ -254,6 +301,12 @@ terminal_ours_1 (output_only)
|
||||
if (inferior_ttystate)
|
||||
free (inferior_ttystate);
|
||||
inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
||||
#ifdef HAVE_TERMIOS
|
||||
inferior_process_group = tcgetpgrp (0);
|
||||
#endif
|
||||
#ifdef HAVE_SGTTY
|
||||
ioctl (scb->fd, TIOCGPGRP, &inferior_process_group);
|
||||
#endif
|
||||
|
||||
/* Here we used to set ICANON in our ttystate, but I believe this
|
||||
was an artifact from before when we used readline. Readline sets
|
||||
@@ -268,6 +321,19 @@ terminal_ours_1 (output_only)
|
||||
SERIAL_NOFLUSH_SET_TTY_STATE (stdin_serial, our_ttystate,
|
||||
inferior_ttystate);
|
||||
|
||||
if (job_control)
|
||||
{
|
||||
#ifdef HAVE_TERMIOS
|
||||
result = tcsetpgrp (0, our_process_group);
|
||||
OOPSY ("tcsetpgrp");
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
result = ioctl (0, TIOCSPGRP, our_process_group);
|
||||
OOPSY ("TIOCSPGRP");
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SIGTTOU
|
||||
if (job_control)
|
||||
signal (SIGTTOU, osigttou);
|
||||
@@ -366,6 +432,10 @@ child_terminal_info (args, from_tty)
|
||||
printf_filtered ("\n");
|
||||
}
|
||||
|
||||
#ifdef PROCESS_GROUP_TYPE
|
||||
printf_filtered ("Process group = %d\n", inferior_process_group);
|
||||
#endif
|
||||
|
||||
SERIAL_PRINT_TTY_STATE (stdin_serial, inferior_ttystate);
|
||||
}
|
||||
|
||||
@@ -510,6 +580,43 @@ clear_sigint_trap()
|
||||
signal (SIGINT, osig);
|
||||
}
|
||||
|
||||
|
||||
int job_control;
|
||||
|
||||
/* This is here because this is where we figure out whether we (probably)
|
||||
have job control. Just using job_control only does part of it because
|
||||
setpgid or setpgrp might not exist on a system without job control.
|
||||
It might be considered misplaced (on the other hand, process groups and
|
||||
job control are closely related to ttys).
|
||||
|
||||
For a more clean implementation, in libiberty, put a setpgid which merely
|
||||
calls setpgrp and a setpgrp which does nothing (any system with job control
|
||||
will have one or the other). */
|
||||
int
|
||||
gdb_setpgid ()
|
||||
{
|
||||
int retval = 0;
|
||||
if (job_control)
|
||||
{
|
||||
#if defined (NEED_POSIX_SETPGID) || defined (HAVE_TERMIOS)
|
||||
/* Do all systems with termios have setpgid? I hope so. */
|
||||
/* setpgid (0, 0) is supposed to work and mean the same thing as
|
||||
this, but on Ultrix 4.2A it fails with EPERM (and
|
||||
setpgid (getpid (), getpid ()) succeeds). */
|
||||
retval = setpgid (getpid (), getpid ());
|
||||
#else
|
||||
#if defined (TIOCGPGRP)
|
||||
#if defined(USG) && !defined(SETPGRP_ARGS)
|
||||
retval = setpgrp ();
|
||||
#else
|
||||
retval = setpgrp (getpid (), getpid ());
|
||||
#endif /* USG */
|
||||
#endif /* TIOCGPGRP. */
|
||||
#endif /* NEED_POSIX_SETPGID */
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
_initialize_inflow ()
|
||||
{
|
||||
@@ -522,4 +629,25 @@ _initialize_inflow ()
|
||||
inferior_pid = 0;
|
||||
|
||||
terminal_is_ours = 1;
|
||||
|
||||
/* OK, figure out whether we have job control. If neither termios nor
|
||||
sgtty (i.e. termio or go32), leave job_control 0. */
|
||||
|
||||
#if defined (HAVE_TERMIOS)
|
||||
/* Do all systems with termios have the POSIX way of identifying job
|
||||
control? I hope so. */
|
||||
#ifdef _POSIX_JOB_CONTROL
|
||||
job_control = 1;
|
||||
#else
|
||||
job_control = sysconf (_SC_JOB_CONTROL);
|
||||
#endif
|
||||
#endif /* termios */
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
#ifdef TIOCGPGRP
|
||||
job_control = 1;
|
||||
#else
|
||||
job_control = 0;
|
||||
#endif /* TIOCGPGRP */
|
||||
#endif /* sgtty */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user