* i387-tdep.c (print_i387_value): Cast &value to (char *) in
[deliverable/binutils-gdb.git] / gdb / inftarg.c
index 9439a9f7cf66112626d348560a3220251f33906f..82a15cdf24308caab3309b12563405a8000366af 100644 (file)
@@ -1,28 +1,28 @@
 /* Target-vector operations for controlling Unix child processes, for GDB.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996
-   Free Software Foundation, Inc.
+   Copyright 1990-1996, 1998, 1999 Free Software Foundation, Inc.
    Contributed by Cygnus Support.
 
-## Contains temporary hacks..
+   ## Contains temporary hacks..
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
-#include "frame.h"  /* required by inferior.h */
+#include "frame.h"             /* required by inferior.h */
 #include "inferior.h"
 #include "target.h"
 #include "gdbcore.h"
@@ -32,25 +32,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <sys/types.h>
 #include <fcntl.h>
 
-#ifdef HAVE_WAIT_H
-# include <wait.h>
-#else
-# ifdef HAVE_SYS_WAIT_H
-#  include <sys/wait.h>
-# endif
-#endif
-
-/* "wait.h" fills in the gaps left by <wait.h> */
-#include "wait.h"
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
+#include "gdb_wait.h"
 
 extern struct symtab_and_line *
-child_enable_exception_callback PARAMS ((enum exception_event_kind, int));
+  child_enable_exception_callback PARAMS ((enum exception_event_kind, int));
 
 extern struct exception_event_record *
-child_get_current_exception_event PARAMS ((void));
+  child_get_current_exception_event PARAMS ((void));
+
+extern void _initialize_inftarg PARAMS ((void));
 
 static void
 child_prepare_to_store PARAMS ((void));
@@ -82,8 +72,7 @@ static void
 child_attach_to_process PARAMS ((char *, int, int));
 
 #if !defined(CHILD_POST_ATTACH)
-static void
-child_post_attach PARAMS ((int));
+extern void child_post_attach PARAMS ((int));
 #endif
 
 static void
@@ -95,10 +84,10 @@ child_require_detach PARAMS ((int, char *, int));
 static void
 ptrace_me PARAMS ((void));
 
-static void 
+static void
 ptrace_him PARAMS ((int));
 
-static void 
+static void
 child_create_inferior PARAMS ((char *, char *, char **));
 
 static void
@@ -114,10 +103,11 @@ child_stop PARAMS ((void));
 int child_thread_alive PARAMS ((int));
 #endif
 
+static void init_child_ops PARAMS ((void));
+
 extern char **environ;
 
-/* Forward declaration */
-extern struct target_ops child_ops;
+struct target_ops child_ops;
 
 int child_suppress_run = 0;    /* Non-zero if inftarg should pretend not to
                                   be a runnable target.  Used by targets
@@ -126,14 +116,14 @@ int child_suppress_run = 0;       /* Non-zero if inftarg should pretend not to
 
 #ifndef CHILD_WAIT
 
-/*##*/
+/*## */
 /* Enable HACK for ttrace work.  In
  * infttrace.c/require_notification_of_events,
  * this is set to 0 so that the loop in child_wait
  * won't loop.
  */
 int not_same_real_pid = 1;
