R_API int r_core_dump(RCore *core, const char *file, ut64 addr, ut64 size) { ut64 i; ut8 *buf; int bs = core->blocksize; FILE *fd; r_sys_truncate (file, 0); fd = r_sandbox_fopen (file, "wb"); if (!fd) { eprintf ("Cannot open '%s' for writing\n", file); return R_FALSE; } buf = malloc (bs); r_cons_break (NULL, NULL); for (i=0; i<size; i+=bs) { if (r_cons_singleton ()->breaked) break; if ((i+bs)>size) bs = size-i; r_io_read_at (core->io, addr+i, buf, bs); if (fwrite (buf, bs, 1, fd) <1) { eprintf ("write error\n"); break; } } eprintf ("dumped 0x%"PFMT64x" bytes\n", i); r_cons_break_end (); fclose (fd); free (buf); return R_TRUE; }
R_API bool r_core_dump(RCore *core, const char *file, ut64 addr, ut64 size, int append) { ut64 i; ut8 *buf; int bs = core->blocksize; FILE *fd; if (append) { fd = r_sandbox_fopen (file, "ab"); } else { r_sys_truncate (file, 0); fd = r_sandbox_fopen (file, "wb"); } if (!fd) { eprintf ("Cannot open '%s' for writing\n", file); return false; } /* some io backends seems to be buggy in those cases */ if (bs > 4096) { bs = 4096; } buf = malloc (bs); if (!buf) { eprintf ("Cannot alloc %d byte(s)\n", bs); fclose (fd); return false; } r_cons_break_push (NULL, NULL); for (i = 0; i < size; i += bs) { if (r_cons_is_breaked ()) { break; } if ((i + bs) > size) { bs = size - i; } r_io_read_at (core->io, addr + i, buf, bs); if (fwrite (buf, bs, 1, fd) < 1) { eprintf ("write error\n"); break; } } r_cons_break_pop (); fclose (fd); free (buf); return true; }