From 9904185cfde13d6c6849f1f042c8e3b74974cf08 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Wed, 15 Jul 2015 17:37:27 +0200 Subject: Move linux_find_memory_regions_full & co. This should be just a move with no changes. gdb/ChangeLog 2015-07-15 Aleksandar Ristovski Move linux_find_memory_regions_full & co. * linux-tdep.c (nat/linux-maps.h): Include. (gdb_regex.h): Remove the include. (enum filterflags, struct smaps_vmflags, read_mapping, decode_vmflags) (mapping_is_anonymous_p, dump_mapping_p): Moved to nat/linux-maps.c. (linux_find_memory_region_ftype): Moved typedef to nat/linux-maps.h. (linux_find_memory_regions_full): Moved definition to nat/linux-maps.c. * nat/linux-maps.c: Include ctype.h, target/target-utils.h, gdb_regex.h and target/target.h. (struct smaps_vmflags, read_mapping, decode_vmflags) (mapping_is_anonymous_p, dump_mapping_p): Move from linux-tdep.c. (linux_find_memory_regions_full): Move from linux-tdep.c. * nat/linux-maps.h (read_mapping): New declaration. (linux_find_memory_region_ftype, enum filterflags): Moved from linux-tdep.c. (linux_find_memory_regions_full): New declaration. * target.c (target/target-utils.h): Include. (read_alloc_pread_ftype): Moved typedef to target/target-utils.h. (read_alloc, read_stralloc_func_ftype, read_stralloc): Moved definitions to target/target-utils.c. * target.h (target_fileio_read_stralloc): Move it to target/target.h. * target/target-utils.c (read_alloc, read_stralloc): Move definitions from target.c. * target/target-utils.h (read_alloc_pread_ftype): New typedef. (read_alloc): New declaration. (read_stralloc_func_ftype): New typedef. (read_stralloc): New declaration. * target/target.h (target_fileio_read_stralloc): Move it from target.h. gdb/gdbserver/ChangeLog 2015-07-15 Aleksandar Ristovski * target.c: Include target/target-utils.h and fcntl.h. (target_fileio_read_stralloc_1_pread, target_fileio_read_stralloc_1) (target_fileio_read_stralloc): New functions. --- gdb/target/target-utils.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ gdb/target/target-utils.h | 12 +++++++ gdb/target/target.h | 11 +++++++ 3 files changed, 102 insertions(+) (limited to 'gdb/target') diff --git a/gdb/target/target-utils.c b/gdb/target/target-utils.c index 4e8fae7bb5b..cdfa6e69803 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 443ffc3ddad..e8bf52ac4f6 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 6ee0feeec0b..4c85fe019ed 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 */ -- cgit v1.2.1