-struct target_ops *
-inf_child_target (void)
-{
- struct target_ops *t = XZALLOC (struct target_ops);
-
- t->to_shortname = "child";
- t->to_longname = "Unix child process";
- t->to_doc = "Unix child process (started by the \"run\" command).";
- t->to_open = inf_child_open;
- t->to_post_attach = inf_child_post_attach;
- t->to_fetch_registers = inf_child_fetch_inferior_registers;
- t->to_store_registers = inf_child_store_inferior_registers;
- t->to_prepare_to_store = inf_child_prepare_to_store;
- t->to_insert_breakpoint = memory_insert_breakpoint;
- t->to_remove_breakpoint = memory_remove_breakpoint;
- t->to_terminal_init = terminal_init_inferior;
- t->to_terminal_inferior = terminal_inferior;
- t->to_terminal_ours_for_output = terminal_ours_for_output;
- t->to_terminal_save_ours = terminal_save_ours;
- t->to_terminal_ours = terminal_ours;
- t->to_terminal_info = child_terminal_info;
- t->to_post_startup_inferior = inf_child_post_startup_inferior;
- t->to_insert_fork_catchpoint = inf_child_insert_fork_catchpoint;
- t->to_remove_fork_catchpoint = inf_child_remove_fork_catchpoint;
- t->to_insert_vfork_catchpoint = inf_child_insert_vfork_catchpoint;
- t->to_remove_vfork_catchpoint = inf_child_remove_vfork_catchpoint;
- t->to_follow_fork = inf_child_follow_fork;
- t->to_insert_exec_catchpoint = inf_child_insert_exec_catchpoint;
- t->to_remove_exec_catchpoint = inf_child_remove_exec_catchpoint;
- t->to_set_syscall_catchpoint = inf_child_set_syscall_catchpoint;
- t->to_can_run = inf_child_can_run;
- t->to_pid_to_exec_file = inf_child_pid_to_exec_file;
- t->to_stratum = process_stratum;
- t->to_has_all_memory = default_child_has_all_memory;
- t->to_has_memory = default_child_has_memory;
- t->to_has_stack = default_child_has_stack;
- t->to_has_registers = default_child_has_registers;
- t->to_has_execution = default_child_has_execution;
- t->to_magic = OPS_MAGIC;
- return t;
+/* Implementation of to_fileio_open. */
+
+int
+inf_child_target::fileio_open (struct inferior *inf, const char *filename,
+ int flags, int mode, int warn_if_slow,
+ int *target_errno)
+{
+ int nat_flags;
+ mode_t nat_mode;
+ int fd;
+
+ if (fileio_to_host_openflags (flags, &nat_flags) == -1
+ || fileio_to_host_mode (mode, &nat_mode) == -1)
+ {
+ *target_errno = FILEIO_EINVAL;
+ return -1;
+ }
+
+ fd = gdb_open_cloexec (filename, nat_flags, nat_mode);
+ if (fd == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return fd;
+}
+
+/* Implementation of to_fileio_pwrite. */
+
+int
+inf_child_target::fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
+ ULONGEST offset, int *target_errno)
+{
+ int ret;
+
+#ifdef HAVE_PWRITE
+ ret = pwrite (fd, write_buf, len, (long) offset);
+#else
+ ret = -1;
+#endif
+ /* If we have no pwrite or it failed for this file, use lseek/write. */
+ if (ret == -1)
+ {
+ ret = lseek (fd, (long) offset, SEEK_SET);
+ if (ret != -1)
+ ret = write (fd, write_buf, len);
+ }
+
+ if (ret == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return ret;
+}
+
+/* Implementation of to_fileio_pread. */
+
+int
+inf_child_target::fileio_pread (int fd, gdb_byte *read_buf, int len,
+ ULONGEST offset, int *target_errno)
+{
+ int ret;
+
+#ifdef HAVE_PREAD
+ ret = pread (fd, read_buf, len, (long) offset);
+#else
+ ret = -1;
+#endif
+ /* If we have no pread or it failed for this file, use lseek/read. */
+ if (ret == -1)
+ {
+ ret = lseek (fd, (long) offset, SEEK_SET);
+ if (ret != -1)
+ ret = read (fd, read_buf, len);
+ }
+
+ if (ret == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return ret;
+}
+
+/* Implementation of to_fileio_fstat. */
+
+int
+inf_child_target::fileio_fstat (int fd, struct stat *sb, int *target_errno)
+{
+ int ret;
+
+ ret = fstat (fd, sb);
+ if (ret == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return ret;
+}
+
+/* Implementation of to_fileio_close. */
+
+int
+inf_child_target::fileio_close (int fd, int *target_errno)
+{
+ int ret;
+
+ ret = ::close (fd);
+ if (ret == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return ret;
+}
+
+/* Implementation of to_fileio_unlink. */
+
+int
+inf_child_target::fileio_unlink (struct inferior *inf, const char *filename,
+ int *target_errno)
+{
+ int ret;
+
+ ret = unlink (filename);
+ if (ret == -1)
+ *target_errno = host_to_fileio_error (errno);
+
+ return ret;
+}
+
+/* Implementation of to_fileio_readlink. */
+
+gdb::optional<std::string>
+inf_child_target::fileio_readlink (struct inferior *inf, const char *filename,
+ int *target_errno)
+{
+ /* We support readlink only on systems that also provide a compile-time
+ maximum path length (PATH_MAX), at least for now. */
+#if defined (PATH_MAX)
+ char buf[PATH_MAX];
+ int len;
+
+ len = readlink (filename, buf, sizeof buf);
+ if (len < 0)
+ {
+ *target_errno = host_to_fileio_error (errno);
+ return {};
+ }
+
+ return std::string (buf, len);
+#else
+ *target_errno = FILEIO_ENOSYS;
+ return {};
+#endif
+}
+
+bool
+inf_child_target::use_agent (bool use)
+{
+ if (agent_loaded_p ())
+ {
+ ::use_agent = use;
+ return true;
+ }
+ else
+ return false;
+}
+
+bool
+inf_child_target::can_use_agent ()
+{
+ return agent_loaded_p ();
+}
+
+/* See inf-child.h. */
+
+void
+add_inf_child_target (inf_child_target *target)
+{
+ set_native_target (target);
+ add_target (inf_child_target_info, inf_child_open_target);