Joel Sherrill (joel@OARcorp.com)
[deliverable/binutils-gdb.git] / gdb / gnu-nat.c
index 367302d1e7310a4dba40bda1049e97ddb348dab2..85dc669cba3315c9461487d5fa9a94a2013aec53 100644 (file)
@@ -23,6 +23,7 @@
 */
 
 #include <stdio.h>
+#include <string.h>
 #include <errno.h>
 #include <signal.h>
 #include <assert.h>
@@ -32,7 +33,8 @@
 
 /* We include this because we don't need the access macros and they conflict
    with gdb's definitions (ick).  This is very non standard!  */
-#include <waitflags.h>
+#define _SYS_WAIT_H            /* Inhibit warning from <bits/waitflags.h>.  */
+#include <bits/waitflags.h>
 
 #include <mach.h>
 #include <mach/message.h>
@@ -67,7 +69,6 @@
 #include "notify_S.h"
 #include "process_reply_S.h"
 #include "msg_reply_S.h"
-
 #include "exc_request_U.h"
 #include "msg_U.h"
 
@@ -85,7 +86,6 @@ int gnu_debug_flag = 0;
 /* Forward decls */
 
 extern struct target_ops gnu_ops;
-extern char *strerror();
 
 int inf_update_procs (struct inf *inf);
 struct inf *make_inf ();
@@ -1912,7 +1912,7 @@ gnu_create_inferior (exec_file, allargs, env)
       if (ptrace (PTRACE_TRACEME) != 0)
        error ("ptrace (PTRACE_TRACEME) failed!");
     }
-  int attach_to_child (int pid)
+  void attach_to_child (int pid)
     {
       /* Attach to the now stopped child, which is actually a shell...  */
       inf_debug (inf, "attaching to child: %d", pid);
@@ -1931,13 +1931,12 @@ gnu_create_inferior (exec_file, allargs, env)
       inferior_pid = inf_pick_first_thread ();
 
       startup_inferior (inf->pending_execs);
-
-      return inferior_pid;
     }
 
   inf_debug (inf, "creating inferior");
 
-  fork_inferior (exec_file, allargs, env, trace_me, attach_to_child, NULL);
+  fork_inferior (exec_file, allargs, env, trace_me, attach_to_child,
+                NULL, NULL);
 
   inf_update_signal_thread (inf);
   inf_set_traced (inf, inf->want_signals);
@@ -2005,6 +2004,10 @@ gnu_attach (args, from_tty)
   attach_flag = 1;
   push_target (&gnu_ops);
 
+  /* We have to initialize the terminal settings now, since the code
+     below might try to restore them.  */
+  target_terminal_init ();
   inf_update_signal_thread (inf);
   inf_set_traced (inf, inf->want_signals);
 
@@ -2083,6 +2086,14 @@ gnu_stop ()
   error ("to_stop target function not implemented");
 }
 