-/*##*/
+/*## */
 
 
 /* Wait for child to do something.  Return pid of child, or -1 in case
@@ -146,102 +136,104 @@ child_wait (pid, ourstatus)
 {
   int save_errno;
   int status;
-  char *  execd_pathname;
-  int  exit_status;
-  int  related_pid;
-  int  syscall_id;
-  enum target_waitkind  kind;
+  char *execd_pathname = NULL;
+  int exit_status;
+  int related_pid;
+  int syscall_id;
+  enum target_waitkind kind;
 
-  do {
-    set_sigint_trap(); /* Causes SIGINT to be passed on to the
-                          attached process. */
-    set_sigio_trap ();
+  do
+    {
+      set_sigint_trap ();      /* Causes SIGINT to be passed on to the
+                                  attached process. */
+      set_sigio_trap ();
 
-    pid = proc_wait (inferior_pid, &status);
+      pid = ptrace_wait (inferior_pid, &status);
 
-    save_errno = errno;
+      save_errno = errno;
 
-    clear_sigio_trap ();
+      clear_sigio_trap ();
 
-    clear_sigint_trap();
+      clear_sigint_trap ();
 
-    if (pid == -1)
-      {
-       if (save_errno == EINTR)
-         continue;
+      if (pid == -1)
+       {
+         if (save_errno == EINTR)
+           continue;
 
-       fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
-                safe_strerror (save_errno));
+         fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
+                             safe_strerror (save_errno));
 
-       /* Claim it exited with unknown signal.  */
-       ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
-       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
-        return -1;
-      }
+         /* Claim it exited with unknown signal.  */
+         ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
+         ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
+         return -1;
+       }
 
-    /* Did it exit?
-     */
-    if (target_has_exited (pid, status, &exit_status))
-      {
-        /* ??rehrauer: For now, ignore this. */
-        continue;
-      }
-
-    if (!target_thread_alive (pid))
-      {
-        ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
-        return pid;
-      }
-      
-    if (target_has_forked (pid, &related_pid)
-        && (pid == inferior_pid) || (related_pid == inferior_pid))
-      {
-        ourstatus->kind = TARGET_WAITKIND_FORKED;
-        ourstatus->value.related_pid = related_pid;
-        return pid;
-      }
-
-    if (target_has_vforked (pid, &related_pid)
-        && (pid == inferior_pid) || (related_pid == inferior_pid))
-      {
-        ourstatus->kind = TARGET_WAITKIND_VFORKED;
-        ourstatus->value.related_pid = related_pid;
-        return pid;
-      }
-
-    if (target_has_execd (pid, &execd_pathname))
-      {
-        /* Are we ignoring initial exec events?  (This is likely because
-           we're in the process of starting up the inferior, and another
-           (older) mechanism handles those.)  If so, we'll report this
-           as a regular stop, not an exec.
-           */
-        if (inferior_ignoring_startup_exec_events)
-          {
-            inferior_ignoring_startup_exec_events--;
-          }
-        else
-          {
-            ourstatus->kind = TARGET_WAITKIND_EXECD;
-            ourstatus->value.execd_pathname = execd_pathname;
-            return pid;
-          }
-      }
-
-    /* All we must do with these is communicate their occurrence
-       to wait_for_inferior...
+      /* Did it exit?
        */
-    if (target_has_syscall_event (pid, &kind, &syscall_id))
-      {
-        ourstatus->kind = kind;
-        ourstatus->value.syscall_id = syscall_id;
-        return pid;
-      }
-
-/*##  } while (pid != inferior_pid); ##*/ /* Some other child died or stopped */
+      if (target_has_exited (pid, status, &exit_status))
+       {
+         /* ??rehrauer: For now, ignore this. */
+         continue;
+       }
+
+      if (!target_thread_alive (pid))
+       {
+         ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
+         return pid;
+       }
+
+      if (target_has_forked (pid, &related_pid)
+         && ((pid == inferior_pid) || (related_pid == inferior_pid)))
+       {
+         ourstatus->kind = TARGET_WAITKIND_FORKED;
+         ourstatus->value.related_pid = related_pid;
+         return pid;
+       }
+
+      if (target_has_vforked (pid, &related_pid)
+         && ((pid == inferior_pid) || (related_pid == inferior_pid)))
+       {
+         ourstatus->kind = TARGET_WAITKIND_VFORKED;
+         ourstatus->value.related_pid = related_pid;
+         return pid;
+       }
+
+      if (target_has_execd (pid, &execd_pathname))
+       {
+         /* Are we ignoring initial exec events?  (This is likely because
+            we're in the process of starting up the inferior, and another
+            (older) mechanism handles those.)  If so, we'll report this
+            as a regular stop, not an exec.
+          */
+         if (inferior_ignoring_startup_exec_events)
+           {
+             inferior_ignoring_startup_exec_events--;
+           }
+         else
+           {
+             ourstatus->kind = TARGET_WAITKIND_EXECD;
+             ourstatus->value.execd_pathname = execd_pathname;
+             return pid;
+           }
+       }
+
+      /* All we must do with these is communicate their occurrence
+         to wait_for_inferior...
+       */
+      if (target_has_syscall_event (pid, &kind, &syscall_id))
+       {
+         ourstatus->kind = kind;
+         ourstatus->value.syscall_id = syscall_id;
+         return pid;
+       }
+
+      /*##  } while (pid != inferior_pid); ## *//* Some other child died or stopped */
 /* hack for thread testing */
