diff options
| author | 2012-02-02 01:14:06 +0100 | |
|---|---|---|
| committer | 2012-02-02 01:14:06 +0100 | |
| commit | d5c9cc009b52749a8fc7e30320d8c039c6cc80aa (patch) | |
| tree | eafe51d307c44674e24cb0a003b8c29d0c89c081 /src | |
| parent | 169f60de912534baa3b6475cd116924ec9e96616 (diff) | |
| download | idevicerestore-d5c9cc009b52749a8fc7e30320d8c039c6cc80aa.tar.gz idevicerestore-d5c9cc009b52749a8fc7e30320d8c039c6cc80aa.tar.bz2 | |
restore: reflect latest libimobiledevice changes and pass options to restored
Diffstat (limited to 'src')
| -rw-r--r-- | src/restore.c | 69 | ||||
| -rw-r--r-- | src/restore.h | 1 | 
2 files changed, 66 insertions, 4 deletions
| diff --git a/src/restore.c b/src/restore.c index 5e42b97..fe58261 100644 --- a/src/restore.c +++ b/src/restore.c @@ -209,6 +209,8 @@ int restore_reboot(struct idevicerestore_client_t* client) {  int restore_open_with_timeout(struct idevicerestore_client_t* client) {  	int i = 0;  	int attempts = 10; +	char *type = NULL; +	uint64_t version = 0;  	idevice_t device = NULL;  	restored_client_t restored = NULL;  	idevice_error_t device_error = IDEVICE_E_SUCCESS; @@ -226,6 +228,7 @@ int restore_open_with_timeout(struct idevicerestore_client_t* client) {  			error("ERROR: Out of memory\n");  			return -1;  		} +		memset(client->restore, '\0', sizeof(struct restore_client_t));  	}  	device_error = idevice_event_subscribe(&restore_device_callback, client); @@ -259,8 +262,12 @@ int restore_open_with_timeout(struct idevicerestore_client_t* client) {  		return -1;  	} -	restore_error = restored_query_type(restored, NULL, NULL); -	if (restore_error != RESTORE_E_SUCCESS) { +	restore_error = restored_query_type(restored, &type, &version); +	if ((restore_error == RESTORE_E_SUCCESS) && type && (strcmp(type, "com.apple.mobile.restored") == 0)) { +		client->restore->protocol_version = version; +		info("Connected to %s, version %d\n", type, (int)version); +	} else { +		error("ERROR: Unable to connect to restored, error=%d\n", restore_error);  		restored_client_free(restored);  		//idevice_event_unsubscribe();  		idevice_free(device); @@ -641,13 +648,67 @@ int restore_device(struct idevicerestore_client_t* client, plist_t build_identit  	restore = client->restore->client;  	device = client->restore->device; +	plist_t opts = plist_new_dict(); +	// FIXME: required? +	//plist_dict_insert_item(opts, "AuthInstallRestoreBehavior", plist_new_string("Erase")); +	plist_dict_insert_item(opts, "AutoBootDelay", plist_new_uint(0)); +	// FIXME: new on iOS 5 ? +	plist_dict_insert_item(opts, "BootImageType", plist_new_string("UserOrInternal")); +	// FIXME: required? +	//plist_dict_insert_item(opts, "BootImageFile", plist_new_string("018-7923-347.dmg")); +	plist_dict_insert_item(opts, "CreateFilesystemPartitions", plist_new_bool(1)); +	plist_dict_insert_item(opts, "DFUFileType", plist_new_string("RELEASE")); +	plist_dict_insert_item(opts, "DataImage", plist_new_bool(0)); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "DeviceTreeFile", plist_new_string("DeviceTree.k48ap.img3")); +	plist_dict_insert_item(opts, "FirmwareDirectory", plist_new_string(".")); +	// FIXME: usable if false? (-x parameter) +	plist_dict_insert_item(opts, "FlashNOR", plist_new_bool(1)); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "KernelCacheFile", plist_new_string("kernelcache.release.k48")); +	// FIXME: new on iOS 5 ? +	plist_dict_insert_item(opts, "KernelCacheType", plist_new_string("Release")); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "NORImagePath", plist_new_string(".")); +	// FIXME: new on iOS 5 ? +	plist_dict_insert_item(opts, "NORImageType", plist_new_string("production")); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "PersonalizedRestoreBundlePath", plist_new_string("/tmp/Per2.tmp")); +	plist_dict_insert_item(opts, "RestoreBundlePath", plist_new_string("/tmp/Per2.tmp")); +	plist_dict_insert_item(opts, "RootToInstall", plist_new_bool(0)); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "SourceRestoreBundlePath", plist_new_string("/tmp")); +	plist_dict_insert_item(opts, "SystemImage", plist_new_bool(1)); +	plist_t spp = plist_new_dict(); +	{ +		plist_dict_insert_item(spp, "16", plist_new_uint(160)); +		plist_dict_insert_item(spp, "32", plist_new_uint(320)); +		plist_dict_insert_item(spp, "64", plist_new_uint(640)); +		plist_dict_insert_item(spp, "8", plist_new_uint(80)); +	} +	// FIXME: new on iOS 5 ? +	plist_dict_insert_item(opts, "SystemImageType", plist_new_string("User")); + +	plist_dict_insert_item(opts, "SystemPartitionPadding", spp); +	char* guid = generate_guid(); +	if (guid) { +		plist_dict_insert_item(opts, "UUID", plist_new_string(guid)); +		free(guid); +	} +	// FIXME: does this have any effect actually? +	plist_dict_insert_item(opts, "UpdateBaseband", plist_new_bool(0)); +	// FIXME: not required for iOS 5? +	//plist_dict_insert_item(opts, "UserLocale", plist_new_string("en_US")); +  	// start the restore process -	restore_error = restored_start_restore(restore); +	restore_error = restored_start_restore(restore, opts, client->restore->protocol_version);  	if (restore_error != RESTORE_E_SUCCESS) {  		error("ERROR: Unable to start the restore process\n"); +		plist_free(opts);  		restore_client_free(client);  		return -1;  	} +	plist_free(opts);  	// this is the restore process loop, it reads each message in from  	// restored and passes that data on to it's specific handler @@ -662,7 +723,7 @@ int restore_device(struct idevicerestore_client_t* client, plist_t build_identit  		// discover what kind of message has been received  		node = plist_dict_get_item(message, "MsgType");  		if (!node || plist_get_node_type(node) != PLIST_STRING) { -			debug("Unknown message received\n"); +			debug("Unknown message received:\n");  			if (idevicerestore_debug)  				debug_plist(message);  			plist_free(message); diff --git a/src/restore.h b/src/restore.h index 9c11c34..eea63bc 100644 --- a/src/restore.h +++ b/src/restore.h @@ -36,6 +36,7 @@ struct restore_client_t {  	const char* uuid;  	unsigned int operation;  	const char* filesystem; +	uint64_t protocol_version;  	restored_client_t client;  }; | 
