diff options
Diffstat (limited to 'src/context.c')
-rw-r--r-- | src/context.c | 89 |
1 files changed, 88 insertions, 1 deletions
diff --git a/src/context.c b/src/context.c index 943fca0..1974702 100644 --- a/src/context.c +++ b/src/context.c @@ -26,6 +26,7 @@ #include <errno.h> #include <string.h> #include <stdarg.h> +#include <unistd.h> #include "minidump.h" #include "format.h" @@ -36,6 +37,7 @@ #include "read-process.h" #include "write-minidump.h" #include "write-minicore.h" +#include "util.h" int context_read_memory(struct context *c, unsigned long source, void *destination, size_t length) { int r; @@ -422,6 +424,48 @@ finish: return r; } +struct buffer *context_find_buffer(struct context *c, unsigned type) { + assert(c); + + switch (type) { + + case MINIDUMP_LINUX_MAPS: + return &c->proc_maps; + + case MINIDUMP_LINUX_PROC_STATUS: + return &c->proc_status; + + case MINIDUMP_LINUX_ENVIRON: + return &c->proc_environ; + + case MINIDUMP_LINUX_CMD_LINE: + return &c->proc_cmdline; + + case MINIDUMP_LINUX_COMM: + return &c->proc_comm; + + case MINIDUMP_LINUX_ATTR_CURRENT: + return &c->proc_attr_current; + + case MINIDUMP_LINUX_EXE: + return &c->proc_exe; + + case MINIDUMP_LINUX_CPU_INFO: + return &c->proc_cpuinfo; + + case MINIDUMP_LINUX_LSB_RELEASE: + return &c->lsb_release; + + case MINIDUMP_LINUX_OS_RELEASE: + return &c->os_release; + + case MINIDUMP_LINUX_AUXV: + return &c->auxv; + } + + return NULL; +} + static int show_buffer(FILE *f, const char *title, struct buffer *b) { char *p; @@ -497,7 +541,16 @@ void context_show(FILE *f, struct context *c) { assert(f); assert(c); - fputs("-- Available Maps\n", f); + fprintf(f, + "-- Source\n" + "Have Process: %s\n" + "Have Coredump: %s\n" + "Have Minidump: %s\n" + "-- Available Maps\n", + yes_no(CONTEXT_HAVE_PROCESS(c)), + yes_no(CONTEXT_HAVE_COREDUMP(c)), + yes_no(CONTEXT_HAVE_MINIDUMP(c))); + for (i = 0, sum = 0; i < c->n_maps; i++) { map_show(f, i, c->maps + i); sum += c->maps[i].extent.size; @@ -557,6 +610,10 @@ int context_load(struct context *c) { r = minidump_read_threads(c); if (r < 0) return r; + + r = minidump_read_streams(c); + if (r < 0) + return r; } if (CONTEXT_HAVE_COREDUMP(c)) { @@ -766,3 +823,33 @@ finish: context_release(&c); return r; } + +int context_pread_buffer(int fd, struct buffer *b, size_t length, off_t offset) { + void *p; + ssize_t l; + + assert(fd >= 0); + assert(b); + assert(length > 0); + + p = malloc(length); + if (!p) + return -ENOMEM; + + l = pread(fd, p, length, offset); + if (l < 0) { + free(p); + return -errno; + } + + if ((size_t) l != length) { + free(p); + return -EIO; + } + + free(b->data); + b->data = p; + b->size = length; + + return 0; +} |