| Index: gdb/inf-ttrace.c | 
| diff --git a/gdb/inf-ttrace.c b/gdb/inf-ttrace.c | 
| index 2c620d58fe5ba75365ff00de48e2f9a5c70c5829..eb0adcb2298c3de25167375bb31561a8433ac7af 100644 | 
| --- a/gdb/inf-ttrace.c | 
| +++ b/gdb/inf-ttrace.c | 
| @@ -1,6 +1,6 @@ | 
| /* Low-level child interface to ttrace. | 
|  | 
| -   Copyright (C) 2004-2012 Free Software Foundation, Inc. | 
| +   Copyright (C) 2004-2013 Free Software Foundation, Inc. | 
|  | 
| This file is part of GDB. | 
|  | 
| @@ -31,13 +31,14 @@ | 
| #include "target.h" | 
|  | 
| #include "gdb_assert.h" | 
| -#include "gdb_string.h" | 
| +#include <string.h> | 
| #include <sys/mman.h> | 
| #include <sys/ttrace.h> | 
| #include <signal.h> | 
|  | 
| #include "inf-child.h" | 
| #include "inf-ttrace.h" | 
| +#include "common/filestuff.h" | 
|  | 
|  | 
|  | 
| @@ -408,7 +409,8 @@ inf_ttrace_stopped_by_watchpoint (void) | 
| static pid_t inf_ttrace_vfork_ppid = -1; | 
|  | 
| static int | 
| -inf_ttrace_follow_fork (struct target_ops *ops, int follow_child) | 
| +inf_ttrace_follow_fork (struct target_ops *ops, int follow_child, | 
| +			int detach_fork) | 
| { | 
| pid_t pid, fpid; | 
| lwpid_t lwpid, flwpid; | 
| @@ -457,7 +459,7 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child) | 
| inf->pspace = parent_inf->pspace; | 
| inf->aspace = parent_inf->aspace; | 
| copy_terminal_info (inf, parent_inf); | 
| -      detach_breakpoints (pid); | 
| +      detach_breakpoints (ptid_build (pid, lwpid, 0)); | 
|  | 
| target_terminal_ours (); | 
| fprintf_unfiltered (gdb_stdlog, | 
| @@ -467,7 +469,11 @@ inf_ttrace_follow_fork (struct target_ops *ops, int follow_child) | 
| else | 
| { | 
| inferior_ptid = ptid_build (pid, lwpid, 0); | 
| -      detach_breakpoints (fpid); | 
| +      /* Detach any remaining breakpoints in the child.  In the case | 
| +	 of fork events, we do not need to do this, because breakpoints | 
| +	 should have already been removed earlier.  */ | 
| +      if (tts.tts_event == TTEVT_VFORK) | 
| +	detach_breakpoints (ptid_build (fpid, flwpid, 0)); | 
|  | 
| target_terminal_ours (); | 
| fprintf_unfiltered (gdb_stdlog, | 
| @@ -554,6 +560,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 | 
| @@ -568,6 +579,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.  */ | 
| @@ -626,9 +642,6 @@ inf_ttrace_him (struct target_ops *ops, int pid) | 
|  | 
| push_target (ops); | 
|  | 
| -  /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will | 
| -     be 1 or 2 depending on whether we're starting without or with a | 
| -     shell.  */ | 
| startup_inferior (START_INFERIOR_TRAPS_EXPECTED); | 
|  | 
| /* On some targets, there must be some explicit actions taken after | 
| @@ -785,7 +798,7 @@ inf_ttrace_attach (struct target_ops *ops, char *args, int from_tty) | 
| } | 
|  | 
| static void | 
| -inf_ttrace_detach (struct target_ops *ops, char *args, int from_tty) | 
| +inf_ttrace_detach (struct target_ops *ops, const char *args, int from_tty) | 
| { | 
| pid_t pid = ptid_get_pid (inferior_ptid); | 
| int sig = 0; | 
|  |