summaryrefslogtreecommitdiffstats
path: root/src/restore.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2012-07-17 18:10:07 +0200
committerGravatar Nikias Bassen2012-07-17 18:10:07 +0200
commitdb8bfa2f93b2a5826558b260e88236ed68cbaf21 (patch)
treee9fa9cbb56302c9a1ae51d2739d5ce657c65a112 /src/restore.c
parent231e33d5544722d27d08261275332072769e59bc (diff)
downloadidevicerestore-db8bfa2f93b2a5826558b260e88236ed68cbaf21.tar.gz
idevicerestore-db8bfa2f93b2a5826558b260e88236ed68cbaf21.tar.bz2
restore: use idevice event to wait for device entering restore mode
Diffstat (limited to 'src/restore.c')
-rw-r--r--src/restore.c48
1 files changed, 20 insertions, 28 deletions
diff --git a/src/restore.c b/src/restore.c
index 676d449..e7a9930 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -299,10 +299,21 @@ static int restore_is_current_device(struct idevicerestore_client_t* client, con
return (strcasecmp(this_srnm, client->srnm) == 0);
}
+static void restore_device_event_cb(const idevice_event_t *event, void *user_data)
+{
+ if (event->event == IDEVICE_DEVICE_ADD) {
+ struct idevicerestore_client_t* client = (struct idevicerestore_client_t*)user_data;
+ if (restore_is_current_device(client, event->udid)) {
+ restore_device_connected = 1;
+ client->udid = strdup(event->udid);
+ }
+ }
+}
+
int restore_open_with_timeout(struct idevicerestore_client_t* client) {
int i = 0;
int j = 0;
- int attempts = 20;
+ int attempts = 180;
char *type = NULL;
uint64_t version = 0;
idevice_t device = NULL;
@@ -332,38 +343,19 @@ int restore_open_with_timeout(struct idevicerestore_client_t* client) {
restore_device_connected = 0;
- info("trying to connect...\n");
- for (i = 0; i < attempts; i++) {
- int num_devices = 0;
- char **devices = NULL;
- idevice_get_device_list(&devices, &num_devices);
- if (num_devices == 0) {
- sleep(2);
- continue;
- }
- for (j = 0; j < num_devices; j++) {
- if (restore_is_current_device(client, devices[j])) {
- restore_device_connected = 1;
- client->udid = strdup(devices[j]);
- break;
- }
- }
- idevice_device_list_free(devices);
-
- if (restore_device_connected == 1) {
+ info("Waiting for device...\n");
+ idevice_event_subscribe(restore_device_event_cb, client);
+ i = 0;
+ while (i++ < attempts) {
+ if (restore_device_connected) {
break;
}
-
- if (i == attempts) {
- error("ERROR: Unable to connect to device in restore mode\n");
- return -1;
- }
-
- sleep(2);
+ sleep(1);
}
+ idevice_event_unsubscribe();
if (!restore_device_connected) {
- error("hm... could not connect\n");
+ error("ERROR: Unable to connect to device in restore mode\n");
return -1;
}