2002-05-15 Nick Clifton <nickc@cambridge.redhat.com>
[deliverable/binutils-gdb.git] / gdb / remote.c
index d447f3804f845e437c044e039bcc079115233795..a1b90b7a5a4f928cb98810c972cd68aaea0b1576 100644 (file)
@@ -86,7 +86,7 @@ static void remote_resume (ptid_t ptid, int step,
                            enum target_signal siggnal);
 static void remote_async_resume (ptid_t ptid, int step,
                                 enum target_signal siggnal);
-static int remote_start_remote (PTR);
+static int remote_start_remote (struct ui_out *uiout, void *dummy);
 
 static void remote_open (char *name, int from_tty);
 static void remote_async_open (char *name, int from_tty);
@@ -970,8 +970,8 @@ show_remote_protocol_binary_download_cmd (char *args,
 
 
 /* Tokens for use by the asynchronous signal handlers for SIGINT */
-PTR sigint_remote_twice_token;
-PTR sigint_remote_token;
+static void *sigint_remote_twice_token;
+static void *sigint_remote_token;
 
 /* These are pointers to hook functions that may be set in order to
    modify resume/wait behavior for a particular architecture.  */
@@ -2107,14 +2107,16 @@ remote_cisco_objfile_relocate (bfd_signed_vma text_off, bfd_signed_vma data_off,
 /* Stub for catch_errors.  */
 
 static int
-remote_start_remote_dummy (void *dummy)
+remote_start_remote_dummy (struct ui_out *uiout, void *dummy)
 {
   start_remote ();             /* Initialize gdb process mechanisms */
+  /* NOTE: Return something >=0.  A -ve value is reserved for
+     catch_exceptions.  */
   return 1;
 }
 
 static int
-remote_start_remote (PTR dummy)
+remote_start_remote (struct ui_out *uiout, void *dummy)
 {
   immediate_quit++;            /* Allow user to interrupt it */
 
@@ -2131,7 +2133,9 @@ remote_start_remote (PTR dummy)
   putpkt ("?");                        /* initiate a query from remote machine */
   immediate_quit--;
 
-  return remote_start_remote_dummy (dummy);
+  /* NOTE: See comment above in remote_start_remote_dummy().  This
+     function returns something >=0.  */
+  return remote_start_remote_dummy (uiout, dummy);
 }
 
 /* Open a connection to a remote debugger.
@@ -2222,10 +2226,31 @@ remote_check_symbols (struct objfile *objfile)
     }
 }
 
+static struct serial *
+remote_serial_open (char *name)
+{
+  static int udp_warning = 0;
+
+  /* FIXME: Parsing NAME here is a hack.  But we want to warn here instead
+     of in ser-tcp.c, because it is the remote protocol assuming that the
+     serial connection is reliable and not the serial connection promising
+     to be.  */
+  if (!udp_warning && strncmp (name, "udp:", 4) == 0)
+    {
+      warning ("The remote protocol may be unreliable over UDP.");
+      warning ("Some events may be lost, rendering further debugging "
+              "impossible.");
+      udp_warning = 1;
+    }
+
+  return serial_open (name);
+}
+
 static void
 remote_open_1 (char *name, int from_tty, struct target_ops *target,
               int extended_p)
 {
+  int ex;
   struct remote_state *rs = get_remote_state ();
   if (name == 0)
     error ("To open a remote debug connection, you need to specify what\n"
@@ -2239,7 +2264,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
 
   unpush_target (target);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
@@ -2288,15 +2313,30 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
   no_shared_libraries (NULL, 0);
 #endif
 
-  /* Start the remote connection; if error (0), discard this target.
-     In particular, if the user quits, be sure to discard it
-     (we'd be in an inconsistent state otherwise).  */
-  if (!catch_errors (remote_start_remote, NULL,
-                    "Couldn't establish connection to remote target\n",
-                    RETURN_MASK_ALL))
+  /* Start the remote connection.  If error() or QUIT, discard this
+     target (we'd otherwise be in an inconsistent state) and then
+     propogate the error on up the exception chain.  This ensures that
+     the caller doesn't stumble along blindly assuming that the
+     function succeeded.  The CLI doesn't have this problem but other
+     UI's, such as MI do.
+
+     FIXME: cagney/2002-05-19: Instead of re-throwing the exception,
+     this function should return an error indication letting the
+     caller restore the previous state.  Unfortunatly the command
+     ``target remote'' is directly wired to this function making that
+     impossible.  On a positive note, the CLI side of this problem has
+     been fixed - the function set_cmd_context() makes it possible for
+     all the ``target ....'' commands to share a common callback
+     function.  See cli-dump.c.  */
+  ex = catch_exceptions (uiout,
+                        remote_start_remote, NULL,
+                        "Couldn't establish connection to remote"
+                        " target\n",
+                        RETURN_MASK_ALL);
+  if (ex < 0)
     {
       pop_target ();
-      return;
+      throw_exception (ex);
     }
 
   if (extended_p)
@@ -2327,6 +2367,7 @@ static void
 remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
                     int extended_p)
 {
+  int ex;
   struct remote_state *rs = get_remote_state ();
   if (name == 0)
     error ("To open a remote debug connection, you need to specify what\n"
@@ -2337,7 +2378,7 @@ remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
 
   unpush_target (target);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
@@ -2399,16 +2440,19 @@ remote_async_open_1 (char *name, int from_tty, struct target_ops *target,
   no_shared_libraries (NULL, 0);
 #endif
 
-  /* Start the remote connection; if error (0), discard this target.
-     In particular, if the user quits, be sure to discard it
-     (we'd be in an inconsistent state otherwise).  */
-  if (!catch_errors (remote_start_remote, NULL,
-                    "Couldn't establish connection to remote target\n",
-                    RETURN_MASK_ALL))
+  /* Start the remote connection; if error, discard this target.  See
+     the comments in remote_open_1() for further details such as the
+     need to re-throw the exception.  */
+  ex = catch_exceptions (uiout,
+                        remote_start_remote, NULL,
+                        "Couldn't establish connection to remote"
+                        " target\n",
+                        RETURN_MASK_ALL);
+  if (ex < 0)
     {
       pop_target ();
       wait_forever_enabled_p = 1;
-      return;
+      throw_exception (ex);
     }
 
   wait_forever_enabled_p = 1;
@@ -5452,6 +5496,7 @@ remote_info_process (char *args, int from_tty)
 static void
 remote_cisco_open (char *name, int from_tty)
 {
+  int ex;
   if (name == 0)
     error ("To open a remote debug connection, you need to specify what \n"
           "device is attached to the remote system (e.g. host:port).");
@@ -5463,7 +5508,7 @@ remote_cisco_open (char *name, int from_tty)
 
   unpush_target (&remote_cisco_ops);
 
-  remote_desc = serial_open (name);
+  remote_desc = remote_serial_open (name);
   if (!remote_desc)
     perror_with_name (name);
 
@@ -5514,14 +5559,18 @@ remote_cisco_open (char *name, int from_tty)
      someday have a notion of debugging several processes.  */
   inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
 
-  /* Start the remote connection; if error (0), discard this target. */
-
-  if (!catch_errors (remote_start_remote_dummy, (char *) 0,
-                    "Couldn't establish connection to remote target\n",
-                    RETURN_MASK_ALL))
+  /* Start the remote connection; if error, discard this target.  See
+     the comments in remote_open_1() for further details such as the
+     need to re-throw the exception.  */
+  ex = catch_exceptions (uiout,
+                        remote_start_remote_dummy, NULL,
+                        "Couldn't establish connection to remote"
+                        " target\n",
+                        RETURN_MASK_ALL);
+  if (ex < 0)
     {
       pop_target ();
-      return;
+      throw_exception (ex);
     }
 }
 
This page took 0.026486 seconds and 4 git commands to generate.