[v5,1/5] Move parts of inferior job control to common/

Message ID 20170330014915.4894-2-sergiodj@redhat.com
State New, archived
Headers

Commit Message

Sergio Durigan Junior March 30, 2017, 1:49 a.m. UTC
  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  <sergiodj@redhat.com>

	* 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  <sergiodj@redhat.com>

	* 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
  

Comments

Pedro Alves March 31, 2017, 5:11 p.m. UTC | #1
On 03/30/2017 02:49 AM, Sergio Durigan Junior wrote:
> gdb/gdbserver/ChangeLog:
> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
> 
> 	* Makefile.in (SFILE): Add "common/job-control.c".
> 	(OBS): Add "job-control.o".
> 	* terminal.h: Include "common-terminal.h".

Is there a reason the .h and the .c files are named differently?

Thanks,
Pedro Alves
  
Sergio Durigan Junior March 31, 2017, 5:31 p.m. UTC | #2
On Friday, March 31 2017, Pedro Alves wrote:

> On 03/30/2017 02:49 AM, Sergio Durigan Junior wrote:
>> gdb/gdbserver/ChangeLog:
>> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
>> 
>> 	* Makefile.in (SFILE): Add "common/job-control.c".
>> 	(OBS): Add "job-control.o".
>> 	* terminal.h: Include "common-terminal.h".
>
> Is there a reason the .h and the .c files are named differently?

Hm, it's just because gdb_setpgid was defined on gdb/terminal.h, so I
thought it was better to move it to common-terminal.h (i.e., keep the
naming).  Do you want a common/job-control.h?
  
Pedro Alves March 31, 2017, 6:21 p.m. UTC | #3
On 03/31/2017 06:31 PM, Sergio Durigan Junior wrote:
> On Friday, March 31 2017, Pedro Alves wrote:
> 
>> On 03/30/2017 02:49 AM, Sergio Durigan Junior wrote:
>>> gdb/gdbserver/ChangeLog:
>>> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
>>>
>>> 	* Makefile.in (SFILE): Add "common/job-control.c".
>>> 	(OBS): Add "job-control.o".
>>> 	* terminal.h: Include "common-terminal.h".
>>
>> Is there a reason the .h and the .c files are named differently?
> 
> Hm, it's just because gdb_setpgid was defined on gdb/terminal.h, so I
> thought it was better to move it to common-terminal.h (i.e., keep the
> naming).  Do you want a common/job-control.h?

So that .h file contains both definitions of symbols that
are the exported API of job-control.c, and also the whole
termios.h/termio.h #ifdefery mess.

It doesn't look like the termios.h stuff is needed by
the _clients_ of the functions defined in job-control.c?

So I think the best is to have two headers instead.

One with the termios.h/termio.h #ifdef-ery stuff,
called common/gdb_termios.h.  That's be similar in spirit
to gdb/gdb_curses.h.  That should only then be included
in files that actually need to see those bits defined.
Maybe job-control.c and inflow.c and not much else.

The "#include <sys/types.h>" include should probably not be
in the resulting gdb_termios.h.  I can't see why it's there
in your common-terminal.h.

And then add a new common/job-control.h header that matches the
new job-control.c file, that _only_ exports job-control.c's
public interface, like, these three declarations:

 extern int job_control;
 extern int gdb_setpgid ();
 extern void have_job_control ();

Also, it looks like gdbserver's terminal.h has all the same
termios goo that you were putting in common-terminal.h.
We should remove/undup all that.

Thanks,
Pedro Alves
  
Sergio Durigan Junior March 31, 2017, 9:20 p.m. UTC | #4
On Friday, March 31 2017, Pedro Alves wrote:

> On 03/31/2017 06:31 PM, Sergio Durigan Junior wrote:
>> On Friday, March 31 2017, Pedro Alves wrote:
>> 
>>> On 03/30/2017 02:49 AM, Sergio Durigan Junior wrote:
>>>> gdb/gdbserver/ChangeLog:
>>>> yyyy-mm-dd  Sergio Durigan Junior  <sergiodj@redhat.com>
>>>>
>>>> 	* Makefile.in (SFILE): Add "common/job-control.c".
>>>> 	(OBS): Add "job-control.o".
>>>> 	* terminal.h: Include "common-terminal.h".
>>>
>>> Is there a reason the .h and the .c files are named differently?
>> 
>> Hm, it's just because gdb_setpgid was defined on gdb/terminal.h, so I
>> thought it was better to move it to common-terminal.h (i.e., keep the
>> naming).  Do you want a common/job-control.h?
>
> So that .h file contains both definitions of symbols that
> are the exported API of job-control.c, and also the whole
> termios.h/termio.h #ifdefery mess.
>
> It doesn't look like the termios.h stuff is needed by
> the _clients_ of the functions defined in job-control.c?
>
> So I think the best is to have two headers instead.
>
> One with the termios.h/termio.h #ifdef-ery stuff,
> called common/gdb_termios.h.  That's be similar in spirit
> to gdb/gdb_curses.h.  That should only then be included
> in files that actually need to see those bits defined.
> Maybe job-control.c and inflow.c and not much else.
>
> The "#include <sys/types.h>" include should probably not be
> in the resulting gdb_termios.h.  I can't see why it's there
> in your common-terminal.h.
>
> And then add a new common/job-control.h header that matches the
> new job-control.c file, that _only_ exports job-control.c's
> public interface, like, these three declarations:
>
>  extern int job_control;
>  extern int gdb_setpgid ();
>  extern void have_job_control ();

