aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/remote.c')
-rw-r--r--gdb/remote.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index b4f7ce6..b9b314c 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -286,6 +286,8 @@ static int ishex PARAMS ((int ch, int *val));
static int stubhex PARAMS ((int ch));
+static int remote_query PARAMS ((char, char *, char *, int *));
+
static int hexnumstr PARAMS ((char *, ULONGEST));
static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
@@ -2969,6 +2971,75 @@ the loaded file\n");
printf_filtered ("No loaded section named '%s'.\n", args);
}
+static int
+remote_query (query_type, buf, outbuf, bufsiz)
+ char query_type;
+ char *buf;
+ char *outbuf;
+ int *bufsiz;
+{
+ int i;
+ char buf2[PBUFSIZ];
+ char *p2 = &buf2[0];
+ char *p = buf;
+
+ if (! bufsiz)
+ error ("null pointer to remote bufer size specified");
+
+ /* minimum outbuf size is PBUFSIZE - if bufsiz is not large enough let
+ the caller know and return what the minimum size is */
+ /* Note: a zero bufsiz can be used to query the minimum buffer size */
+ if ( *bufsiz < PBUFSIZ )
+ {
+ *bufsiz = PBUFSIZ;
+ return -1;
+ }
+
+ /* except for querying the minimum buffer size, target must be open */
+ if (! remote_desc)
+ error ("remote query is only available after target open");
+
+ /* we only take uppercase letters as query types, at least for now */
+ if ( (query_type < 'A') || (query_type > 'Z') )
+ error ("invalid remote query type");
+
+ if (! buf)
+ error ("null remote query specified");
+
+ if (! outbuf)
+ error ("remote query requires a buffer to receive data");
+
+ outbuf[0] = '\0';
+
+ *p2++ = 'q';
+ *p2++ = query_type;
+
+ /* we used one buffer char for the remote protocol q command and another
+ for the query type. As the remote protocol encapsulation uses 4 chars
+ we have PBUFZIZ -6 left to pack the query string */
+ i = 0;
+ while ( buf[i] && (i < (PBUFSIZ - 7)) )
+ {
+ /* bad caller may have sent forbidden characters */
+ if ( (!isprint(buf[i])) || (buf[i] == '$') || (buf[i] == '#') )
+ error ("illegal characters in query string");
+
+ *p2++ = buf[i];
+ i++;
+ }
+ *p2 = buf[i];
+
+ if ( buf[i] )
+ error ("query larger than avaiable buffer");
+
+ i = putpkt (buf2);
+ if ( i < 0 ) return i;
+
+ getpkt (outbuf, 0);
+
+ return 0;
+}
+
static void
packet_command (args, from_tty)
char *args;
@@ -3179,6 +3250,7 @@ Specify the serial device it is connected to (e.g. /dev/ttya).";
remote_ops.to_mourn_inferior = remote_mourn;
remote_ops.to_thread_alive = remote_thread_alive;
remote_ops.to_stop = remote_stop;
+ remote_ops.to_query = remote_query;
remote_ops.to_stratum = process_stratum;
remote_ops.to_has_all_memory = 1;
remote_ops.to_has_memory = 1;