summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-10-16 23:01:32 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-10-16 23:01:32 (GMT)
commitec6aa436f4a1ae486feb7a88b2b8e793b59674d4 (patch)
tree49798a3502c3e4c807d48a41c11289850024959a /src
parent6d34dbbb00da0c276261d0e1ce4bf862f22fd8e0 (diff)
Allowed log messages from every thread contexts.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@415 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r--src/analysis/binary.c4
-rw-r--r--src/analysis/db/client.c21
-rw-r--r--src/analysis/db/client.h2
-rw-r--r--src/gui/panels/log.c218
4 files changed, 182 insertions, 63 deletions
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index 0fcbe0d..18dca8c 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -281,7 +281,9 @@ GLoadedBinary *g_loaded_binary_new_from_xml(xmlXPathContextPtr context, const ch
g_checksum_update(result->checksum, result->bin_data, result->bin_length);
- result->local = g_db_client_new(g_loaded_binary_get_cheksum(result), result->collections);
+ result->local = g_db_client_new(g_loaded_binary_get_name(result, false),
+ g_loaded_binary_get_cheksum(result),
+ result->collections);
if (!g_generic_config_get_value(get_main_configuration(), MPK_LOCAL_HOST, &host))
diff --git a/src/analysis/db/client.c b/src/analysis/db/client.c
index 71df99c..c19a39e 100644
--- a/src/analysis/db/client.c
+++ b/src/analysis/db/client.c
@@ -32,6 +32,9 @@
#include <sys/socket.h>
+#include <i18n.h>
+
+
#include "protocol.h"
#include "misc/rlestr.h"
#include "../../common/io.h"
@@ -44,6 +47,8 @@ struct _GDbClient
{
GObject parent; /* A laisser en premier */
+ const char *name; /* Désignation du binaire */
+
rle_string hash; /* Empreinte du binaire lié */
GList *collections; /* Collections d'un binaire */
@@ -145,7 +150,8 @@ static void g_db_client_finalize(GDbClient *client)
/******************************************************************************
* *
-* Paramètres : hash = empreinte d'un binaire en cours d'analyse. *
+* Paramètres : name = désignation humaine du binaire associé. *
+* hash = empreinte d'un binaire en cours d'analyse. *
* collections = ensemble de collections existantes. *
* *
* Description : Prépare un client pour une connexion à une BD. *
@@ -156,12 +162,14 @@ static void g_db_client_finalize(GDbClient *client)
* *
******************************************************************************/
-GDbClient *g_db_client_new(const char *hash, GDbCollection *collections)
+GDbClient *g_db_client_new(const char *name, const char *hash, GDbCollection *collections)
{
GDbClient *result; /* Adresse à retourner */
result = g_object_new(G_TYPE_DB_CLIENT, NULL);
+ result->name = name;
+
set_rle_string(&result->hash, hash);
result->collections = collections;
@@ -361,9 +369,12 @@ static void *g_db_client_update(GDbClient *client)
error = be32toh(val32);
- printf("## CLIENT ## Saved ? %d\n", error);
-
-
+ if (error == DBE_NONE)
+ log_variadic_message(LMT_INFO, _("Archive saved for binary '%s'"),
+ client->name);
+ else
+ log_variadic_message(LMT_ERROR, _("Failed to save the archive for binary '%s'"),
+ client->name);
break;
diff --git a/src/analysis/db/client.h b/src/analysis/db/client.h
index 963744b..66ebb08 100644
--- a/src/analysis/db/client.h
+++ b/src/analysis/db/client.h
@@ -51,7 +51,7 @@ typedef struct _GDbClientClass GDbClientClass;
GType g_db_client_get_type(void);
/* Prépare un client pour une connexion à une BD. */
-GDbClient *g_db_client_new(const char *, GDbCollection *);
+GDbClient *g_db_client_new(const char *, const char *, GDbCollection *);
/* Démarre la connexion à la base de données. */
bool g_db_client_start(GDbClient *, const char *, unsigned short, const char *);
diff --git a/src/gui/panels/log.c b/src/gui/panels/log.c
index 883c85c..3e56519 100644
--- a/src/gui/panels/log.c
+++ b/src/gui/panels/log.c
@@ -28,6 +28,7 @@
#include <malloc.h>
#include <stdarg.h>
#include <stdio.h>
+#include <string.h>
#include <gtk/gtk.h>
@@ -43,10 +44,33 @@ typedef enum _LogColumn
} LogColumn;
+/* Paramètres à transmettre pour un affichage */
+typedef struct _log_data
+{
+ GPanelItem *item; /* Intermédiaire mis en place */
+ LogMessageType type; /* Type de message à afficher */
+ char *msg; /* Contenu du message */
+
+} log_data;
+
+/* Paramètres à transmettre pour un défilement */
+typedef struct _scroll_data
+{
+ GtkTreeView *treeview; /* Affichage de la liste */
+ GtkTreePath *path; /* Chemin d'accès à cibler */
+
+} scroll_data;
+
/* Construit le panneau d'affichage des messages système. */
static GtkWidget *build_log_panel(void);
+/* Affiche un message dans le journal des messages système. */
+static void _log_simple_message(LogMessageType, char *);
+
+/* Affiche un message dans le journal des messages système. */
+static gboolean log_message(log_data *);
+
/******************************************************************************
@@ -149,126 +173,208 @@ static GtkWidget *build_log_panel(void)
void log_simple_message(LogMessageType type, const char *msg)
{
+ _log_simple_message(type, strdup(msg));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = espèce du message à ajouter. *
+* msg = message à faire apparaître à l'écran. *
+* *
+* Description : Affiche un message dans le journal des messages système. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void _log_simple_message(LogMessageType type, char *msg)
+{
GPanelItem *item; /* Intermédiaire mis en place */
+ log_data *data; /* Paramètres à joindre */
+
+ item = g_panel_item_get(PANEL_LOG_ID);
+
+ data = (log_data *)calloc(1, sizeof(log_data));
+
+ data->item = item;
+ data->type = type;
+ data->msg = msg;
+
+ g_object_ref(G_OBJECT(data->item));
+
+ g_main_context_invoke(NULL, (GSourceFunc)log_message, data);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : type = espèce du message à ajouter. *
+* fmt = format du message à faire apparaître à l'écran. *
+* ... = éventuels arguments venant compléter le message. *
+* *
+* Description : Affiche un message dans le journal des messages système. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void log_variadic_message(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;
+
+ }
+
+ }
+
+ _log_simple_message(type, buffer);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : data = paramètres destinés à l'affichage d'un message. *
+* *
+* Description : Affiche un message dans le journal des messages système. *
+* *
+* Retour : - *
+* *
+* Remarques : Cette fonction, et c'est tout son intérêt, est toujours *
+* exécutée dans le contexte GTK principal. *
+* *
+******************************************************************************/
+
+static gboolean log_message(log_data *data)
+{
GtkWidget *panel; /* Panneau à traiter */
GtkTreeStore *store; /* Modèle de gestion */
GtkTreeIter iter; /* Point d'insertion */
GtkTreeView *treeview; /* Affichage de la liste */
GtkTreePath *path; /* Chemin d'accès à la ligne */
+ scroll_data *sdata; /* Paramètres de défilement */
- item = g_panel_item_get(PANEL_LOG_ID);
- panel = g_editor_item_get_widget(G_EDITOR_ITEM(item));
+ /* Mise en place du message */
+
+ panel = g_editor_item_get_widget(G_EDITOR_ITEM(data->item));
store = g_object_get_data(G_OBJECT(panel), "store");
gtk_tree_store_append(store, &iter, NULL);
- switch (type)
+ switch (data->type)
{
case LMT_INFO:
gtk_tree_store_set(store, &iter,
LGC_PICTURE, "gtk-info",
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
case LMT_BAD_BINARY:
gtk_tree_store_set(store, &iter,
LGC_PICTURE, "gtk-dialog-warning",
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
case LMT_PROCESS:
gtk_tree_store_set(store, &iter,
LGC_PICTURE, "gtk-execute",
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
case LMT_ERROR:
gtk_tree_store_set(store, &iter,
LGC_PICTURE, "gtk-dialog-error",
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
case LMT_WARNING:
gtk_tree_store_set(store, &iter,
LGC_PICTURE, "gtk-dialog-warning",
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
default:
gtk_tree_store_set(store, &iter,
- LGC_STRING, msg,
+ LGC_STRING, data->msg,
-1);
break;
}
- treeview = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(panel), "treeview"));
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+ /* Défilement pour pointer à l'affichage */
- gtk_tree_view_scroll_to_cell(treeview, path, NULL, FALSE, 0.0, 0.0);
+ gboolean wait_for_scrolling(scroll_data *_data)
+ {
+ gtk_tree_view_scroll_to_cell(_data->treeview, _data->path, NULL, FALSE, 0.0, 0.0);
- gtk_tree_path_free(path);
+ g_object_unref(G_OBJECT(_data->treeview));
+ gtk_tree_path_free(_data->path);
-}
+ free(_data);
+ return G_SOURCE_REMOVE;
-/******************************************************************************
-* *
-* Paramètres : type = espèce du message à ajouter. *
-* fmt = format du message à faire apparaître à l'écran. *
-* ... = éventuels arguments venant compléter le message. *
-* *
-* Description : Affiche un message dans le journal des messages système. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ }
-void log_variadic_message(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 */
+ treeview = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(panel), "treeview"));
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
- len = VARIADIC_LOG_BUFSIZE;
- buffer = calloc(len, sizeof(char));
+ sdata = (scroll_data *)calloc(1, sizeof(log_data));
- while (buffer != NULL)
- {
- va_start(ap, fmt);
- ret = vsnprintf(buffer, len, fmt, ap);
- va_end(ap);
+ sdata->treeview = treeview;
+ sdata->path = path;
- if (ret >= 0 && ret < len) break;
+ g_object_ref(G_OBJECT(sdata->treeview));
- else
- {
- if (ret > -1) len += 1; /* glibc 2.1 */
- else len *= 2; /* glibc 2.0 */
+ g_idle_add((GSourceFunc)wait_for_scrolling, sdata);
- if ((ptr = realloc(buffer, len)) == NULL)
- {
- free(buffer);
- buffer = NULL;
- }
- else buffer = ptr;
+ /* Nettoyage de la mémoire */
- }
+ g_object_unref(G_OBJECT(data->item));
- }
+ free(data->msg);
- log_simple_message(type, buffer);
+ free(data);
- free(buffer);
+ return G_SOURCE_REMOVE;
}