]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdbserver: add gdbserver support for vFile::stat packet
authorAndrew Burgess <aburgess@redhat.com>
Tue, 21 May 2024 14:58:41 +0000 (15:58 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 18 Jul 2024 12:24:20 +0000 (13:24 +0100)
After the previous two commits, this commit adds support for the
vFile::stat packet to gdbserver.  This is pretty similar to the
handling for vFile::fstat, but instead calls 'lstat'.

There's still no users of target_fileio_stat in GDB, that will come in
a later commit.

gdbserver/hostio.cc

index c5ae35ab7ddb037bd0525f268732127a53e4afff..cc47d6869d3b0a0ee86908e71bae121abf4395b1 100644 (file)
@@ -486,6 +486,42 @@ handle_fstat (char *own_buf, int *new_packet_len)
     write_enn (own_buf);
 }
 
+static void
+handle_stat (char *own_buf, int *new_packet_len)
+{
+  int bytes_sent;
+  char *p;
+  struct stat st;
+  struct fio_stat fst;
+  char filename[HOSTIO_PATH_MAX];
+
+  p = own_buf + strlen ("vFile:stat:");
+
+  if (require_filename (&p, filename)
+      || require_end (p))
+    {
+      hostio_packet_error (own_buf);
+      return;
+    }
+
+  if (lstat (filename, &st) == -1)
+    {
+      hostio_error (own_buf);
+      return;
+    }
+
+  host_to_fileio_stat (&st, &fst);
+
+  bytes_sent = hostio_reply_with_data (own_buf,
+                                      (char *) &fst, sizeof (fst),
+                                      new_packet_len);
+
+  /* If the response does not fit into a single packet, do not attempt
+     to return a partial response, but simply fail.  */
+  if (bytes_sent < sizeof (fst))
+    write_enn (own_buf);
+}
+
 static void
 handle_close (char *own_buf)
 {
@@ -603,6 +639,8 @@ handle_vFile (char *own_buf, int packet_len, int *new_packet_len)
     handle_pwrite (own_buf, packet_len);
   else if (startswith (own_buf, "vFile:fstat:"))
     handle_fstat (own_buf, new_packet_len);
+  else if (startswith (own_buf, "vFile:stat:"))
+    handle_stat (own_buf, new_packet_len);
   else if (startswith (own_buf, "vFile:close:"))
     handle_close (own_buf);
   else if (startswith (own_buf, "vFile:unlink:"))