aboutsummaryrefslogtreecommitdiff
path: root/gdb/common
diff options
context:
space:
mode:
authorSergio Durigan Junior <sergiodj@redhat.com>2016-12-22 12:41:16 -0500
committerSergio Durigan Junior <sergiodj@redhat.com>2017-06-07 19:52:56 -0400
commit156525114c1cbbace0dec223494b842ffc60d52e (patch)
treed2a29c3995795d328c3e68ada68d83bdd0c59fd5 /gdb/common
parent2d7cc5c7973b6d1bdd9205288863bedadeaf8b41 (diff)
downloadgdb-156525114c1cbbace0dec223494b842ffc60d52e.zip
gdb-156525114c1cbbace0dec223494b842ffc60d52e.tar.gz
gdb-156525114c1cbbace0dec223494b842ffc60d52e.tar.bz2
Move parts of inferior job control to common/
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: 2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com> * Makefile.in (SFILES): Add "common/job-control.c". (HFILES_NO_SRCDIR): Add "common/job-control.h". (COMMON_OBS): Add "job-control.o". * common/job-control.c: New file, with contents from "gdb/inflow.c". * common/job-control.h: New file, with contents from "terminal.h". * fork-child.c: Include "job-control.h". * inflow.c: Include "job-control.h". (gdb_setpgid): Move to "common/common-inflow.c". (_initialize_inflow): Move setting of "job_control" to "handle_job_control". * terminal.h (job_control): Moved to "common/common-terminal.h". (gdb_setpgid): Likewise. * top.c: Include "job_control.h". * utils.c: Likewise. (job_control): Moved to "job-control.c". gdb/gdbserver/ChangeLog: 2017-06-07 Sergio Durigan Junior <sergiodj@redhat.com> * Makefile.in (SFILE): Add "common/job-control.c". (OBS): Add "job-control.o".
Diffstat (limited to 'gdb/common')
-rw-r--r--gdb/common/job-control.c93
-rw-r--r--gdb/common/job-control.h38
2 files changed, 131 insertions, 0 deletions
diff --git a/gdb/common/job-control.c b/gdb/common/job-control.c
new file mode 100644
index 0000000..d76bc57
--- /dev/null
+++ b/gdb/common/job-control.c
@@ -0,0 +1,93 @@
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#include "common-defs.h"
+#include "job-control.h"
+#include "gdb_termios.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 ()
+{
+ 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 ()
+{
+ /* 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/common/job-control.h b/gdb/common/job-control.h
new file mode 100644
index 0000000..9e284aa
--- /dev/null
+++ b/gdb/common/job-control.h
@@ -0,0 +1,38 @@
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#ifndef JOB_CONTROL_H
+#define JOB_CONTROL_H
+
+/* 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 ();
+
+/* 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 ();
+
+#endif /* ! JOB_CONTROL_H */