diff options
Diffstat (limited to 'gdb/target')
-rw-r--r-- | gdb/target/target-utils.c | 79 | ||||
-rw-r--r-- | gdb/target/target-utils.h | 12 | ||||
-rw-r--r-- | gdb/target/target.h | 11 |
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 */ |