diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-04-12 22:00:05 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-04-12 22:00:05 (GMT) |
commit | b4cbeedf6ed4e04dd85c92e8345b4cb8dcaab27d (patch) | |
tree | abfbc921202792ae9e37e8070d56e08a7022c8b9 | |
parent | 63874c59241aeaaac5a5bc3f0f9f02433f7c76f8 (diff) |
Added features to dump compressed content into memory.
-rw-r--r-- | src/common/compression.c | 53 | ||||
-rw-r--r-- | src/common/compression.h | 6 |
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 */ |