From f24444a7b1277a914572ab0fb1740b48eb991ebb Mon Sep 17 00:00:00 2001 From: atxr Date: Tue, 6 Feb 2024 20:13:46 +0100 Subject: [PATCH] Get eocd and cdh entries --- libmineziper/include/libmineziper_zip.h | 3 ++- libmineziper/src/libmineziper_zip.c | 30 ++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/libmineziper/include/libmineziper_zip.h b/libmineziper/include/libmineziper_zip.h index 4b41d1f..223420e 100644 --- a/libmineziper/include/libmineziper_zip.h +++ b/libmineziper/include/libmineziper_zip.h @@ -68,7 +68,8 @@ typedef struct zip EOCD* eocd; } zip; -void find_cdh(raw* raw, zip* out); +void get_eocd(raw* raw, zip* out); +void get_cdh(raw* raw, zip* out); void parse_zip(char* filename, zip* out); #endif \ No newline at end of file diff --git a/libmineziper/src/libmineziper_zip.c b/libmineziper/src/libmineziper_zip.c index 03de455..95803c9 100644 --- a/libmineziper/src/libmineziper_zip.c +++ b/libmineziper/src/libmineziper_zip.c @@ -1,20 +1,40 @@ #include "libmineziper_zip.h" #include -void find_cdh(raw* raw, zip* out) +void get_eocd(raw* raw, zip* out) { - if (raw->size < START_CDH_SEARCH) + if (raw->size < START_EOCD_SEARCH) return; - char* se = raw->buf + raw->size - START_CDH_SEARCH; + char* se = raw->buf + raw->size - START_EOCD_SEARCH; while (se > raw->buf) { - if (strcmp(se, CDH_MB) == 0) + if (strcmp(se, EOCD_SIG) == 0) { - out->cd = (CDH*) se; + out->eocd = se; + out->cdh = (CDH**) malloc(out->eocd->number_of_entries * sizeof(CDH*)); break; } se--; } +} + +void get_cdh(raw* raw, zip* out) +{ + if (out->eocd == 0 || out->eocd->off_cdh == 0) + { + printf(" error: No EOCD found.\n"); + exit(-1); + } + + out->cd = raw->buf + out->eocd->off_cdh; + + CDH* cdh = out->cd; + for (int i = 0; i < out->eocd->number_of_entries; i++) + { + out->cdh[i] = cdh; + cdh = (CDH*) (((char*) cdh) + sizeof(CDH) + cdh->filename_length + + cdh->extra_field_length + cdh->file_comment_length); + } } \ No newline at end of file