summaryrefslogtreecommitdiffstats
path: root/src/ipsw.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2012-07-17 19:00:33 +0200
committerGravatar Nikias Bassen2012-07-17 19:00:33 +0200
commit67bb07bb55577970761b51effa9e17b05b86a2a2 (patch)
treed8d298d1830ad438db4f81d8c22114616d63d88c /src/ipsw.c
parentb32de647e7942147a64b55df1b4e9fc331119ef4 (diff)
downloadidevicerestore-67bb07bb55577970761b51effa9e17b05b86a2a2.tar.gz
idevicerestore-67bb07bb55577970761b51effa9e17b05b86a2a2.tar.bz2
ipsw: add function ipsw_get_file_size() to get uncompressed file size
Diffstat (limited to 'src/ipsw.c')
-rw-r--r--src/ipsw.c26
1 files changed, 26 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) {