-      } while( (pid != inferior_pid) && not_same_real_pid );
-/*##*/
+    }
+  while ((pid != inferior_pid) && not_same_real_pid);
+/*## */
 
   store_waitstatus (ourstatus, status);
   return pid;
@@ -251,15 +243,15 @@ child_wait (pid, ourstatus)
 #if !defined(CHILD_POST_WAIT)
 void
 child_post_wait (pid, wait_status)
-  int  pid;
-  int  wait_status;
+     int pid;
+     int wait_status;
 {
   /* This version of Unix doesn't require a meaningful "post wait"
      operation.
-     */
+   */
 }
 #endif
+
 
 #ifndef CHILD_THREAD_ALIVE
 
@@ -279,9 +271,9 @@ child_thread_alive (pid)
 
 static void
 child_attach_to_process (args, from_tty, after_fork)
-  char *  args;
-  int  from_tty;
-  int  after_fork;
+     char *args;
+     int from_tty;
+     int after_fork;
 {
   if (!args)
     error_no_arg ("process-id to attach");
@@ -292,8 +284,7 @@ child_attach_to_process (args, from_tty, after_fork)
   {
     char *exec_file;
     int pid;
-    struct target_waitstatus *wstatus;
-    char *  dummy;
+    char *dummy;
 
     dummy = args;
     pid = strtol (args, &dummy, 0);
@@ -301,7 +292,7 @@ child_attach_to_process (args, from_tty, after_fork)
     if ((pid == 0) && (args == dummy))
       error ("Illegal process-id: %s\n", args);
 
-    if (pid == getpid())               /* Trying to masturbate? */
+    if (pid == getpid ())      /* Trying to masturbate? */
       error ("I refuse to debug myself!");
 
     if (from_tty)
@@ -309,13 +300,13 @@ child_attach_to_process (args, from_tty, after_fork)
        exec_file = (char *) get_exec_file (0);
 
        if (after_fork)
-         printf_unfiltered ("Attaching after fork to %s\n", 
-                 target_pid_to_str (pid));
+         printf_unfiltered ("Attaching after fork to %s\n",
+                            target_pid_to_str (pid));
        else if (exec_file)
          printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
-                  target_pid_to_str (pid));
-        else
-          printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
+                            target_pid_to_str (pid));
+       else
+         printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid));
 
        gdb_flush (gdb_stdout);
       }
@@ -328,7 +319,7 @@ child_attach_to_process (args, from_tty, after_fork)
     inferior_pid = pid;
     push_target (&child_ops);
   }
-#endif  /* ATTACH_DETACH */
+#endif /* ATTACH_DETACH */
 }
 
 
@@ -343,31 +334,29 @@ child_attach (args, from_tty)
 }
 
 #if !defined(CHILD_POST_ATTACH)
-static void
+void
 child_post_attach (pid)
-  int  pid;
+     int pid;
 {
   /* This version of Unix doesn't require a meaningful "post attach"
-     operation by a debugger.
-     */
+     operation by a debugger.  */
 }
 #endif
 
-
 static void
 child_require_attach (args, from_tty)
      char *args;
      int from_tty;
 {
   child_attach_to_process (args, from_tty, 1);
-} 
+}
 
 static void
 child_detach_from_process (pid, args, from_tty, after_fork)