+static char *
+gnu_pid_to_exec_file ()
+{
+  error ("to_pid_to_exec_file target function not implemented");
+  return NULL;
+}
+
 static int
 gnu_thread_alive (int tid)
 {
@@ -2341,49 +2352,75 @@ gnu_xfer_memory (memaddr, myaddr, len, write, target)
 extern void gnu_store_registers (int regno);
 extern void gnu_fetch_registers (int regno);
 
-struct target_ops gnu_ops = {
-  "GNU",                       /* to_shortname */
-  "GNU Hurd process",          /* to_longname */
-  "GNU Hurd process",          /* to_doc */
-  gnu_open,                    /* to_open */
-  0,                           /* to_close */
-  gnu_attach,                  /* to_attach */
-  gnu_detach,                  /* to_detach */
-  gnu_resume,                  /* to_resume */
-  gnu_wait,                    /* to_wait */
-  gnu_fetch_registers,         /* to_fetch_registers */
-  gnu_store_registers,         /* to_store_registers */
-  gnu_prepare_to_store,                /* to_prepare_to_store */
-  gnu_xfer_memory,             /* to_xfer_memory */
-  0,                           /* to_files_info */
-  memory_insert_breakpoint,    /* to_insert_breakpoint */
-  memory_remove_breakpoint,    /* to_remove_breakpoint */
-  gnu_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 */
-  gnu_kill_inferior,           /* to_kill */
-  0,                           /* to_load */
-  0,                           /* to_lookup_symbol */
-
-  gnu_create_inferior,         /* to_create_inferior */
-  gnu_mourn_inferior,          /* to_mourn_inferior */
-  gnu_can_run,                 /* to_can_run */
-  0,                           /* to_notice_signals */
-  gnu_thread_alive,            /* to_thread_alive */
-  gnu_stop,                    /* to_stop */
-  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,                           /* sections */
-  0,                           /* sections_end */
-  OPS_MAGIC                    /* to_magic */
-};
+struct target_ops gnu_ops ;
+
+static void
+init_gnu_ops(void)
+{
+  gnu_ops.to_shortname =   "GNU";              /* to_shortname */
+  gnu_ops.to_longname =   "GNU Hurd process";  /* to_longname */
+  gnu_ops.to_doc =   "GNU Hurd process";       /* to_doc */
+  gnu_ops.to_open =   gnu_open;                        /* to_open */
+  gnu_ops.to_close =   0;                      /* to_close */
+  gnu_ops.to_attach =   gnu_attach;            /* to_attach */
+  gnu_ops.to_post_attach = NULL;
+  gnu_ops.to_require_attach = NULL;             /* to_require_attach */
+  gnu_ops.to_detach =   gnu_detach;            /* to_detach */
+  gnu_ops.to_require_detach = NULL;             /* to_require_detach */
+  gnu_ops.to_resume =   gnu_resume;            /* to_resume */
+  gnu_ops.to_wait  =   gnu_wait;               /* to_wait */
+  gnu_ops.to_post_wait = NULL;                         /* to_post_wait */
+  gnu_ops.to_fetch_registers  =   gnu_fetch_registers; /* to_fetch_registers */
+  gnu_ops.to_store_registers  =   gnu_store_registers; /* to_store_registers */
+  gnu_ops.to_prepare_to_store =   gnu_prepare_to_store;        /* to_prepare_to_store */
+  gnu_ops.to_xfer_memory  =   gnu_xfer_memory; /* to_xfer_memory */
+  gnu_ops.to_files_info  =   0;                        /* to_files_info */
+  gnu_ops.to_insert_breakpoint =   memory_insert_breakpoint;
+  gnu_ops.to_remove_breakpoint =   memory_remove_breakpoint;
+  gnu_ops.to_terminal_init  =   gnu_terminal_init_inferior;
+  gnu_ops.to_terminal_inferior =   terminal_inferior;
+  gnu_ops.to_terminal_ours_for_output =   terminal_ours_for_output;
+  gnu_ops.to_terminal_ours  =   terminal_ours;
+  gnu_ops.to_terminal_info  =   child_terminal_info;   
+  gnu_ops.to_kill  =   gnu_kill_inferior;      /* to_kill */
+  gnu_ops.to_load  =   0;                      /* to_load */
+  gnu_ops.to_lookup_symbol =   0;              /* to_lookup_symbol */
+  gnu_ops.to_create_inferior =   gnu_create_inferior;  /* to_create_inferior */
+  gnu_ops.to_post_startup_inferior = NULL;      /* to_post_startup_inferior */
+  gnu_ops.to_acknowledge_created_inferior = NULL; /* to_acknowledge_created_inferior */
+  gnu_ops.to_clone_and_follow_inferior = NULL;    /* to_clone_and_follow_inferior */
+  gnu_ops.to_post_follow_inferior_by_clone = NULL; /* to_post_follow_inferior_by_clone */
+  gnu_ops.to_insert_fork_catchpoint = NULL;
+  gnu_ops.to_remove_fork_catchpoint = NULL;
+  gnu_ops.to_insert_vfork_catchpoint = NULL;
+  gnu_ops.to_remove_vfork_catchpoint = NULL;
+  gnu_ops.to_has_forked = NULL;                    /* to_has_forked */
+  gnu_ops.to_has_vforked = NULL;                   /* to_has_vforked */
+  gnu_ops.to_can_follow_vfork_prior_to_exec = NULL;
+  gnu_ops.to_post_follow_vfork = NULL;             /* to_post_follow_vfork */
+  gnu_ops.to_insert_exec_catchpoint = NULL;
+  gnu_ops.to_remove_exec_catchpoint = NULL;
+  gnu_ops.to_has_execd = NULL;
+  gnu_ops.to_reported_exec_events_per_exec_call = NULL;
+  gnu_ops.to_has_exited = NULL;
+  gnu_ops.to_mourn_inferior =   gnu_mourn_inferior; /* to_mourn_inferior */
+  gnu_ops.to_can_run  =   gnu_can_run;         /* to_can_run */
+  gnu_ops.to_notice_signals =   0;             /* to_notice_signals */
+  gnu_ops.to_thread_alive  =   gnu_thread_alive;/* to_thread_alive */
+  gnu_ops.to_stop  =   gnu_stop;               /* to_stop */
+  gnu_ops.to_pid_to_exec_file = gnu_pid_to_exec_file;         /* to_pid_to_exec_file */
+  gnu_ops.to_core_file_to_sym_file = NULL;
+  gnu_ops.to_stratum =   process_stratum;      /* to_stratum */
+  gnu_ops.DONT_USE =   0;                      /* to_next */
+  gnu_ops.to_has_all_memory =   1;             /* to_has_all_memory */
+  gnu_ops.to_has_memory =   1;                 /* to_has_memory */
+  gnu_ops.to_has_stack =   1;                  /* to_has_stack */
+  gnu_ops.to_has_registers =   1;              /* to_has_registers */
+  gnu_ops.to_has_execution =   1;              /* to_has_execution */
+  gnu_ops.to_sections =   0;                   /* sections */
+  gnu_ops.to_sections_end =   0;               /* sections_end */
+  gnu_ops.to_magic =   OPS_MAGIC ;             /* to_magic */
+} /* init_gnu_ops */
 \f
 /* Return printable description of proc.  */
 char *proc_string (struct proc *proc)
@@ -3132,17 +3169,14 @@ void
 _initialize_gnu_nat ()
 {
   proc_server = getproc ();
-
+  init_gnu_ops() ;
   add_target (&gnu_ops);
-
   add_task_commands ();
   add_thread_commands ();
 
-#if MAINTENANCE_CMDS
   add_set_cmd ("gnu-debug", class_maintenance,
               var_boolean, (char *)&gnu_debug_flag,
               "Set debugging output for the gnu backend.", &maintenancelist);
-#endif
 }
 \f
 #ifdef FLUSH_INFERIOR_CACHE
This page took 0.025975 seconds and 4 git commands to generate.