summaryrefslogtreecommitdiff
path: root/src/analysis/contents/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/contents/file.c')
-rw-r--r--src/analysis/contents/file.c220
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;
-
-}