-  int  pid;
-  char *  args;
-  int  from_tty;
-  int  after_fork;
+     int pid;
+     char *args;
+     int from_tty;
+     int after_fork;
 {
 #ifdef ATTACH_DETACH
   {
@@ -378,12 +367,12 @@ child_detach_from_process (pid, args, from_tty, after_fork)
        char *exec_file = get_exec_file (0);
        if (exec_file == 0)
          exec_file = "";
-        if (after_fork)
-          printf_unfiltered ("Detaching after fork from %s\n",
-                             target_pid_to_str (pid));
-        else
+       if (after_fork)
+         printf_unfiltered ("Detaching after fork from %s\n",
+                            target_pid_to_str (pid));
+       else
          printf_unfiltered ("Detaching from program: %s, %s\n", exec_file,
-                            target_pid_to_str (pid));
+                            target_pid_to_str (pid));
        gdb_flush (gdb_stdout);
       }
     if (args)
@@ -419,9 +408,9 @@ child_detach (args, from_tty)
 
 static void
 child_require_detach (pid, args, from_tty)
-  int  pid;
-  char *  args;
-  int  from_tty;
+     int pid;
+     char *args;
+     int from_tty;
 {
   child_detach_from_process (pid, args, from_tty, 1);
 }
@@ -448,7 +437,7 @@ child_files_info (ignore)
      struct target_ops *ignore;
 {
   printf_unfiltered ("\tUsing the running image of %s %s.\n",
-         attach_flag? "attached": "child", target_pid_to_str (inferior_pid));
+      attach_flag ? "attached" : "child", target_pid_to_str (inferior_pid));
 }
 
 /* ARGSUSED */
@@ -473,7 +462,7 @@ ptrace_me ()
 /* Stub function which causes the GDB that runs it, to start ptrace-ing
    the child process.  */
 
-static void 
+static void
 ptrace_him (pid)
      int pid;
 {
@@ -483,7 +472,7 @@ ptrace_him (pid)
      between the parent and child processes after the debugger
      forks, and before the child execs the debuggee program.  This
      call basically gives permission for the child to exec.
-     */
+   */
 
   target_acknowledge_created_inferior (pid);
 
@@ -495,7 +484,7 @@ ptrace_him (pid)
 
   /* On some targets, there must be some explicit actions taken after
      the inferior has been started up.
-     */
+   */
   target_post_startup_inferior (pid);
 }
 
@@ -510,70 +499,10 @@ child_create_inferior (exec_file, allargs, env)
      char *allargs;
      char **env;
 {
-
 #ifdef HPUXHPPA
-  char *tryname;
-  char *shell_file;
-  char *p;
-  char *p1;
-  char *path = getenv ("PATH");
-  int len;
-  struct stat statbuf;
-
-  /* On HP-UX, we have a possible bad interaction between
-   * the start-up-with-shell code and our catch-fork/catch-exec
-   * logic. To avoid the bad interaction, we start up with the
-   * C shell ("csh") and pass it the "-f" flag (fast start-up,
-   * don't run .cshrc code).
-   * See further comments in inferior.h toward the bottom
-   * (STARTUP_WITH_SHELL flag) and in fork-child.c
-   */
-
-  /* Rather than passing in a hard-wired path like "/bin/csh",
-   * we look down the PATH to find csh. I took this code from
-   * procfs.c, which is the file in the Sun-specific part of GDB
-   * analogous to inftarg.c. See procfs.c for more detailed 
-   * comments. - RT
-   */
-  shell_file = "csh";
-  if (path == NULL)
-    path = "/bin:/usr/bin";
-  tryname = alloca (strlen (path) + strlen (shell_file) + 2);
-  for (p = path; p != NULL; p = p1 ? p1 + 1: NULL)
-    {
-    p1 = strchr (p, ':');
-    if (p1 != NULL)
-      len = p1 - p;
-    else
-      len = strlen (p);
-    strncpy (tryname, p, len);
-    tryname[len] = '\0';
-    strcat (tryname, "/");
-    strcat (tryname, shell_file);
-    if (access (tryname, X_OK) < 0)
-      continue;
-    if (stat (tryname, &statbuf) < 0)
-      continue;
-    if (!S_ISREG (statbuf.st_mode))
-      /* We certainly need to reject directories.  I'm not quite
-         as sure about FIFOs, sockets, etc., but I kind of doubt
-         that people want to exec() these things.  */
-      continue;
-      break;
-    }
-  if (p == NULL)
-    /* Not found. I replaced the error() which existed in procfs.c
-     * with simply passing in NULL and hoping fork_inferior() 
-     * can deal with it. - RT
-     */ 
-    /* error ("Can't find shell %s in PATH", shell_file); */
-    shell_file = NULL;
-  else
-    shell_file = tryname;
-
-  fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, shell_file);
+  fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
 #else
- fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
 fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
 #endif
   /* We are at the first instruction we care about.  */
   /* Pedal to the metal... */
@@ -583,36 +512,36 @@ child_create_inferior (exec_file, allargs, env)
 #if !defined(CHILD_POST_STARTUP_INFERIOR)
 void
 child_post_startup_inferior (pid)
-  int  pid;
+     int pid;
 {
   /* This version of Unix doesn't require a meaningful "post startup inferior"
      operation by a debugger.
-     */
+   */
 }
 #endif
 
 #if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
 void
 child_acknowledge_created_inferior (pid)
-  int  pid;
+     int pid;
 {
   /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
      operation by a debugger.
-     */
+   */
 }
 #endif
 
 
 void
 child_clone_and_follow_inferior (child_pid, followed_child)
-  int  child_pid;
-  int  *followed_child;
+     int child_pid;
+     int *followed_child;
 {
   clone_and_follow_inferior (child_pid, followed_child);
 
   /* Don't resume CHILD_PID; it's stopped where it ought to be, until
      the decision gets made elsewhere how to continue it.
-     */
+   */
 }
 
 
@@ -622,63 +551,57 @@ child_post_follow_inferior_by_clone ()
 {
   /* This version of Unix doesn't require a meaningful "post follow inferior"
      operation by a clone debugger.
-     */
+   */
 }
 #endif
 
-
 #if !defined(CHILD_INSERT_FORK_CATCHPOINT)
 int
 child_insert_fork_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of fork events.
-     */
+  /* This version of Unix doesn't support notification of fork events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_REMOVE_FORK_CATCHPOINT)
 int
 child_remove_fork_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of fork events.
-     */
+  /* This version of Unix doesn't support notification of fork events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_INSERT_VFORK_CATCHPOINT)
 int
 child_insert_vfork_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of vfork events.
-     */
+  /* This version of Unix doesn't support notification of vfork events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_REMOVE_VFORK_CATCHPOINT)
 int
 child_remove_vfork_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of vfork events.
-     */
+  /* This version of Unix doesn't support notification of vfork events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_HAS_FORKED)
 int
 child_has_forked (pid, child_pid)
-  int  pid;
-  int *  child_pid;
+     int pid;
+     int *child_pid;
 {
-  /* This version of Unix doesn't support notification of fork events.
-     */
+  /* This version of Unix doesn't support notification of fork events.  */
   return 0;
 }
 #endif
@@ -687,11 +610,11 @@ child_has_forked (pid, child_pid)
 #if !defined(CHILD_HAS_VFORKED)
 int
 child_has_vforked (pid, child_pid)
-  int  pid;
-  int *  child_pid;
+     int pid;
+     int *child_pid;
 {
   /* This version of Unix doesn't support notification of vfork events.
-     */
+   */
   return 0;
 }
 #endif
@@ -704,7 +627,7 @@ child_can_follow_vfork_prior_to_exec ()
   /* This version of Unix doesn't support notification of vfork events.
      However, if it did, it probably wouldn't allow vforks to be followed
      before the following exec.
-     */
+   */
   return 0;
 }
 #endif
