* 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
This commit is contained in:
pancake 2011-02-05 12:51:37 +01:00
parent 7e22c00602
commit ad027ba004
6 changed files with 91 additions and 10 deletions

11
AUTHORS
View File

@ -1,12 +1,15 @@
Main developers aka /dev/radare
Main developers:
================
- pancake <nopcode.org>
- nibble.ds <gmail.com>
- earada @earada
Contributors
- earada
Contributors: (sorted by length)
================================
- esteve <estlack.org>
- Glyn Kennington
- elektranox
- neuroflip
- rvalles
- graz
- pof

View File

@ -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);

View File

@ -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?",

View File

@ -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

View File

@ -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);

View File

@ -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;
}