diff options
| -rw-r--r-- | src/ideviceinstaller.c | 18 | 
1 files changed, 16 insertions, 2 deletions
| diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c index 2be92d3..d1fcfc1 100644 --- a/src/ideviceinstaller.c +++ b/src/ideviceinstaller.c @@ -68,6 +68,7 @@ int remove_archive_mode = 0;  char *last_status = NULL;  int wait_for_op_complete = 0;  int notification_expected = 0; +int is_device_connected = 0;  int op_completed = 0;  int err_occured = 0;  int notified = 0; @@ -234,25 +235,38 @@ static int zip_get_app_directory(struct zip* zf, char** path)  	return 0;  } +static void idevice_event_callback(const idevice_event_t* event, void* userdata) +{ +	if (event->event == IDEVICE_DEVICE_REMOVE) { +		is_device_connected = 0; +	} +} +  static void idevice_wait_for_operation_to_complete()  {  	int i = 0;  	struct timespec ts;  	ts.tv_sec = 0;  	ts.tv_nsec = 500000000; +	is_device_connected = 1; + +	/* subscribe to make sure to exit on device removal */ +	idevice_event_subscribe(idevice_event_callback, NULL);  	/* wait for operation to complete */  	while (wait_for_op_complete && !op_completed && !err_occured -		   && !notified && (i < 60)) { +		   && !notified && (i < 60) && is_device_connected) {  		nanosleep(&ts, NULL);  		i++;  	}  	/* wait some time if a notification is expected */ -	while (notification_expected && !notified && !err_occured && (i < 10)) { +	while (notification_expected && !notified && !err_occured && (i < 10) && is_device_connected) {  		nanosleep(&ts, NULL);  		i++;  	} + +	idevice_event_unsubscribe();  }  static void print_usage(int argc, char **argv) | 