@@ -713,47 +636,45 @@ child_can_follow_vfork_prior_to_exec ()
 #if !defined(CHILD_POST_FOLLOW_VFORK)
 void
 child_post_follow_vfork (parent_pid, followed_parent, child_pid, followed_child)
-  int  parent_pid;
-  int  followed_parent;
-  int  child_pid;
-  int  followed_child;
+     int parent_pid;
+     int followed_parent;
+     int child_pid;
+     int followed_child;
 {
   /* This version of Unix doesn't require a meaningful "post follow vfork"
      operation by a clone debugger.
-     */
+   */
 }
 #endif
 
 #if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
 int
 child_insert_exec_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of exec events.
-     */
+  /* This version of Unix doesn't support notification of exec events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_REMOVE_EXEC_CATCHPOINT)
 int
 child_remove_exec_catchpoint (pid)
-  int  pid;
+     int pid;
 {
-  /* This version of Unix doesn't support notification of exec events.
-     */
+  /* This version of Unix doesn't support notification of exec events.  */
+  return 0;
 }
 #endif
 
-
 #if !defined(CHILD_HAS_EXECD)
 int
 child_has_execd (pid, execd_pathname)
-  int  pid;
-  char **  execd_pathname;
+     int pid;
+     char **execd_pathname;
 {
   /* This version of Unix doesn't support notification of exec events.
-     */
+   */
   return 0;
 }
 #endif
@@ -764,7 +685,7 @@ int
 child_reported_exec_events_per_exec_call ()
 {
   /* This version of Unix doesn't support notification of exec events.
-     */
+   */
   return 1;
 }
 #endif
@@ -773,12 +694,12 @@ child_reported_exec_events_per_exec_call ()
 #if !defined(CHILD_HAS_SYSCALL_EVENT)
 int
 child_has_syscall_event (pid, kind, syscall_id)
-  int  pid;
-  enum target_waitkind *  kind;
-  int *  syscall_id;
+     int pid;
+     enum target_waitkind *kind;
+     int *syscall_id;
 {
   /* This version of Unix doesn't support notification of syscall events.
-     */
+   */
   return 0;
 }
 #endif
@@ -787,9 +708,9 @@ child_has_syscall_event (pid, kind, syscall_id)
 #if !defined(CHILD_HAS_EXITED)
 int
 child_has_exited (pid, wait_status, exit_status)
