* configure.ac (AC_CHECK_FUNCS): Add check for setsid.
authorThiago Jung Bauermann <bauerman@br.ibm.com>
Wed, 12 Mar 2008 14:10:56 +0000 (14:10 +0000)
committerThiago Jung Bauermann <bauerman@br.ibm.com>
Wed, 12 Mar 2008 14:10:56 +0000 (14:10 +0000)
* config.in, configure: Regenerate.
* fork-child.c (fork_inferior): Call create_tty_session.
* inflow.c (new_tty): Set controlling terminal with TIOCSCTTY.
(create_tty_session): New function.
* terminal.h: Declare create_tty_session.

gdb/ChangeLog
gdb/config.in
gdb/configure
gdb/configure.ac
gdb/fork-child.c
gdb/inflow.c
gdb/terminal.h

index 5e3bce1d70d14f6bdc7be86e3cb59981cea9daa1..ed3a1bfeb6061fa3685f203d305dae9ae18ca27b 100644 (file)
@@ -1,3 +1,12 @@
+2008-03-12  Thiago Jung Bauermann  <bauerman.ibm.com>
+
+       * configure.ac (AC_CHECK_FUNCS): Add check for setsid.
+       * config.in, configure: Regenerate.
+       * fork-child.c (fork_inferior): Call create_tty_session.
+       * inflow.c (new_tty): Set controlling terminal with TIOCSCTTY.
+       (create_tty_session): New function.
+       * terminal.h: Declare create_tty_session.
+
 2008-03-12  Alan Modra  <amodra@bigpond.net.au>
 
        PR 5900
index b6aba7d28526a59686af8a5d629612ec045c4dc1..fd83c62402b1e3049a456a61a3e7ded6f6352bfc 100644 (file)
 /* Define to 1 if you have the `setpgrp' function. */
 #undef HAVE_SETPGRP
 
+/* Define to 1 if you have the `setsid' function. */
+#undef HAVE_SETSID
+
 /* Define to 1 if you have the <sgtty.h> header file. */
 #undef HAVE_SGTTY_H
 
index 5faaebaa24cf194853a53f22b26d9d26485b2c22..b4930c46d92f860353c1d6c8dc64f41ce3680e79 100755 (executable)
@@ -18503,7 +18503,8 @@ done
 
 
 
-for ac_func in setpgid setpgrp
+
+for ac_func in setpgid setpgrp setsid
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_func" >&5
index 2f1c33bcf60e7410289186fd111c29f078020a01..fcc35136a8e12741a6eda2dc761dba036770432f 100644 (file)
@@ -603,7 +603,7 @@ AC_CHECK_FUNCS(getuid getgid)
 AC_CHECK_FUNCS(poll)
 AC_CHECK_FUNCS(pread64)
 AC_CHECK_FUNCS(sbrk)
-AC_CHECK_FUNCS(setpgid setpgrp)
+AC_CHECK_FUNCS(setpgid setpgrp setsid)
 AC_CHECK_FUNCS(sigaction sigprocmask sigsetmask)
 AC_CHECK_FUNCS(socketpair)
 AC_CHECK_FUNCS(syscall)
index cbde5dbfac420c5c96612ac437f963e62b1f47ea..c8e76838dbb55104b1c94c3a3bfd920342132c0d 100644 (file)
@@ -303,10 +303,16 @@ fork_inferior (char *exec_file_arg, char *allargs, char **env,
       if (debug_fork)
        sleep (debug_fork);
 
-      /* Run inferior in a separate process group.  */
-      debug_setpgrp = gdb_setpgid ();
-      if (debug_setpgrp == -1)
-       perror ("setpgrp failed in child");
+      /* Create a new session for the inferior process, if necessary.
+         It will also place the inferior in a separate process group.  */
+      if (create_tty_session () <= 0)
+       {
+         /* No session was created, but we still want to run the inferior
+            in a separate process group.  */
+         debug_setpgrp = gdb_setpgid ();
+         if (debug_setpgrp == -1)
+           perror ("setpgrp failed in child");
+       }
 
       /* Ask the tty subsystem to switch to the one we specified
          earlier (or to share the current terminal, if none was
index f7bf7d12e3038a237c8f83204425cda508c31cc2..d003a98dcd198abfd100cdd18835a78c72c9663e 100644 (file)
@@ -557,6 +557,16 @@ new_tty (void)
       close (2);
       dup (tty);
     }
+
+#ifdef TIOCSCTTY
+  /* Make tty our new controlling terminal.  */
+  if (ioctl (tty, TIOCSCTTY, 0) == -1)
+    /* Mention GDB in warning because it will appear in the inferior's
+       terminal instead of GDB's.  */
+    warning ("GDB: Failed to set controlling terminal: %s",
+            safe_strerror (errno));
+#endif
+
   if (tty > 2)
     close (tty);
 #endif /* !go32 && !win32 */
@@ -683,6 +693,33 @@ clear_sigio_trap (void)
 #endif /* No SIGIO.  */
 \f
 
+/* 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.  */
+pid_t
+create_tty_session (void)
+{
+#ifdef HAVE_SETSID
+  pid_t ret;
+
+  if (!job_control || inferior_thisrun_terminal == 0)
+    return 0;
+
+  ret = setsid ();
+  if (ret == -1)
+    warning ("Failed to create new terminal session: setsid: %s",
+            safe_strerror (errno));
+
+  return ret;
+#else
+  return 0;
+#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.
index 911a23a355a3b1c33f48762b0e89d1d3c0551193..743be6c1dc0c2cd71cb0af2fbcca8ece112c84ee 100644 (file)
@@ -82,6 +82,8 @@ extern void new_tty (void);
    a given run of GDB.  In inflow.c.  */
 extern int job_control;
 
+extern int 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);
This page took 0.037039 seconds and 4 git commands to generate.