public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Gary Benson <gbenson@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 3/3 v2] Implement remote_bfd_iovec_stat using vFile:fstat
Date: Tue, 10 Mar 2015 11:20:00 -0000	[thread overview]
Message-ID: <1425986407-18203-1-git-send-email-gbenson@redhat.com> (raw)
In-Reply-To: <1425902299-2151-4-git-send-email-gbenson@redhat.com>

I noticed I left a bit of useless code in remote_bfd_iovec_stat.
This updated patch removes it, the rest is unchanged.

---
This patch implements the function remote_bfd_iovec_stat using a
vFile:fstat hostio call to the remote target.  If vFile:fstat is
not supported GDB creates a dummy result by zeroing the supplied
stat structure and then setting it's st_size field to INT_MAX.
This mimic's GDB's previous behaviour, with the exception that
GDB did not previously zero the structure so all other fields
would have been returned unchanged, which is to say very likely
populated with random values from the stack.

gdb/ChangeLog:

	* remote-fileio.h (remote_fileio_to_host_stat): New declaration.
	* remote-fileio.c (remote_fileio_to_host_uint): New function.
	(remote_fileio_to_host_ulong): Likewise.
	(remote_fileio_to_host_mode): Likewise.
	(remote_fileio_to_host_time): Likewise.
	(remote_fileio_to_host_stat): Likewise.
	* remote.c (PACKET_vFile_fstat): New enum value.
	(remote_protocol_features): Register the "vFile:fstat" feature.
	(remote_hostio_fstat): New function.
	(remote_bfd_iovec_stat): Use the above.
	(_initialize_remote): Register new "set/show remote
	hostio-fstat-packet" command.

gdb/doc/ChangeLog:

	* gdb.texinfo (Remote Configuration): Document the
	"set/show remote hostio-fstat-packet" command.
---
 gdb/ChangeLog       |   15 +++++++++
 gdb/doc/ChangeLog   |    5 +++
 gdb/doc/gdb.texinfo |    4 ++
 gdb/remote-fileio.c |   80 +++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/remote-fileio.h |    4 ++
 gdb/remote.c        |   74 ++++++++++++++++++++++++++++++++++++++++++++--
 6 files changed, 178 insertions(+), 4 deletions(-)

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 8d4af3c..552da31 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -19748,6 +19748,10 @@ are:
 @tab @code{vFile:readlink}
 @tab Host I/O
 
+@item @code{hostio-fstat-packet}
+@tab @code{vFile:fstat}
+@tab Host I/O
+
 @item @code{noack-packet}
 @tab @code{QStartNoAckMode}
 @tab Packet acknowledgment
diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c
index 0ce0714..aaf839d 100644
--- a/gdb/remote-fileio.c
+++ b/gdb/remote-fileio.c
@@ -1321,6 +1321,86 @@ remote_fileio_request (char *buf, int ctrlc_pending_p)
 
   remote_fileio_sig_exit ();
 }
