diff options
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index b8a7a1af0e6..8151eb2e7f1 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -122,6 +122,8 @@ static void remote_send (char **buf, long *sizeof_buf_p); static int readchar (int timeout); +static void remote_serial_write (const char *str, int len); + static void remote_kill (struct target_ops *ops); static int tohex (int nib); @@ -3210,13 +3212,13 @@ static void send_interrupt_sequence (void) { if (interrupt_sequence_mode == interrupt_sequence_control_c) - serial_write (remote_desc, "\x03", 1); + remote_serial_write ("\x03", 1); else if (interrupt_sequence_mode == interrupt_sequence_break) serial_send_break (remote_desc); else if (interrupt_sequence_mode == interrupt_sequence_break_g) { serial_send_break (remote_desc); - serial_write (remote_desc, "g", 1); + remote_serial_write ("g", 1); } else internal_error (__FILE__, __LINE__, @@ -7061,6 +7063,21 @@ readchar (int timeout) return ch; } +/* Wrapper for serial_write that closes the target and throws if + writing fails. */ + +static void +remote_serial_write (const char *str, int len) +{ + if (serial_write (remote_desc, str, len)) + { + remote_unpush_target (); + throw_perror_with_name (TARGET_CLOSE_ERROR, + _("Remote communication error. " + "Target disconnected.")); + } +} + /* Send the command in *BUF to the remote machine, and read the reply into *BUF. Report an error if we get an error reply. Resize *BUF using xrealloc if necessary to hold the result, and update @@ -7181,8 +7198,7 @@ putpkt_binary (char *buf, int cnt) gdb_flush (gdb_stdlog); do_cleanups (old_chain); } - if (serial_write (remote_desc, buf2, p - buf2)) - perror_with_name (_("putpkt: write failed")); + remote_serial_write (buf2, p - buf2); /* If this is a no acks version of the remote protocol, send the packet and move on. */ @@ -7237,7 +7253,7 @@ putpkt_binary (char *buf, int cnt) doesn't get retransmitted when we resend this packet. */ skip_frame (); - serial_write (remote_desc, "+", 1); + remote_serial_write ("+", 1); continue; /* Now, go look for +. */ } @@ -7592,7 +7608,7 @@ getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever, break; } - serial_write (remote_desc, "-", 1); + remote_serial_write ("-", 1); } if (tries > MAX_TRIES) @@ -7603,7 +7619,7 @@ getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever, /* Skip the ack char if we're in no-ack mode. */ if (!rs->noack_mode) - serial_write (remote_desc, "+", 1); + remote_serial_write ("+", 1); return -1; } @@ -7623,7 +7639,7 @@ getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever, /* Skip the ack char if we're in no-ack mode. */ if (!rs->noack_mode) - serial_write (remote_desc, "+", 1); + remote_serial_write ("+", 1); if (is_notif != NULL) *is_notif = 0; return val; |