[PATCH v4 1/5] Share parts of gdb/terminal.h with gdbserver
Sergio Durigan Junior
sergiodj@redhat.com
Wed Mar 8 05:29:00 GMT 2017
As part of the bigger work of sharing fork_inferior with gdbserver,
some parts of gdb/terminal.h also needed to be moved to a common
place. These parts are:
- The code responsible for determining some terminal-based define's
based on available features;
- terminal-related functions needed by fork_inferior;
gdb/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* Makefile.in (HFILES_NO_SRCDIR): Add "common/common-terminal.h".
* common/common-terminal.h: New file, with parts of "terminal.h".
* common/common.m4: Check headers 'termios.h', 'termio.h' and
'sgtty.h'.
* terminal.h: Move terminal-related defines to
"common/common-terminal.h". Include "common/common-terminal.h".
(new_tty_prefork): Move to "common/common-terminal.h".
(new_tty): Likewise.
(new_tty_postfork): Likewise.
(create_tty_session): Likewise.
(gdb_setpgid): Likewise.
* utils.c: Include "terminal.h".
gdb/gdbserver/ChangeLog:
yyyy-mm-dd Sergio Durigan Junior <sergiodj@redhat.com>
* terminal.c: New file.
---
gdb/Makefile.in | 1 +
gdb/common/common-terminal.h | 116 +++++++++++++++++++++++++++++++++++++++++++
gdb/common/common.m4 | 3 +-
gdb/gdbserver/terminal.c | 69 +++++++++++++++++++++++++
gdb/terminal.h | 73 +--------------------------
gdb/utils.c | 1 +
6 files changed, 190 insertions(+), 73 deletions(-)
create mode 100644 gdb/common/common-terminal.h
create mode 100644 gdb/gdbserver/terminal.c
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 0818742..177c853 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1484,6 +1484,7 @@ HFILES_NO_SRCDIR = \
common/common-regcache.h \
common/common-types.h \
common/common-utils.h \
+ common/common-terminal.h \
common/errors.h \
common/environ.h \
common/fileio.h \
diff --git a/gdb/common/common-terminal.h b/gdb/common/common-terminal.h
new file mode 100644
index 0000000..87a19f0
--- /dev/null
+++ b/gdb/common/common-terminal.h
@@ -0,0 +1,116 @@
+/* Common terminal interface definitions for GDB and gdbserver.
+ Copyright (C) 1986-2017 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef COMMON_TERMINAL_H
+#define COMMON_TERMINAL_H
+
+/* If we're using autoconf, it will define HAVE_TERMIOS_H,
+ HAVE_TERMIO_H and HAVE_SGTTY_H for us. One day we can rewrite
+ 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
+ thing. */
+
+#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) */
+#endif /* !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) &&
+ !defined (HAVE_SGTTY) */
+
+#if defined(HAVE_TERMIOS)
+#include <termios.h>
+#endif
+
+#if !defined(_WIN32) && !defined (HAVE_TERMIOS)
+
+/* 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
+
+#include <sys/types.h>
+
+extern void new_tty (void);
+
+/* NEW_TTY_PREFORK is called before forking a new child process,
+ so we can record the state of ttys in the child to be formed.
+ TTYNAME is null if we are to share the terminal with gdb;
+ or points to a string containing the name of the desired tty.
+
+ NEW_TTY is called in new child processes under Unix, which will
+ become debugger target processes. This actually switches to
+ the terminal specified in the NEW_TTY_PREFORK call.
+
+ This function is implemented as a placeholder on GDBserver. */
+extern void new_tty_prefork (const char *ttyname);
+
+/* NEW_TTY_POSTFORK is called after forking a new child process, and
+ adding it to the inferior table, to store the TTYNAME being used by
+ the child, or null if it sharing the terminal with gdb.
+
+ This function is implemented as a placeholder on GDBserver. */
+extern void new_tty_postfork (void);
+
+/* Create a new session if the inferior will run in a different tty.
+ A session is UNIX's way of grouping processes that share a controlling
+ terminal, so a new one is needed if the inferior terminal will be
+ different from GDB's.
+
+ Returns the session id of the new session, 0 if no session was created
+ or -1 if an error occurred.
+
+ This function is implemented as a placeholder on GDBserver. */
+extern pid_t create_tty_session (void);
+
+/* Set the process group of the caller to its own pid, or do nothing
+ if we lack job control. */
+extern int gdb_setpgid (void);
+
+#endif /* ! COMMON_TERMINAL_H */
diff --git a/gdb/common/common.m4 b/gdb/common/common.m4
index e21e6e5..45726ab 100644
--- a/gdb/common/common.m4
+++ b/gdb/common/common.m4
@@ -28,7 +28,8 @@ AC_DEFUN([GDB_AC_COMMON], [
AC_CHECK_HEADERS(linux/perf_event.h locale.h memory.h signal.h dnl
sys/resource.h sys/socket.h sys/syscall.h dnl
sys/un.h sys/wait.h dnl
- thread_db.h wait.h)
+ thread_db.h wait.h dnl
+ termios.h termio.h sgtty.h)
AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 socketpair sigaction])
diff --git a/gdb/gdbserver/terminal.c b/gdb/gdbserver/terminal.c
new file mode 100644
index 0000000..fb06209
--- /dev/null
+++ b/gdb/gdbserver/terminal.c
@@ -0,0 +1,69 @@
+/* Terminal interface definitions for the GDB remote server.
+ Copyright (C) 2016-2017 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "server.h"
+#include "common-terminal.h"
+
+/* Placeholders needed by fork_inferior. For now, these functions are
+ not needed nor useful to have on gdbserver. When/If we properly
+ handle terminal modes, we can revisit and implement the needed
+ support. */
+
+/* See common/common-terminal.h. */
+
+void
+new_tty (void)
+{
+}
+
+/* See common/common-terminal.h. */
+
+void
+new_tty_prefork (const char *ttyname)
+{
+}
+
+/* See common/common-terminal.h. */
+
+void
+new_tty_postfork (void)
+{
+}
+
+/* See common/common-terminal.h. */
+
+pid_t
+create_tty_session (void)
+{
+ return (pid_t) 0;
+}
+
+/* See common/common-inferior.h. */
+
+void
+set_inferior_io_terminal (const char *terminal_name)
+{
+}
+
+/* See common/common-inferior.h. */
+
+const char *
+get_inferior_io_terminal (void)
+{
+ return NULL;
+}
diff --git a/gdb/terminal.h b/gdb/terminal.h
index d8691b2..438eb40 100644
--- a/gdb/terminal.h
+++ b/gdb/terminal.h
@@ -19,83 +19,16 @@
#if !defined (TERMINAL_H)
#define TERMINAL_H 1
-
-/* If we're using autoconf, it will define HAVE_TERMIOS_H,
- HAVE_TERMIO_H and HAVE_SGTTY_H for us. One day we can rewrite
- 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
- thing. */
-
-#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) */
-#endif /* !defined (HAVE_TERMIOS) && !defined (HAVE_TERMIO) &&
- !defined (HAVE_SGTTY) */
-
-#if defined(HAVE_TERMIOS)
-#include <termios.h>
-#endif
-
-#if !defined(_WIN32) && !defined (HAVE_TERMIOS)
-
-/* 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
+#include "common-terminal.h"
struct inferior;
-extern void new_tty_prefork (const char *);
-
-extern void new_tty (void);
-
-extern void new_tty_postfork (void);
-
extern void copy_terminal_info (struct inferior *to, struct inferior *from);
/* 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;
-extern pid_t create_tty_session (void);
-
-/* Set the process group of the caller to its own pid, or do nothing if
- we lack job control. */
-extern int gdb_setpgid (void);
-
/* Set up a serial structure describing standard input. In inflow.c. */
extern void initialize_stdin_serial (void);
@@ -105,8 +38,4 @@ extern void gdb_save_tty_state (void);
have had a chance to alter it. */
extern void set_initial_gdb_ttystate (void);
-/* Set the process group of the caller to its own pid, or do nothing
- if we lack job control. */
-extern int gdb_setpgid (void);
-
#endif /* !defined (TERMINAL_H) */
diff --git a/gdb/utils.c b/gdb/utils.c
index 27021a1..fdb983a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -53,6 +53,7 @@
#include "top.h"
#include "main.h"
#include "solist.h"
+#include "terminal.h"
#include "inferior.h" /* for signed_pointer_to_address */
--
2.9.3
More information about the Gdb-patches
mailing list