/* Base/prototype target for default child (native) targets.
- Copyright (C) 1988-2019 Free Software Foundation, Inc.
+ Copyright (C) 1988-2022 Free Software Foundation, Inc.
This file is part of GDB.
return inf_child_target_info;
}
-/* Helper function for child_wait and the derivatives of child_wait.
- HOSTSTATUS is the waitstatus from wait() or the equivalent; store our
- translation of that in OURSTATUS. */
-void
-store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus)
+/* See inf-child.h. */
+
+target_waitstatus
+host_status_to_waitstatus (int hoststatus)
{
if (WIFEXITED (hoststatus))
- {
- ourstatus->kind = TARGET_WAITKIND_EXITED;
- ourstatus->value.integer = WEXITSTATUS (hoststatus);
- }
+ return target_waitstatus ().set_exited (WEXITSTATUS (hoststatus));
else if (!WIFSTOPPED (hoststatus))
- {
- ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
- ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (hoststatus));
- }
+ return target_waitstatus ().set_signalled
+ (gdb_signal_from_host (WTERMSIG (hoststatus)));
else
- {
- ourstatus->kind = TARGET_WAITKIND_STOPPED;
- ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (hoststatus));
- }
+ return target_waitstatus ().set_stopped
+ (gdb_signal_from_host (WSTOPSIG (hoststatus)));
}
inf_child_target::~inf_child_target ()
gdb_assert (dynamic_cast<inf_child_target *> (target) != NULL);
target_preopen (from_tty);
- push_target (target);
+ current_inferior ()->push_target (target);
inf_child_explicitly_opened = 1;
if (from_tty)
- printf_filtered ("Done. Use the \"run\" command to start a process.\n");
+ gdb_printf ("Done. Use the \"run\" command to start a process.\n");
}
/* Implement the to_disconnect target_ops method. */
void
inf_child_target::maybe_unpush_target ()
{
- if (!inf_child_explicitly_opened && !have_inferiors ())
- unpush_target (this);
-}
-
-void
-inf_child_target::post_startup_inferior (ptid_t ptid)
-{
- /* This target doesn't require a meaningful "post startup inferior"
- operation by a debugger. */
+ if (!inf_child_explicitly_opened)
+ current_inferior ()->unpush_target (this);
}
bool
return true;
}
-char *
+const char *
inf_child_target::pid_to_exec_file (int pid)
{
/* This target doesn't support translation of a process ID to the
return -1;
}
- fd = gdb_open_cloexec (filename, nat_flags, nat_mode);
+ fd = gdb_open_cloexec (filename, nat_flags, nat_mode).release ();
if (fd == -1)
*target_errno = host_to_fileio_error (errno);
return agent_loaded_p ();
}
+void
+inf_child_target::follow_exec (inferior *follow_inf, ptid_t ptid,
+ const char *execd_pathname)
+{
+ inferior *orig_inf = current_inferior ();
+
+ process_stratum_target::follow_exec (follow_inf, ptid, execd_pathname);
+
+ if (orig_inf != follow_inf)
+ {
+ /* If the target was implicitly push in the original inferior, unpush
+ it. */
+ scoped_restore_current_thread restore_thread;
+ switch_to_inferior_no_thread (orig_inf);
+ maybe_unpush_target ();
+ }
+}
+
/* See inf-child.h. */
void