mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-04 03:11:28 +00:00
108 lines
2.1 KiB
C
108 lines
2.1 KiB
C
/* radare - LGPL - Copyright 2009 pancake<nopcode.org> */
|
|
/* ruby extension for libr (radare2) */
|
|
|
|
#include "r_lib.h"
|
|
#include "r_lang.h"
|
|
#include "ruby.h"
|
|
|
|
// XXX
|
|
//#define RUBYAPI LIBDIR"/ruby1.8/radare.rb"
|
|
#define RUBYAPI "/usr/lib/radare2/radare.rb"
|
|
|
|
#include "r_core.h"
|
|
static struct r_core_t *core = NULL;
|
|
|
|
static VALUE radare_ruby_cmd(VALUE self, VALUE string)
|
|
{
|
|
const char *retstr;
|
|
Check_Type(string, T_STRING);
|
|
retstr = r_core_cmd_str(core, RSTRING(string)->ptr);
|
|
if (retstr == NULL || retstr[0]=='\0')
|
|
return rb_str_new2("");
|
|
return rb_str_new2(retstr);
|
|
}
|
|
|
|
static int run(void *user, const char *code, int len)
|
|
{
|
|
int err, ret = R_TRUE;
|
|
rb_eval_string_protect(code, &err);
|
|
if (err != 0) {
|
|
printf("error %d handled\n", err);
|
|
ret = R_FALSE;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
static int slurp_ruby(const char *file)
|
|
{
|
|
if (r_file_exist(file)) {
|
|
rb_load_file(file);
|
|
ruby_exec();
|
|
return R_TRUE;
|
|
}
|
|
eprintf("lang_ruby: Cannot open '%s'\n", file);
|
|
return R_FALSE;
|
|
}
|
|
|
|
static int run_file(void *user, const char *file)
|
|
{
|
|
return slurp_ruby(file);
|
|
}
|
|
|
|
static int init(void *user)
|
|
{
|
|
VALUE rb_RadareCmd;
|
|
|
|
ruby_init();
|
|
ruby_init_loadpath();
|
|
|
|
rb_eval_string_protect("require 'irb'", NULL);
|
|
core = user;
|
|
rb_RadareCmd = rb_define_class("RadareInternal", rb_cObject);
|
|
rb_define_method(rb_RadareCmd, "cmd", radare_ruby_cmd, 1);
|
|
rb_eval_string_protect("$r = RadareInternal.new()", NULL);
|
|
|
|
if (!slurp_ruby(RUBYAPI)) {
|
|
printf("[ruby] error loading ruby api\n");
|
|
//return R_FALSE;
|
|
}
|
|
return R_TRUE;
|
|
}
|
|
|
|
static int prompt(void *user)
|
|
{
|
|
int err;
|
|
rb_eval_string_protect("IRB.start();", &err);
|
|
if (err != 0)
|
|
return R_FALSE;
|
|
return R_TRUE;
|
|
}
|
|
|
|
static int fini(void *user)
|
|
{
|
|
ruby_finalize();
|
|
return R_TRUE;
|
|
}
|
|
|
|
static const char *help =
|
|
"Ruby plugin usage:\n"
|
|
" $r = RadareInternal.new()\n"
|
|
" bytes = $r.cmd(\"p8 10\");\n";
|
|
|
|
static struct r_lang_plugin_t r_lang_plugin_ruby = {
|
|
.name = "ruby",
|
|
.desc = "Ruby language extension",
|
|
.init = &init,
|
|
.fini = &fini,
|
|
.help = &help,
|
|
.prompt = &prompt,
|
|
.run = &run,
|
|
.run_file = &run_file,
|
|
.set_argv = NULL,
|
|
};
|
|
|
|
struct r_lib_struct_t radare_plugin = {
|
|
.type = R_LIB_TYPE_LANG,
|
|
.data = &r_lang_plugin_ruby,
|
|
};
|