aboutsummaryrefslogtreecommitdiff
path: root/gdb/target
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/target')
-rw-r--r--gdb/target/target-utils.c79
-rw-r--r--gdb/target/target-utils.h12
-rw-r--r--gdb/target/target.h11
3 files changed, 102 insertions, 0 deletions
diff --git a/gdb/target/target-utils.c b/gdb/target/target-utils.c
index 4e8fae7..cdfa6e6 100644
--- a/gdb/target/target-utils.c
+++ b/gdb/target/target-utils.c
@@ -19,3 +19,82 @@
#include "common-defs.h"
#include "target/target-utils.h"
+
+LONGEST
+read_alloc (gdb_byte **buf_p, int handle, read_alloc_pread_ftype *pread_func,
+ int padding)
+{
+ size_t buf_alloc, buf_pos;
+ gdb_byte *buf;
+ LONGEST n;
+ int target_errno;
+
+ /* Start by reading up to 4K at a time. The target will throttle
+ this number down if necessary. */
+ buf_alloc = 4096;
+ buf = xmalloc (buf_alloc);
+ buf_pos = 0;
+ while (1)
+ {
+ n = pread_func (handle, &buf[buf_pos], buf_alloc - buf_pos - padding,
+ buf_pos, &target_errno);
+ if (n <= 0)
+ {
+ if (n < 0 || (n == 0 && buf_pos == 0))
+ xfree (buf);
+ else
+ *buf_p = buf;
+ if (n < 0)
+ {
+ /* An error occurred. */
+ return -1;
+ }
+ else
+ {
+ /* Read all there was. */
+ return buf_pos;
+ }
+ }
+
+ buf_pos += n;
+
+ /* If the buffer is filling up, expand it. */
+ if (buf_alloc < buf_pos * 2)
+ {
+ buf_alloc *= 2;
+ buf = xrealloc (buf, buf_alloc);
+ }
+ }
+}
+
+char *
+read_stralloc (struct inferior *inf, const char *filename,
+ read_stralloc_func_ftype *func)
+{
+ gdb_byte *buffer;
+ char *bufstr;
+ LONGEST i, transferred;
+
+ transferred = func (inf, filename, &buffer, 1);
+ bufstr = (char *) buffer;
+
+ if (transferred < 0)
+ return NULL;
+
+ if (transferred == 0)
+ return xstrdup ("");
+
+ bufstr[transferred] = 0;
+
+ /* Check for embedded NUL bytes; but allow trailing NULs. */
+ for (i = strlen (bufstr); i < transferred; i++)
+ if (bufstr[i] != 0)
+ {
+ warning (_("target file %s "
+ "contained unexpected null characters"),
+ filename);
+ break;
+ }
+
+ return bufstr;
+}
diff --git a/gdb/target/target-utils.h b/gdb/target/target-utils.h
index 443ffc3..e8bf52a 100644
--- a/gdb/target/target-utils.h
+++ b/gdb/target/target-utils.h
@@ -20,4 +20,16 @@
#ifndef TARGET_TARGET_UTILS_H
#define TARGET_TARGET_UTILS_H
+typedef int (read_alloc_pread_ftype) (int handle, gdb_byte *read_buf, int len,
+ ULONGEST offset, int *target_errno);
+extern LONGEST read_alloc (gdb_byte **buf_p, int handle,
+ read_alloc_pread_ftype *pread_func, int padding);
+
+struct inferior;
+typedef LONGEST (read_stralloc_func_ftype) (struct inferior *inf,
+ const char *filename,
+ gdb_byte **buf_p, int padding);
+extern char *read_stralloc (struct inferior *inf, const char *filename,
+ read_stralloc_func_ftype *func);
+
#endif /* TARGET_TARGET_UTILS_H */
diff --git a/gdb/target/target.h b/gdb/target/target.h
index 6ee0fee..4c85fe0 100644
--- a/gdb/target/target.h
+++ b/gdb/target/target.h
@@ -70,4 +70,15 @@ extern void target_stop_and_wait (ptid_t ptid);
extern void target_continue_no_signal (ptid_t ptid);
+/* Read target file FILENAME, in the filesystem as seen by INF. If
+ INF is NULL, use the filesystem seen by the debugger (GDB or, for
+ remote targets, the remote stub). The result is NUL-terminated and
+ returned as a string, allocated using xmalloc. If an error occurs
+ or the transfer is unsupported, NULL is returned. Empty objects
+ are returned as allocated but empty strings. A warning is issued
+ if the result contains any embedded NUL bytes. */
+struct inferior;
+extern char *target_fileio_read_stralloc (struct inferior *inf,
+ const char *filename);
+
#endif /* TARGET_COMMON_H */