-  int  pid;
-  int  wait_status;
-  int *  exit_status;
+     int pid;
+     int wait_status;
+     int *exit_status;
 {
   if (WIFEXITED (wait_status))
     {
@@ -799,12 +720,12 @@ child_has_exited (pid, wait_status, exit_status)
 
   if (WIFSIGNALED (wait_status))
     {
-      *exit_status = 0;  /* ?? Don't know what else to say here. */
+      *exit_status = 0;                /* ?? Don't know what else to say here. */
       return 1;
     }
 
   /* ?? Do we really need to consult the event state, too?  Assume the
-   wait_state alone suffices.
+     wait_state alone suffices.
    */
   return 0;
 }
@@ -814,11 +735,7 @@ child_has_exited (pid, wait_status, exit_status)
 static void
 child_mourn_inferior ()
 {
-  /* FIXME: Should be in a header file */
-  extern void proc_remove_foreign PARAMS ((int));
-
   unpush_target (&child_ops);
-  proc_remove_foreign (inferior_pid);
   generic_mourn_inferior ();
 }
 
@@ -849,8 +766,8 @@ child_stop ()
 #if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
 struct symtab_and_line *
 child_enable_exception_callback (kind, enable)
-  enum exception_event_kind kind;
-  int enable;
+     enum exception_event_kind kind;
+     int enable;
 {
   return (struct symtab_and_line *) NULL;
 }
@@ -868,95 +785,99 @@ child_get_current_exception_event ()
 #if !defined(CHILD_PID_TO_EXEC_FILE)
 char *
 child_pid_to_exec_file (pid)
-  int  pid;
+     int pid;
 {
   /* This version of Unix doesn't support translation of a process ID
      to the filename of the executable file.
-     */
+   */
   return NULL;
 }
 #endif
 
 char *
 child_core_file_to_sym_file (core)
-  char *  core;
+     char *core;
 {
   /* The target stratum for a running executable need not support
      this operation.
-     */
+   */
   return NULL;
 }
+\f
 
+#if !defined(CHILD_PID_TO_STR)
+char *
+child_pid_to_str (pid)
+     int pid;
+{
+  return normal_pid_to_str (pid);
+}
+#endif
 
-\f
-struct target_ops child_ops = {
-  "child",                     /* to_shortname */
-  "Unix child process",                /* to_longname */
-  "Unix child process (started by the \"run\" command).",      /* to_doc */
-  child_open,                  /* to_open */
-  0,                           /* to_close */
-  child_attach,                        /* to_attach */
-  child_post_attach,            /* to_post_attach */
-  child_require_attach,                /* to_require_attach */
-  child_detach,                /* to_detach */
-  child_require_detach,        /* to_require_detach */
-  child_resume,                        /* to_resume */
-  child_wait,                  /* to_wait */
-  child_post_wait,              /* to_post_wait */
-  fetch_inferior_registers,    /* to_fetch_registers */
-  store_inferior_registers,    /* to_store_registers */
-  child_prepare_to_store,      /* to_prepare_to_store */
-  child_xfer_memory,           /* to_xfer_memory */
-  child_files_info,            /* to_files_info */
-  memory_insert_breakpoint,    /* to_insert_breakpoint */
-  memory_remove_breakpoint,    /* to_remove_breakpoint */
-  terminal_init_inferior,      /* to_terminal_init */
-  terminal_inferior,           /* to_terminal_inferior */
-  terminal_ours_for_output,    /* to_terminal_ours_for_output */
-  terminal_ours,               /* to_terminal_ours */
-  child_terminal_info,         /* to_terminal_info */
-  kill_inferior,               /* to_kill */
-  0,                           /* to_load */
-  0,                           /* to_lookup_symbol */
-  child_create_inferior,       /* to_create_inferior */
-  child_post_startup_inferior,  /* to_post_startup_inferior */
-  child_acknowledge_created_inferior,   /* to_acknowledge_created_inferior */
-  child_clone_and_follow_inferior,    /* to_clone_and_follow_inferior */
-  child_post_follow_inferior_by_clone,  /* to_post_follow_inferior_by_clone */
-  child_insert_fork_catchpoint, /* to_insert_fork_catchpoint */
-  child_remove_fork_catchpoint, /* to_remove_fork_catchpoint */
-  child_insert_vfork_catchpoint, /* to_insert_vfork_catchpoint */
-  child_remove_vfork_catchpoint, /* to_remove_vfork_catchpoint */
-  child_has_forked,             /* to_has_forked */
-  child_has_vforked,            /* to_has_vforked */
-  child_can_follow_vfork_prior_to_exec, /* to_can_follow_vfork_prior_to_exec */
-  child_post_follow_vfork,      /* to_post_follow_vfork */
-  child_insert_exec_catchpoint, /* to_insert_exec_catchpoint */
-  child_remove_exec_catchpoint, /* to_remove_exec_catchpoint */
-  child_has_execd,              /* to_has_execd */
-  child_reported_exec_events_per_exec_call, /* to_reported_exec_events_per_exec_call */
-  child_has_syscall_event,      /* to_has_syscall_event */
-  child_has_exited,             /* to_has_exited */
-  child_mourn_inferior,                /* to_mourn_inferior */
-  child_can_run,               /* to_can_run */
-  0,                           /* to_notice_signals */
-  child_thread_alive,          /* to_thread_alive */
-  child_stop,                  /* to_stop */
-  child_enable_exception_callback,  /* to_enable_exception_callback */
-  child_get_current_exception_event, /* to_get_current_exception_event */ 
-  child_pid_to_exec_file,       /* to_pid_to_exec_file */
-  child_core_file_to_sym_file,  /* to_core_file_to_sym_file */
-  process_stratum,             /* to_stratum */
-  0,                           /* to_next */
-  1,                           /* to_has_all_memory */
-  1,                           /* to_has_memory */
-  1,                           /* to_has_stack */
-  1,                           /* to_has_registers */
-  1,                           /* to_has_execution */
-  0,                           /* to_sections */
-  0,                           /* to_sections_end */
-  OPS_MAGIC                    /* to_magic */
-};
+static void
+init_child_ops ()
+{
+  child_ops.to_shortname = "child";
+  child_ops.to_longname = "Unix child process";
+  child_ops.to_doc = "Unix child process (started by the \"run\" command).";
+  child_ops.to_open = child_open;
+  child_ops.to_attach = child_attach;
+  child_ops.to_post_attach = child_post_attach;
+  child_ops.to_require_attach = child_require_attach;
+  child_ops.to_detach = child_detach;
+  child_ops.to_require_detach = child_require_detach;
+  child_ops.to_resume = child_resume;
+  child_ops.to_wait = child_wait;
+  child_ops.to_post_wait = child_post_wait;
+  child_ops.to_fetch_registers = fetch_inferior_registers;
+  child_ops.to_store_registers = store_inferior_registers;
+  child_ops.to_prepare_to_store = child_prepare_to_store;
+  child_ops.to_xfer_memory = child_xfer_memory;
+  child_ops.to_files_info = child_files_info;
+  child_ops.to_insert_breakpoint = memory_insert_breakpoint;
+  child_ops.to_remove_breakpoint = memory_remove_breakpoint;
+  child_ops.to_terminal_init = terminal_init_inferior;
+  child_ops.to_terminal_inferior = terminal_inferior;
+  child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
+  child_ops.to_terminal_ours = terminal_ours;
+  child_ops.to_terminal_info = child_terminal_info;
+  child_ops.to_kill = kill_inferior;
+  child_ops.to_create_inferior = child_create_inferior;
+  child_ops.to_post_startup_inferior = child_post_startup_inferior;
+  child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
+  child_ops.to_clone_and_follow_inferior = child_clone_and_follow_inferior;
+  child_ops.to_post_follow_inferior_by_clone = child_post_follow_inferior_by_clone;
+  child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
+  child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
+  child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
+  child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
+  child_ops.to_has_forked = child_has_forked;
+  child_ops.to_has_vforked = child_has_vforked;
+  child_ops.to_can_follow_vfork_prior_to_exec = child_can_follow_vfork_prior_to_exec;
+  child_ops.to_post_follow_vfork = child_post_follow_vfork;
+  child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
+  child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
+  child_ops.to_has_execd = child_has_execd;
+  child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
+  child_ops.to_has_syscall_event = child_has_syscall_event;
+  child_ops.to_has_exited = child_has_exited;
+  child_ops.to_mourn_inferior = child_mourn_inferior;
+  child_ops.to_can_run = child_can_run;
+  child_ops.to_thread_alive = child_thread_alive;
+  child_ops.to_pid_to_str = child_pid_to_str;
+  child_ops.to_stop = child_stop;
+  child_ops.to_enable_exception_callback = child_enable_exception_callback;
+  child_ops.to_get_current_exception_event = child_get_current_exception_event;
+  child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
+  child_ops.to_core_file_to_sym_file = child_core_file_to_sym_file;
+  child_ops.to_stratum = process_stratum;
+  child_ops.to_has_all_memory = 1;
+  child_ops.to_has_memory = 1;
+  child_ops.to_has_stack = 1;
+  child_ops.to_has_registers = 1;
+  child_ops.to_has_execution = 1;
+  child_ops.to_magic = OPS_MAGIC;
+}
 
 void
 _initialize_inftarg ()
@@ -978,5 +899,6 @@ _initialize_inftarg ()
     }
 #endif
 
+  init_child_ops ();
   add_target (&child_ops);
 }
This page took 0.037308 seconds and 4 git commands to generate.