From ad027ba004cf11751290f02422ba1b3ec1041eb1 Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 5 Feb 2011 12:51:37 +0100 Subject: [PATCH] * Apply patchsets from Glyn Kennington (Thanks!) - Added new method r_io_shift (start, end, move) - Added 'r' command (like in r1) - Fix parallel builds with -j>1 --- AUTHORS | 11 +++++---- libr/core/cmd.c | 51 +++++++++++++++++++++++++++++++++++++++++ libr/core/core.c | 1 + libr/fs/p/grub/Makefile | 4 ++-- libr/include/r_io.h | 1 + libr/io/io.c | 33 ++++++++++++++++++++++---- 6 files changed, 91 insertions(+), 10 deletions(-) diff --git a/AUTHORS b/AUTHORS index 588a9995c0..1362672d5d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,12 +1,15 @@ -Main developers aka /dev/radare - +Main developers: +================ - pancake - nibble.ds + - earada @earada -Contributors - - earada +Contributors: (sorted by length) +================================ - esteve + - Glyn Kennington - elektranox - neuroflip + - rvalles - graz - pof diff --git a/libr/core/cmd.c b/libr/core/cmd.c index ecd6d063ad..882e984254 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -1393,6 +1393,7 @@ static int cmd_help(void *data, const char *input) { " w[mode] [arg] ; multiple write operations\n" " x [len] ; alias for 'px' (print hexadecimal)\n" " y [len] [off] ; yank/paste bytes from/to memory\n" + " r[+- ][len] ; resize file\n" " ? [expr] ; help or evaluate math expression\n" " /[xmp/] ; search for bytes, regexps, patterns, ..\n" " ![cmd] ; run given command as in system(3)\n" @@ -2749,6 +2750,55 @@ static int cmd_write(void *data, const char *input) { return 0; } +static int cmd_resize(void *data, const char *input) { + RCore *core = (RCore *)data; + st64 delta=0; + int grow; + ut64 oldsize,newsize; + + oldsize = core->file->size; + + switch (input[0]) { + case ' ': + newsize = r_num_math(core->num, input+1); + break; + case '+': + case '-': + delta = (st64)r_num_math(NULL, input); + newsize = oldsize + delta; + break; + case '?': + default: + r_cons_printf ( + "Usage: r[ size|+insert|-remove]\n" + " r size set filesize to size, extending or truncating\n" + " r-num remove num bytes, move following data down\n" + " r+num insert num bytes, move following data up\n"); + return R_TRUE; + } + + grow = (newsize > oldsize); + + if (grow) { + r_io_resize (core->io, newsize); + core->file->size = newsize; + } + + if (delta && core->offset < newsize) + r_io_shift (core->io, core->offset, grow?newsize:oldsize, delta); + + if (!grow) { + r_io_resize (core->io, newsize); + core->file->size = newsize; + } + + if (newsize < core->offset+core->blocksize || + oldsize < core->offset+core->blocksize) + r_core_block_read (core, 0); + + return R_TRUE; +} + static const char *cmdhit = NULL; static const char *searchprefix = NULL; static int __cb_hit(RSearchKeyword *kw, void *user, ut64 addr) { @@ -4316,6 +4366,7 @@ void r_core_cmd_init(RCore *core) { r_cmd_add (core->cmd, "Project", "project", &cmd_project); r_cmd_add (core->cmd, "open", "open or map file", &cmd_open); r_cmd_add (core->cmd, "yank", "yank bytes", &cmd_yank); + r_cmd_add (core->cmd, "resize", "change file size", &cmd_resize); r_cmd_add (core->cmd, "Visual", "enter visual mode", &cmd_visual); r_cmd_add (core->cmd, "!", "run system command", &cmd_system); r_cmd_add (core->cmd, "=", "io pipe", &cmd_rap); diff --git a/libr/core/core.c b/libr/core/core.c index 9ce4c40950..c36b7ff59f 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -86,6 +86,7 @@ static const char *radare_argv[] = { "f", "fr", "f-", "f*", "fs", "fS", "fr", "f?", "m", "m*", "ml", "m-", "my", "mg", "md", "mp", "m?", "x", + "r", "r+", "r-", "b", "bf", "b?", "/", "//", "/a", "/c", "/m", "/x", "/v", "y", "yy", "y?", diff --git a/libr/fs/p/grub/Makefile b/libr/fs/p/grub/Makefile index 00e0fd7590..8442f6fb4e 100644 --- a/libr/fs/p/grub/Makefile +++ b/libr/fs/p/grub/Makefile @@ -36,9 +36,9 @@ CFLAGS+=-I../../../include #CFLAGS+=-fnested-functions BIN=test${EXT_EXE} -all: ${KERNOBJS} main.o ${BIN} +all: ${BIN} -${BIN}: +${BIN}: ${KERNOBJS} main.o ${CC} -o ${BIN} main.o ${CFLAGS} ${KERNOBJS} lib: all libgrubfs.a diff --git a/libr/include/r_io.h b/libr/include/r_io.h index 578d383648..f82f7df290 100644 --- a/libr/include/r_io.h +++ b/libr/include/r_io.h @@ -201,6 +201,7 @@ R_API int r_io_close(RIO *io, RIODesc *fd); R_API ut64 r_io_size(RIO *io); //, int fd); R_API int r_io_resize(struct r_io_t *io, ut64 newsize); R_API int r_io_accept(RIO *io, int fd); +R_API int r_io_shift(RIO *io, ut64 start, ut64 end, st64 move); /* io/cache.c */ R_API void r_io_cache_commit(RIO *io); diff --git a/libr/io/io.c b/libr/io/io.c index 9745dd730b..144a152786 100644 --- a/libr/io/io.c +++ b/libr/io/io.c @@ -362,9 +362,34 @@ R_API int r_io_bind(RIO *io, RIOBind *bnd) { } R_API int r_io_accept(RIO *io, int fd) { - if (r_io_is_listener (io)) { - if (io->plugin->accept) - return io->plugin->accept (io, io->fd, fd); - } + if (r_io_is_listener (io) && (io->plugin->accept)) + return io->plugin->accept (io, io->fd, fd); return R_FALSE; } + +/* moves bytes up (+) or down (-) within the specified range */ +R_API int r_io_shift(RIO *io, ut64 start, ut64 end, st64 move) { + ut8 *buf; + ut64 chunksize=0x10000; + ut64 rest, src, shiftsize = r_num_abs (move); + if (!shiftsize || (end-start) <= shiftsize) return R_FALSE; + rest = (end-start) - shiftsize; + + if (!(buf = malloc (chunksize))) return R_FALSE; + + if (move>0) src = end-shiftsize; + else src = start+shiftsize; + + while (rest>0) { + if (chunksize>rest) chunksize=rest; + if (move>0) src -= chunksize; + + r_io_read_at (io, src, buf, chunksize); + r_io_write_at (io, src+move, buf, chunksize); + + if (move<0) src += chunksize; + rest -= chunksize; + } + free (buf); + return R_TRUE; +}