From bfcd784574ace78f9923213e3d260302d28b54c8 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Fri, 9 Jul 2010 16:35:17 +0200 Subject: Refactor manifest extraction --- src/idevicerestore.c | 2 +- src/idevicerestore.h | 1 - src/ipsw.c | 22 ++++++++++++++++++++++ src/ipsw.h | 2 ++ 4 files changed, 25 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/idevicerestore.c b/src/idevicerestore.c index dde163d..6b3dee4 100644 --- a/src/idevicerestore.c +++ b/src/idevicerestore.c @@ -149,7 +149,7 @@ int main(int argc, char* argv[]) { // extract buildmanifest plist_t buildmanifest = NULL; info("Extracting BuildManifest from IPSW\n"); - if (extract_buildmanifest(client, ipsw, &buildmanifest) < 0) { + if (ipsw_extract_build_manifest(ipsw, &buildmanifest) < 0) { error("ERROR: Unable to extract BuildManifest from %s\n", ipsw); return -1; } diff --git a/src/idevicerestore.h b/src/idevicerestore.h index f42ed6f..27128a7 100644 --- a/src/idevicerestore.h +++ b/src/idevicerestore.h @@ -38,7 +38,6 @@ int get_build_count(plist_t buildmanifest); int get_ecid(struct idevicerestore_client_t* client, uint64_t* ecid); int get_bdid(struct idevicerestore_client_t* client, uint32_t* bdid); int get_cpid(struct idevicerestore_client_t* client, uint32_t* cpid); -int extract_buildmanifest(struct idevicerestore_client_t* client, const char* ipsw, plist_t* buildmanifest); plist_t get_build_identity(struct idevicerestore_client_t* client, plist_t buildmanifest, uint32_t identity); int get_shsh_blobs(struct idevicerestore_client_t* client, uint64_t ecid, plist_t build_identity, plist_t* tss); int extract_filesystem(struct idevicerestore_client_t* client, const char* ipsw, plist_t buildmanifest, char** filesystem); diff --git a/src/ipsw.c b/src/ipsw.c index f08e2fd..9cd7290 100644 --- a/src/ipsw.c +++ b/src/ipsw.c @@ -173,6 +173,28 @@ int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer, return 0; } +int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest) { + int size = 0; + char* data = NULL; + + /* older devices don't require personalized firmwares and use a BuildManifesto.plist */ + if (ipsw_extract_to_memory(ipsw, "BuildManifesto.plist", &data, &size) == 0) { + plist_from_xml(data, size, buildmanifest); + return 0; + } + + data = NULL; + size = 0; + + /* whereas newer devices do not require personalized firmwares and use a BuildManifest.plist */ + if (ipsw_extract_to_memory(ipsw, "BuildManifest.plist", &data, &size) == 0) { + plist_from_xml(data, size, buildmanifest); + return 0; + } + + return -1; +} + void ipsw_close(ipsw_archive* archive) { if (archive != NULL) { zip_unchange_all(archive->zip); diff --git a/src/ipsw.h b/src/ipsw.h index cd11406..f1694ef 100644 --- a/src/ipsw.h +++ b/src/ipsw.h @@ -28,6 +28,7 @@ extern "C" { #include #include +#include typedef struct { int index; @@ -37,6 +38,7 @@ typedef struct { } ipsw_file; 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); void ipsw_free_file(ipsw_file* file); #ifdef __cplusplus -- cgit v1.1-32-gdbae