+\f
+
+/* Unpack an fio_uint_t.  */
+
+static unsigned int
+remote_fileio_to_host_uint (fio_uint_t fnum)
+{
+  gdb_byte *buf, *lim;
+  unsigned int num = 0;
+
+  for (buf = (gdb_byte *) fnum, lim = buf + 4; buf < lim; buf++)
+    {
+      num <<= 8;
+      num |= *buf;
+    }
+
+  return num;
+}
+
+/* Unpack an fio_ulong_t.  */
+
+static ULONGEST
+remote_fileio_to_host_ulong (fio_ulong_t fnum)
+{
+  gdb_byte *buf, *lim;
+  ULONGEST num = 0;
+
+  for (buf = (gdb_byte *) fnum, lim = buf + 8; buf < lim; buf++)
+    {
+      num <<= 8;
+      num |= *buf;
+    }
+
+  return num;
+}
+
+/* Unpack an fio_mode_t.  */
+
+static mode_t
+remote_fileio_to_host_mode (fio_mode_t fnum)
+{
+  return remote_fileio_mode_to_host (remote_fileio_to_host_uint (fnum),
+				     0);
+}
+
+/* Unpack an fio_time_t.  */
+
+static time_t
+remote_fileio_to_host_time (fio_time_t fnum)
+{
+  return remote_fileio_to_host_uint (fnum);
+}
+
+
+/* See remote-fileio.h.  */
+
+void
+remote_fileio_to_host_stat (struct fio_stat *fst, struct stat *st)
+{
+  memset (st, 0, sizeof (struct stat));
+
+  st->st_dev = remote_fileio_to_host_uint (fst->fst_dev);
+  st->st_ino = remote_fileio_to_host_uint (fst->fst_ino);
+  st->st_mode = remote_fileio_to_host_mode (fst->fst_mode);
+  st->st_nlink = remote_fileio_to_host_uint (fst->fst_nlink);
+  st->st_uid = remote_fileio_to_host_uint (fst->fst_uid);
+  st->st_gid = remote_fileio_to_host_uint (fst->fst_gid);
+  st->st_rdev = remote_fileio_to_host_uint (fst->fst_rdev);
+  st->st_size = remote_fileio_to_host_ulong (fst->fst_size);
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+  st->st_blksize = remote_fileio_to_host_ulong (fst->fst_blksize);
+#endif
+#if HAVE_STRUCT_STAT_ST_BLOCKS
+  st->st_blocks = remote_fileio_to_host_ulong (fst->fst_blocks);
+#endif
+  st->st_atime = remote_fileio_to_host_time (fst->fst_atime);
+  st->st_mtime = remote_fileio_to_host_time (fst->fst_mtime);
+  st->st_ctime = remote_fileio_to_host_time (fst->fst_ctime);
+}
+\f
 
 static void
 set_system_call_allowed (char *args, int from_tty)
diff --git a/gdb/remote-fileio.h b/gdb/remote-fileio.h
index 8b32868..d30ae6a 100644
--- a/gdb/remote-fileio.h
+++ b/gdb/remote-fileio.h
@@ -38,4 +38,8 @@ extern void initialize_remote_fileio (
   struct cmd_list_element *remote_set_cmdlist,
   struct cmd_list_element *remote_show_cmdlist);
 
+/* Unpack a struct fio_stat.  */
+extern void remote_fileio_to_host_stat (struct fio_stat *fst,
+					struct stat *st);
+
 #endif
diff --git a/gdb/remote.c b/gdb/remote.c
index 495dfdc..52adbbb 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1253,6 +1253,7 @@ enum {
   PACKET_vFile_close,
   PACKET_vFile_unlink,
   PACKET_vFile_readlink,
+  PACKET_vFile_fstat,
   PACKET_qXfer_auxv,
   PACKET_qXfer_features,
   PACKET_qXfer_libraries,
@@ -4042,7 +4043,9 @@ static const struct protocol_feature remote_protocol_features[] = {
   { "Qbtrace-conf:bts:size", PACKET_DISABLE, remote_supported_packet,
     PACKET_Qbtrace_conf_bts_size },
   { "swbreak", PACKET_DISABLE, remote_supported_packet, PACKET_swbreak_feature },
-  { "hwbreak", PACKET_DISABLE, remote_supported_packet, PACKET_hwbreak_feature }
+  { "hwbreak", PACKET_DISABLE, remote_supported_packet, PACKET_hwbreak_feature },
+  { "vFile:fstat", PACKET_DISABLE, remote_supported_packet,
+    PACKET_vFile_fstat },
 };
 
 static char *remote_support_xml;
@@ -10059,6 +10062,55 @@ remote_hostio_readlink (struct target_ops *self,
   return ret;
 }
 
+/* Read information about the open file FD on the remote target
+   into ST.  Return 0 on success, or -1 if an error occurs (and
+   set *REMOTE_ERRNO).  */
+
+static int
+remote_hostio_fstat (struct target_ops *self,
+		     int fd, struct stat *st,
+		     int *remote_errno)
+{
+  struct remote_state *rs = get_remote_state ();
+  char *p = rs->buf;
+  int left = get_remote_packet_size ();
+  int attachment_len, ret;
+  char *attachment;
+  struct fio_stat fst;
+  int read_len;
+
+  if (packet_support (PACKET_vFile_fstat) != PACKET_ENABLE)
+    {
+      memset (st, 0, sizeof (struct stat));
+      st->st_size = INT_MAX;
+      return 0;
+    }
+
+  remote_buffer_add_string (&p, &left, "vFile:fstat:");
+
+  remote_buffer_add_int (&p, &left, fd);
+
+  ret = remote_hostio_send_command (p - rs->buf, PACKET_vFile_fstat,
+				    remote_errno, &attachment,
+				    &attachment_len);
+  if (ret < 0)
+    return ret;
+
+  read_len = remote_unescape_input ((gdb_byte *) attachment, attachment_len,
+				    (gdb_byte *) &fst, sizeof (fst));
+
+  if (read_len != ret)
+    error (_("vFile:fstat returned %d, but %d bytes."), ret, read_len);
+
+  if (read_len != sizeof (fst))
+    error (_("vFile:fstat returned %d bytes, but expecting %d."),
+	   read_len, (int) sizeof (fst));
+
+  remote_fileio_to_host_stat (&fst, st);
+
+  return 0;
+}
+
 static int
 remote_fileio_errno_to_host (int errnum)
 {
@@ -10203,9 +10255,20 @@ remote_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
 static int
 remote_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
 {
-  /* FIXME: We should probably implement remote_hostio_stat.  */
-  sb->st_size = INT_MAX;
-  return 0;
+  int fd = *(int *) stream;
+  int remote_errno;
+  int result;
+
+  result = remote_hostio_fstat (find_target_at (process_stratum),
+				fd, sb, &remote_errno);
+
+  if (result == -1)
+    {
+      errno = remote_fileio_errno_to_host (remote_errno);
+      bfd_set_error (bfd_error_system_call);
+    }
+
+  return result;
 }
 
 int
@@ -12342,6 +12405,9 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL,
   add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_readlink],
 			 "vFile:readlink", "hostio-readlink", 0);
 
