-/* Low level Unix child interface, for GDB when running under Unix.
+/* Base/prototype target for default child (native) targets.
- Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2004-2020 Free Software Foundation, Inc.
This file is part of GDB.
#ifndef INF_CHILD_H
#define INF_CHILD_H
-/* Create a prototype child target. The client can override it with
- local methods. */
+#include "target.h"
+#include "process-stratum-target.h"
-extern struct target_ops *inf_child_target (void);
+/* A prototype child target. The client can override it with local
+ methods. */
+
+class inf_child_target
+ : public memory_breakpoint_target<process_stratum_target>
+{
+public:
+ inf_child_target () = default;
+ ~inf_child_target () override = 0;
+
+ const target_info &info () const override;
+
+ void close () override;
+
+ void disconnect (const char *, int) override;
+
+ void fetch_registers (struct regcache *, int) override = 0;
+ void store_registers (struct regcache *, int) override = 0;
+
+ void prepare_to_store (struct regcache *) override;
+
+ bool supports_terminal_ours () override;
+ void terminal_init () override;
+ void terminal_inferior () override;
+ void terminal_save_inferior () override;
+ void terminal_ours_for_output () override;
+ void terminal_ours () override;
+ void terminal_info (const char *, int) override;
+
+ void interrupt () override;
+ void pass_ctrlc () override;
+
+ void post_startup_inferior (ptid_t) override;
+
+ void mourn_inferior () override;
+
+ bool can_run () override;
+
+ bool can_create_inferior () override;
+ void create_inferior (const char *, const std::string &,
+ char **, int) override = 0;
+
+ bool can_attach () override;
+ void attach (const char *, int) override = 0;
+
+ void post_attach (int) override;
+
+ char *pid_to_exec_file (int pid) override;
+
+ int fileio_open (struct inferior *inf, const char *filename,
+ int flags, int mode, int warn_if_slow,
+ int *target_errno) override;
+ int fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
+ ULONGEST offset, int *target_errno) override;
+ int fileio_pread (int fd, gdb_byte *read_buf, int len,
+ ULONGEST offset, int *target_errno) override;
+ int fileio_fstat (int fd, struct stat *sb, int *target_errno) override;
+ int fileio_close (int fd, int *target_errno) override;
+ int fileio_unlink (struct inferior *inf,
+ const char *filename,
+ int *target_errno) override;
+ gdb::optional<std::string> fileio_readlink (struct inferior *inf,
+ const char *filename,
+ int *target_errno) override;
+ bool use_agent (bool use) override;
+
+ bool can_use_agent () override;
+
+protected:
+ /* Unpush the target if it wasn't explicitly open with "target native"
+ and there are no live inferiors left. Note: if calling this as a
+ result of a mourn or detach, the current inferior shall already
+ have its PID cleared, so it isn't counted as live. That's usually
+ done by calling either generic_mourn_inferior or
+ detach_inferior. */
+ void maybe_unpush_target ();
+};
+
+/* Functions for helping to write a native target. */
+
+/* This is for native targets which use a unix/POSIX-style waitstatus. */
+extern void store_waitstatus (struct target_waitstatus *, int);
+
+/* Register TARGET as native target and set it up to respond to the
+ "target native" command. */
+extern void add_inf_child_target (inf_child_target *target);
+
+/* target_open_ftype callback for inf-child targets. Used by targets
+ that want to register an alternative target_info object. Most
+ targets use add_inf_child_target instead. */
+extern void inf_child_open_target (const char *arg, int from_tty);
#endif