Thanks, it makes sense to separate like this, indeed.

> Also, it looks like gdbserver's terminal.h has all the same
> termios goo that you were putting in common-terminal.h.
> We should remove/undup all that.

Yeah, after a closer look I noticed that the code is just a simplified
version of what's already done on the GDB side (now under common/).  So
I went ahead and deleted the gdbserver file.

Thanks for this review, I implemented everything you mentioned on this
message but will wait until you review the other parts before I send the
v6.

Thanks,
  
Pedro Alves April 7, 2017, 5:51 p.m. UTC | #5
On 03/31/2017 10:20 PM, Sergio Durigan Junior wrote:
> On Friday, March 31 2017, Pedro Alves wrote:

>> So that .h file contains both definitions of symbols that
>> are the exported API of job-control.c, and also the whole
>> termios.h/termio.h #ifdefery mess.
>>
>> It doesn't look like the termios.h stuff is needed by
>> the _clients_ of the functions defined in job-control.c?
>>
>> So I think the best is to have two headers instead.
>>
>> One with the termios.h/termio.h #ifdef-ery stuff,
>> called common/gdb_termios.h.  That's be similar in spirit
>> to gdb/gdb_curses.h.  That should only then be included
>> in files that actually need to see those bits defined.
>> Maybe job-control.c and inflow.c and not much else.
>>
>> The "#include <sys/types.h>" include should probably not be
>> in the resulting gdb_termios.h.  I can't see why it's there
>> in your common-terminal.h.
>>
>> And then add a new common/job-control.h header that matches the
>> new job-control.c file, that _only_ exports job-control.c's
>> public interface, like, these three declarations:
>>
>>  extern int job_control;
>>  extern int gdb_setpgid ();
>>  extern void have_job_control ();
> 
> Thanks, it makes sense to separate like this, indeed.
> 
>> Also, it looks like gdbserver's terminal.h has all the same
>> termios goo that you were putting in common-terminal.h.
>> We should remove/undup all that.
> 
> Yeah, after a closer look I noticed that the code is just a simplified
> version of what's already done on the GDB side (now under common/).  So
> I went ahead and deleted the gdbserver file.
> 
> Thanks for this review, I implemented everything you mentioned on this
> message but will wait until you review the other parts before I send the
> v6.

Note that if you extract the
 gdb/terminal.h / gdbserver/terminal.h
   => common/gdb_termios.h 
part (including the corresponding common.m4 bits) into its own preparatory
patch, and post it separately, we can get that merged and out of the way
quickly.  That part stands on its own right.

Thanks,
Pedro Alves
  
Sergio Durigan Junior April 12, 2017, 12:25 a.m. UTC | #6
On Friday, April 07 2017, Pedro Alves wrote:

> On 03/31/2017 10:20 PM, Sergio Durigan Junior wrote:
>> On Friday, March 31 2017, Pedro Alves wrote:
>
>>> So that .h file contains both definitions of symbols that
>>> are the exported API of job-control.c, and also the whole
>>> termios.h/termio.h #ifdefery mess.
>>>
>>> It doesn't look like the termios.h stuff is needed by
>>> the _clients_ of the functions defined in job-control.c?
>>>
>>> So I think the best is to have two headers instead.
>>>
>>> One with the termios.h/termio.h #ifdef-ery stuff,
>>> called common/gdb_termios.h.  That's be similar in spirit
>>> to gdb/gdb_curses.h.  That should only then be included
>>> in files that actually need to see those bits defined.
>>> Maybe job-control.c and inflow.c and not much else.
>>>
>>> The "#include <sys/types.h>" include should probably not be
>>> in the resulting gdb_termios.h.  I can't see why it's there
>>> in your common-terminal.h.
>>>
>>> And then add a new common/job-control.h header that matches the
>>> new job-control.c file, that _only_ exports job-control.c's
>>> public interface, like, these three declarations:
>>>
>>>  extern int job_control;
>>>  extern int gdb_setpgid ();
>>>  extern void have_job_control ();
>> 
>> Thanks, it makes sense to separate like this, indeed.
>> 
>>> Also, it looks like gdbserver's terminal.h has all the same
>>> termios goo that you were putting in common-terminal.h.
>>> We should remove/undup all that.
>> 
>> Yeah, after a closer look I noticed that the code is just a simplified
>> version of what's already done on the GDB side (now under common/).  So
>> I went ahead and deleted the gdbserver file.
>> 
>> Thanks for this review, I implemented everything you mentioned on this
>> message but will wait until you review the other parts before I send the
>> v6.
>
> Note that if you extract the
>  gdb/terminal.h / gdbserver/terminal.h
>    => common/gdb_termios.h 
> part (including the corresponding common.m4 bits) into its own preparatory
> patch, and post it separately, we can get that merged and out of the way
> quickly.  That part stands on its own right.

OK, I'll do that now.
  

Patch

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 <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>
+
+/* 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 <http://www.gnu.org/licenses/>.  */
+
+#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 <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;
 
@@ -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.)  */