Skip to content

Commit

Permalink
Handle argc/argv in RLang.C
Browse files Browse the repository at this point in the history
  • Loading branch information
radare committed Oct 22, 2017
1 parent 217bfc8 commit 79de4e5
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 20 deletions.
2 changes: 1 addition & 1 deletion libr/bin/bin.c
Expand Up @@ -432,7 +432,7 @@ static void get_strings_range(RBinFile *arch, RList *list, int min, ut64 from, u
}

static int is_data_section(RBinFile *a, RBinSection *s) {
if (s->has_strings) {
if (s->has_strings || s->is_data) {
return true;
}
if (s->is_data) {
Expand Down
2 changes: 1 addition & 1 deletion libr/core/cbin.c
Expand Up @@ -1311,7 +1311,7 @@ static void set_bin_relocs(RCore *r, RBinReloc *reloc, ut64 addr, Sdb **db, char
}

static int bin_relocs(RCore *r, int mode, int va) {
int bin_demangle = r_config_get_i (r->config, "bin.demangle");
bool bin_demangle = r_config_get_i (r->config, "bin.demangle");
RList *relocs;
RListIter *iter;
RBinReloc *reloc = NULL;
Expand Down
6 changes: 4 additions & 2 deletions libr/lang/lang.c
Expand Up @@ -209,7 +209,7 @@ R_API int r_lang_run_string(RLang *lang, const char *code) {
return r_lang_run (lang, code, strlen (code));
}

R_API int r_lang_run_file(RLang *lang, const char *file) {
R_API int r_lang_run_file(RLang *lang, const char *file) {
int len, ret = false;
if (lang->cur) {
if (!lang->cur->run_file) {
Expand All @@ -218,7 +218,9 @@ R_API int r_lang_run_file(RLang *lang, const char *file) {
ret = lang->cur->run (lang, code, len);
free (code);
}
} else ret = lang->cur->run_file (lang, file);
} else {
ret = lang->cur->run_file (lang, file);
}
}
return ret;
}
Expand Down
56 changes: 40 additions & 16 deletions libr/lang/p/c.c
@@ -1,21 +1,33 @@
/* radare - LGPL - Copyright 2011-2015 pancake */
/* radare - LGPL - Copyright 2011-2017 pancake */
/* vala extension for libr (radare2) */
// TODO: add cache directory (~/.r2/cache)

#include "r_lib.h"
#include "r_core.h"
#include "r_lang.h"

static int ac = 0;
static const char **av = NULL;

static bool lang_c_set_argv(RLang *lang, int argc, const char **argv) {
ac = argc;
av = argv;
return true;
}

static int lang_c_file(RLang *lang, const char *file) {
void *lib;
char *a, *cc, *p, name[512], buf[512];
const char *libpath, *libname;
void *lib;

if (strlen (file) > (sizeof(name)-10))
if (strlen (file) > (sizeof (name) - 10)) {
return false;
if (!strstr (file, ".c"))
}
if (!strstr (file, ".c")) {
sprintf (name, "%s.c", file);
else strcpy (name, file);
} else {
strcpy (name, file);
}
if (!r_file_exists (name)) {
eprintf ("file not found (%s)\n", name);
return false;
Expand All @@ -25,31 +37,42 @@ static int lang_c_file(RLang *lang, const char *file) {
if (a) {
*a = 0;
libpath = name;
libname = a+1;
libname = a + 1;
} else {
libpath = ".";
libname = name;
}
r_sys_setenv ("PKG_CONFIG_PATH", R2_LIBDIR"/pkgconfig");
p = strstr (name, ".c"); if (p) *p=0;
p = strstr (name, ".c");
if (p) {
*p=0;
}
cc = r_sys_getenv ("CC");
if (!cc || !*cc)
if (!cc || !*cc) {
cc = strdup ("gcc");
}
snprintf (buf, sizeof (buf), "%s -fPIC -shared %s -o %s/lib%s."R_LIB_EXT
" $(pkg-config --cflags --libs r_core)", cc, file, libpath, libname);
free (cc);
if (r_sandbox_system (buf, 1) != 0)
if (r_sandbox_system (buf, 1) != 0) {
return false;

}
snprintf (buf, sizeof (buf), "%s/lib%s."R_LIB_EXT, libpath, libname);
lib = r_lib_dl_open (buf);
if (lib!= NULL) {
void (*fcn)(RCore *);
if (lib) {
void (*fcn)(RCore *, int argc, const char **argv);
fcn = r_lib_dl_sym (lib, "entry");
if (fcn) fcn (lang->user);
else eprintf ("Cannot find 'entry' symbol in library\n");
if (fcn) {
fcn (lang->user, ac, av);
ac = 0;
av = NULL;
} else {
eprintf ("Cannot find 'entry' symbol in library\n");
}
r_lib_dl_close (lib);
} else eprintf ("Cannot open library\n");
} else {
eprintf ("Cannot open library\n");
}
r_file_rm (buf); // remove lib
return 0;
}
Expand All @@ -62,7 +85,7 @@ static int lang_c_init(void *user) {
static int lang_c_run(RLang *lang, const char *code, int len) {
FILE *fd = fopen (".tmp.c", "w");
if (fd) {
fputs ("#include <r_core.h>\n\nvoid entry(RCore *core) {\n", fd);
fputs ("#include <r_core.h>\n\nvoid entry(RCore *core, int argc, const char **argv) {\n", fd);
fputs (code, fd);
fputs ("\n}\n", fd);
fclose (fd);
Expand All @@ -80,4 +103,5 @@ static RLangPlugin r_lang_plugin_c = {
.run = lang_c_run,
.init = (void*)lang_c_init,
.run_file = (void*)lang_c_file,
.set_argv = (void*)lang_c_set_argv,
};

0 comments on commit 79de4e5

Please sign in to comment.