diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/plugin-def.h | 11 | ||||
-rw-r--r-- | src/plugins/plugin-int.h | 15 | ||||
-rw-r--r-- | src/plugins/plugin.c | 147 | ||||
-rw-r--r-- | src/plugins/plugin.h | 3 |
4 files changed, 158 insertions, 18 deletions
diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h index 0c7ff1c..c1579b2 100644 --- a/src/plugins/plugin-def.h +++ b/src/plugins/plugin-def.h @@ -49,10 +49,12 @@ typedef enum _PluginAction PGA_DISASSEMBLE = (1 << 1), /* Désassemblage (non trivial) */ - PGA_CODE_PROCESS = (1 << 2), /* Traitement du code existant */ + PGA_DISASS_PROCESS = (1 << 2), /* Traitement niveau assembleur*/ + PGA_CODE_PROCESS = (1 << 3), /* Traitement du code existant */ + + PGA_DEBUGGER_ATTACH = (1 << 4), /* Activation d'un débogueur */ + PGA_DEBUGGER_DETACH = (1 << 5) /* Désactivation d'un débogueur*/ - PGA_DEBUGGER_ATTACH = (1 << 3), /* Activation d'un débogueur */ - PGA_DEBUGGER_DETACH = (1 << 4) /* Désactivation d'un débogueur*/ } PluginAction; @@ -64,9 +66,6 @@ typedef PluginType (* get_plugin_type_fc) (void); /* Fournit une indication sur le type d'opération(s) menée(s). */ //typedef PluginAction (* get_plugin_action_fc) (void); -/* Exécute une action définie sur un binaire chargé. */ -typedef bool (* execute_action_on_binary_fc) (GOpenidaBinary *, PluginAction); - /* PGA_FORMAT_MATCHER */ diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index a4f3cb6..56753e0 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -29,12 +29,16 @@ #include "plugin-def.h" +#include "../gui/panels/log.h" +/* Précise le nom associé au greffon. */ +typedef char * (* get_plugin_name_fc) (void); + /* Procède à l'initialisation du greffon */ -typedef bool (* init_plugin_fc) (GObject *); +typedef bool (* init_plugin_fc) (GPluginModule *, GObject *); /* Fournit une indication sur le type d'opération(s) menée(s). */ typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); @@ -42,6 +46,9 @@ typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); /* Identifie un format à associer à un contenu binaire. */ typedef MatchingFormatAction (* is_matching_fc) (const GPluginModule *, char **, bin_t **, off_t *); +/* Exécute une action définie sur un binaire chargé. */ +typedef bool (* execute_action_on_binary_fc) (const GPluginModule *, GOpenidaBinary *, PluginAction); + /* Exécute une action relative à un débogueur. */ typedef bool (* execute_on_debugger_fc) (const GPluginModule *, GBinaryDebugger *, PluginAction); @@ -53,6 +60,7 @@ struct _GPluginModule GModule *module; /* Abstration de manipulation */ + char *name; /* Nom associé au greffon */ PluginType type; /* Type(s) du greffon */ init_plugin_fc init; /* Procédure d'initialisation */ @@ -75,8 +83,11 @@ struct _GPluginModuleClass +/* Présente dans le journal un message simple. */ +void g_plugin_module_log_simple_message(const GPluginModule *, LogMessageType, const char *); - +/* Présente dans le journal un message complexe. */ +void g_plugin_module_log_variadic_message(const GPluginModule *, LogMessageType, const char *, ...); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 7521008..e769df6 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -26,7 +26,12 @@ #include <gmodule.h> +#include <libgen.h> +#include <malloc.h> +#include <stdarg.h> #include <stdbool.h> +#include <stdio.h> +#include <string.h> #include "plugin-int.h" @@ -98,22 +103,26 @@ static void g_plugin_module_init(GPluginModule *line) GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) { GPluginModule *result; /* Structure à retourner */ + get_plugin_name_fc get_name; /* Nom du greffon */ get_plugin_action_fc __get_type; /* Type(s) de greffon */ get_plugin_action_fc get_action; /* Actions du greffon */ - + char *dir; /* Répertoire modifiable */ result = g_object_new(G_TYPE_PLUGIN_MODULE, NULL); result->module = g_module_open(filename, G_MODULE_BIND_LAZY); + if (!result->module) goto bad_plugin; - if (!result->module) + if (!g_module_symbol(result->module, "get_plugin_name", (gpointer *)&get_name)) { - printf("err null mod\n"); - return NULL; - + log_variadic_message(LMT_ERROR, + _("No 'get_plugin_name' entry in plugin candidate '%s'"), + filename); + goto bad_plugin; } + result->name = get_name(); if (!g_module_symbol(result->module, "init_plugin", (gpointer *)&result->init)) { @@ -166,12 +175,21 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) - if (!result->init(ref)) - printf("Err loading pg\n"); - else printf("Loaded '%s' : ok (%p)\n", filename, result); + if (!result->init(result, ref)) + { + log_variadic_message(LMT_ERROR, _("Initialization of plugin '%s' failed !"), filename); + goto bad_plugin; + } + + dir = strdup(filename); + dir = dirname(dir); - return result; + log_variadic_message(LMT_PROCESS, _("Loaded the '<b>%s</b>' from the '<b>%s</b>' directory"), + strrchr(filename, G_DIR_SEPARATOR) + 1, dir); + free(dir); + + return result; bad_plugin: @@ -186,6 +204,115 @@ GPluginModule *g_plugin_module_new(const gchar *filename, GObject *ref) * * * Paramètres : plugin = greffon à consulter. * * * +* Description : Fournit le nom associé au greffon. * +* * +* Retour : Désignation humaine. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_plugin_module_get_name(const GPluginModule *plugin) +{ + return plugin->name; + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* msg = message à faire apparaître à l'écran. * +* * +* Description : Présente dans le journal un message simple. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_log_simple_message(const GPluginModule *plugin, LogMessageType type, const char *msg) +{ + size_t len; /* Taille tampon disponible */ + char *buffer; /* Tampon du msg reconstitué */ + + len = 1 + strlen(plugin->name) + 2 + strlen(msg) + 1; + buffer = calloc(len, sizeof(char)); + + strcpy(buffer, "["); + strcat(buffer, plugin->name); + strcat(buffer, "] "); + strcat(buffer, msg); + + log_simple_message(type, buffer); + + free(buffer); + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* type = espèce du message à ajouter. * +* fmt = format du message à faire apparaître à l'écran. * +* ... = éventuels arguments venant compléter le message. * +* * +* Description : Présente dans le journal un message complexe. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessageType type, const char *fmt, ...) +{ + size_t len; /* Taille tampon disponible */ + char *buffer; /* Tampon du msg reconstitué */ + int ret; /* Bilan d'une impression */ + char *ptr; /* Nouvelle allocation */ + va_list ap; /* Liste d'arguments variable */ + + len = VARIADIC_LOG_BUFSIZE; + buffer = calloc(len, sizeof(char)); + + while (buffer != NULL) + { + va_start(ap, fmt); + ret = vsnprintf(buffer, len, fmt, ap); + va_end(ap); + + if (ret >= 0 && ret < len) break; + + else + { + if (ret > -1) len += 1; /* glibc 2.1 */ + else len *= 2; /* glibc 2.0 */ + + if ((ptr = realloc(buffer, len)) == NULL) + { + free(buffer); + buffer = NULL; + } + else buffer = ptr; + + } + + } + + g_plugin_module_log_simple_message(plugin, type, buffer); + + free(buffer); + +} + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* * * Description : Indique les opérations offertes par un greffon donné. * * * * Retour : Action(s) offerte(s) par le greffon. * @@ -262,7 +389,7 @@ MatchingFormatAction g_plugin_module_is_matching(const GPluginModule *plugin, ch bool g_plugin_module_execute_action_on_binary(const GPluginModule *plugin, GOpenidaBinary *binary, PluginAction action) { - return plugin->exec_on_bin(binary, action); + return plugin->exec_on_bin(plugin, binary, action); } diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index dbd27fd..aa90ee1 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -54,6 +54,9 @@ GType g_plugin_module_get_type(void); /* Crée un module pour un greffon donné. */ GPluginModule *g_plugin_module_new(const gchar *, GObject *); +/* Fournit le nom associé au greffon. */ +const char *g_plugin_module_get_name(const GPluginModule *); + /* Indique les opérations offertes par un greffon donné. */ PluginAction g_plugin_module_get_action(const GPluginModule *); |