From a40d2e800604541b8976adda41335c410b8b7c27 Mon Sep 17 00:00:00 2001 From: Luc Tielen Date: Fri, 23 Jun 2023 14:50:26 +0200 Subject: [PATCH] Fix removing core plugins from Lc after L- ##core --- libr/anal/anal.c | 9 ++- libr/arch/arch.c | 9 ++- libr/asm/parse.c | 8 ++- libr/bin/bin.c | 9 ++- libr/bp/bp_plugin.c | 5 ++ libr/core/cplugin.c | 14 +++++ libr/core/libs.c | 22 ++++---- libr/debug/plugin.c | 5 ++ libr/egg/egg.c | 9 ++- libr/esil/esil_plugin.c | 5 ++ libr/fs/fs.c | 13 ++++- libr/include/r_anal.h | 3 +- libr/include/r_arch.h | 3 +- libr/include/r_bin.h | 3 +- libr/include/r_bp.h | 3 +- libr/include/r_core.h | 3 +- libr/include/r_debug.h | 3 +- libr/include/r_egg.h | 3 +- libr/include/r_esil.h | 1 + libr/include/r_fs.h | 3 +- libr/include/r_io.h | 1 + libr/include/r_lang.h | 4 +- libr/include/r_parse.h | 3 +- libr/io/io_plugin.c | 5 ++ libr/lang/lang.c | 38 +++++++------ libr/lang/p/qjs.c | 55 +++++++++++++------ libr/lang/p/qjs/arch.c | 5 +- libr/lang/p/qjs/core.c | 10 ++-- libr/main/rabin2.c | 2 +- libr/main/ragg2.c | 2 +- libr/main/rasm2.c | 4 +- libr/util/lib.c | 8 ++- test/db/cmd/cmd_js | 118 +++++++++++++++++++++++++++++++++++++++- 33 files changed, 306 insertions(+), 82 deletions(-) diff --git a/libr/anal/anal.c b/libr/anal/anal.c index 29cb8c317c..657002e79a 100644 --- a/libr/anal/anal.c +++ b/libr/anal/anal.c @@ -138,13 +138,18 @@ R_API RAnal *r_anal_new(void) { anal->plugins = r_list_newf ((RListFree) r_anal_plugin_free); if (anal->plugins) { for (i = 0; anal_static_plugins[i]; i++) { - r_anal_add (anal, anal_static_plugins[i]); + r_anal_plugin_add (anal, anal_static_plugins[i]); } } R_DIRTY (anal); return anal; } +R_API bool r_anal_plugin_remove(RAnal *anal, RAnalPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API void r_anal_plugin_free(RAnalPlugin *p) { if (p && p->fini) { p->fini (NULL); @@ -209,7 +214,7 @@ R_API bool r_esil_use(RAnal *anal, const char *name) { return false; } -R_API int r_anal_add(RAnal *anal, RAnalPlugin *foo) { +R_API int r_anal_plugin_add(RAnal *anal, RAnalPlugin *foo) { if (foo->init) { foo->init (anal->user); } diff --git a/libr/arch/arch.c b/libr/arch/arch.c index 830a3110b5..bc3496c67e 100644 --- a/libr/arch/arch.c +++ b/libr/arch/arch.c @@ -23,7 +23,7 @@ R_API RArch *r_arch_new(void) { a->cfg = r_arch_config_new (); ut32 i = 0; while (arch_static_plugins[i]) { - r_arch_add (a, (RArchPlugin*)arch_static_plugins[i++]); + r_arch_plugin_add (a, (RArchPlugin*)arch_static_plugins[i++]); } return a; } @@ -201,7 +201,7 @@ R_API bool r_arch_set_arch(RArch *arch, char *archname) { return true; } -R_API bool r_arch_add(RArch *a, RArchPlugin *ap) { +R_API bool r_arch_plugin_add(RArch *a, RArchPlugin *ap) { r_return_val_if_fail (a && ap, false); if (!ap->meta.name || !ap->arch) { return false; @@ -209,6 +209,11 @@ R_API bool r_arch_add(RArch *a, RArchPlugin *ap) { return r_list_append (a->plugins, ap) != NULL; } +R_API bool r_arch_plugin_remove(RArch *arch, RArchPlugin *ap) { + // R2_590 TODO + return true; +} + R_API bool r_arch_del(RArch *arch, const char *name) { r_return_val_if_fail (arch && arch->plugins && name, false); RArchPlugin *ap = find_bestmatch (arch, NULL, name, false); diff --git a/libr/asm/parse.c b/libr/asm/parse.c index 8c7a9f841b..86e5213cfd 100644 --- a/libr/asm/parse.c +++ b/libr/asm/parse.c @@ -59,7 +59,7 @@ R_API RParse *r_parse_new(void) { p->localvar_only = false; size_t i; for (i = 0; parse_static_plugins[i]; i++) { - r_parse_add (p, parse_static_plugins[i]); + r_parse_plugin_add (p, parse_static_plugins[i]); } return p; } @@ -71,7 +71,7 @@ R_API void r_parse_free(RParse *p) { } } -R_API bool r_parse_add(RParse *p, RParsePlugin *foo) { +R_API bool r_parse_plugin_add(RParse *p, RParsePlugin *foo) { r_return_val_if_fail (p && foo, false); bool itsFine = foo->init? foo->init (p, p->user): true; if (itsFine) { @@ -80,6 +80,10 @@ R_API bool r_parse_add(RParse *p, RParsePlugin *foo) { return true; } +R_API bool r_parse_plugin_remove(RParse *p, RParsePlugin *plugin) { + return true; +} + static char *predotname(const char *name) { char *sname = strdup (name); char *dot = strchr (sname, '.'); diff --git a/libr/bin/bin.c b/libr/bin/bin.c index 82e8af885e..b5f0dd4ca8 100644 --- a/libr/bin/bin.c +++ b/libr/bin/bin.c @@ -418,7 +418,7 @@ static void r_bin_plugin_free(RBinPlugin *p) { } // rename to r_bin_plugin_add like the rest -R_API bool r_bin_add(RBin *bin, RBinPlugin *foo) { +R_API bool r_bin_plugin_add(RBin *bin, RBinPlugin *foo) { RListIter *it; RBinPlugin *plugin; @@ -438,6 +438,11 @@ R_API bool r_bin_add(RBin *bin, RBinPlugin *foo) { return true; } +R_API bool r_bin_plugin_remove(RBin *bin, RBinPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API bool r_bin_ldr_add(RBin *bin, RBinLdrPlugin *foo) { RListIter *it; RBinLdrPlugin *ldr; @@ -851,7 +856,7 @@ R_API RBin *r_bin_new(void) { /* bin parsers */ bin->binfiles = r_list_newf ((RListFree)r_bin_file_free); for (i = 0; bin_static_plugins[i]; i++) { - r_bin_add (bin, bin_static_plugins[i]); + r_bin_plugin_add (bin, bin_static_plugins[i]); } /* extractors */ bin->binxtrs = r_list_new (); diff --git a/libr/bp/bp_plugin.c b/libr/bp/bp_plugin.c index a8cafab350..953becfcf4 100644 --- a/libr/bp/bp_plugin.c +++ b/libr/bp/bp_plugin.c @@ -38,6 +38,11 @@ R_API int r_bp_plugin_add(RBreakpoint *bp, RBreakpointPlugin *foo) { return true; } +R_API int r_bp_plugin_remove(RBreakpoint *bp, RBreakpointPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API int r_bp_use(RBreakpoint *bp, const char *name, int bits) { RListIter *iter; bp->bits = bits; diff --git a/libr/core/cplugin.c b/libr/core/cplugin.c index 7ac229f71e..879c79e3b5 100644 --- a/libr/core/cplugin.c +++ b/libr/core/cplugin.c @@ -31,6 +31,20 @@ R_API bool r_core_plugin_add(RCmd *cmd, RCorePlugin *plugin) { return true; } +R_API bool r_core_plugin_remove(RCmd *cmd, RCorePlugin *plugin) { + const char *name = plugin->name; + RListIter *iter, *iter2; + RCorePlugin *p; + r_list_foreach_safe (cmd->plist, iter, iter2, p) { + if (p && !strcmp (name, p->name)) { + r_list_delete (cmd->plist, iter); + return true; + } + } + + return false; +} + R_API bool r_core_plugin_init(RCmd *cmd) { r_return_val_if_fail (cmd, false); size_t i; diff --git a/libr/core/libs.c b/libr/core/libs.c index 26041c59d9..82df8c94de 100644 --- a/libr/core/libs.c +++ b/libr/core/libs.c @@ -8,10 +8,14 @@ struct r_ ## x ## _plugin_t *hand = (struct r_ ## x ## _plugin_t *)data;\ RCore *core = (RCore *) user;\ pl->free = NULL; \ - r_ ## x ## _add (core->y, hand);\ + r_ ## x ## _plugin_add (core->y, hand);\ return true;\ }\ - static int __lib_ ## x ## _dt (RLibPlugin * pl, void *p, void *u) { return true; } + static int __lib_ ## x ## _dt (RLibPlugin * pl, void *user, void *data) { \ + struct r_ ## x ## _plugin_t *hand = (struct r_ ## x ## _plugin_t *)data; \ + RCore *core = (RCore *) user; \ + return r_ ## x ## _plugin_remove (core->y, hand); \ + } // TODO: deprecate this #define CB_COPY(x, y)\ @@ -21,23 +25,21 @@ RCore *core = (RCore *) user;\ instance = R_NEW (struct r_ ## x ## _plugin_t);\ memcpy (instance, hand, sizeof (struct r_ ## x ## _plugin_t));\ - r_ ## x ## _add (core->y, instance);\ + r_ ## x ## _plugin_add (core->y, instance);\ return true;\ }\ - static int __lib_ ## x ## _dt (RLibPlugin * pl, void *p, void *u) { return true; } + static int __lib_ ## x ## _dt (RLibPlugin *pl, void *user, void *data) { \ + struct r_ ## x ## _plugin_t *hand = (struct r_ ## x ## _plugin_t *)data; \ + RCore *core = (RCore *) user; \ + return r_ ## x ## _plugin_remove (core->y, hand); \ + } -// XXX R2_590 : api consistency issues -#define r_io_add r_io_plugin_add CB_COPY (io, io) -#define r_core_add r_core_plugin_add CB (core, rcmd) -#define r_debug_add r_debug_plugin_add CB (debug, dbg) -#define r_bp_add r_bp_plugin_add CB (bp, dbg->bp) CB (lang, lang) CB (anal, anal) -#define r_esil_add r_esil_plugin_add CB (esil, anal->esil) CB (parse, parser) CB (bin, bin) diff --git a/libr/debug/plugin.c b/libr/debug/plugin.c index 62056324c4..e9b150e0dd 100644 --- a/libr/debug/plugin.c +++ b/libr/debug/plugin.c @@ -100,6 +100,11 @@ R_API bool r_debug_plugin_add(RDebug *dbg, RDebugPlugin *foo) { return true; } +R_API bool r_debug_plugin_remove(RDebug *dbg, RDebugPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API bool r_debug_plugin_set_reg_profile(RDebug *dbg, const char *profile) { char *str = r_file_slurp (profile, NULL); if (!str) { diff --git a/libr/egg/egg.c b/libr/egg/egg.c index ed995b631a..d61d7c3944 100644 --- a/libr/egg/egg.c +++ b/libr/egg/egg.c @@ -75,7 +75,7 @@ R_API REgg *r_egg_new(void) { } egg->plugins = r_list_new (); for (i = 0; egg_static_plugins[i]; i++) { - r_egg_add (egg, egg_static_plugins[i]); + r_egg_plugin_add (egg, egg_static_plugins[i]); } return egg; @@ -84,7 +84,7 @@ beach: return NULL; } -R_API bool r_egg_add(REgg *a, REggPlugin *foo) { +R_API bool r_egg_plugin_add(REgg *a, REggPlugin *foo) { r_return_val_if_fail (a && foo, false); RListIter *iter; // TODO: cache foo->name length and use memcmp instead of strcmp @@ -101,6 +101,11 @@ R_API bool r_egg_add(REgg *a, REggPlugin *foo) { return true; } +R_API bool r_egg_plugin_remove(REgg *a, REggPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API char *r_egg_tostring(REgg *egg) { r_return_val_if_fail (egg, NULL); return r_buf_tostring (egg->buf); diff --git a/libr/esil/esil_plugin.c b/libr/esil/esil_plugin.c index c3b50c3aca..16017ffe61 100644 --- a/libr/esil/esil_plugin.c +++ b/libr/esil/esil_plugin.c @@ -42,6 +42,11 @@ R_API bool r_esil_plugin_add(REsil *esil, REsilPlugin *plugin) { return true; } +R_API bool r_esil_plugin_remove(REsil *esil, REsilPlugin *plugin) { + // R2_590 TODO + return true; +} + static REsilActivePlugin *_get_active_plugin(REsil *esil, const char *name) { RListIter *iter; REsilActivePlugin *eap; diff --git a/libr/fs/fs.c b/libr/fs/fs.c index d44b976705..4070bee6be 100644 --- a/libr/fs/fs.c +++ b/libr/fs/fs.c @@ -65,7 +65,7 @@ R_API R_MUSTUSE RFS* r_fs_new(void) { continue; } memcpy (static_plugin, fs_static_plugins[i], sizeof (RFSPlugin)); - r_fs_add (fs, static_plugin); + r_fs_plugin_add (fs, static_plugin); free (static_plugin); } } @@ -95,8 +95,8 @@ R_API void r_fs_free(RFS* fs) { } /* plugins */ -R_API void r_fs_add(RFS* fs, RFSPlugin* p) { - r_return_if_fail (fs && p); +R_API bool r_fs_plugin_add(RFS* fs, RFSPlugin* p) { + r_return_val_if_fail (fs && p, false); if (p->init) { p->init (); } @@ -104,7 +104,14 @@ R_API void r_fs_add(RFS* fs, RFSPlugin* p) { if (sp) { memcpy (sp, p, sizeof (RFSPlugin)); r_list_append (fs->plugins, sp); + return true; } + return false; +} + +R_API bool r_fs_plugin_remove(RFS *fs, RFSPlugin *p) { + // R2_590 TODO + return true; } R_API void r_fs_del(RFS* fs, RFSPlugin* p) { diff --git a/libr/include/r_anal.h b/libr/include/r_anal.h index a20cd72cc9..7a5b1d781a 100644 --- a/libr/include/r_anal.h +++ b/libr/include/r_anal.h @@ -1008,7 +1008,8 @@ R_API void r_anal_purge(RAnal *anal); R_API void r_anal_free(RAnal *r); R_API void r_anal_set_user_ptr(RAnal *anal, void *user); R_API void r_anal_plugin_free(RAnalPlugin *p); -R_API int r_anal_add(RAnal *anal, RAnalPlugin *foo); +R_API int r_anal_plugin_add(RAnal *anal, RAnalPlugin *plugin); +R_API bool r_anal_plugin_remove(RAnal *anal, RAnalPlugin *plugin); R_API int r_anal_archinfo(RAnal *anal, int query); R_API bool r_anal_is_aligned(RAnal *anal, const ut64 addr); R_API bool r_anal_use(RAnal *anal, const char *name); diff --git a/libr/include/r_arch.h b/libr/include/r_arch.h index d5cd39fe1a..fa2e222649 100644 --- a/libr/include/r_arch.h +++ b/libr/include/r_arch.h @@ -208,7 +208,8 @@ R_API RArch *r_arch_new(void); R_API bool r_arch_use(RArch *arch, RArchConfig *config, const char *name); // arch plugins management apis -R_API bool r_arch_add(RArch *arch, RArchPlugin *ap); +R_API bool r_arch_plugin_add(RArch *arch, RArchPlugin *ap); +R_API bool r_arch_plugin_remove(RArch *arch, RArchPlugin *ap); R_API bool r_arch_del(RArch *arch, const char *name); R_API void r_arch_free(RArch *arch); diff --git a/libr/include/r_bin.h b/libr/include/r_bin.h index 133ef77cb1..18755ae6dd 100644 --- a/libr/include/r_bin.h +++ b/libr/include/r_bin.h @@ -699,7 +699,8 @@ R_API RBinFile *r_bin_file_open(RBin *bin, const char *file, RBinFileOptions *op // plugins/bind functions R_API void r_bin_bind(RBin *b, RBinBind *bnd); -R_API bool r_bin_add(RBin *bin, RBinPlugin *foo); +R_API bool r_bin_plugin_add(RBin *bin, RBinPlugin *plugin); +R_API bool r_bin_plugin_remove(RBin *bin, RBinPlugin *plugin); R_API bool r_bin_xtr_add(RBin *bin, RBinXtrPlugin *foo); R_API bool r_bin_ldr_add(RBin *bin, RBinLdrPlugin *foo); R_API void r_bin_list(RBin *bin, PJ *pj, int format); diff --git a/libr/include/r_bp.h b/libr/include/r_bp.h index 4bbb15cf5d..d2f3cec992 100644 --- a/libr/include/r_bp.h +++ b/libr/include/r_bp.h @@ -113,7 +113,8 @@ R_API RBreakpoint *r_bp_free(RBreakpoint *bp); R_API bool r_bp_del(RBreakpoint *bp, ut64 addr); R_API bool r_bp_del_all(RBreakpoint *bp); -R_API int r_bp_plugin_add(RBreakpoint *bp, RBreakpointPlugin *foo); +R_API int r_bp_plugin_add(RBreakpoint *bp, RBreakpointPlugin *plugin); +R_API int r_bp_plugin_remove(RBreakpoint *bp, RBreakpointPlugin *plugin); R_API int r_bp_use(RBreakpoint *bp, const char *name, int bits); R_API int r_bp_plugin_del(RBreakpoint *bp, const char *name); R_API void r_bp_plugin_list(RBreakpoint *bp); diff --git a/libr/include/r_core.h b/libr/include/r_core.h index 9d823e6451..03fcac5460 100644 --- a/libr/include/r_core.h +++ b/libr/include/r_core.h @@ -32,7 +32,7 @@ #include #include -// TODO: thois var should be 1 at some point :D +// TODO: this var should be 1 at some point :D #define SHELLFILTER 0 #ifdef __cplusplus @@ -992,6 +992,7 @@ extern RCorePlugin r_core_plugin_a2f; extern RCorePlugin r_core_plugin_sixref; R_API bool r_core_plugin_init(RCmd *cmd); R_API bool r_core_plugin_add(RCmd *cmd, RCorePlugin *plugin); +R_API bool r_core_plugin_remove(RCmd *cmd, RCorePlugin *plugin); R_API bool r_core_plugin_check(RCmd *cmd, const char *a0); R_API void r_core_plugin_fini(RCmd *cmd); diff --git a/libr/include/r_debug.h b/libr/include/r_debug.h index 9a2135d68d..ab1c5aa3ef 100644 --- a/libr/include/r_debug.h +++ b/libr/include/r_debug.h @@ -513,7 +513,8 @@ R_API int r_debug_kill_setup(RDebug *dbg, int sig, int action); R_API void r_debug_plugin_init(RDebug *dbg); R_API int r_debug_plugin_set(RDebug *dbg, const char *str); R_API bool r_debug_plugin_list(RDebug *dbg, int mode); -R_API bool r_debug_plugin_add(RDebug *dbg, RDebugPlugin *foo); +R_API bool r_debug_plugin_add(RDebug *dbg, RDebugPlugin *plugin); +R_API bool r_debug_plugin_remove(RDebug *dbg, RDebugPlugin *plugin); R_API bool r_debug_plugin_set_reg_profile(RDebug *dbg, const char *str); /* memory */ diff --git a/libr/include/r_egg.h b/libr/include/r_egg.h index 6ccad1ee1d..d4a845635d 100644 --- a/libr/include/r_egg.h +++ b/libr/include/r_egg.h @@ -187,7 +187,8 @@ R_API void r_egg_lang_init(REgg *egg); R_API void r_egg_lang_free(REgg *egg); R_API char *r_egg_tostring(REgg *egg); R_API void r_egg_free(REgg *egg); -R_API bool r_egg_add(REgg *a, REggPlugin *foo); +R_API bool r_egg_plugin_add(REgg *a, REggPlugin *plugin); +R_API bool r_egg_plugin_remove(REgg *a, REggPlugin *plugin); R_API void r_egg_reset(REgg *egg); R_API bool r_egg_setup(REgg *egg, const char *arch, int bits, int endian, const char *os); R_API bool r_egg_include(REgg *egg, const char *file, int format); diff --git a/libr/include/r_esil.h b/libr/include/r_esil.h index 18d2515f95..f31296beff 100644 --- a/libr/include/r_esil.h +++ b/libr/include/r_esil.h @@ -326,6 +326,7 @@ R_API void r_esil_handlers_fini(REsil *esil); R_API void r_esil_plugins_init(REsil *esil); R_API void r_esil_plugins_fini(REsil *esil); R_API bool r_esil_plugin_add(REsil *esil, REsilPlugin *plugin); +R_API bool r_esil_plugin_remove(REsil *esil, REsilPlugin *plugin); R_API bool r_esil_plugin_activate(REsil *esil, const char *name); R_API void r_esil_plugin_deactivate(REsil *esil, const char *name); diff --git a/libr/include/r_fs.h b/libr/include/r_fs.h index e511436039..bf92434f09 100644 --- a/libr/include/r_fs.h +++ b/libr/include/r_fs.h @@ -136,7 +136,8 @@ R_API RFS *r_fs_new(void); R_API void r_fs_free(RFS* fs); R_API void r_fs_view(RFS* fs, int view); -R_API void r_fs_add(RFS *fs, RFSPlugin *p); +R_API bool r_fs_plugin_add(RFS *fs, RFSPlugin *p); +R_API bool r_fs_plugin_remove(RFS *fs, RFSPlugin *p); R_API void r_fs_del(RFS *fs, RFSPlugin *p); R_API RFSRoot *r_fs_mount(RFS* fs, const char *fstype, const char *path, ut64 delta); diff --git a/libr/include/r_io.h b/libr/include/r_io.h index cd26241e4c..8591f4b11d 100644 --- a/libr/include/r_io.h +++ b/libr/include/r_io.h @@ -454,6 +454,7 @@ R_API void r_io_free(RIO *io); R_API bool r_io_plugin_init(RIO *io); R_API bool r_io_plugin_add(RIO *io, RIOPlugin *plugin); +R_API bool r_io_plugin_remove(RIO *io, RIOPlugin *plugin); R_API int r_io_plugin_list(RIO *io); R_API int r_io_plugin_list_json(RIO *io); R_API int r_io_plugin_read(RIODesc *desc, ut8 *buf, int len); diff --git a/libr/include/r_lang.h b/libr/include/r_lang.h index 66824abcff..1984061967 100644 --- a/libr/include/r_lang.h +++ b/libr/include/r_lang.h @@ -69,7 +69,8 @@ typedef struct r_lang_session_t { R_API RLang *r_lang_new(void); R_API void r_lang_free(RLang *lang); R_API bool r_lang_setup(RLang *lang); -R_API bool r_lang_add(RLang *lang, RLangPlugin *foo); +R_API bool r_lang_plugin_add(RLang *lang, RLangPlugin *plugin); +R_API bool r_lang_plugin_remove(RLang *lang, RLangPlugin *plugin); R_API void r_lang_list(RLang *lang, int mode); R_API bool r_lang_use(RLang *lang, const char *name); R_API bool r_lang_use_plugin(RLang *lang, RLangPlugin *h); @@ -82,7 +83,6 @@ R_API bool r_lang_run_file(RLang *lang, const char *file); R_API bool r_lang_prompt(RLang *lang); R_API RLangPlugin *r_lang_get_by_name(RLang *lang, const char *name); R_API RLangPlugin *r_lang_get_by_extension(RLang *lang, const char *ext); -// TODO: rename r_Lang_add for r_lang_plugin_add R_API bool r_lang_define(RLang *lang, const char *type, const char *name, void *value); R_API void r_lang_undef(RLang *lang, const char *name); diff --git a/libr/include/r_parse.h b/libr/include/r_parse.h index 32bb656e78..18f9fc167b 100644 --- a/libr/include/r_parse.h +++ b/libr/include/r_parse.h @@ -62,7 +62,8 @@ R_API void r_parse_free(RParse *p); /* plugins */ R_API void r_parse_set_user_ptr(RParse *p, void *user); -R_API bool r_parse_add(RParse *p, RParsePlugin *foo); +R_API bool r_parse_plugin_add(RParse *p, RParsePlugin *plugin); +R_API bool r_parse_plugin_remove(RParse *p, RParsePlugin *plugin); R_API bool r_parse_use(RParse *p, const char *name); /* action */ diff --git a/libr/io/io_plugin.c b/libr/io/io_plugin.c index 034a9b2ef7..b590e1afa8 100644 --- a/libr/io/io_plugin.c +++ b/libr/io/io_plugin.c @@ -16,6 +16,11 @@ R_API bool r_io_plugin_add(RIO *io, RIOPlugin *plugin) { return true; } +R_API bool r_io_plugin_remove(RIO *io, RIOPlugin *plugin) { + // R2_590 TODO + return true; +} + R_API bool r_io_plugin_init(RIO *io) { RIOPlugin *static_plugin; int i; diff --git a/libr/lang/lang.c b/libr/lang/lang.c index 192666dda0..c425c07c43 100644 --- a/libr/lang/lang.c +++ b/libr/lang/lang.c @@ -47,24 +47,24 @@ R_API RLang *r_lang_new(void) { lang->cb_printf = (PrintfCallback)printf; #if HAVE_SYSTEM #if R2__UNIX__ - r_lang_add (lang, &r_lang_plugin_s); - r_lang_add (lang, &r_lang_plugin_c); - r_lang_add (lang, &r_lang_plugin_cpipe); + r_lang_plugin_add (lang, &r_lang_plugin_s); + r_lang_plugin_add (lang, &r_lang_plugin_c); + r_lang_plugin_add (lang, &r_lang_plugin_cpipe); #endif - r_lang_add (lang, &r_lang_plugin_v); - r_lang_add (lang, &r_lang_plugin_vala); - r_lang_add (lang, &r_lang_plugin_rust); - r_lang_add (lang, &r_lang_plugin_zig); - r_lang_add (lang, &r_lang_plugin_pipe); + r_lang_plugin_add (lang, &r_lang_plugin_v); + r_lang_plugin_add (lang, &r_lang_plugin_vala); + r_lang_plugin_add (lang, &r_lang_plugin_rust); + r_lang_plugin_add (lang, &r_lang_plugin_zig); + r_lang_plugin_add (lang, &r_lang_plugin_pipe); #endif - r_lang_add (lang, &r_lang_plugin_go); - r_lang_add (lang, &r_lang_plugin_poke); - r_lang_add (lang, &r_lang_plugin_spp); - r_lang_add (lang, &r_lang_plugin_lib); - r_lang_add (lang, &r_lang_plugin_asm); - r_lang_add (lang, &r_lang_plugin_qjs); - r_lang_add (lang, &r_lang_plugin_tsc); - r_lang_add (lang, &r_lang_plugin_nim); + r_lang_plugin_add (lang, &r_lang_plugin_go); + r_lang_plugin_add (lang, &r_lang_plugin_poke); + r_lang_plugin_add (lang, &r_lang_plugin_spp); + r_lang_plugin_add (lang, &r_lang_plugin_lib); + r_lang_plugin_add (lang, &r_lang_plugin_asm); + r_lang_plugin_add (lang, &r_lang_plugin_qjs); + r_lang_plugin_add (lang, &r_lang_plugin_tsc); + r_lang_plugin_add (lang, &r_lang_plugin_nim); return lang; } @@ -148,7 +148,7 @@ R_API bool r_lang_setup(RLang *lang) { return false; } -R_API bool r_lang_add(RLang *lang, RLangPlugin *foo) { +R_API bool r_lang_plugin_add(RLang *lang, RLangPlugin *foo) { if (foo && !r_lang_get_by_name (lang, foo->name)) { bool supported = true; if (foo->init) { @@ -166,6 +166,10 @@ R_API bool r_lang_add(RLang *lang, RLangPlugin *foo) { return false; } +R_API bool r_lang_plugin_remove(RLang *lang, RLangPlugin *plugin) { + return true; +} + /* TODO: deprecate all list methods */ R_API void r_lang_list(RLang *lang, int mode) { RListIter *iter; diff --git a/libr/lang/p/qjs.c b/libr/lang/p/qjs.c index 927e1bbec3..eec8897c23 100644 --- a/libr/lang/p/qjs.c +++ b/libr/lang/p/qjs.c @@ -24,6 +24,7 @@ typedef struct qjs_core_plugin { R_GENERATE_VEC_IMPL_FOR(CorePlugin, QjsCorePlugin); typedef struct qjs_arch_plugin_t { + char *name; char *arch; R_BORROW JSContext *ctx; JSValue decode_func; @@ -45,6 +46,7 @@ static void core_plugin_fini(QjsCorePlugin *cp, void *user) { } static void arch_plugin_fini(QjsArchPlugin *ap, void *user) { + free (ap->name); free (ap->arch); } @@ -96,6 +98,7 @@ static bool plugin_manager_remove_core_plugin(QjsPluginManager *pm, const char * } if (found) { + pm->core->lang->cmdf (pm->core, "L-%s", name); RVecCorePlugin_remove (&pm->core_plugins, i, core_plugin_fini, NULL); return true; } @@ -103,13 +106,14 @@ static bool plugin_manager_remove_core_plugin(QjsPluginManager *pm, const char * return false; } -static void plugin_manager_add_arch_plugin(QjsPluginManager *pm, const char *arch, - JSContext *ctx, JSValue decode_func) { +static void plugin_manager_add_arch_plugin(QjsPluginManager *pm, const char *name, + const char *arch, JSContext *ctx, JSValue decode_func) { r_return_if_fail (pm); QjsArchPlugin *ap = RVecArchPlugin_emplace_back (&pm->arch_plugins); if (ap) { - ap->arch = arch? strdup (arch): NULL; + ap->name = strdup (name); + ap->arch = strdup (arch); ap->ctx = ctx; ap->decode_func = decode_func; } @@ -145,6 +149,8 @@ static bool plugin_manager_remove_arch_plugin(QjsPluginManager *pm, const char * } if (found) { + // XXX Can arch plugins be properly removed with L-name? + pm->core->lang->cmdf (pm->core, "L-%s", ap->name); RVecArchPlugin_remove (&pm->arch_plugins, i, arch_plugin_fini, NULL); return true; } @@ -152,6 +158,25 @@ static bool plugin_manager_remove_arch_plugin(QjsPluginManager *pm, const char * return false; } +static bool plugin_manager_remove_plugin(QjsPluginManager *pm, const char *type, const char *plugin_id) { + r_return_val_if_fail (pm, false); + + if (R_STR_ISNOTEMPTY (type)) { + if (!strcmp (type, "core")) { + return plugin_manager_remove_core_plugin (pm, plugin_id); + } + + if (!strcmp (type, "arch")) { + return plugin_manager_remove_arch_plugin (pm, plugin_id); + } + } + + // TODO extend for bin / io / ... plugins + // invalid throw exception here + // return JS_ThrowRangeError(ctx, "invalid r2plugin type"); + return false; +} + static void plugin_manager_fini (QjsPluginManager *pm) { RVecCorePlugin_fini (&pm->core_plugins, core_plugin_fini, NULL); RVecArchPlugin_fini (&pm->arch_plugins, arch_plugin_fini, NULL); @@ -256,7 +281,7 @@ static JSValue r2plugin(JSContext *ctx, JSValueConst this_val, int argc, JSValue if (!strcmp (n, "core")) { return r2plugin_core_load (ctx, this_val, argc, argv); } else if (!strcmp (n, "arch")) { - return r2plugin_arch (ctx, this_val, argc, argv); + return r2plugin_arch_load (ctx, this_val, argc, argv); #if 0 } else if (!strcmp (n, "bin")) { return r2plugin_bin (ctx, this_val, argc, argv); @@ -272,17 +297,16 @@ static JSValue r2plugin(JSContext *ctx, JSValueConst this_val, int argc, JSValue } static JSValue r2plugin_unload(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { - if (argc != 1 || !JS_IsString (argv[0])) { + if (argc != 2 || !JS_IsString (argv[0]) || !JS_IsString (argv[1])) { return JS_ThrowRangeError (ctx, "r2.unload takes only one string as argument"); } JSRuntime *rt = JS_GetRuntime (ctx); QjsPluginManager *pm = JS_GetRuntimeOpaque (rt); - size_t plen; - const char *name = JS_ToCStringLen2 (ctx, &plen, argv[0], false); - pm->core->lang->cmdf (pm->core, "L-%s", name); - bool res = plugin_manager_remove_core_plugin (pm, name); - // invalid throw exception here - // return JS_ThrowRangeError(ctx, "invalid r2plugin type"); + + size_t len; + const char *type = JS_ToCStringLen2 (ctx, &len, argv[0], false); + const char *name_or_arch = JS_ToCStringLen2 (ctx, &len, argv[1], false); + const bool res = plugin_manager_remove_plugin (pm, type, name_or_arch); return JS_NewBool (ctx, res); } @@ -423,9 +447,9 @@ static JSModuleDef *js_init_module_os(JSContext *ctx) { } static const JSCFunctionListEntry js_r2_funcs[] = { - JS_CFUNC_DEF ("cmd", 1, r2cmd), + JS_CFUNC_DEF ("cmd", 1, r2cmd), // XXX deprecate, we have r2.cmd already JS_CFUNC_DEF ("plugin", 2, r2plugin), - JS_CFUNC_DEF ("unload", 1, r2plugin_unload), + JS_CFUNC_DEF ("unload", 2, r2plugin_unload), // JS_CFUNC_DEF ("cmdj", 1, r2cmdj), // can be implemented in js JS_CFUNC_DEF ("log", 1, r2log), JS_CFUNC_DEF ("error", 1, r2error), @@ -624,15 +648,14 @@ static bool fini(RLangSession *s) { QjsPluginManager *pm = s->plugin_data; - plugin_manager_fini (pm); - QjsContext *qctx = &pm->default_ctx; JS_FreeContext (qctx->ctx); qctx->ctx = NULL; + plugin_manager_fini (pm); + free (pm); s->plugin_data = NULL; - return true; } diff --git a/libr/lang/p/qjs/arch.c b/libr/lang/p/qjs/arch.c index 7e7297777d..4678a0a40a 100644 --- a/libr/lang/p/qjs/arch.c +++ b/libr/lang/p/qjs/arch.c @@ -20,6 +20,7 @@ } r2.plugin("arch", archPlugin); + r2.unload("arch", archPlugin); })() ``` @@ -140,7 +141,7 @@ static bool r2qjs_arch_decode(RArchSession *s, RAnalOp *op, RArchDecodeMask mask return JS_ToBool (ctx, res); } -static JSValue r2plugin_arch(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { +static JSValue r2plugin_arch_load(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { JSRuntime *rt = JS_GetRuntime (ctx); QjsPluginManager *pm = JS_GetRuntimeOpaque (rt); RCore *core = pm->core; @@ -203,7 +204,7 @@ static JSValue r2plugin_arch(JSContext *ctx, JSValueConst this_val, int argc, JS return JS_NewBool (ctx, false); } - plugin_manager_add_arch_plugin (pm, ap->arch, ctx, decode_func); + plugin_manager_add_arch_plugin (pm, ap->meta.name, ap->arch, ctx, decode_func); RLibStruct *lib = R_NEW0 (RLibStruct); if (!lib) { diff --git a/libr/lang/p/qjs/core.c b/libr/lang/p/qjs/core.c index e74283af44..09d324b74f 100644 --- a/libr/lang/p/qjs/core.c +++ b/libr/lang/p/qjs/core.c @@ -45,11 +45,11 @@ console.log("load true", r2.plugin("core", examplePlugin)); console.log("load true", r2.plugin("core", examplePlugin2)); console.log("load false", r2.plugin("core", examplePlugin)); - console.log("unload false", r2.unload("false")); - console.log("unload true", r2.unload("qjs-example")); - console.log("unload false", r2.unload("qjs-example")); + console.log("unload false", r2.unload("core", "false")); + console.log("unload true", r2.unload("core", "qjs-example")); + console.log("unload false", r2.unload("core", "qjs-example")); log("Plugins:"); - log(r2cmd("Lc")); + log(r2.cmd("Lc")); } })(); @@ -146,5 +146,5 @@ static JSValue r2plugin_core_load(JSContext *ctx, JSValueConst this_val, int arg lib->data = ap; lib->version = R2_VERSION; int ret = r_lib_open_ptr (pm->core->lib, ap->name, NULL, lib); - return JS_NewBool (ctx, ret == 0); + return JS_NewBool (ctx, ret == 1); } diff --git a/libr/main/rabin2.c b/libr/main/rabin2.c index 446c39c1f2..37d8159bd2 100644 --- a/libr/main/rabin2.c +++ b/libr/main/rabin2.c @@ -477,7 +477,7 @@ static int __lib_bin_cb(RLibPlugin *pl, void *user, void *data) { struct r_bin_plugin_t *hand = (struct r_bin_plugin_t *)data; RBin *bin = user; //printf(" * Added (dis)assembly plugin\n"); - r_bin_add (bin, hand); + r_bin_plugin_add (bin, hand); return true; } diff --git a/libr/main/ragg2.c b/libr/main/ragg2.c index d19c5b2936..64be59fa10 100644 --- a/libr/main/ragg2.c +++ b/libr/main/ragg2.c @@ -22,7 +22,7 @@ typedef struct { static int __lib_egg_cb(RLibPlugin *pl, void *user, void *data) { REggPlugin *hand = (REggPlugin *)data; REggState *es = (REggState *)user; - r_egg_add (es->e, hand); + r_egg_plugin_add (es->e, hand); return true; } diff --git a/libr/main/rasm2.c b/libr/main/rasm2.c index af4eb05e17..dbb934e049 100644 --- a/libr/main/rasm2.c +++ b/libr/main/rasm2.c @@ -635,7 +635,7 @@ static bool rasm_asm(RAsmState *as, const char *buf, ut64 offset, ut64 len, int static int __lib_anal_cb(RLibPlugin *pl, void *user, void *data) { RAnalPlugin *hand = (RAnalPlugin *)data; RAsmState *as = (RAsmState *)user; - r_anal_add (as->anal, hand); + r_anal_plugin_add (as->anal, hand); return true; } @@ -643,7 +643,7 @@ static int __lib_anal_cb(RLibPlugin *pl, void *user, void *data) { static int __lib_arch_cb(RLibPlugin *pl, void *user, void *data) { RArchPlugin *hand = (RArchPlugin *)data; RAsmState *as = (RAsmState *)user; - r_arch_add (as->anal->arch, hand); + r_arch_plugin_add (as->anal->arch, hand); return true; } diff --git a/libr/util/lib.c b/libr/util/lib.c index ac4619c857..8637b700c5 100644 --- a/libr/util/lib.c +++ b/libr/util/lib.c @@ -245,18 +245,20 @@ R_API int r_lib_close(RLib *lib, const char *file) { } // delete similar plugin name r_list_foreach (lib->plugins, iter, p) { + eprintf("similar p->file: %s\n", p->file); if (strstr (p->file, file)) { int ret = 0; if (p->handler && p->handler->destructor) { ret = p->handler->destructor (p, p->handler->user, p->data); } + eprintf("similar deleting: %s\n", p->file); free (p->file); r_list_delete (lib->plugins, iter); { - const char *fileName = r_str_rstr (file, R_SYS_DIR); - if (fileName) { - ht_pp_delete (lib->plugins_ht, fileName + 1); + const char *file_name = r_str_rstr (file, R_SYS_DIR); + if (file_name) { + ht_pp_delete (lib->plugins_ht, file_name + 1); } } return ret; diff --git a/test/db/cmd/cmd_js b/test/db/cmd/cmd_js index 337b8fed94..e6c2c97e76 100644 --- a/test/db/cmd/cmd_js +++ b/test/db/cmd/cmd_js @@ -1,4 +1,4 @@ -NAME=js tests +NAME=js tests, variable scoping FILE=- CMDS=<