* Fix installation of documentation
* Fix popen() fread-related bug in addr2line plugin for bininfo * Add 'fo' command. - Installs the 'fortunes' file * Add 'CD' command (show debug information of file using bininfo) * Add scr.seek and cfg.fortunes config keys - scr.seek works in visual mode (cleanup debug visual mode) - cfg.fortunes runs 'fo' command at startup
This commit is contained in:
parent
a8f2ae2d07
commit
12af51655b
11 changed files with 100 additions and 53 deletions
4
Makefile
4
Makefile
|
|
@ -8,8 +8,8 @@ clean:
|
|||
|
||||
install:
|
||||
mkdir -p ${DESTDIR}${PREFIX}
|
||||
mkdir -p ${DESTDIR}${PREFIX}/share/doc
|
||||
for a in doc/* ; do cp $a ${DESTDIR}/${PREFIX}/share/doc ; done
|
||||
mkdir -p ${DESTDIR}${PREFIX}/share/doc/radare
|
||||
for a in doc/* ; do cp $a ${DESTDIR}/${PREFIX}/share/doc/radare ; done
|
||||
cd libr && make install PARENT=1 PREFIX=${DESTDIR}${PREFIX}
|
||||
|
||||
uninstall:
|
||||
|
|
|
|||
|
|
@ -10,14 +10,17 @@ static char *a2l_get_path(struct r_bininfo_t *bi)
|
|||
|
||||
static int cmd_to_str(const char *cmd, char *out, int len)
|
||||
{
|
||||
int ret;
|
||||
FILE *fd = popen(cmd, "r");
|
||||
if (fd == NULL) {
|
||||
fprintf(stderr, "Cannot find 'addr2line' program\n");
|
||||
return R_FALSE;
|
||||
}
|
||||
fread(out, len, 1, fd);
|
||||
if (out[strlen(out)-1]=='\n')
|
||||
out[strlen(out)-1]='\0';
|
||||
ret = fread(out, len, 1, fd);
|
||||
if (ret >0) {
|
||||
if (out[ret-1]=='\n')
|
||||
out[ret-1]='\0';
|
||||
} else out[0]='\0';
|
||||
pclose(fd);
|
||||
return R_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
NAME=r_core
|
||||
DEPS=r_config r_cons r_line r_io r_cmd r_util r_print r_flags r_asm r_lib r_macro r_debug r_hash r_bin r_lang r_io r_asm r_anal r_parse r_config r_macro r_print
|
||||
DEPS=r_config r_cons r_line r_io r_cmd r_util r_print r_flags r_asm r_lib r_macro r_debug r_hash r_bin r_lang r_io r_asm r_anal r_parse r_config r_macro r_print r_bininfo
|
||||
|
||||
OBJ=core.o cmd.o file.o config.o visual.o io.o yank.o
|
||||
|
||||
|
|
|
|||
|
|
@ -448,6 +448,16 @@ static int cmd_flag(void *data, const char *input)
|
|||
r_flag_space_set(&core->flags, input+2);
|
||||
else r_flag_space_list(&core->flags);
|
||||
break;
|
||||
case 'o':
|
||||
{
|
||||
// XXX
|
||||
#define PREFIX "/usr"
|
||||
char *file = PREFIX"/share/doc/radare/fortunes";
|
||||
char *line = r_file_slurp_random_line (file);
|
||||
r_cons_printf("%s\n", line);
|
||||
free(line);
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
r_flag_list(&core->flags, 1);
|
||||
break;
|
||||
|
|
@ -899,16 +909,31 @@ static int cmd_system(void *data, const char *input)
|
|||
|
||||
static int cmd_meta(void *data, const char *input)
|
||||
{
|
||||
struct r_core_t *core = (struct r_core_t *)data;
|
||||
int ret, line = 0;
|
||||
char file[1024];
|
||||
//struct r_core_t *core = (struct r_core_t *)data;
|
||||
switch(input[0]) {
|
||||
case '\0':
|
||||
/* meta help */
|
||||
break;
|
||||
case 'D': // debug information of current offset
|
||||
ret = r_bininfo_get_line(
|
||||
&core->bininfo, core->seek, file, 1023, &line);
|
||||
if (ret)
|
||||
r_cons_printf("file %s\nline %d\n", file, line);
|
||||
break;
|
||||
case 'C': /* add comment */
|
||||
// r_meta_add(&core->meta);
|
||||
break;
|
||||
case 'F': /* add function */
|
||||
break;
|
||||
case '?':
|
||||
eprintf(
|
||||
"Usage: C[CDF?] [arg]\n"
|
||||
" CD show debug information (bininfo)\n"
|
||||
" CF register function size here\n"
|
||||
" CC add comment\n");
|
||||
}
|
||||
return R_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ int r_core_config_init(struct r_core_t *core)
|
|||
r_config_set_cb(cfg, "scr.color",
|
||||
(core->print.flags&R_PRINT_FLAGS_COLOR)?"true":"false",
|
||||
&config_color_callback);
|
||||
r_config_set (cfg, "scr.seek", "eip");
|
||||
#if 0
|
||||
node = config_set("asm.profile", "default");
|
||||
// node->callback = &config_asm_profile;
|
||||
|
|
@ -137,6 +138,7 @@ int r_core_config_init(struct r_core_t *core)
|
|||
r_config_set(cfg, "cmd.vprompt2", "CFV");
|
||||
r_config_set(cfg, "cmd.vprompt3", "");
|
||||
r_config_set(cfg, "cmd.bp", "");
|
||||
r_config_set(cfg, "cfg.fortunes", "true");
|
||||
|
||||
#if 0
|
||||
config_set_i("search.from", 0);
|
||||
|
|
@ -213,7 +215,6 @@ int r_core_config_init(struct r_core_t *core)
|
|||
config_set("cfg.rdbdir", "TODO");
|
||||
config_set("cfg.datefmt", "%d:%m:%Y %H:%M:%S %z");
|
||||
config_set_i("cfg.count", 0);
|
||||
config_set("cfg.fortunes", "true");
|
||||
node = config_set_i("cfg.bsize", 512);
|
||||
node->callback = &config_bsize_callback;
|
||||
config_set_i("cfg.vbsize", 1024);
|
||||
|
|
@ -346,7 +347,6 @@ int r_core_config_init(struct r_core_t *core)
|
|||
config_set_scr_pal("00","white")
|
||||
config_set_scr_pal("7f","magenta")
|
||||
|
||||
config_set("scr.seek", "eip");
|
||||
config_set("scr.grephigh", "");
|
||||
node = config_set("scr.tee", "");
|
||||
node->callback = &config_teefile_callback;
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ int r_core_init(struct r_core_t *core)
|
|||
r_parse_init(&core->parser);
|
||||
r_parse_set_user_ptr(&core->parser, core);
|
||||
r_bin_init(&core->bin);
|
||||
r_bininfo_init(&core->bininfo);
|
||||
r_bin_set_user_ptr(&core->bin, core);
|
||||
r_meta_init(&core->meta);
|
||||
r_cons_init();
|
||||
|
|
@ -247,6 +248,7 @@ int r_core_seek_align(struct r_core_t *core, u64 align, int times)
|
|||
return r_core_seek(core, seek+diff);
|
||||
}
|
||||
|
||||
/* TODO: add a parameter to read or not the block? optimization? */
|
||||
int r_core_seek(struct r_core_t *core, u64 addr)
|
||||
{
|
||||
u64 tmp = core->seek;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ struct r_core_file_t *r_core_file_open(struct r_core_t *r, const char *file, int
|
|||
fh->size = r_io_size(&r->io, fd);
|
||||
list_add(&(fh->list), &r->files);
|
||||
|
||||
// XXX: detect plugin automagically or set it in config.c
|
||||
r_bin_open(&r->bin, fh->filename, 0, "bin_elf");
|
||||
r_bininfo_open(&r->bininfo, fh->filename, 0, "bininfo_addr2line");
|
||||
|
||||
r_core_block_read(r, 0);
|
||||
|
||||
return fh;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
OBJ=radare2.o
|
||||
BIN=radare2
|
||||
BINDEPS=r_core r_cons r_macro r_util r_flags r_lib r_io r_hash r_cmd r_config r_asm r_anal r_parse r_lang r_debug r_print r_line r_bin r_search r_meta
|
||||
BINDEPS=r_core r_cons r_macro r_util r_flags r_lib r_io r_hash r_cmd r_config r_asm r_anal r_parse r_lang r_debug r_print r_line r_bin r_search r_meta r_bininfo
|
||||
|
||||
#LIBS=-lr_core -L..
|
||||
### shared
|
||||
|
|
|
|||
|
|
@ -38,35 +38,35 @@ int main(int argc, char **argv)
|
|||
int bsize = 0;
|
||||
int seek = 0; // XXX use 64
|
||||
|
||||
if (argc<2)
|
||||
return main_help(1);
|
||||
if (argc < 2)
|
||||
return main_help (1);
|
||||
|
||||
r_core_init(&r);
|
||||
r_core_init (&r);
|
||||
|
||||
while((c = getopt(argc, argv, "whendVs:b:"))!=-1) {
|
||||
switch(c) {
|
||||
while ((c = getopt (argc, argv, "whendVs:b:"))!=-1) {
|
||||
switch (c) {
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
case 'e':
|
||||
r_config_eval(&r.config, optarg);
|
||||
r_config_eval (&r.config, optarg);
|
||||
break;
|
||||
case 'h':
|
||||
return main_help(0);
|
||||
return main_help (0);
|
||||
case 'n':
|
||||
run_rc = 0;
|
||||
break;
|
||||
case 'V':
|
||||
return main_version();
|
||||
return main_version ();
|
||||
break;
|
||||
case 'w':
|
||||
perms = R_IO_RDWR;
|
||||
break;
|
||||
case 'b':
|
||||
bsize = atoi(optarg); // XXX use r_num
|
||||
bsize = atoi (optarg); // XXX use r_num
|
||||
break;
|
||||
case 's':
|
||||
seek = atoi(optarg); // XXX use r_num
|
||||
seek = atoi (optarg); // XXX use r_num
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
|
|
@ -75,68 +75,70 @@ int main(int argc, char **argv)
|
|||
|
||||
if (debug) {
|
||||
char file[1024];
|
||||
|
||||
strcpy(file, "dbg://");
|
||||
if (optind<argc) {
|
||||
char *ptr = r_file_path(argv[optind]);
|
||||
strcpy (file, "dbg://");
|
||||
if (optind < argc) {
|
||||
char *ptr = r_file_path (argv[optind]);
|
||||
if (ptr) {
|
||||
strcat(file, ptr);
|
||||
free(ptr);
|
||||
strcat (file, ptr);
|
||||
free (ptr);
|
||||
optind++;
|
||||
}
|
||||
}
|
||||
while (optind<argc) {
|
||||
strcat(file, argv[optind]);
|
||||
strcat(file, " ");
|
||||
optind++;
|
||||
if (optind!=argc)
|
||||
while (optind < argc) {
|
||||
strcat (file, argv[optind]);
|
||||
strcat (file, " ");
|
||||
if (++optind != argc)
|
||||
strcat(file, " ");
|
||||
}
|
||||
fh = r_core_file_open(&r, file, perms);
|
||||
fh = r_core_file_open (&r, file, perms);
|
||||
if (fh == NULL) {
|
||||
fprintf(stderr,
|
||||
fprintf (stderr,
|
||||
"Cannot open file '%s'\n", file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
} else
|
||||
while (optind<argc) {
|
||||
while (optind < argc) {
|
||||
const char *file = argv[optind++];
|
||||
fh = r_core_file_open(&r, file, perms);
|
||||
fh = r_core_file_open (&r, file, perms);
|
||||
if (fh == NULL) {
|
||||
fprintf(stderr, "Cannot open file '%s'\n", file);
|
||||
fprintf (stderr, "Cannot open file '%s'\n", file);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (r.file == NULL) {
|
||||
fprintf(stderr, "Cannot open file\n");
|
||||
fprintf (stderr, "Cannot open file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (run_rc) {
|
||||
char *homerc = r_str_home(".radarerc");
|
||||
char *homerc = r_str_home (".radarerc");
|
||||
if (homerc) {
|
||||
r_core_cmd_file(&r, homerc);
|
||||
free(homerc);
|
||||
r_core_cmd_file (&r, homerc);
|
||||
free (homerc);
|
||||
}
|
||||
}
|
||||
if (debug) {
|
||||
r_core_cmd(&r, "dh ptrace", 0);
|
||||
r_core_cmdf(&r, "dp %d", r.file->fd);
|
||||
r_core_cmd(&r, ".dr*", 0);
|
||||
r_core_cmd(&r, "s eip", 0);
|
||||
r_core_cmd(&r, "e cmd.prompt=.dr",0);
|
||||
r_core_cmd(&r, "\"e cmd.vprompt=.dr\"",0);
|
||||
r_core_cmd(&r, "\"e cmd.visual=.dr&&s eip\"",0);
|
||||
r_core_cmd (&r, "dh ptrace", 0);
|
||||
r_core_cmdf (&r, "dp %d", r.file->fd);
|
||||
r_core_cmd (&r, ".dr*", 0);
|
||||
r_core_cmd (&r, "s eip", 0);
|
||||
r_core_cmd (&r, "e cmd.prompt=.dr",0);
|
||||
r_core_cmd (&r, "\"e cmd.vprompt=.dr\"",0);
|
||||
r_core_cmd (&r, "\"e cmd.visual=.dr\"",0);
|
||||
}
|
||||
|
||||
if (seek)
|
||||
r_core_seek(&r, seek);
|
||||
r_core_seek (&r, seek);
|
||||
if (bsize)
|
||||
r_core_block_size(&r, bsize);
|
||||
r_core_block_size (&r, bsize);
|
||||
|
||||
while(r_core_prompt(&r) != -1);
|
||||
if (r_config_get_i (&r.config, "cfg.fortunes")) {
|
||||
r_core_cmd (&r, "fo", 0);
|
||||
r_cons_flush();
|
||||
}
|
||||
|
||||
return r_core_file_close(&r, fh);
|
||||
while(r_core_prompt (&r) != -1);
|
||||
|
||||
return r_core_file_close (&r, fh);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,9 +182,12 @@ void r_core_visual_prompt(struct r_core_t *core)
|
|||
|
||||
int r_core_visual(struct r_core_t *core, const char *input)
|
||||
{
|
||||
const char *cmdprompt;
|
||||
const char *vi;
|
||||
u64 scrseek;
|
||||
int ch;
|
||||
|
||||
const char *vi = r_config_get(&core->config, "cmd.visual");
|
||||
vi = r_config_get(&core->config, "cmd.visual");
|
||||
if (vi) r_core_cmd(core, vi, 0);
|
||||
|
||||
while(input[0]) {
|
||||
|
|
@ -200,7 +203,13 @@ int r_core_visual(struct r_core_t *core, const char *input)
|
|||
|
||||
color = r_config_get_i(&core->config, "scr.color");
|
||||
do {
|
||||
const char *cmdprompt = r_config_get(&core->config, "cmd.vprompt");
|
||||
scrseek = r_num_math(&core->num,
|
||||
r_config_get(&core->config, "scr.seek"));
|
||||
if (scrseek != 0LL) {
|
||||
r_core_seek (core, scrseek);
|
||||
// TODO: read?
|
||||
}
|
||||
cmdprompt = r_config_get (&core->config, "cmd.vprompt");
|
||||
if (cmdprompt && cmdprompt[0])
|
||||
r_core_cmd(core, cmdprompt, 0);
|
||||
r_cons_clear00();
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#include "r_flags.h"
|
||||
#include "r_config.h"
|
||||
#include "r_bin.h"
|
||||
#include "r_bininfo.h"
|
||||
|
||||
#define R_CORE_BLOCKSIZE 64
|
||||
#define R_CORE_BLOCKSIZE_MAX 0x40000 /* 4 MB */
|
||||
|
|
@ -56,6 +57,7 @@ struct r_core_t {
|
|||
struct r_parse_t parser;
|
||||
struct r_print_t print;
|
||||
struct r_bin_t bin;
|
||||
struct r_bininfo_t bininfo;
|
||||
struct r_meta_t meta;
|
||||
struct r_lang_t lang;
|
||||
struct r_debug_t dbg;
|
||||
|
|
|
|||
Loading…
Reference in a new issue