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.
This commit is contained in:
Tom Tromey
2013-05-10 17:01:00 +00:00
parent d3685d60d6
commit 21ff46861c
5 changed files with 67 additions and 0 deletions

View 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>

View 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. */

View File

@@ -24,6 +24,16 @@
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. */

View 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);

View File

@@ -38,6 +38,7 @@
#include "inf-child.h"
#include "inf-ttrace.h"
#include "common/filestuff.h"
@@ -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. */