* Run callback when defining keys in config

- Add asm_arch and asm_parser callbacks
* Run config_init at the end of core init
* Do not force disassembler to be x86-only
  - Add the disassembler initialization in config
  - Detect invalid disassembling
  - Only parse when asm.pseudo is enabled
This commit is contained in:
pancake 2009-03-17 22:06:50 +00:00
parent f3983d9316
commit 996f5ba9c4
4 changed files with 45 additions and 10 deletions

View File

@ -90,6 +90,8 @@ struct r_config_node_t *r_config_set_cb(struct r_config_t *cfg, const char *name
struct r_config_node_t *node;
node = r_config_set(cfg, name, value);
node->callback = callback;
if (node->callback)
node->callback(cfg->user, node);
return node;
}

View File

@ -340,20 +340,23 @@ static int cmd_print(void *data, const char *input)
/* XXX hardcoded */
int ret, idx;
u8 *buf = core->block;
u64 pseudo = r_config_get_i(&core->config, "asm.pseudo");
int pseudo = (int)r_config_get_i(&core->config, "asm.pseudo");
char str[128];
struct r_asm_aop_t aop;
r_asm_set_pc(&core->assembler, core->seek);
r_asm_set(&core->assembler, "asm_x86");
r_parse_set(&core->parser, "parse_x86_pseudo");
for(idx=ret=0; idx < len; idx+=ret) {
r_asm_set_pc(&core->assembler, core->assembler.pc + ret);
ret = r_asm_disassemble(&core->assembler, &aop, buf+idx, len-idx);
r_parse_parse(&core->parser, aop.buf_asm, str);
if (ret <1) {
ret = 1;
fprintf(stderr, "** invalid opcode at 0x%08llx **\n", core->assembler.pc + ret);
}
if (show_offset) r_cons_printf("0x%08llx ", core->seek + idx);
if (show_bytes) r_cons_printf("%14s ", aop.buf_hex);
r_cons_printf("%s\n", pseudo?str:aop.buf_asm);
if (pseudo) {
r_parse_parse(&core->parser, aop.buf_asm, str);
r_cons_printf("%s\n", str);
} else r_cons_printf("%s\n", aop.buf_asm);
}
}
break;

View File

@ -2,6 +2,28 @@
#include <r_core.h>
int config_asm_arch_callback(void *user, void *data)
{
struct r_core_t *core = (struct r_core_t *) user;
struct r_config_node_t *node = (struct r_config_node_t *) data;
char buf[128];
snprintf(buf, 127, "asm_%s", node->value),
r_asm_set(&core->assembler, buf);
// TODO: control error and restore old value (return false?) show errormsg?
return R_TRUE;
}
int config_asm_parser_callback(void *user, void *data)
{
struct r_core_t *core = (struct r_core_t *) user;
struct r_config_node_t *node = (struct r_config_node_t *) data;
char buf[128];
snprintf(buf, 127, "parse_%s", node->value),
r_asm_set(&core->assembler, buf);
// TODO: control error and restore old value (return false?) show errormsg?
return R_TRUE;
}
int config_color_callback(void *user, void *data)
{
struct r_core_t *core = (struct r_core_t *) user;
@ -22,10 +44,17 @@ int r_core_config_init(struct r_core_t *core)
{
struct r_config_t *cfg = &core->config;
r_config_init(cfg, (void *)core);
r_config_set(cfg, "asm.arch", "x86");
r_config_set_cb(cfg, "asm.arch", "x86",
&config_asm_arch_callback);
r_parse_set(&core->parser, "parse_x86_pseudo");
r_config_set_cb(cfg, "asm.parser", "x86_pseudo",
&config_asm_parser_callback);
r_config_set(cfg, "asm.syntax", "intel");
r_config_set_i(cfg, "asm.bits", 32);
r_config_set(cfg, "asm.syntax", "x86");
r_config_set(cfg, "asm.pseudo", "false");
r_config_set(cfg, "asm.pseudo", "false"); // DEPRECATED ???
r_config_set(cfg, "asm.bytes", "true");
r_config_set(cfg, "asm.offset", "true");
r_config_set(cfg, "asm.os", "linux");

View File

@ -132,6 +132,7 @@ int r_core_init(struct r_core_t *core)
r_anal_init(&core->anal);
r_anal_set_user_ptr(&core->anal, core);
r_asm_init(&core->assembler);
r_asm_set(&core->assembler, "asm_x86"); // XXX should be done by r_asm on init?
r_asm_set_user_ptr(&core->assembler, core);
r_parse_init(&core->parser);
r_parse_set_user_ptr(&core->parser, core);
@ -151,7 +152,6 @@ int r_core_init(struct r_core_t *core)
core->blocksize = R_CORE_BLOCKSIZE;
core->block = (u8*)malloc(R_CORE_BLOCKSIZE);
r_core_cmd_init(core);
r_core_config_init(core);
r_flag_init(&core->flags);
r_debug_init(&core->dbg);
r_lib_init(&core->lib, "radare_plugin");
@ -175,6 +175,7 @@ int r_core_init(struct r_core_t *core)
r_lib_opendir(&core->lib, homeplugindir);
free(homeplugindir);
}
r_core_config_init(core);
// XXX fix path here
return 0;
}