summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-04-12 22:00:05 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-04-12 22:00:05 (GMT)
commitb4cbeedf6ed4e04dd85c92e8345b4cb8dcaab27d (patch)
treeabfbc921202792ae9e37e8070d56e08a7022c8b9 /src/common
parent63874c59241aeaaac5a5bc3f0f9f02433f7c76f8 (diff)
Added features to dump compressed content into memory.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/compression.c53
-rw-r--r--src/common/compression.h6
2 files changed, 59 insertions, 0 deletions
diff --git a/src/common/compression.c b/src/common/compression.c
index 982ac6a..df0ac6e 100644
--- a/src/common/compression.c
+++ b/src/common/compression.c
@@ -26,9 +26,11 @@
#include <fcntl.h>
#include <stdio.h>
+#include <string.h>
#include "io.h"
+#include "../analysis/contents/memory.h"
@@ -175,3 +177,54 @@ bool dump_archive_entry_into_file(struct archive *input, struct archive_entry *e
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : intput = archive dont le contenu est à extraire. *
+* entry = entrée de l'archive à extraire. *
+* *
+* Description : Extrait un élement d'une archive. *
+* *
+* Retour : Nouveau contenu volatile ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GBinContent *dump_archive_entry_into_memory(struct archive *input, struct archive_entry *entry)
+{
+ GBinContent *result; /* Contenu à retourner */
+ bin_t *full_data; /* Données rassemblées */
+ phys_t full_size; /* Somme de toutes les tailles */
+ const void *buff; /* Tampon de copie */
+ size_t size; /* Quantité copiée */
+ __LA_INT64_T offset; /* Position de lecture */
+ int ret; /* Bilan d'un appel */
+
+ result = NULL;
+
+ full_data = NULL;
+ full_size = 0;
+
+ for (ret = archive_read_data_block(input, &buff, &size, &offset);
+ ret == ARCHIVE_OK;
+ ret = archive_read_data_block(input, &buff, &size, &offset))
+ {
+ full_data = realloc(full_data, full_size + size);
+
+ memcpy(full_data + full_size, buff, size);
+
+ full_size += size;
+
+ }
+
+ if (ret == ARCHIVE_EOF)
+ result = g_memory_content_new(full_data, full_size);
+
+ if (full_data != NULL)
+ free(full_data);
+
+ return result;
+
+}
diff --git a/src/common/compression.h b/src/common/compression.h
index 632147a..f038ff6 100644
--- a/src/common/compression.h
+++ b/src/common/compression.h
@@ -30,6 +30,9 @@
#include <stdbool.h>
+#include "../analysis/content.h"
+
+
/* Codes de retour pour la compression */
typedef enum _CPError
@@ -47,6 +50,9 @@ CPError add_file_into_archive(struct archive *, const char *, const char *);
/* Extrait un élement d'une archive. */
bool dump_archive_entry_into_file(struct archive *, struct archive_entry *, const char *);
+/* Extrait un élement d'une archive. */
+GBinContent *dump_archive_entry_into_memory(struct archive *, struct archive_entry *);
+
#endif /* _COMMON_COMPRESSION_H */