22 #include "target/waitstatus.h" 24 #include "target/target.h" 35 #define SHELL_FILE "/bin/sh" 46 const char *shell_file);
56 return const_cast<char **
> (&
m_argv[0]);
73 const char *shell_file);
106 m_argv.push_back (exec_file);
108 for (
size_t cur_pos = 0; cur_pos < args_copy.size ();)
111 std::size_t pos = args_copy.find_first_not_of (
" \t\n", cur_pos);
113 if (pos != std::string::npos)
117 std::size_t next_sep = args_copy.find_first_of (
" \t\n", cur_pos);
119 if (next_sep == std::string::npos)
123 next_sep = args_copy.size ();
128 args_copy[next_sep++] =
'\0';
131 m_argv.push_back (&args_copy[cur_pos]);
147 size_t shell_file_len = strlen (shell_file);
153 if (shell_file_len < 3)
156 if (shell_file[shell_file_len - 3] ==
'c' 157 && shell_file[shell_file_len - 2] ==
's' 158 && shell_file[shell_file_len - 1] ==
'h')
168 const char *shell_file)
170 if (shell_file == NULL)
181 const char *shell_file)
192 shell_command =
"exec ";
196 if (exec_wrapper != NULL)
198 shell_command += exec_wrapper;
199 shell_command +=
' ';
208 const char *p = exec_file;
226 need_to_quote =
true;
230 need_to_quote =
false;
241 shell_command +=
'\'';
242 for (p = exec_file; *p !=
'\0'; ++p)
245 shell_command +=
"'\\''";
246 else if (*p ==
'!' && escape_bang)
247 shell_command +=
"\\!";
251 shell_command +=
'\'';
254 shell_command += exec_file;
256 shell_command +=
' ' + allargs;
262 m_argv.push_back (shell_file);
264 m_argv.push_back (shell_command.c_str ());
275 static const char *ret;
277 ret = getenv (
"SHELL");
288 char **env,
void (*traceme_fun) (),
289 void (*init_trace_fun) (
int),
void (*pre_trace_fun) (),
290 const char *shell_file_arg,
291 void (*exec_fun)(
const char *file,
char *
const *argv,
297 const char *shell_file;
298 const char *exec_file;
302 const char *inferior_cwd;
307 if (exec_file_arg == NULL)
310 exec_file = exec_file_arg;
317 shell_file = shell_file_arg;
320 if (shell_file == NULL)
329 execv_argv child_argv (exec_file, allargs, shell_file);
349 if (inferior_cwd != NULL)
354 inferior_cwd = expanded_inferior_cwd.c_str ();
360 if (pre_trace_fun != NULL)
374 #if !(defined(__UCLIBC__) && defined(HAS_NOMMU)) 375 if (pre_trace_fun || debug_fork)
394 if (inferior_cwd != NULL)
396 if (chdir (inferior_cwd) < 0)
433 char **argv = child_argv.
argv ();
435 if (exec_fun != NULL)
436 (*exec_fun) (argv[0], &argv[0], env);
438 execvp (argv[0], &argv[0]);
442 warning (
"Cannot exec %s", argv[0]);
444 for (i = 1; argv[i] != NULL; i++)
461 (*init_trace_fun) (pid);
473 struct target_waitstatus *last_waitstatus,
476 int pending_execs = ntraps;
477 int terminal_initted = 0;
499 enum gdb_signal resume_signal = GDB_SIGNAL_0;
502 struct target_waitstatus ws;
503 memset (&ws, 0,
sizeof (ws));
506 if (last_waitstatus != NULL)
507 *last_waitstatus = ws;
511 if (ws.kind == TARGET_WAITKIND_IGNORE)
517 case TARGET_WAITKIND_SPURIOUS:
518 case TARGET_WAITKIND_LOADED:
519 case TARGET_WAITKIND_FORKED:
520 case TARGET_WAITKIND_VFORKED:
521 case TARGET_WAITKIND_SYSCALL_ENTRY:
522 case TARGET_WAITKIND_SYSCALL_RETURN:
527 case TARGET_WAITKIND_SIGNALLED:
528 target_terminal::ours ();
530 error (
_(
"During startup program terminated with signal %s, %s."),
535 case TARGET_WAITKIND_EXITED:
536 target_terminal::ours ();
538 if (ws.value.integer)
539 error (
_(
"During startup program exited with code %d."),
542 error (
_(
"During startup program exited normally."));
545 case TARGET_WAITKIND_EXECD:
547 xfree (ws.value.execd_pathname);
548 resume_signal = GDB_SIGNAL_TRAP;
552 case TARGET_WAITKIND_STOPPED:
553 resume_signal = ws.value.sig;
558 if (resume_signal != GDB_SIGNAL_TRAP)
566 if (!terminal_initted)
575 target_terminal::init ();
578 target_terminal::inferior ();
580 terminal_initted = 1;
583 if (--pending_execs == 0)
602 warning (
"Could not trace the inferior process.\nError: ");
void vwarning(const char *string, va_list args)
ptid_t startup_inferior(pid_t pid, int ntraps, struct target_waitstatus *last_waitstatus, ptid_t *last_ptid)
void target_mourn_inferior(ptid_t ptid)
static void xfree(T *ptr)
int target_supports_multi_process(void)
static bool escape_bang_in_quoted_argument(const char *shell_file)
void warning(const char *fmt,...)
void * memset(T *s, int c, size_t n)=delete
void prefork_hook(const char *args)
void init_for_shell(const char *exec_file, const std::string &allargs, const char *shell_file)
execv_argv(const char *exec_file, const std::string &allargs, const char *shell_file)
static const char * get_startup_shell()
ptid_t pid_to_ptid(int pid)
DISABLE_COPY_AND_ASSIGN(execv_argv)
void target_continue(ptid_t ptid, enum gdb_signal signal)
void trace_start_error(const char *fmt,...)
void restore_original_signals_state(void)
void target_continue_no_signal(ptid_t ptid)
const char * gdb_signal_to_name(enum gdb_signal)
ptid_t target_wait(ptid_t ptid, struct target_waitstatus *status, int options)
void close_most_fds(void)
void switch_to_thread(ptid_t ptid)
void trace_start_error_with_name(const char *string)
void postfork_hook(pid_t pid)
const char * get_exec_wrapper()
pid_t fork_inferior(const char *exec_file_arg, const std::string &allargs, char **env, void(*traceme_fun)(), void(*init_trace_fun)(int), void(*pre_trace_fun)(), const char *shell_file_arg, void(*exec_fun)(const char *file, char *const *argv, char *const *env))
void init_for_no_shell(const char *exec_file, const std::string &allargs)
char * safe_strerror(int)
std::string gdb_tilde_expand(const char *dir)
void perror_with_name(const char *string)
const char * get_inferior_cwd()
const char * gdb_signal_to_string(enum gdb_signal)
void error(const char *fmt,...)
std::vector< const char * > m_argv
char * get_exec_file(int err)
void postfork_child_hook()