summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/plugin-def.h11
-rw-r--r--src/plugins/plugin-int.h15
-rw-r--r--src/plugins/plugin.c147
-rw-r--r--src/plugins/plugin.h3
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 *);