1999-04-16 09:35:26 +08:00
|
|
|
/* Terminal interface definitions for GDB, the GNU Debugger.
|
2016-01-01 12:33:14 +08:00
|
|
|
Copyright (C) 1986-2016 Free Software Foundation, Inc.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This file is part of GDB.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-08-24 02:08:50 +08:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
1999-07-08 04:19:36 +08:00
|
|
|
(at your option) any later version.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
You should have received a copy of the GNU General Public License
|
2007-08-24 02:08:50 +08:00
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
#if !defined (TERMINAL_H)
|
|
|
|
#define TERMINAL_H 1
|
|
|
|
|
|
|
|
|
|
|
|
/* If we're using autoconf, it will define HAVE_TERMIOS_H,
|
2011-01-12 05:53:25 +08:00
|
|
|
HAVE_TERMIO_H and HAVE_SGTTY_H for us. One day we can rewrite
|
1999-04-16 09:35:26 +08:00
|
|
|
ser-unix.c and inflow.c to inspect those names instead of
|
|
|
|
HAVE_TERMIOS, HAVE_TERMIO and the implicit HAVE_SGTTY (when neither
|
|
|
|
HAVE_TERMIOS or HAVE_TERMIO is set). Until then, make sure that
|
|
|
|
nothing has already defined the one of the names, and do the right
|
2011-01-12 05:53:25 +08:00
|
|
|
thing. */
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
#if !defined (HAVE_TERMIOS) && !defined(HAVE_TERMIO) && !defined(HAVE_SGTTY)
|
|
|
|
#if defined(HAVE_TERMIOS_H)
|
|
|
|
#define HAVE_TERMIOS
|
|
|
|
#else /* ! defined (HAVE_TERMIOS_H) */
|
|
|
|
#if defined(HAVE_TERMIO_H)
|
|
|
|
#define HAVE_TERMIO
|
|
|
|
#else /* ! defined (HAVE_TERMIO_H) */
|
|
|
|
#if defined(HAVE_SGTTY_H)
|
|
|
|
#define HAVE_SGTTY
|
|
|
|
#endif /* ! defined (HAVE_SGTTY_H) */
|
|
|
|
#endif /* ! defined (HAVE_TERMIO_H) */
|
|
|
|
#endif /* ! defined (HAVE_TERMIOS_H) */
|
2011-01-06 06:22:53 +08:00
|
|
|
#endif /* !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) &&
|
|
|
|
!defined (HAVE_SGTTY) */
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
#if defined(HAVE_TERMIOS)
|
|
|
|
#include <termios.h>
|
|
|
|
#endif
|
|
|
|
|
1999-08-24 06:40:00 +08:00
|
|
|
#if !defined(_WIN32) && !defined (HAVE_TERMIOS)
|
1999-04-16 09:35:26 +08:00
|
|
|
|
|
|
|
/* Define a common set of macros -- BSD based -- and redefine whatever
|
|
|
|
the system offers to make it look like that. FIXME: serial.h and
|
|
|
|
ser-*.c deal with this in a much cleaner fashion; as soon as stuff
|
|
|
|
is converted to use them, can get rid of this crap. */
|
|
|
|
|
|
|
|
#ifdef HAVE_TERMIO
|
|
|
|
|
|
|
|
#include <termio.h>
|
|
|
|
|
|
|
|
#undef TIOCGETP
|
|
|
|
#define TIOCGETP TCGETA
|
|
|
|
#undef TIOCSETN
|
|
|
|
#define TIOCSETN TCSETA
|
|
|
|
#undef TIOCSETP
|
|
|
|
#define TIOCSETP TCSETAF
|
|
|
|
#define TERMINAL struct termio
|
|
|
|
|
|
|
|
#else /* sgtty */
|
|
|
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <sgtty.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#define TERMINAL struct sgttyb
|
|
|
|
|
|
|
|
#endif /* sgtty */
|
|
|
|
#endif
|
|
|
|
|
2009-05-19 10:46:45 +08:00
|
|
|
struct inferior;
|
|
|
|
|
|
|
|
extern void new_tty_prefork (const char *);
|
|
|
|
|
2000-05-28 09:12:42 +08:00
|
|
|
extern void new_tty (void);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2009-05-19 10:46:45 +08:00
|
|
|
extern void new_tty_postfork (void);
|
|
|
|
|
|
|
|
extern void copy_terminal_info (struct inferior *to, struct inferior *from);
|
|
|
|
|
1999-04-16 09:35:26 +08:00
|
|
|
/* Do we have job control? Can be assumed to always be the same within
|
|
|
|
a given run of GDB. In inflow.c. */
|
|
|
|
extern int job_control;
|
|
|
|
|
2008-04-29 08:52:26 +08:00
|
|
|
extern pid_t create_tty_session (void);
|
2008-03-12 22:10:56 +08:00
|
|
|
|
1999-04-16 09:35:26 +08:00
|
|
|
/* Set the process group of the caller to its own pid, or do nothing if
|
|
|
|
we lack job control. */
|
2000-05-28 09:12:42 +08:00
|
|
|
extern int gdb_setpgid (void);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
* NEWS: Mention native Windows support.
* Makefile.in (gdb_select_h, ser_tcp_h): New.
(ALLDEPFILES): Add ser-mingw.c.
(event-loop.o, inflow.o, mingw-hdep.o, posix-hdep.o, ser-base.o)
(ser-tcp.o, ser-unix.o): Update.
(ser-mingw.o): New rule.
* configure: Regenerated.
* configure.ac: Add ser-mingw.o for mingw32.
* ser-mingw.c: New file.
* event-loop.c: Include "gdb_select.h".
(gdb_select): Remove, moved to mingw-hdep.c and posix-hdep.c.
* ser-base.c: Include "gdb_select.h".
(ser_base_wait_for): Use gdb_select.
* serial.c (serial_for_fd): New function.
(serial_fdopen): Try "terminal" before "hardwire". Initialize
the allocated struct serial.
(serial_wait_handle): New function.
* serial.h (serial_for_fd, serial_wait_handle): New prototypes.
(struct serial_ops) [USE_WIN32API]: Add wait_handle.
* gdb_select.h: New file.
* ser-tcp.c: Include "ser-tcp.h". Remove unused "ser-unix.h" include.
(net_close, net_read_prim, net_write_prim): Make global.
(net_open): Likewise. Pass an exception set to select. Whitespace fix.
Document why we can not use gdb_select.
(_initialize_ser_tcp) [USE_WIN32API]: Do not register TCP support here.
* ser-tcp.h: New file.
* inflow.c (gdb_has_a_terminal): Don't initialize stdin_serial here.
(handle_sigio): Use gdb_select.
(initialize_stdin_serial): New function.
* terminal.h (initialize_stdin_serial): New prototype.
* top.c (gdb_init): Call initialize_stdin_serial.
* mingw-hdep.c (gdb_select): New function, moved from gdb_select in
event-loop.c. Add exception condition support. Use serial_for_fd
and serial_wait_handle. Fix timeout handling.
* posix-hdep.c: Include "gdb_select.h".
(gdb_select): New function.
* remote-st.c (connect_command): Use gdb_select.
* ser-unix.c: Include "gdb_select.h".
(hardwire_send_break, wait_for): Use gdb_select.
2006-02-11 06:01:43 +08:00
|
|
|
/* Set up a serial structure describing standard input. In inflow.c. */
|
|
|
|
extern void initialize_stdin_serial (void);
|
|
|
|
|
2009-05-19 10:46:45 +08:00
|
|
|
extern int gdb_has_a_terminal (void);
|
|
|
|
|
2014-08-25 22:40:32 +08:00
|
|
|
extern void gdb_save_tty_state (void);
|
|
|
|
|
Don't propagate our current terminal state to the inferior
Currently when we start an inferior we have the inferior inherit our
terminal state. Under TUI, our terminal is highly modified by ncurses
and readline. So when starting an inferior under TUI, the inferior will
have a highly modified terminal state which will interfere with standard
I/O. For example,
$ gdb gdb
(gdb) break main
(gdb) run
(gdb) print puts ("a\nb")
a
b
$1 = 4
(gdb) [enter TUI mode]
(gdb) run
(gdb) [exit TUI mode]
(gdb) print puts ("a\nb")
a
b
$2 = 4
(gdb) print puts ("a\r\nb\r")
a
b
$3 = 6
As you can see, when we start the inferior under the regular interface,
puts() prints the text properly. But when we start the inferior under
TUI, puts() does not print the text properly. This is because when we
start the inferior under TUI it inherits our current terminal state
which has been modified by ncurses to, among other things, require an
explicit \r\n to print a new line. As a result the inferior performs
standard I/O in an unexpected way.
Because of this discrepancy, it doesn't seem like a good idea to have
the inferior inherit our _current_ terminal state for it may have been
modified by readline and/or ncurses. Instead, we should have the
inferior inherit a pristine snapshot of our terminal state taken before
readline or ncurses have had a chance to alter it. This enables the
inferior to run in a more accurate way, more closely mimicking the
program's behavior had it run standalone. And it fixes the above
mentioned issue.
Tested on x86_64-unknown-linux-gnu.
gdb/ChangeLog:
* terminal.h (set_initial_gdb_ttystate): Declare.
* inflow.c (initial_gdb_ttystate): New static variable.
(set_initial_gdb_ttystate): New setter.
(child_terminal_init_with_pgrp): Copy initial_gdb_ttystate
instead of our current terminal state.
* top.c (gdb_init): Call set_initial_gdb_ttystate.
2014-11-23 03:12:49 +08:00
|
|
|
extern void set_initial_gdb_ttystate (void);
|
|
|
|
|
2009-05-19 10:46:45 +08:00
|
|
|
/* Set the process group of the caller to its own pid, or do nothing
|
|
|
|
if we lack job control. */
|
|
|
|
extern int gdb_setpgid (void);
|
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
#endif /* !defined (TERMINAL_H) */
|