* 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:
pancake 2009-03-27 00:16:27 +00:00
parent a8f2ae2d07
commit 12af51655b
11 changed files with 100 additions and 53 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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