diff options
Diffstat (limited to 'src/analysis/contents/restricted.c')
-rw-r--r-- | src/analysis/contents/restricted.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/analysis/contents/restricted.c b/src/analysis/contents/restricted.c index e342242..1f996d1 100644 --- a/src/analysis/contents/restricted.c +++ b/src/analysis/contents/restricted.c @@ -69,6 +69,9 @@ static void g_restricted_content_finalize(GRestrictedContent *); /* Calcule une empreinte unique (SHA256) pour les données. */ static void g_restricted_content_compute_checksum(GRestrictedContent *, GChecksum *); +/* Avance la tête de lecture d'une certaine quantité de données. */ +static bool g_restricted_content_seek(const GRestrictedContent *, vmpa2t *, phys_t); + /* Donne accès à une portion des données représentées. */ static const bin_t *g_restricted_content_get_raw_access(const GRestrictedContent *, vmpa2t *, phys_t); @@ -161,6 +164,8 @@ static void g_restricted_content_interface_init(GBinContentInterface *iface) { iface->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum; + iface->seek = (seek_fc)g_restricted_content_seek; + iface->get_raw_access = (get_raw_access_fc)g_restricted_content_get_raw_access; iface->read_raw = (read_raw_fc)g_restricted_content_read_raw; @@ -286,6 +291,48 @@ static void g_restricted_content_compute_checksum(GRestrictedContent *content, G * * * Paramètres : content = contenu binaire à venir lire. * * addr = position de la tête de lecture. * +* length = quantité d'octets à provisionner. * +* * +* Description : Avance la tête de lecture d'une certaine quantité de données.* +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_restricted_content_seek(const GRestrictedContent *content, vmpa2t *addr, phys_t length) +{ + bool result; /* Bilan de lecture à renvoyer */ + vmpa2t old; /* Copie de sauvegarde */ + + if (!mrange_contains_addr(&content->range, addr)) + { + result = false; + goto bad_range; + } + + copy_vmpa(&old, addr); + + result = g_binary_content_seek(content->internal, addr, length); + + if (result && !mrange_contains_addr_inclusive(&content->range, addr)) + { + copy_vmpa(addr, &old); + result = false; + } + + bad_range: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu binaire à venir lire. * +* addr = position de la tête de lecture. * * length = quantité d'octets à lire. * * * * Description : Donne accès à une portion des données représentées. * |