From ec6aa436f4a1ae486feb7a88b2b8e793b59674d4 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Thu, 16 Oct 2014 23:01:32 +0000 Subject: Allowed log messages from every thread contexts. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@415 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 13 +++ src/analysis/binary.c | 4 +- src/analysis/db/client.c | 21 +++-- src/analysis/db/client.h | 2 +- src/gui/panels/log.c | 218 +++++++++++++++++++++++++++++++++++------------ 5 files changed, 195 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index fef9d17..36b047b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +14-10-17 Cyrille Bagard + + * src/analysis/binary.c: + Tansmit a binary name to clients. + + * src/analysis/db/client.c: + * src/analysis/db/client.h: + Store the humain name of handled binaries and display a message when + the archives are saved. + + * src/gui/panels/log.c: + Allow log messages from every thread contexts. + 14-10-16 Cyrille Bagard * src/analysis/binary.c: 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 +#include + + #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 #include #include +#include #include @@ -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; } -- cgit v0.11.2-87-g4458