diff options
| author | 2010-06-02 04:13:25 +0800 | |
|---|---|---|
| committer | 2010-06-09 17:17:06 +0800 | |
| commit | bab56cf4083c2d0695215ba785019532ffae5749 (patch) | |
| tree | bcc8ff80fc9152823c5881de9d0163a124d369f1 /src/normal.c | |
| parent | 4de6d38c54d9f641006539a06083e423a5d0c9c9 (diff) | |
| download | idevicerestore-bab56cf4083c2d0695215ba785019532ffae5749.tar.gz idevicerestore-bab56cf4083c2d0695215ba785019532ffae5749.tar.bz2 | |
Began major refactoring, not quite finished yet, this branch is probably broke
Diffstat (limited to 'src/normal.c')
| -rw-r--r-- | src/normal.c | 169 | 
1 files changed, 168 insertions, 1 deletions
| diff --git a/src/normal.c b/src/normal.c index c7baefd..0420a82 100644 --- a/src/normal.c +++ b/src/normal.c @@ -19,10 +19,177 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA   */ +#include <stdio.h>  #include <stdint.h> +#include <libimobiledevice/lockdown.h> +#include <libimobiledevice/libimobiledevice.h>  #include "normal.h" +#include "idevicerestore.h" -int normal_get_ecid(uint64_t* ecid) { +int normal_check_mode(const char* uuid) { +	char* type = NULL; +	idevice_t device = NULL; +	lockdownd_client_t lockdown = NULL; +	idevice_error_t device_error = IDEVICE_E_SUCCESS; +	lockdownd_error_t lockdown_error = IDEVICE_E_SUCCESS; + +	device_error = idevice_new(&device, uuid); +	if (device_error != IDEVICE_E_SUCCESS) { +		return -1; +	} + +	lockdown_error = lockdownd_client_new(device, &lockdown, "idevicerestore"); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		idevice_free(device); +		return -1; +	} + +	lockdown_error = lockdownd_query_type(lockdown, &type); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} + +	lockdownd_client_free(lockdown); +	idevice_free(device); +	lockdown = NULL; +	device = NULL;  	return 0;  } + +int normal_get_device(const char* uuid) { +	idevice_t device = NULL; +	char* product_type = NULL; +	plist_t product_type_node = NULL; +	lockdownd_client_t lockdown = NULL; +	idevice_error_t device_error = IDEVICE_E_SUCCESS; +	lockdownd_error_t lockdown_error = IDEVICE_E_SUCCESS; + +	device_error = idevice_new(&device, uuid); +	if (device_error != IDEVICE_E_SUCCESS) { +		return -1; +	} + +	lockdown_error = lockdownd_client_new_with_handshake(device, &lockdown, "idevicerestore"); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		idevice_free(device); +		return -1; +	} + +	lockdown_error = lockdownd_get_value(lockdown, NULL, "ProductType", &product_type_node); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} + +	if (!product_type_node || plist_get_node_type(product_type_node) != PLIST_STRING) { +		if(product_type_node) plist_free(product_type_node); +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} +	plist_get_string_val(product_type_node, &product_type); +	plist_free(product_type_node); + +	lockdownd_client_free(lockdown); +	idevice_free(device); +	lockdown = NULL; +	device = NULL; + +	int i = 0; +	for(i = 0; idevicerestore_products[i] != NULL; i++) { +		if(!strcmp(product_type, idevicerestore_products[i])) { +			idevicerestore_device = i; +			break; +		} +	} + +	return idevicerestore_device; +} + +int normal_enter_recovery(const char* uuid) { +	idevice_t device = NULL; +	lockdownd_client_t lockdown = NULL; +	idevice_error_t device_error = IDEVICE_E_SUCCESS; +	lockdownd_error_t lockdown_error = IDEVICE_E_SUCCESS; + +	device_error = idevice_new(&device, uuid); +	if (device_error != IDEVICE_E_SUCCESS) { +		error("ERROR: Unable to find device\n"); +		return -1; +	} + +	lockdown_error = lockdownd_client_new(device, &lockdown, "idevicerestore"); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		error("ERROR: Unable to connect to lockdownd service\n"); +		idevice_free(device); +		return -1; +	} + +	lockdown_error = lockdownd_enter_recovery(lockdown); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		error("ERROR: Unable to place device in recovery mode\n"); +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} + +	lockdownd_client_free(lockdown); +	idevice_free(device); +	lockdown = NULL; +	device = NULL; +	return 0; +} + +int normal_get_cpid(const char* uuid, uint32_t* cpid) { +	return 0; +} + +int normal_get_bdid(const char* uuid, uint32_t* bdid) { +	return 0; +} + +int normal_get_ecid(const char* uuid, uint64_t* ecid) { +	idevice_t device = NULL; +	plist_t unique_chip_node = NULL; +	lockdownd_client_t lockdown = NULL; +	idevice_error_t device_error = IDEVICE_E_SUCCESS; +	lockdownd_error_t lockdown_error = IDEVICE_E_SUCCESS; + +	device_error = idevice_new(&device, uuid); +	if(device_error != IDEVICE_E_SUCCESS) { +		return -1; +	} + +	lockdown_error = lockdownd_client_new_with_handshake(device, &lockdown, "idevicerestore"); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		error("ERROR: Unable to connect to lockdownd\n"); +		idevice_free(device); +		return -1; +	} + +	lockdown_error = lockdownd_get_value(lockdown, NULL, "UniqueChipID", &unique_chip_node); +	if (lockdown_error != LOCKDOWN_E_SUCCESS) { +		error("ERROR: Unable to get UniqueChipID from lockdownd\n"); +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} + +	if (!unique_chip_node || plist_get_node_type(unique_chip_node) != PLIST_UINT) { +		error("ERROR: Unable to get ECID\n"); +		lockdownd_client_free(lockdown); +		idevice_free(device); +		return -1; +	} +	plist_get_uint_val(unique_chip_node, ecid); +	plist_free(unique_chip_node); + +	lockdownd_client_free(lockdown); +	idevice_free(device); +	lockdown = NULL; +	device = NULL; +} | 
