diff options
Diffstat (limited to 'src/analysis/contents/file.c')
-rw-r--r-- | src/analysis/contents/file.c | 220 |
1 files changed, 142 insertions, 78 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c index 78bd981..545d869 100644 --- a/src/analysis/contents/file.c +++ b/src/analysis/contents/file.c @@ -25,6 +25,7 @@ #include <fcntl.h> +#include <libgen.h> #include <malloc.h> #include <string.h> #include <unistd.h> @@ -32,29 +33,14 @@ #include <sys/stat.h> -#include "memory-int.h" -#include "../content-int.h" +#include "file-int.h" #include "../db/misc/rlestr.h" #include "../storage/serialize-int.h" #include "../../core/logs.h" -/* Contenu de données binaires issues d'un fichier (instance) */ -struct _GFileContent -{ - GMemoryContent parent; /* A laisser en premier */ - - char *filename; /* Fichier chargé en mémoire */ - -}; - -/* Contenu de données binaires issues d'un fichier (classe) */ -struct _GFileContentClass -{ - GMemoryContentClass parent; /* A laisser en premier */ - -}; +/* -------------------------- ENSEMBLE DE DONNEES BINAIRES -------------------------- */ /* Initialise la classe des contenus de données binaires. */ @@ -63,15 +49,20 @@ static void g_file_content_class_init(GFileContentClass *); /* Initialise une instance de contenu de données binaires. */ static void g_file_content_init(GFileContent *); -/* Procède à l'initialisation de l'interface de sérialisation. */ -static void g_file_content_serializable_init(GSerializableObjectInterface *); - /* Supprime toutes les références externes. */ static void g_file_content_dispose(GFileContent *); /* Procède à la libération totale de la mémoire. */ static void g_file_content_finalize(GFileContent *); + + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + + +/* Fournit le nom associé au contenu binaire. */ +static char *g_file_content_describe(const GFileContent *, bool); + /* Charge un contenu depuis une mémoire tampon. */ static bool g_file_content_load(GFileContent *, GObjectStorage *, packed_buffer_t *); @@ -80,9 +71,13 @@ static bool g_file_content_store(const GFileContent *, GObjectStorage *, packed_ +/* ---------------------------------------------------------------------------------- */ +/* ENSEMBLE DE DONNEES BINAIRES */ +/* ---------------------------------------------------------------------------------- */ + + /* Indique le type défini par la GLib pour les contenus de données. */ -G_DEFINE_TYPE_WITH_CODE(GFileContent, g_file_content, G_TYPE_MEMORY_CONTENT, - G_IMPLEMENT_INTERFACE(G_TYPE_SERIALIZABLE_OBJECT, g_file_content_serializable_init)); +G_DEFINE_TYPE(GFileContent, g_file_content, G_TYPE_MEMORY_CONTENT); /****************************************************************************** @@ -100,12 +95,20 @@ G_DEFINE_TYPE_WITH_CODE(GFileContent, g_file_content, G_TYPE_MEMORY_CONTENT, static void g_file_content_class_init(GFileContentClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GBinContentClass *content; /* Version parente de la classe*/ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_file_content_dispose; object->finalize = (GObjectFinalizeFunc)g_file_content_finalize; + content = G_BIN_CONTENT_CLASS(klass); + + content->describe = (describe_content_fc)g_file_content_describe; + + content->load = (load_content_cb)g_file_content_load; + content->store = (store_content_cb)g_file_content_store; + } @@ -124,15 +127,16 @@ static void g_file_content_class_init(GFileContentClass *klass) static void g_file_content_init(GFileContent *content) { content->filename = NULL; + content->fd = -1; } /****************************************************************************** * * -* Paramètres : iface = interface GLib à initialiser. * +* Paramètres : content = instance d'objet GLib à traiter. * * * -* Description : Procède à l'initialisation de l'interface de sérialisation. * +* Description : Supprime toutes les références externes. * * * * Retour : - * * * @@ -140,10 +144,9 @@ static void g_file_content_init(GFileContent *content) * * ******************************************************************************/ -static void g_file_content_serializable_init(GSerializableObjectInterface *iface) +static void g_file_content_dispose(GFileContent *content) { - iface->load = (load_serializable_object_cb)g_file_content_load; - iface->store = (store_serializable_object_cb)g_file_content_store; + G_OBJECT_CLASS(g_file_content_parent_class)->dispose(G_OBJECT(content)); } @@ -152,7 +155,7 @@ static void g_file_content_serializable_init(GSerializableObjectInterface *iface * * * Paramètres : content = instance d'objet GLib à traiter. * * * -* Description : Supprime toutes les références externes. * +* Description : Procède à la libération totale de la mémoire. * * * * Retour : - * * * @@ -160,55 +163,78 @@ static void g_file_content_serializable_init(GSerializableObjectInterface *iface * * ******************************************************************************/ -static void g_file_content_dispose(GFileContent *content) +static void g_file_content_finalize(GFileContent *content) { - G_OBJECT_CLASS(g_file_content_parent_class)->dispose(G_OBJECT(content)); + GMemoryContent *base; /* Structure parente */ + + free(content->filename); + + if (content->fd != -1) + { + base = G_MEMORY_CONTENT(content); + munmap(base->data, base->length); + + close(content->fd); + + } + + G_OBJECT_CLASS(g_file_content_parent_class)->finalize(G_OBJECT(content)); } + + /****************************************************************************** * * -* Paramètres : content = instance d'objet GLib à traiter. * +* Paramètres : filename = chemin d'accès au fichier à charger. * * * -* Description : Procède à la libération totale de la mémoire. * +* Description : Charge en mémoire le contenu d'un fichier donné. * * * -* Retour : - * +* Retour : Représentation de contenu à manipuler ou NULL en cas d'échec.* * * * Remarques : - * * * ******************************************************************************/ -static void g_file_content_finalize(GFileContent *content) +GBinContent *g_file_content_new(const char *filename) { - free(content->filename); + GBinContent *result; /* Structure à retourner */ - G_OBJECT_CLASS(g_file_content_parent_class)->finalize(G_OBJECT(content)); + result = g_object_new(G_TYPE_FILE_CONTENT, NULL); + + if (!g_file_content_create(G_FILE_CONTENT(result), filename)) + g_clear_object(&result); + + return result; } /****************************************************************************** * * -* Paramètres : filename = chemin d'accès au fichier à charger. * +* Paramètres : content = instance à initialiser pleinement. * +* filename = chemin d'accès au fichier à charger. * * * -* Description : Charge en mémoire le contenu d'un fichier donné. * +* Description : Met en place un contenu d'un fichier donné. * * * -* Retour : Représentation de contenu à manipuler ou NULL en cas d'échec.* +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_file_content_new(const char *filename) +bool g_file_content_create(GFileContent *content, const char *filename) { - GFileContent *result; /* Structure à retourner */ + bool result; /* Bilan à retourner */ int fd; /* Descripteur du fichier */ struct stat info; /* Informations sur le fichier */ int ret; /* Bilan d'un appel */ - void *content; /* Contenu brut du fichier */ + void *data; /* Contenu brut du fichier */ GMemoryContent *base; /* Structure parente */ + result = false; + /* Récupération des données */ fd = open(filename, O_RDONLY); @@ -226,8 +252,8 @@ GBinContent *g_file_content_new(const char *filename) goto file_error; } - content = mmap(NULL, info.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (content == MAP_FAILED) + data = mmap(NULL, info.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (data == MAP_FAILED) { close(fd); LOG_ERROR_N("mmap"); @@ -236,25 +262,86 @@ GBinContent *g_file_content_new(const char *filename) /* Constitution du contenu officiel */ - result = g_object_new(G_TYPE_FILE_CONTENT, NULL); + content->filename = strdup(filename); - result->filename = strdup(filename); + base = G_MEMORY_CONTENT(content); - base = G_MEMORY_CONTENT(result); + base->data = data; + base->length = info.st_size; - base->data = malloc(info.st_size); - memcpy(base->data, content, info.st_size); + result = true; - base->length = info.st_size; + file_error: - munmap(content, info.st_size); - close(fd); + return result; - return G_BIN_CONTENT(result); +} - file_error: - return NULL; +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir consulter. * +* * +* Description : Fournit le nom de fichier associé au contenu binaire. * +* * +* Retour : Chemin d'accès au contenu binaire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_file_content_get_filename(const GFileContent *content) +{ + char *result; /* Chemin d'accès à retourner */ + + result = content->filename; + + return result; + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* IMPLEMENTATION DES FONCTIONS DE CLASSE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à consulter. * +* full = précise s'il s'agit d'une version longue ou non. * +* * +* Description : Fournit le nom associé au contenu binaire. * +* * +* Retour : Nom de fichier avec chemin absolu au besoin. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static char *g_file_content_describe(const GFileContent *content, bool full) +{ + char *result; /* Description à retourner */ + char *tmp; /* Copie modifiable */ + char *base; /* Description à recopier */ + + if (full) + result = strdup(content->filename); + + else + { + tmp = strdup(content->filename); + + base = basename(tmp); + + result = strdup(base); + + free(tmp); + + } + + return result; } @@ -341,26 +428,3 @@ static bool g_file_content_store(const GFileContent *content, GObjectStorage *st return result; } - - -/****************************************************************************** -* * -* Paramètres : content = contenu binaire à venir consulter. * -* * -* Description : Fournit le nom de fichier associé au contenu binaire. * -* * -* Retour : Chemin d'accès au contenu binaire. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_file_content_get_filename(const GFileContent *content) -{ - char *result; /* Chemin d'accès à retourner */ - - result = content->filename; - - return result; - -} |