2013-05-10 Joel Brobecker <brobecker@adacore.com>
authorTom Tromey <tromey@redhat.com>
Fri, 10 May 2013 17:01:00 +0000 (17:01 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 10 May 2013 17:01:00 +0000 (17:01 +0000)
    Tom Tromey  <tromey@redhat.com>

* common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec):
New functions.
* common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec):
Declare.
* darwin-nat.c (darwin_pre_ptrace): Use mark_fd_no_cloexec.
(darwin_ptrace_him): Use unmark_fd_no_cloexec.
* inf-ttrace.c (do_cleanup_pfds): Use unmark_fd_no_cloexec.
(inf_ttrace_prepare): Use mark_fd_no_cloexec.

gdb/ChangeLog
gdb/common/filestuff.c
gdb/common/filestuff.h
gdb/darwin-nat.c
gdb/inf-ttrace.c

index d43e2bf..84159e1 100644 (file)
@@ -1,3 +1,15 @@
+2013-05-10  Joel Brobecker  <brobecker@adacore.com>
+           Tom Tromey  <tromey@redhat.com>
+
+       * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec):
+       New functions.
+       * common/filestuff.c (mark_fd_no_cloexec, unmark_fd_no_cloexec):
+       Declare.
+       * darwin-nat.c (darwin_pre_ptrace): Use mark_fd_no_cloexec.
+       (darwin_ptrace_him): Use unmark_fd_no_cloexec.
+       * inf-ttrace.c (do_cleanup_pfds): Use unmark_fd_no_cloexec.
+       (inf_ttrace_prepare): Use mark_fd_no_cloexec.
+
 2013-05-10  Freddie Chopin  <freddie_chopin@op.pl>
            Tom Tromey  <tromey@redhat.com>
 
index 68f66ca..e7af3a5 100644 (file)
@@ -177,6 +177,33 @@ notice_open_fds (void)
   fdwalk (do_mark_open_fd, NULL);
 }
 
+/* See filestuff.h.  */
+
+void
+mark_fd_no_cloexec (int fd)
+{
+  do_mark_open_fd (NULL, fd);
+}
+
+/* See filestuff.h.  */
+
+void
+unmark_fd_no_cloexec (int fd)
+{
+  int i, val;
+
+  for (i = 0; VEC_iterate (int, open_fds, i, val); ++i)
+    {
+      if (fd == val)
+       {
+         VEC_unordered_remove (int, open_fds, i);
+         return;
+       }
+    }
+
+  gdb_assert_not_reached (_("fd not found in open_fds"));
+}
+
 /* Helper function for close_most_fds that closes the file descriptor
    if appropriate.  */
 
index 0db33f0..b162a0c 100644 (file)
 
 extern void notice_open_fds (void);
 
+/* Mark a file descriptor as inheritable across an exec.  */
+
+extern void mark_fd_no_cloexec (int fd);
+
+/* Mark a file descriptor as no longer being inheritable across an
+   exec.  This is only meaningful when FD was previously passed to
+   mark_fd_no_cloexec.  */
+
+extern void unmark_fd_no_cloexec (int fd);
+
 /* Close all open file descriptors other than those marked by
    'notice_open_fds', and stdin, stdout, and stderr.  Errors that
    occur while closing are ignored.  */
index acdbf36..a2da924 100644 (file)
@@ -66,6 +66,7 @@
 #include <mach/port.h>
 
 #include "darwin-nat.h"
+#include "common/filestuff.h"
 
 /* Quick overview.
    Darwin kernel is Mach + BSD derived kernel.  Note that they share the
@@ -1516,6 +1517,9 @@ darwin_pre_ptrace (void)
       ptrace_fds[1] = -1;
       error (_("unable to create a pipe: %s"), safe_strerror (errno));
     }
+
+  mark_fd_no_cloexec (ptrace_fds[0]);
+  mark_fd_no_cloexec (ptrace_fds[1]);
 }
 
 static void
@@ -1533,6 +1537,9 @@ darwin_ptrace_him (int pid)
   close (ptrace_fds[0]);
   close (ptrace_fds[1]);
 
+  unmark_fd_no_cloexec (ptrace_fds[0]);
+  unmark_fd_no_cloexec (ptrace_fds[1]);
+
   darwin_init_thread_list (inf);
 
   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
index 642e520..511a67c 100644 (file)
@@ -38,6 +38,7 @@
 
 #include "inf-child.h"
 #include "inf-ttrace.h"
+#include "common/filestuff.h"
 
 \f
 
@@ -558,6 +559,11 @@ do_cleanup_pfds (void *dummy)
   close (inf_ttrace_pfd1[1]);
   close (inf_ttrace_pfd2[0]);
   close (inf_ttrace_pfd2[1]);
+
+  unmark_fd_no_cloexec (inf_ttrace_pfd1[0]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd1[1]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd2[0]);
+  unmark_fd_no_cloexec (inf_ttrace_pfd2[1]);
 }
 
 static void
@@ -572,6 +578,11 @@ inf_ttrace_prepare (void)
       close (inf_ttrace_pfd2[0]);
       perror_with_name (("pipe"));
     }
+
+  mark_fd_no_cloexec (inf_ttrace_pfd1[0]);
+  mark_fd_no_cloexec (inf_ttrace_pfd1[1]);
+  mark_fd_no_cloexec (inf_ttrace_pfd2[0]);
+  mark_fd_no_cloexec (inf_ttrace_pfd2[1]);
 }
 
 /* Prepare to be traced.  */