diff options
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/fork-inferior.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gdb/nat/fork-inferior.c b/gdb/nat/fork-inferior.c index 6ff1197..ee1340b 100644 --- a/gdb/nat/fork-inferior.c +++ b/gdb/nat/fork-inferior.c @@ -25,6 +25,7 @@ #include "common-inferior.h" #include "common-gdbthread.h" #include "signals-state-save-restore.h" +#include "gdb_tilde_expand.h" #include <vector> extern char **environ; @@ -298,6 +299,8 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs, char **save_our_env; int i; int save_errno; + const char *inferior_cwd; + std::string expanded_inferior_cwd; /* If no exec file handed to us, get it from the exec-file command -- with a good, common error message if none is specified. */ @@ -339,6 +342,18 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs, the parent and child flushing the same data after the fork. */ gdb_flush_out_err (); + /* Check if the user wants to set a different working directory for + the inferior. */ + inferior_cwd = get_inferior_cwd (); + + if (inferior_cwd != NULL) + { + /* Expand before forking because between fork and exec, the child + process may only execute async-signal-safe operations. */ + expanded_inferior_cwd = gdb_tilde_expand (inferior_cwd); + inferior_cwd = expanded_inferior_cwd.c_str (); + } + /* If there's any initialization of the target layers that must happen to prepare to handle the child we're about fork, do it now... */ @@ -374,6 +389,14 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs, UIs. */ close_most_fds (); + /* Change to the requested working directory if the user + requested it. */ + if (inferior_cwd != NULL) + { + if (chdir (inferior_cwd) < 0) + trace_start_error_with_name (inferior_cwd); + } + if (debug_fork) sleep (debug_fork); |