summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/idevicerestore.c7
-rw-r--r--src/idevicerestore.h14
-rw-r--r--src/ipsw.c8
-rw-r--r--src/recovery.c11
-rw-r--r--src/restore.c2
5 files changed, 35 insertions, 7 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index 0e77447..a1faeac 100644
--- a/src/idevicerestore.c
+++ b/src/idevicerestore.c
@@ -137,11 +137,12 @@ int main(int argc, char* argv[]) {
}
// discover the device type
- idevicerestore_device = check_device(uuid);
- if (idevicerestore_device < 0) {
+ int id = check_device(uuid);
+ if (id < 0) {
error("ERROR: Unable to discover device type\n");
return -1;
}
+ idevicerestore_device = &idevicerestore_devices[id];
// extract buildmanifest
plist_t buildmanifest = NULL;
@@ -178,7 +179,7 @@ int main(int argc, char* argv[]) {
// devices that come after iPod2g require personalized firmwares
plist_t tss_request = NULL;
plist_t tss = NULL;
- if (idevicerestore_device > DEVICE_IPOD2G) {
+ if (idevicerestore_device->device_id > DEVICE_IPOD2G) {
info("Creating TSS request\n");
// fetch the device's ECID for the TSS request
if (get_ecid(uuid, &ecid) < 0 || ecid == 0) {
diff --git a/src/idevicerestore.h b/src/idevicerestore.h
index af66892..f92aad2 100644
--- a/src/idevicerestore.h
+++ b/src/idevicerestore.h
@@ -111,4 +111,18 @@ inline static void debug_plist(plist_t plist) {
free(data);
}
+inline static void print_progress_bar(const char* operation, double progress) {
+ int i = 0;
+ if(progress < 0) return;
+ if(progress > 100) progress = 100;
+ info("\r%s [", operation);
+ for(i = 0; i < 50; i++) {
+ if(i < progress / 2) info("=");
+ else info(" ");
+ }
+ info("] %3.1f%%", progress);
+ if(progress == 100) info("\n");
+ fflush(stdout);
+}
+
#endif
diff --git a/src/ipsw.c b/src/ipsw.c
index 6c5d504..7ded33e 100644
--- a/src/ipsw.c
+++ b/src/ipsw.c
@@ -95,7 +95,9 @@ int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfi
int i = 0;
int size = 0;
+ int bytes = 0;
int count = 0;
+ double progress = 0;
for (i = zstat.size; i > 0; i -= count) {
if (i < BUFSIZE)
size = i;
@@ -109,9 +111,11 @@ int ipsw_extract_to_file(const char* ipsw, const char* infile, const char* outfi
return -1;
}
fwrite(buffer, 1, count, fd);
- debug(".");
+
+ bytes += size;
+ progress = ((double) bytes/ (double) zstat.size) * 100.0;
+ print_progress_bar("Extracting", progress);
}
- debug("\n");
fclose(fd);
zip_fclose(zfile);
diff --git a/src/recovery.c b/src/recovery.c
index e67b10d..52f4802 100644
--- a/src/recovery.c
+++ b/src/recovery.c
@@ -31,6 +31,13 @@
#include "recovery.h"
#include "idevicerestore.h"
+int recovery_progress_callback(irecv_client_t client, const irecv_event_t* event) {
+ if (event->type == IRECV_PROGRESS) {
+ print_progress_bar(event->data, event->progress);
+ }
+ return 0;
+}
+
int recovery_check_mode() {
irecv_client_t recovery = NULL;
irecv_error_t recovery_error = IRECV_E_SUCCESS;
@@ -92,8 +99,9 @@ int recovery_enter_restore(const char* uuid, const char* ipsw, plist_t tss) {
error("ERROR: Unable to connect to device in restore mode\n");
return -1;
}
- restore_close(device, restore);
+ restore_close(device, restore);
+ idevicerestore_mode = MODE_RESTORE;
return 0;
}
@@ -149,6 +157,7 @@ int recovery_open_with_timeout(irecv_client_t* client) {
debug("Retrying connection...\n");
}
+ irecv_event_subscribe(recovery, IRECV_PROGRESS, &recovery_progress_callback, NULL);
*client = recovery;
return 0;
}
diff --git a/src/restore.c b/src/restore.c
index 46a509a..b5eea66 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -208,7 +208,7 @@ void restore_close(idevice_t device, restored_client_t restore) {
restored_client_free(restore);
if (device)
idevice_free(device);
- idevice_event_unsubscribe();
+ //idevice_event_unsubscribe();
}
const char* restore_progress_string(unsigned int operation) {