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 <zip.h>
 #include <stdint.h>
+#include <plist/plist.h>
 
 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