* 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:
parent
5357f1287d
commit
a14a8fad36
6 changed files with 158 additions and 183 deletions
|
@ -1,5 +1,13 @@
|
|||
Fri Oct 8 14:56:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* 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.
|
||||
|
||||
* findvar.c, value.h (symbol_read_needs_frame): New function.
|
||||
* c-exp.y, m2-exp.y: Call it instead of having our own switch on
|
||||
the symbol's class.
|
||||
|
|
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 */
|
||||
}
|
||||
|
|
|
@ -343,15 +343,6 @@ go32_setbaudrate (scb, rate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
go32_set_process_group (scb, ttystate, group)
|
||||
serial_t scb;
|
||||
serial_ttystate ttystate;
|
||||
int group;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
go32_write (scb, str, len)
|
||||
serial_t scb;
|
||||
|
@ -386,18 +377,8 @@ static struct serial_ops go32_ops =
|
|||
go32_print_tty_state,
|
||||
go32_noflush_set_tty_state,
|
||||
go32_setbaudrate,
|
||||
go32_set_process_group
|
||||
};
|
||||
|
||||
/* There is never job control on go32. */
|
||||
int
|
||||
gdb_setpgid ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int job_control = 0;
|
||||
|
||||
_initialize_ser_go32 ()
|
||||
{
|
||||
serial_add_interface (&go32_ops);
|
||||
|
|
|
@ -259,15 +259,6 @@ tcp_setbaudrate(scb, rate)
|
|||
return 0; /* Never fails! */
|
||||
}
|
||||
|
||||
static int
|
||||
tcp_set_process_group (scb, ttystate, group)
|
||||
serial_t scb;
|
||||
serial_ttystate ttystate;
|
||||
int group;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
tcp_write(scb, str, len)
|
||||
serial_t scb;
|
||||
|
@ -316,7 +307,6 @@ static struct serial_ops tcp_ops =
|
|||
tcp_print_tty_state,
|
||||
tcp_noflush_set_tty_state,
|
||||
tcp_setbaudrate,
|
||||
tcp_set_process_group
|
||||
};
|
||||
|
||||
void
|
||||
|
|
123
gdb/ser-unix.c
123
gdb/ser-unix.c
|
@ -33,7 +33,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
struct hardwire_ttystate
|
||||
{
|
||||
struct termios termios;
|
||||
pid_t process_group;
|
||||
};
|
||||
#endif /* termios */
|
||||
|
||||
|
@ -65,13 +64,6 @@ struct hardwire_ttystate
|
|||
struct ltchars ltc;
|
||||
/* Line discipline flags. */
|
||||
int lmode;
|
||||
|
||||
#ifdef SHORT_PGRP
|
||||
/* This is only used for the ultra. Does it have pid_t? */
|
||||
short process_group;
|
||||
#else
|
||||
int process_group;
|
||||
#endif
|
||||
};
|
||||
#endif /* sgtty */
|
||||
|
||||
|
@ -110,23 +102,10 @@ get_tty_state(scb, state)
|
|||
{
|
||||
#ifdef HAVE_TERMIOS
|
||||
extern int errno;
|
||||
pid_t new_process_group;
|
||||
|
||||
if (tcgetattr(scb->fd, &state->termios) < 0)
|
||||
return -1;
|
||||
|
||||
if (!job_control)
|
||||
return 0;
|
||||
|
||||
/* Apparently, if a tty has no process group, then tcgetpgrp returns -1 with
|
||||
errno == 0. In this case, set the process group to -1 so that we know to
|
||||
omit resetting it later. */
|
||||
new_process_group = tcgetpgrp (scb->fd);
|
||||
if ((new_process_group == (pid_t)-1)
|
||||
&& (errno != ENOTTY))
|
||||
return -1;
|
||||
errno = 0;
|
||||
state->process_group = new_process_group;
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
|
@ -146,10 +125,7 @@ get_tty_state(scb, state)
|
|||
if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0)
|
||||
return -1;
|
||||
|
||||
if (!job_control)
|
||||
return 0;
|
||||
|
||||
return ioctl (scb->fd, TIOCGPGRP, &state->process_group);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -162,14 +138,7 @@ set_tty_state(scb, state)
|
|||
if (tcsetattr(scb->fd, TCSANOW, &state->termios) < 0)
|
||||
return -1;
|
||||
|
||||
if (!job_control)
|
||||
return 0;
|
||||
|
||||
/* If the tty had no process group before, then do not reset it. */
|
||||
if (state->process_group == -1)
|
||||
return 0;
|
||||
else
|
||||
return tcsetpgrp (scb->fd, state->process_group);
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TERMIO
|
||||
|
@ -182,10 +151,7 @@ set_tty_state(scb, state)
|
|||
if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0)
|
||||
return -1;
|
||||
|
||||
if (!job_control)
|
||||
return 0;
|
||||
|
||||
return ioctl (scb->fd, TIOCSPGRP, &state->process_group);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -270,8 +236,6 @@ hardwire_print_tty_state (scb, ttystate)
|
|||
int i;
|
||||
|
||||
#ifdef HAVE_TERMIOS
|
||||
printf_filtered ("Process group = %d\n", state->process_group);
|
||||
|
||||
printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n",
|
||||
state->termios.c_iflag, state->termios.c_oflag);
|
||||
printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x\n",
|
||||
|
@ -300,8 +264,6 @@ hardwire_print_tty_state (scb, ttystate)
|
|||
#endif
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
printf_filtered ("Process group = %d\n", state->process_group);
|
||||
|
||||
printf_filtered ("sgttyb.sg_flags = 0x%x.\n", state->sgttyb.sg_flags);
|
||||
|
||||
printf_filtered ("tchars: ");
|
||||
|
@ -614,18 +576,6 @@ hardwire_setbaudrate(scb, rate)
|
|||
return set_tty_state (scb, &state);
|
||||
}
|
||||
|
||||
static int
|
||||
hardwire_set_process_group (scb, ttystate, group)
|
||||
serial_t scb;
|
||||
serial_ttystate ttystate;
|
||||
int group;
|
||||
{
|
||||
#if defined (HAVE_SGTTY) || defined (HAVE_TERMIOS)
|
||||
((struct hardwire_ttystate *)ttystate)->process_group = group;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
hardwire_write(scb, str, len)
|
||||
serial_t scb;
|
||||
|
@ -674,77 +624,10 @@ static struct serial_ops hardwire_ops =
|
|||
hardwire_print_tty_state,
|
||||
hardwire_noflush_set_tty_state,
|
||||
hardwire_setbaudrate,
|
||||
hardwire_set_process_group
|
||||
};
|
||||
|
||||
int job_control;
|
||||
#if defined (HAVE_TERMIOS)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* 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_ser_hardwire ()
|
||||
{
|
||||
serial_add_interface (&hardwire_ops);
|
||||
|
||||
/* OK, figure out whether we have job control. */
|
||||
|
||||
#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_TERMIO
|
||||
/* See comment at top of file about trying to support process groups
|
||||
with termio. */
|
||||
job_control = 0;
|
||||
#endif /* termio */
|
||||
|
||||
#ifdef HAVE_SGTTY
|
||||
#ifdef TIOCGPGRP
|
||||
job_control = 1;
|
||||
#else
|
||||
job_control = 0;
|
||||
#endif /* TIOCGPGRP */
|
||||
#endif /* sgtty */
|
||||
|
||||
}
|
||||
|
|
15
gdb/serial.h
15
gdb/serial.h
|
@ -54,7 +54,6 @@ struct serial_ops {
|
|||
int (*noflush_set_tty_state)
|
||||
PARAMS ((serial_t, serial_ttystate, serial_ttystate));
|
||||
int (*setbaudrate) PARAMS ((serial_t, int rate));
|
||||
int (*set_process_group) PARAMS ((serial_t, serial_ttystate, int));
|
||||
};
|
||||
|
||||
/* Add a new serial interface to the interface list */
|
||||
|
@ -151,18 +150,4 @@ void serial_close PARAMS ((serial_t));
|
|||
|
||||
#define SERIAL_UN_FDOPEN(SERIAL_T) (free (SERIAL_T))
|
||||
|
||||
/* Set the process group saved in TTYSTATE to GROUP. This just modifies
|
||||
the ttystate setting; need to call SERIAL_SET_TTY_STATE for this to
|
||||
actually have any effect. If no job control, then don't do anything. */
|
||||
#define SERIAL_SET_PROCESS_GROUP(SERIAL_T, TTYSTATE, GROUP) \
|
||||
((*((SERIAL_T)->ops->set_process_group)) (SERIAL_T, TTYSTATE, GROUP))
|
||||
|
||||
/* Do we have job control? Can be assumed to always be the same within
|
||||
a given run of GDB. In ser-unix.c, ser-go32.c, etc. */
|
||||
extern int job_control;
|
||||
|
||||
/* Set the process group of the caller to its own pid, or do nothing if
|
||||
we lack job control. */
|
||||
extern int gdb_setpgid PARAMS ((void));
|
||||
|
||||
#endif /* SERIAL_H */
|
||||
|
|
Loading…
Add table
Reference in a new issue