Index: gdb/gdbserver/remote-utils.c |
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c |
index 9052c48eb3d0e20477de1a7e541fa6a206ced618..0b3adace79c55a5bb970d654a499cd7ac0d75777 100644 |
--- a/gdb/gdbserver/remote-utils.c |
+++ b/gdb/gdbserver/remote-utils.c |
@@ -19,6 +19,7 @@ |
#include "server.h" |
#include "terminal.h" |
#include "target.h" |
+#include "gdbthread.h" |
#include <stdio.h> |
#include <string.h> |
#if HAVE_SYS_IOCTL_H |
@@ -105,6 +106,8 @@ struct sym_cache |
int remote_debug = 0; |
struct ui_file *gdb_stdlog; |
+static int remote_is_stdio = 0; |
+ |
static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; |
static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; |
@@ -128,6 +131,14 @@ gdb_connected (void) |
return remote_desc != INVALID_DESCRIPTOR; |
} |
+/* Return true if the remote connection is over stdio. */ |
+ |
+int |
+remote_connection_is_stdio (void) |
+{ |
+ return remote_is_stdio; |
+} |
+ |
static void |
enable_async_notification (int fd) |
{ |
@@ -220,6 +231,17 @@ remote_prepare (char *name) |
socklen_t tmp; |
char *port_end; |
+ remote_is_stdio = 0; |
+ if (strcmp (name, STDIO_CONNECTION_NAME) == 0) |
+ { |
+ /* We need to record fact that we're using stdio sooner than the |
+ call to remote_open so start_inferior knows the connection is |
+ via stdio. */ |
+ remote_is_stdio = 1; |
+ transport_is_reliable = 1; |
+ return; |
+ } |
+ |
port_str = strchr (name, ':'); |
if (port_str == NULL) |
{ |
@@ -270,11 +292,27 @@ remote_open (char *name) |
char *port_str; |
port_str = strchr (name, ':'); |
+#ifdef USE_WIN32API |
if (port_str == NULL) |
+ error ("Only <host>:<port> is supported on this platform."); |
+#endif |
+ |
+ if (strcmp (name, STDIO_CONNECTION_NAME) == 0) |
+ { |
+ fprintf (stderr, "Remote debugging using stdio\n"); |
+ |
+ /* Use stdin as the handle of the connection. |
+ We only select on reads, for example. */ |
+ remote_desc = fileno (stdin); |
+ |
+ enable_async_notification (remote_desc); |
+ |
+ /* Register the event loop handler. */ |
+ add_file_handler (remote_desc, handle_serial_event, NULL); |
+ } |
+#ifndef USE_WIN32API |
+ else if (port_str == NULL) |
{ |
-#ifdef USE_WIN32API |
- error ("Only <host>:<port> is supported on this platform."); |
-#else |
struct stat statbuf; |
if (stat (name, &statbuf) == 0 |
@@ -339,8 +377,8 @@ remote_open (char *name) |
/* Register the event loop handler. */ |
add_file_handler (remote_desc, handle_serial_event, NULL); |
-#endif /* USE_WIN32API */ |
} |
+#endif /* USE_WIN32API */ |
else |
{ |
int port; |
@@ -370,7 +408,8 @@ remote_close (void) |
#ifdef USE_WIN32API |
closesocket (remote_desc); |
#else |
- close (remote_desc); |
+ if (! remote_connection_is_stdio ()) |
+ close (remote_desc); |
#endif |
remote_desc = INVALID_DESCRIPTOR; |
@@ -729,6 +768,32 @@ read_ptid (char *buf, char **obuf) |
return ptid_build (pid, tid, 0); |
} |
+/* Write COUNT bytes in BUF to the client. |
+ The result is the number of bytes written or -1 if error. |
+ This may return less than COUNT. */ |
+ |
+static int |
+write_prim (const void *buf, int count) |
+{ |
+ if (remote_connection_is_stdio ()) |
+ return write (fileno (stdout), buf, count); |
+ else |
+ return write (remote_desc, buf, count); |
+} |
+ |
+/* Read COUNT bytes from the client and store in BUF. |
+ The result is the number of bytes read or -1 if error. |
+ This may return less than COUNT. */ |
+ |
+static int |
+read_prim (void *buf, int count) |
+{ |
+ if (remote_connection_is_stdio ()) |
+ return read (fileno (stdin), buf, count); |
+ else |
+ return read (remote_desc, buf, count); |
+} |
+ |
/* Send a packet to the remote machine, with error checking. |
The data of the packet is in BUF, and the length of the |
packet is in CNT. Returns >= 0 on success, -1 otherwise. */ |
@@ -766,7 +831,7 @@ putpkt_binary_1 (char *buf, int cnt, int is_notif) |
do |
{ |
- if (write (remote_desc, buf2, p - buf2) != p - buf2) |
+ if (write_prim (buf2, p - buf2) != p - buf2) |
{ |
perror ("putpkt(write)"); |
free (buf2); |
@@ -861,7 +926,7 @@ input_interrupt (int unused) |
int cc; |
char c = 0; |
- cc = read (remote_desc, &c, 1); |
+ cc = read_prim (&c, 1); |
if (cc != 1 || c != '\003' || current_inferior == NULL) |
{ |
@@ -989,8 +1054,7 @@ readchar (void) |
if (readchar_bufcnt == 0) |
{ |
- readchar_bufcnt = read (remote_desc, readchar_buf, |
- sizeof (readchar_buf)); |
+ readchar_bufcnt = read_prim (readchar_buf, sizeof (readchar_buf)); |
if (readchar_bufcnt <= 0) |
{ |
@@ -1112,7 +1176,7 @@ getpkt (char *buf) |
fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", |
(c1 << 4) + c2, csum, buf); |
- if (write (remote_desc, "-", 1) != 1) |
+ if (write_prim ("-", 1) != 1) |
return -1; |
} |
@@ -1124,7 +1188,7 @@ getpkt (char *buf) |
fflush (stderr); |
} |
- if (write (remote_desc, "+", 1) != 1) |
+ if (write_prim ("+", 1) != 1) |
return -1; |
if (remote_debug) |
@@ -1250,7 +1314,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, |
struct target_waitstatus *status) |
{ |
if (debug_threads) |
- fprintf (stderr, "Writing resume reply for %s:%d\n\n", |
+ fprintf (stderr, "Writing resume reply for %s:%d\n", |
target_pid_to_str (ptid), status->kind); |
switch (status->kind) |
@@ -1327,8 +1391,8 @@ prepare_resume_reply (char *buf, ptid_t ptid, |
strcat (buf, ";"); |
buf += strlen (buf); |
- if (the_target->core_of_thread) |
- core = (*the_target->core_of_thread) (ptid); |
+ core = target_core_of_thread (ptid); |
+ |
if (core != -1) |
{ |
sprintf (buf, "core:"); |