From patchwork Thu Mar 30 01:49:11 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: 19764 Received: (qmail 107281 invoked by alias); 30 Mar 2017 01:50:05 -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 101739 invoked by uid 89); 30 Mar 2017 01:49:27 -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=H*MI:sk:2017033, junior, unh, sergio 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; Thu, 30 Mar 2017 01:49:24 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1F3FBC04BD5B for ; Thu, 30 Mar 2017 01:49:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1F3FBC04BD5B Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sergiodj@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 1F3FBC04BD5B Received: from psique.yyz.redhat.com (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by smtp.corp.redhat.com (Postfix) with ESMTP id 114765C88D; Thu, 30 Mar 2017 01:49:22 +0000 (UTC) From: Sergio Durigan Junior To: GDB Patches Cc: Pedro Alves , Sergio Durigan Junior Subject: [PATCH v5 1/5] Move parts of inferior job control to common/ Date: Wed, 29 Mar 2017 21:49:11 -0400 Message-Id: <20170330014915.4894-2-sergiodj@redhat.com> In-Reply-To: <20170330014915.4894-1-sergiodj@redhat.com> References: <1482464361-4068-1-git-send-email-sergiodj@redhat.com> <20170330014915.4894-1-sergiodj@redhat.com> X-IsSubscribed: yes This commit moves a few bits responsible for dealing with inferior job control from GDB to common/, which makes them available to gdbserver. This is necessary for the upcoming patches that will share fork_inferior et al between GDB and gdbserver. We move some parts of gdb/terminal.h to gdb/common/common-terminal.h, especifically the code that checks terminal features and that are used to set job_control accordingly. After sharing parts of gdb/terminal.h, we also to share the two functions on gdb/inflow.c that are going to be needed by the fork_inferior rework. They are 'gdb_setpgid' and the new 'have_job_control'. I've also taken the opportunity to give a more meaningful name to "inflow.c" on common/. Now it is called "job-control.c" (thanks Pedro for the suggestion). gdb/ChangeLog: yyyy-mm-dd Sergio Durigan Junior * Makefile.in (SFILES): Add "common/job-control.c". (HFILES_NO_SRCDIR): Add "common/common-terminal.h". (COMMON_OBS): Add "common/job-control.o". * common/common-terminal.h: New file, with parts of "terminal.h". * common/common.m4: Check headers 'termios.h', 'termio.h' and 'sgtty.h'. * common/job-control.c: New file, with contents from "gdb/inflow.c". * inflow.c (gdb_setpgid): Move to "common/common-inflow.c". (_initialize_inflow): Move setting of "job_control" to "handle_job_control". * terminal.h: Move terminal-related defines to "common/common-terminal.h". Include "common/common-terminal.h". (job_control): Moved to "common/common-terminal.h". (gdb_setpgid): Likewise. * utils.c (job_control): Remove. gdb/gdbserver/ChangeLog: yyyy-mm-dd Sergio Durigan Junior * Makefile.in (SFILE): Add "common/job-control.c". (OBS): Add "job-control.o". * terminal.h: Include "common-terminal.h". --- gdb/Makefile.in | 3 ++ gdb/common/common-terminal.h | 94 ++++++++++++++++++++++++++++++++++++++++++++ gdb/common/common.m4 | 3 +- gdb/common/job-control.c | 92 +++++++++++++++++++++++++++++++++++++++++++ gdb/gdbserver/Makefile.in | 2 + gdb/gdbserver/terminal.h | 2 + gdb/inflow.c | 63 +---------------------------- gdb/terminal.h | 69 +------------------------------- gdb/utils.c | 4 -- 9 files changed, 198 insertions(+), 134 deletions(-) create mode 100644 gdb/common/common-terminal.h create mode 100644 gdb/common/job-control.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 0818742..6ad03d7 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1210,6 +1210,7 @@ SFILES = \ common/fileio.c \ common/filestuff.c \ common/format.c \ + common/job-control.c \ common/gdb_vecs.c \ common/new-op.c \ common/print-utils.c \ @@ -1484,6 +1485,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 \ @@ -1637,6 +1639,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \ common-agent.o \ common-debug.o \ common-exceptions.o \ + job-control.o \ common-regcache.o \ common-utils.o \ complaints.o \ diff --git a/gdb/common/common-terminal.h b/gdb/common/common-terminal.h new file mode 100644 index 0000000..4026a08 --- /dev/null +++ b/gdb/common/common-terminal.h @@ -0,0 +1,94 @@ +/* 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 + +/* Do we have job control? Can be assumed to always be the same + within a given run of GDB. Use in gdb/inflow.c and + common/common-inflow.c. */ +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 (void); + +/* Determine whether we have job control, and set variable JOB_CONTROL + accordingly. This function must be called before any use of + JOB_CONTROL. */ +extern void have_job_control (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/common/job-control.c b/gdb/common/job-control.c new file mode 100644 index 0000000..14b719e --- /dev/null +++ b/gdb/common/job-control.c @@ -0,0 +1,92 @@ +/* Job control and terminal related functions, for GDB and gdbserver + when running under Unix. + + 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 . */ + +#include "common-defs.h" +#include "common-terminal.h" + +/* Nonzero if we have job control. */ +int job_control; + +/* Set the process group ID of the inferior. + + Just using job_control only does part of it because setpgid or + setpgrp might not exist on a system without job control. + + 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 (void) +{ + int retval = 0; + + if (job_control) + { +#if defined (HAVE_TERMIOS) || defined (TIOCGPGRP) +#ifdef HAVE_SETPGID + /* The call 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 +#ifdef HAVE_SETPGRP +#ifdef SETPGRP_VOID + retval = setpgrp (); +#else + retval = setpgrp (getpid (), getpid ()); +#endif +#endif /* HAVE_SETPGRP */ +#endif /* HAVE_SETPGID */ +#endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */ + } + + return retval; +} + +/* See common/common-terminal.h. */ + +void +have_job_control (void) +{ + /* 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 +#ifdef _SC_JOB_CONTROL + job_control = sysconf (_SC_JOB_CONTROL); +#else + job_control = 0; /* Have to assume the worst. */ +#endif /* _SC_JOB_CONTROL */ +#endif /* _POSIX_JOB_CONTROL */ +#endif /* HAVE_TERMIOS */ + +#ifdef HAVE_SGTTY +#ifdef TIOCGPGRP + job_control = 1; +#else + job_control = 0; +#endif /* TIOCGPGRP */ +#endif /* sgtty */ +} diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 9935012..340c9c0 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -204,6 +204,7 @@ SFILES = \ $(srcdir)/common/environ.c \ $(srcdir)/common/fileio.c \ $(srcdir)/common/filestuff.c \ + $(srcdir)/common/job-control.c \ $(srcdir)/common/gdb_vecs.c \ $(srcdir)/common/new-op.c \ $(srcdir)/common/print-utils.c \ @@ -234,6 +235,7 @@ OBS = \ cleanups.o \ common-debug.o \ common-exceptions.o \ + job-control.o \ common-regcache.o \ common-utils.o \ debug.o \ diff --git a/gdb/gdbserver/terminal.h b/gdb/gdbserver/terminal.h index 3bdd5f5..498ab26 100644 --- a/gdb/gdbserver/terminal.h +++ b/gdb/gdbserver/terminal.h @@ -19,6 +19,8 @@ #if !defined (TERMINAL_H) #define TERMINAL_H 1 +#include "common-terminal.h" + /* Autoconf will have defined HAVE_TERMIOS_H, HAVE_TERMIO_H, and HAVE_SGTTY_H for us as appropriate. */ diff --git a/gdb/inflow.c b/gdb/inflow.c index 7ffa83a..271278d 100644 --- a/gdb/inflow.c +++ b/gdb/inflow.c @@ -803,43 +803,6 @@ create_tty_session (void) #endif /* HAVE_SETSID */ } -/* 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 (void) -{ - int retval = 0; - - if (job_control) - { -#if defined (HAVE_TERMIOS) || defined (TIOCGPGRP) -#ifdef HAVE_SETPGID - /* The call 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 -#ifdef HAVE_SETPGRP -#ifdef SETPGRP_VOID - retval = setpgrp (); -#else - retval = setpgrp (getpid (), getpid ()); -#endif -#endif /* HAVE_SETPGRP */ -#endif /* HAVE_SETPGID */ -#endif /* defined (HAVE_TERMIOS) || defined (TIOCGPGRP) */ - } - - return retval; -} - /* Get all the current tty settings (including whether we have a tty at all!). We can't do this in _initialize_inflow because serial_fdopen() won't work until the serial_ops_list is @@ -860,30 +823,8 @@ _initialize_inflow (void) 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 -#ifdef _SC_JOB_CONTROL - job_control = sysconf (_SC_JOB_CONTROL); -#else - job_control = 0; /* Have to assume the worst. */ -#endif /* _SC_JOB_CONTROL */ -#endif /* _POSIX_JOB_CONTROL */ -#endif /* HAVE_TERMIOS */ - -#ifdef HAVE_SGTTY -#ifdef TIOCGPGRP - job_control = 1; -#else - job_control = 0; -#endif /* TIOCGPGRP */ -#endif /* sgtty */ + /* OK, figure out whether we have job control. */ + have_job_control (); observer_attach_inferior_exit (inflow_inferior_exit); diff --git a/gdb/terminal.h b/gdb/terminal.h index d8691b2..3243279 100644 --- a/gdb/terminal.h +++ b/gdb/terminal.h @@ -19,62 +19,7 @@ #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; @@ -86,16 +31,8 @@ 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 +42,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 39798cc..d7a1993 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -102,10 +102,6 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time; static int debug_timestamp = 0; -/* Nonzero if we have job control. */ - -int job_control; - /* Nonzero means that strings with character values >0x7F should be printed as octal escapes. Zero means just print the value (e.g. it's an international character, and the terminal or window can cope.) */