From patchwork Wed Mar 8 05:29:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergio Durigan Junior X-Patchwork-Id: 19467 Received: (qmail 37870 invoked by alias); 8 Mar 2017 05:29:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 37715 invoked by uid 89); 8 Mar 2017 05:29:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=UD:utils.c, utilsc, utils.c, 1116 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 08 Mar 2017 05:29:51 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D61A761E42; Wed, 8 Mar 2017 05:29:43 +0000 (UTC) Received: from psique.yyz.redhat.com (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v285Te88010590; Wed, 8 Mar 2017 00:29:41 -0500 From: Sergio Durigan Junior To: GDB Patches Cc: Pedro Alves , Luis Machado , Sergio Durigan Junior Subject: [PATCH v4 1/5] Share parts of gdb/terminal.h with gdbserver Date: Wed, 8 Mar 2017 00:29:27 -0500 Message-Id: <20170308052931.25398-2-sergiodj@redhat.com> In-Reply-To: <20170308052931.25398-1-sergiodj@redhat.com> References: <20170208032257.15443-1-sergiodj@redhat.com> <20170308052931.25398-1-sergiodj@redhat.com> X-IsSubscribed: yes 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 * 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 * 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 . */ + +#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 +#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 + +#undef TIOCGETP +#define TIOCGETP TCGETA +#undef TIOCSETN +#define TIOCSETN TCSETA +#undef TIOCSETP +#define TIOCSETP TCSETAF +#define TERMINAL struct termio + +#else /* sgtty */ + +#include +#include +#include +#define TERMINAL struct sgttyb + +#endif /* sgtty */ +#endif + +#include + +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 . */ + +#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 -#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 - -#undef TIOCGETP -#define TIOCGETP TCGETA -#undef TIOCSETN -#define TIOCSETN TCSETA -#undef TIOCSETP -#define TIOCSETP TCSETAF -#define TERMINAL struct termio - -#else /* sgtty */ - -#include -#include -#include -#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 */