+  add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_fstat],
+			 "vFile:fstat", "hostio-fstat", 0);
+
   add_packet_config_cmd (&remote_protocol_packets[PACKET_vAttach],
 			 "vAttach", "attach", 0);
 
-- 
1.7.1

  parent reply	other threads:[~2015-03-10 11:20 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-09 11:58 [PATCH 0/3] Properly implement remote_bfd_iovec_stat Gary Benson
2015-03-09 11:58 ` [PATCH 2/3] Add vFile:fstat: packet to gdbserver Gary Benson
2015-03-10 18:31   ` Pedro Alves
2015-03-11 10:33     ` [PATCH 2/3 v2] Implement vFile:fstat: packet in gdbserver Gary Benson
2015-03-11 11:35       ` Pedro Alves
2015-03-11 16:00       ` Eli Zaretskii
2015-03-09 11:58 ` [PATCH 1/3] Move remote_fileio_to_fio_stat to gdb/common Gary Benson
2015-03-10 18:30   ` Pedro Alves
2015-03-09 11:58 ` [PATCH 3/3] Implement remote_bfd_iovec_stat using vFile:fstat Gary Benson
2015-03-09 16:17   ` Eli Zaretskii
2015-03-10  9:32     ` Gary Benson
2015-03-10 16:40       ` Eli Zaretskii
2015-03-10 11:20   ` Gary Benson [this message]
2015-03-10 15:51     ` [PATCH 3/3 v3] " Gary Benson
2015-03-10 18:31       ` Pedro Alves
2015-03-10 18:36       ` Pedro Alves
2015-03-11 10:23         ` Gary Benson
2015-03-11 11:22           ` Pedro Alves
2015-03-11 12:58             ` [PATCH 3/3 v4] Implement remote_bfd_iovec_stat Gary Benson
2015-03-11 13:15               ` Pedro Alves
2015-03-11 13:16               ` Gary Benson
2015-03-11 13:39                 ` [PATCH 0/3 v2] Gary Benson
2015-03-11 18:04                   ` [PATCH 0/3 v2] Properly implement remote_bfd_iovec_stat Gary Benson
2015-03-11 13:40                 ` [PATCH 2/3 v5] Implement remote_bfd_iovec_stat Gary Benson
2015-03-11 13:52                   ` Pedro Alves
2015-03-11 13:40                 ` [PATCH 3/3 v3] Implement vFile:fstat: packet in gdbserver Gary Benson
2015-03-11 13:53                   ` Pedro Alves
2015-03-11 13:40                 ` [PATCH 1/3] Move remote_fileio_to_fio_stat to gdb/common Gary Benson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1425986407-18203-1-git-send-email-gbenson@redhat.com \
    --to=gbenson@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).