* 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)
|
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.
|
* 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
|
* c-exp.y, m2-exp.y: Call it instead of having our own switch on
|
||||||
the symbol's class.
|
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 "command.h"
|
||||||
#include "signals.h"
|
#include "signals.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
#include "terminal.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
|
|
||||||
#ifdef USG
|
#include <signal.h>
|
||||||
#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 <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <sys/param.h>
|
#if !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) && !defined (HAVE_SGTTY) && !defined (__GO32__)
|
||||||
#include <signal.h>
|
#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
|
static void
|
||||||
kill_command PARAMS ((char *, int));
|
kill_command PARAMS ((char *, int));
|
||||||
|
@ -66,6 +81,13 @@ static serial_ttystate our_ttystate;
|
||||||
static int tflags_inferior;
|
static int tflags_inferior;
|
||||||
static int tflags_ours;
|
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
|
/* 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,
|
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
|
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)
|
if (stdin_serial != NULL)
|
||||||
{
|
{
|
||||||
our_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
our_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
||||||
|
|
||||||
if (our_ttystate != NULL)
|
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;
|
return gdb_has_a_terminal_flag == yes;
|
||||||
|
@ -140,7 +171,9 @@ terminal_init_inferior ()
|
||||||
if (inferior_ttystate)
|
if (inferior_ttystate)
|
||||||
free (inferior_ttystate);
|
free (inferior_ttystate);
|
||||||
inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
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
|
/* 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
|
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
|
terminal_ours, we will not change in our out of raw mode with
|
||||||
this call, so we don't flush any input. */
|
this call, so we don't flush any input. */
|
||||||
result = SERIAL_SET_TTY_STATE (stdin_serial, inferior_ttystate);
|
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
|
/* If attach_flag is set, we don't know whether we are sharing a
|
||||||
terminal with the inferior or not. (attaching a process
|
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
|
`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
|
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
|
are sharing a terminal. So what we do is to go through all
|
||||||
the saving and restoring of terminal state, but ignore errors
|
the saving and restoring of the tty state, but ignore errors
|
||||||
(which will occur, in tcsetpgrp, if we are not sharing a
|
setting the process group, which will happen if we are not
|
||||||
terminal). */
|
sharing a terminal). */
|
||||||
|
|
||||||
if (!attach_flag)
|
if (job_control)
|
||||||
OOPSY ("setting tty state");
|
|
||||||
|
|
||||||
if (!job_control)
|
|
||||||
{
|
{
|
||||||
sigint_ours = (void (*) ()) signal (SIGINT, SIG_IGN);
|
#ifdef HAVE_TERMIOS
|
||||||
sigquit_ours = (void (*) ()) signal (SIGQUIT, SIG_IGN);
|
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;
|
terminal_is_ours = 0;
|
||||||
}
|
}
|
||||||
|
@ -254,6 +301,12 @@ terminal_ours_1 (output_only)
|
||||||
if (inferior_ttystate)
|
if (inferior_ttystate)
|
||||||
free (inferior_ttystate);
|
free (inferior_ttystate);
|
||||||
inferior_ttystate = SERIAL_GET_TTY_STATE (stdin_serial);
|
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
|
/* Here we used to set ICANON in our ttystate, but I believe this
|
||||||
was an artifact from before when we used readline. Readline sets
|
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,
|
SERIAL_NOFLUSH_SET_TTY_STATE (stdin_serial, our_ttystate,
|
||||||
inferior_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
|
#ifdef SIGTTOU
|
||||||
if (job_control)
|
if (job_control)
|
||||||
signal (SIGTTOU, osigttou);
|
signal (SIGTTOU, osigttou);
|
||||||
|
@ -366,6 +432,10 @@ child_terminal_info (args, from_tty)
|
||||||
printf_filtered ("\n");
|
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);
|
SERIAL_PRINT_TTY_STATE (stdin_serial, inferior_ttystate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -510,6 +580,43 @@ clear_sigint_trap()
|
||||||
signal (SIGINT, osig);
|
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
|
void
|
||||||
_initialize_inflow ()
|
_initialize_inflow ()
|
||||||
{
|
{
|
||||||
|
@ -522,4 +629,25 @@ _initialize_inflow ()
|
||||||
inferior_pid = 0;
|
inferior_pid = 0;
|
||||||
|
|
||||||
terminal_is_ours = 1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
go32_set_process_group (scb, ttystate, group)
|
|
||||||
serial_t scb;
|
|
||||||
serial_ttystate ttystate;
|
|
||||||
int group;
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
go32_write (scb, str, len)
|
go32_write (scb, str, len)
|
||||||
serial_t scb;
|
serial_t scb;
|
||||||
|
@ -386,18 +377,8 @@ static struct serial_ops go32_ops =
|
||||||
go32_print_tty_state,
|
go32_print_tty_state,
|
||||||
go32_noflush_set_tty_state,
|
go32_noflush_set_tty_state,
|
||||||
go32_setbaudrate,
|
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 ()
|
_initialize_ser_go32 ()
|
||||||
{
|
{
|
||||||
serial_add_interface (&go32_ops);
|
serial_add_interface (&go32_ops);
|
||||||
|
|
|
@ -259,15 +259,6 @@ tcp_setbaudrate(scb, rate)
|
||||||
return 0; /* Never fails! */
|
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
|
static int
|
||||||
tcp_write(scb, str, len)
|
tcp_write(scb, str, len)
|
||||||
serial_t scb;
|
serial_t scb;
|
||||||
|
@ -316,7 +307,6 @@ static struct serial_ops tcp_ops =
|
||||||
tcp_print_tty_state,
|
tcp_print_tty_state,
|
||||||
tcp_noflush_set_tty_state,
|
tcp_noflush_set_tty_state,
|
||||||
tcp_setbaudrate,
|
tcp_setbaudrate,
|
||||||
tcp_set_process_group
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
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 hardwire_ttystate
|
||||||
{
|
{
|
||||||
struct termios termios;
|
struct termios termios;
|
||||||
pid_t process_group;
|
|
||||||
};
|
};
|
||||||
#endif /* termios */
|
#endif /* termios */
|
||||||
|
|
||||||
|
@ -65,13 +64,6 @@ struct hardwire_ttystate
|
||||||
struct ltchars ltc;
|
struct ltchars ltc;
|
||||||
/* Line discipline flags. */
|
/* Line discipline flags. */
|
||||||
int lmode;
|
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 */
|
#endif /* sgtty */
|
||||||
|
|
||||||
|
@ -110,23 +102,10 @@ get_tty_state(scb, state)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_TERMIOS
|
#ifdef HAVE_TERMIOS
|
||||||
extern int errno;
|
extern int errno;
|
||||||
pid_t new_process_group;
|
|
||||||
|
|
||||||
if (tcgetattr(scb->fd, &state->termios) < 0)
|
if (tcgetattr(scb->fd, &state->termios) < 0)
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -146,10 +125,7 @@ get_tty_state(scb, state)
|
||||||
if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0)
|
if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!job_control)
|
return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
return ioctl (scb->fd, TIOCGPGRP, &state->process_group);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,14 +138,7 @@ set_tty_state(scb, state)
|
||||||
if (tcsetattr(scb->fd, TCSANOW, &state->termios) < 0)
|
if (tcsetattr(scb->fd, TCSANOW, &state->termios) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!job_control)
|
return 0;
|
||||||
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);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_TERMIO
|
#ifdef HAVE_TERMIO
|
||||||
|
@ -182,10 +151,7 @@ set_tty_state(scb, state)
|
||||||
if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0)
|
if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!job_control)
|
return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
return ioctl (scb->fd, TIOCSPGRP, &state->process_group);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,8 +236,6 @@ hardwire_print_tty_state (scb, ttystate)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS
|
#ifdef HAVE_TERMIOS
|
||||||
printf_filtered ("Process group = %d\n", state->process_group);
|
|
||||||
|
|
||||||
printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n",
|
printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n",
|
||||||
state->termios.c_iflag, state->termios.c_oflag);
|
state->termios.c_iflag, state->termios.c_oflag);
|
||||||
printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x\n",
|
printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x\n",
|
||||||
|
@ -300,8 +264,6 @@ hardwire_print_tty_state (scb, ttystate)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SGTTY
|
#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 ("sgttyb.sg_flags = 0x%x.\n", state->sgttyb.sg_flags);
|
||||||
|
|
||||||
printf_filtered ("tchars: ");
|
printf_filtered ("tchars: ");
|
||||||
|
@ -614,18 +576,6 @@ hardwire_setbaudrate(scb, rate)
|
||||||
return set_tty_state (scb, &state);
|
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
|
static int
|
||||||
hardwire_write(scb, str, len)
|
hardwire_write(scb, str, len)
|
||||||
serial_t scb;
|
serial_t scb;
|
||||||
|
@ -674,77 +624,10 @@ static struct serial_ops hardwire_ops =
|
||||||
hardwire_print_tty_state,
|
hardwire_print_tty_state,
|
||||||
hardwire_noflush_set_tty_state,
|
hardwire_noflush_set_tty_state,
|
||||||
hardwire_setbaudrate,
|
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
|
void
|
||||||
_initialize_ser_hardwire ()
|
_initialize_ser_hardwire ()
|
||||||
{
|
{
|
||||||
serial_add_interface (&hardwire_ops);
|
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)
|
int (*noflush_set_tty_state)
|
||||||
PARAMS ((serial_t, serial_ttystate, serial_ttystate));
|
PARAMS ((serial_t, serial_ttystate, serial_ttystate));
|
||||||
int (*setbaudrate) PARAMS ((serial_t, int rate));
|
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 */
|
/* 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))
|
#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 */
|
#endif /* SERIAL_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue