int normal_check_mode(struct idevicerestore_client_t* client) { idevice_t device = NULL; normal_idevice_new(client, &device); if (!device) { return -1; } idevice_free(device); return 0; }
int normal_check_device(struct idevicerestore_client_t* client) { int i = 0; 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; normal_idevice_new(client, &device); if (!device) { 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; } lockdownd_client_free(lockdown); idevice_free(device); lockdown = NULL; device = NULL; if (!product_type_node || plist_get_node_type(product_type_node) != PLIST_STRING) { if (product_type_node) plist_free(product_type_node); return -1; } plist_get_string_val(product_type_node, &product_type); plist_free(product_type_node); for (i = 0; irecv_devices[i].product != NULL; i++) { if (!strcmp(product_type, irecv_devices[i].product)) { break; } } return irecv_devices[i].index; }
int normal_open_with_timeout(struct idevicerestore_client_t* client) { int i = 0; int attempts = 10; idevice_t device = NULL; lockdownd_client_t lockdownd = NULL; idevice_error_t device_error = IDEVICE_E_SUCCESS; lockdownd_error_t lockdownd_error = LOCKDOWN_E_SUCCESS; // no context exists so bail if(client == NULL) { return -1; } normal_device_connected = 0; // create our normal client if it doesn't yet exist if(client->normal == NULL) { client->normal = (struct normal_client_t*) malloc(sizeof(struct normal_client_t)); if(client->normal == NULL) { error("ERROR: Out of memory\n"); return -1; } } for (i = 1; i <= attempts; i++) { normal_idevice_new(client, &device); if (device) { normal_device_connected = 1; break; } if (i == attempts) { error("ERROR: Unable to connect to device in normal mode\n"); return -1; } sleep(2); } client->normal->device = device; return 0; }
const char* normal_check_product_type(struct idevicerestore_client_t* client) { int i = 0; idevice_t device = NULL; char* product_type = NULL; irecv_device_t irecv_device = 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; normal_idevice_new(client, &device); if (!device) { return product_type; } lockdown_error = lockdownd_client_new_with_handshake(device, &lockdown, "idevicerestore"); if (lockdown_error == LOCKDOWN_E_PASSWORD_PROTECTED) { lockdown_error = lockdownd_client_new(device, &lockdown, "idevicerestore"); } else if (lockdown_error == LOCKDOWN_E_INVALID_HOST_ID) { char* udid = NULL; lockdownd_unpair(lockdown, NULL); idevice_get_udid(device, &udid); if (udid) { userpref_remove_device_record(udid); } lockdown_error = lockdownd_client_new_with_handshake(device, &lockdown, "idevicerestore"); } if (lockdown_error != LOCKDOWN_E_SUCCESS) { idevice_free(device); return product_type; } plist_t pval = NULL; lockdownd_get_value(lockdown, NULL, "HardwareModel", &pval); if (pval && (plist_get_node_type(pval) == PLIST_STRING)) { char* strval = NULL; plist_get_string_val(pval, &strval); if (strval) { irecv_devices_get_device_by_hardware_model(strval, &irecv_device); if (irecv_device) { product_type = strdup(irecv_device->product_type); } free(strval); } } if (pval) { plist_free(pval); } if (product_type == NULL) { 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 product_type; } } lockdownd_client_free(lockdown); idevice_free(device); lockdown = NULL; device = NULL; if (irecv_device) { if (product_type) free(product_type); return irecv_device->product_type; } if (product_type_node != NULL) { if (!product_type_node || plist_get_node_type(product_type_node) != PLIST_STRING) { if (product_type_node) plist_free(product_type_node); return product_type; } plist_get_string_val(product_type_node, &product_type); plist_free(product_type_node); irecv_devices_get_device_by_product_type(product_type, &irecv_device); if (irecv_device && irecv_device->product_type) { free(product_type); return irecv_device->product_type; } } return product_type; }