| /* Job control and terminal related functions, for GDB and gdbserver | 
 |    when running under Unix. | 
 |  | 
 |    Copyright (C) 1986-2025 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 "job-control.h" | 
 | #ifdef HAVE_TERMIOS_H | 
 | #include <termios.h> | 
 | #endif | 
 | #include <unistd.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) | 
 |     { | 
 | #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 */ | 
 |     } | 
 |  | 
 |   return retval; | 
 | } | 
 |  | 
 | /* See gdbsupport/common-terminal.h.  */ | 
 |  | 
 | void | 
 | have_job_control () | 
 | { | 
 |   /* OK, figure out whether we have job control.  If termios is not | 
 |      available, leave job_control 0.  */ | 
 | #if defined (HAVE_TERMIOS_H) | 
 |   /* 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_H */ | 
 | } |