#include "gdbthread.h"
#include "regcache.h"
#include "inf-child.h"
+#include "nat/fork-inferior.h"
#include "filestuff.h"
#if defined (NEW_PROC_API)
int, unsigned char *);
static void procfs_kill_inferior (struct target_ops *ops);
static void procfs_mourn_inferior (struct target_ops *ops);
-static void procfs_create_inferior (struct target_ops *, char *,
- char *, char **, int);
+static void procfs_create_inferior (struct target_ops *, const char *,
+ const std::string &, char **, int);
static ptid_t procfs_wait (struct target_ops *,
ptid_t, struct target_waitstatus *, int);
static enum target_xfer_status procfs_xfer_memory (gdb_byte *,
static int procfs_thread_alive (struct target_ops *ops, ptid_t);
static void procfs_update_thread_list (struct target_ops *ops);
-static char *procfs_pid_to_str (struct target_ops *, ptid_t);
+static const char *procfs_pid_to_str (struct target_ops *, ptid_t);
static int proc_find_memory_regions (struct target_ops *self,
find_memory_region_ftype, void *);
static procinfo *create_procinfo (int pid, int tid);
static void destroy_procinfo (procinfo * p);
static void do_destroy_procinfo_cleanup (void *);
-static void dead_procinfo (procinfo * p, char *msg, int killp);
+static void dead_procinfo (procinfo * p, const char *msg, int killp);
static int open_procinfo_files (procinfo * p, int which);
static void close_procinfo_files (procinfo * p);
static int sysset_t_size (procinfo *p);
#ifdef DYNAMIC_SYSCALLS
static void load_syscalls (procinfo *pi);
static void free_syscalls (procinfo *pi);
-static int find_syscall (procinfo *pi, char *name);
+static int find_syscall (procinfo *pi, const char *name);
#endif /* DYNAMIC_SYSCALLS */
static int iterate_over_mappings
destroys the data structure. */
static void
-dead_procinfo (procinfo *pi, char *msg, int kill_p)
+dead_procinfo (procinfo *pi, const char *msg, int kill_p)
{
char procfile[80];
If no match is found, return -1. */
static int
-find_syscall (procinfo *pi, char *name)
+find_syscall (procinfo *pi, const char *name)
{
int i;
void *ptr);
static void
-proc_warn (procinfo *pi, char *func, int line)
+proc_warn (procinfo *pi, const char *func, int line)
{
sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
print_sys_errmsg (errmsg, errno);
}
static void
-proc_error (procinfo *pi, char *func, int line)
+proc_error (procinfo *pi, const char *func, int line)
{
sprintf (errmsg, "procfs: %s line %d, %s", func, line, pi->pathname);
perror_with_name (errmsg);
if (from_tty)
{
- char *exec_file;
+ const char *exec_file;
exec_file = get_exec_file (0);
if (exec_file == NULL)
{
gdb_gregset_t *gregs;
procinfo *pi;
- int pid = ptid_get_pid (inferior_ptid);
- int tid = ptid_get_lwp (inferior_ptid);
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ ptid_t ptid = regcache_get_ptid (regcache);
+ int pid = ptid_get_pid (ptid);
+ int tid = ptid_get_lwp (ptid);
+ struct gdbarch *gdbarch = regcache->arch ();
pi = find_procinfo_or_die (pid, tid);
if (pi == NULL)
error (_("procfs: fetch_registers failed to find procinfo for %s"),
- target_pid_to_str (inferior_ptid));
+ target_pid_to_str (ptid));
gregs = proc_get_gregs (pi);
if (gregs == NULL)
{
gdb_gregset_t *gregs;
procinfo *pi;
- int pid = ptid_get_pid (inferior_ptid);
- int tid = ptid_get_lwp (inferior_ptid);
- struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ ptid_t ptid = regcache_get_ptid (regcache);
+ int pid = ptid_get_pid (ptid);
+ int tid = ptid_get_lwp (ptid);
+ struct gdbarch *gdbarch = regcache->arch ();
pi = find_procinfo_or_die (pid, tid);
if (pi == NULL)
error (_("procfs: store_registers: failed to find procinfo for %s"),
- target_pid_to_str (inferior_ptid));
+ target_pid_to_str (ptid));
gregs = proc_get_gregs (pi);
if (gregs == NULL)
static int
insert_dbx_link_bpt_in_file (int fd, CORE_ADDR ignored)
{
- bfd *abfd;
long storage_needed;
CORE_ADDR sym_addr;
- abfd = gdb_bfd_fdopenr ("unamed", 0, fd);
+ gdb_bfd_ref_ptr abfd (gdb_bfd_fdopenr ("unamed", 0, fd));
if (abfd == NULL)
{
warning (_("Failed to create a bfd: %s."), bfd_errmsg (bfd_get_error ()));
return 0;
}
- if (!bfd_check_format (abfd, bfd_object))
+ if (!bfd_check_format (abfd.get (), bfd_object))
{
/* Not the correct format, so we can not possibly find the dbx_link
symbol in it. */
- gdb_bfd_unref (abfd);
return 0;
}
- sym_addr = dbx_link_addr (abfd);
+ sym_addr = dbx_link_addr (abfd.get ());
if (sym_addr != 0)
{
struct breakpoint *dbx_link_bpt;
if (dbx_link_bpt == NULL)
{
warning (_("Failed to insert dbx_link breakpoint."));
- gdb_bfd_unref (abfd);
return 0;
}
- gdb_bfd_unref (abfd);
return 1;
}
- gdb_bfd_unref (abfd);
return 0;
}
thread_change_ptid (pid_to_ptid (pid),
ptid_build (pid, lwpid, 0));
- startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
+ gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
#ifdef SYS_syssgi
/* On mips-irix, we need to stop the inferior early enough during
inf-ptrace? */
static void
-procfs_create_inferior (struct target_ops *ops, char *exec_file,
- char *allargs, char **env, int from_tty)
+procfs_create_inferior (struct target_ops *ops, const char *exec_file,
+ const std::string &allargs, char **env, int from_tty)
{
char *shell_file = getenv ("SHELL");
char *tryname;
if the caller is the superuser; failing to use it loses if
there are ACLs or some such. */
- char *p;
- char *p1;
+ const char *p;
+ const char *p1;
/* FIXME-maybe: might want "set path" command so user can change what
path is used from within GDB. */
- char *path = getenv ("PATH");
+ const char *path = getenv ("PATH");
int len;
struct stat statbuf;
pid = fork_inferior (exec_file, allargs, env, procfs_set_exec_trap,
NULL, NULL, shell_file, NULL);
+ /* We have something that executes now. We'll be running through
+ the shell at this point (if startup-with-shell is true), but the
+ pid shouldn't change. */
+ add_thread_silent (pid_to_ptid (pid));
+
procfs_init_inferior (ops, pid);
}
/* Convert PTID to a string. Returns the string in a static
buffer. */
-static char *
+static const char *
procfs_pid_to_str (struct target_ops *ops, ptid_t ptid)
{
static char buf[80];
struct cleanup *old_chain;
procinfo *process = NULL;
procinfo *thread = NULL;
- char **argv = NULL;
char *tmp = NULL;
int pid = 0;
int tid = 0;
}
old_chain = make_cleanup (null_cleanup, 0);
- if (args)
- {
- argv = gdb_buildargv (args);
- make_cleanup_freeargv (argv);
- }
- while (argv != NULL && *argv != NULL)
+ gdb_argv built_argv (args);
+ for (char *arg : built_argv)
{
- if (isdigit (argv[0][0]))
+ if (isdigit (arg[0]))
{
- pid = strtoul (argv[0], &tmp, 10);
+ pid = strtoul (arg, &tmp, 10);
if (*tmp == '/')
tid = strtoul (++tmp, NULL, 10);
}
- else if (argv[0][0] == '/')
+ else if (arg[0] == '/')
{
- tid = strtoul (argv[0] + 1, NULL, 10);
+ tid = strtoul (arg + 1, NULL, 10);
}
- argv++;
}
if (pid == 0)
pid = ptid_get_pid (inferior_ptid);
proc_trace_syscalls (args, from_tty, PR_SYSEXIT, FLAG_RESET);
}
-
-/* Provide a prototype to silence -Wmissing-prototypes. */
-extern void _initialize_procfs (void);
-
void
_initialize_procfs (void)
{
gdb_gregset_t gregs;
gdb_fpregset_t fpregs;
unsigned long merged_pid;
- struct cleanup *old_chain;
merged_pid = ptid_get_lwp (ptid) << 16 | ptid_get_pid (ptid);
once it is implemented in this platform:
gdbarch_iterate_over_regset_sections(). */
- old_chain = save_inferior_ptid ();
+ scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid);
inferior_ptid = ptid;
target_fetch_registers (regcache, -1);
&fpregs,
sizeof (fpregs));
- do_cleanups (old_chain);
-
return note_data;
}