summaryrefslogtreecommitdiffstats
path: root/src/idevicerestore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/idevicerestore.c')
-rw-r--r--src/idevicerestore.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index c7aeb81..edb977c 100644
--- a/src/idevicerestore.c
+++ b/src/idevicerestore.c
@@ -287,8 +287,8 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
client->idevice_e_ctx = idevice_event_cb;
// check which mode the device is currently in so we know where to start
- WAIT_FOR(client->mode != &idevicerestore_modes[MODE_UNKNOWN], 10);
- if (client->mode == &idevicerestore_modes[MODE_UNKNOWN]) {
+ WAIT_FOR(client->mode != &idevicerestore_modes[MODE_UNKNOWN] || (client->flags & FLAG_QUIT), 10);
+ if (client->mode == &idevicerestore_modes[MODE_UNKNOWN] || (client->flags & FLAG_QUIT)) {
error("ERROR: Unable to discover device mode. Please make sure a device is attached.\n");
return -1;
}
@@ -452,6 +452,9 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
plist_free(signed_fws);
return -1;
}
+ if (client->flags & FLAG_QUIT) {
+ return -1;
+ }
unsigned long selected = strtoul(input, NULL, 10);
if (selected == 0 || selected > count) {
printf("Invalid input value. Must be in range: 1..%d\n", count);
@@ -528,7 +531,7 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
// we need to refresh the current mode again
WAIT_FOR(client->mode != &idevicerestore_modes[MODE_UNKNOWN] || (client->flags & FLAG_QUIT), 60);
- if (client->mode == &idevicerestore_modes[MODE_UNKNOWN]) {
+ if (client->mode == &idevicerestore_modes[MODE_UNKNOWN] || (client->flags & FLAG_QUIT)) {
error("ERROR: Unable to discover device mode. Please make sure a device is attached.\n");
return -1;
}
@@ -779,6 +782,9 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
fflush(stdin);
input[0] = '\0';
get_user_input(input, 63, 0);
+ if (client->flags & FLAG_QUIT) {
+ return -1;
+ }
if (*input != '\0' && !strcmp(input, "YES")) {
break;
} else {
@@ -806,6 +812,9 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
fflush(stdin);
input[0] = '\0';
get_user_input(input, 63, 0);
+ if (client->flags & FLAG_QUIT) {
+ return -1;
+ }
if (*input != '\0' && !strcmp(input, "YES")) {
break;
} else {
@@ -916,6 +925,8 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
if (client->tss)
plist_free(client->tss);
plist_free(buildmanifest);
+ info("Removing %s\n", filesystem);
+ unlink(filesystem);
return -1;
}
@@ -1205,7 +1216,7 @@ int idevicerestore_start(struct idevicerestore_client_t* client)
info("Waiting for device to enter restore mode...\n");
WAIT_FOR(client->mode == &idevicerestore_modes[MODE_RESTORE] || (client->flags & FLAG_QUIT), 180);
- if (client->mode != &idevicerestore_modes[MODE_RESTORE]) {
+ if (client->mode != &idevicerestore_modes[MODE_RESTORE] || (client->flags & FLAG_QUIT)) {
error("ERROR: Device failed to enter restore mode.\n");
if (delete_fs && filesystem)
unlink(filesystem);
@@ -1381,6 +1392,7 @@ static void handle_signal(int sig)
{
if (idevicerestore_client) {
idevicerestore_client->flags |= FLAG_QUIT;
+ ipsw_cancel();
}
}