summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ipsw.c26
-rw-r--r--src/ipsw.h2
2 files changed, 28 insertions, 0 deletions
diff --git a/src/ipsw.c b/src/ipsw.c
index 789af60..84547b3 100644
--- a/src/ipsw.c
+++ b/src/ipsw.c
@@ -56,6 +56,32 @@ ipsw_archive* ipsw_open(const char* ipsw) {
return archive;
}
+int ipsw_get_file_size(const char* ipsw, const char* infile, off_t* size) {
+ ipsw_archive* archive = ipsw_open(ipsw);
+ if (archive == NULL || archive->zip == NULL) {
+ error("ERROR: Invalid archive\n");
+ return -1;
+ }
+
+ int zindex = zip_name_locate(archive->zip, infile, 0);
+ if (zindex < 0) {
+ error("ERROR: zip_name_locate: %s\n", infile);
+ return -1;
+ }
+
+ struct zip_stat zstat;
+ zip_stat_init(&zstat);
+ if (zip_stat_index(archive->zip, zindex, 0, &zstat) != 0) {
+ error("ERROR: zip_stat_index: %s\n", infile);
+ return -1;
+ }
+
+ *size = zstat.size;
+
+ ipsw_close(archive);
+ return 0;
+}
+
int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfile) {
ipsw_archive* archive = ipsw_open(ipsw);
if (archive == NULL || archive->zip == NULL) {
diff --git a/src/ipsw.h b/src/ipsw.h
index c61e73d..50309bc 100644
--- a/src/ipsw.h
+++ b/src/ipsw.h
@@ -37,6 +37,8 @@ typedef struct {
unsigned char* data;
} ipsw_file;
+int ipsw_get_file_size(const char* ipsw, const char* infile, off_t* size);
+int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfile);
int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer, uint32_t* psize);
int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest, int *tss_enabled);
int ipsw_extract_restore_plist(const char* ipsw, plist_t* restore_plist);