summaryrefslogtreecommitdiff
path: root/gdb/gdbserver/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r--gdb/gdbserver/server.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index b9de99a5982..ffc94e7063f 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -717,7 +717,7 @@ main (int argc, char *argv[])
initialize_low ();
- own_buf = malloc (PBUFSIZ);
+ own_buf = malloc (PBUFSIZ + 1);
mem_buf = malloc (PBUFSIZ);
if (pid == 0)
@@ -748,9 +748,15 @@ main (int argc, char *argv[])
restart:
setjmp (toplevel);
- while (!exit_requested && getpkt (own_buf) > 0)
+ while (!exit_requested)
{
unsigned char sig;
+ int new_packet_len = -1;
+ int packet_len;
+
+ packet_len = getpkt (own_buf);
+ if (packet_len <= 0)
+ break;
if (running == 0)
{
@@ -1056,6 +1062,16 @@ main (int argc, char *argv[])
/* Extended (long) request. */
handle_v_requests (own_buf, &status, &signal);
break;
+ case 'F':
+ if (handle_f_hostio (own_buf, packet_len, &new_packet_len))
+ break;
+
+ /* It is a request we don't understand. Respond with an
+ empty packet so that gdb knows that we don't support this
+ request. */
+ own_buf[0] = '\0';
+ break;
+
default:
/* It is a request we don't understand. Respond with an
empty packet so that gdb knows that we don't support this
@@ -1065,7 +1081,10 @@ main (int argc, char *argv[])
}
done_packet:
- putpkt (own_buf);
+ if (new_packet_len != -1)
+ putpkt_binary (own_buf, new_packet_len);
+ else
+ putpkt (own_buf);
if (running && (status == 'W' || status == 'X'))
{