Make wait for install/uninstall notification optional with -n command line switch
diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c
index 17f6966..27b4669 100644
--- a/src/ideviceinstaller.c
+++ b/src/ideviceinstaller.c
@@ -1,8 +1,8 @@
 /*
  * ideviceinstaller - Manage apps on iOS devices.
  *
+ * Copyright (C) 2010-2019 Nikias Bassen <nikias@gmx.li>
  * Copyright (C) 2010-2015 Martin Szulecki <m.szulecki@libimobiledevice.org>
- * Copyright (C) 2010-2014 Nikias Bassen <nikias@gmx.li>
  *
  * Licensed under the GNU General Public License Version 2
  *
@@ -109,6 +109,7 @@
 
 char *last_status = NULL;
 int wait_for_command_complete = 0;
+int use_notifier = 0;
 int notification_expected = 0;
 int is_device_connected = 0;
 int command_completed = 0;
@@ -368,7 +369,7 @@
 	}
 
 	/* wait some time if a notification is expected */
-	while (notification_expected && !notified && !err_occurred && is_device_connected) {
+	while (use_notifier && notification_expected && !notified && !err_occurred && is_device_connected) {
 		wait_ms(50);
 	}
 
@@ -404,6 +405,8 @@
 		 "  -r, --restore APPID\tRestore archived app specified by APPID\n"
 		 "  -R, --remove-archive APPID  Remove app archive specified by APPID\n"
 		 "  -o, --options\t\tPass additional options to the specified command.\n"
+		 "  -n, --notify-wait\t\tWait for app installed/uninstalled notification\n"
+		 "                    \t\tto before reporting success of operation\n"
 		 "  -h, --help\t\tprints usage information\n"
 		 "  -d, --debug\t\tenable communication debugging\n" "\n");
 	printf("Homepage: <http://libimobiledevice.org>\n");
@@ -412,24 +415,25 @@
 static void parse_opts(int argc, char **argv)
 {
 	static struct option longopts[] = {
-		{"help", 0, NULL, 'h'},
-		{"udid", 1, NULL, 'u'},
-		{"list-apps", 0, NULL, 'l'},
-		{"install", 1, NULL, 'i'},
-		{"uninstall", 1, NULL, 'U'},
-		{"upgrade", 1, NULL, 'g'},
-		{"list-archives", 0, NULL, 'L'},
-		{"archive", 1, NULL, 'a'},
-		{"restore", 1, NULL, 'r'},
-		{"remove-archive", 1, NULL, 'R'},
-		{"options", 1, NULL, 'o'},
-		{"debug", 0, NULL, 'd'},
-		{NULL, 0, NULL, 0}
+		{ "help", no_argument, NULL, 'h' },
+		{ "udid", required_argument, NULL, 'u' },
+		{ "list-apps", no_argument, NULL, 'l' },
+		{ "install", required_argument, NULL, 'i' },
+		{ "uninstall", required_argument, NULL, 'U' },
+		{ "upgrade", required_argument, NULL, 'g' },
+		{ "list-archives", no_argument, NULL, 'L' },
+		{ "archive", required_argument, NULL, 'a' },
+		{ "restore", required_argument, NULL, 'r' },
+		{ "remove-archive", required_argument, NULL, 'R' },
+		{ "options", required_argument, NULL, 'o' },
+		{ "notify-wait", no_argument, NULL, 'n' },
+		{ "debug", no_argument, NULL, 'd' },
+		{ NULL, 0, NULL, 0 }
 	};
 	int c;
 
 	while (1) {
-		c = getopt_long(argc, argv, "hU:li:u:g:La:r:R:o:d", longopts,
+		c = getopt_long(argc, argv, "hU:li:u:g:La:r:R:o:nd", longopts,
 						(int *) 0);
 		if (c == -1) {
 			break;
@@ -508,6 +512,9 @@
 				options = newopts;
 			}
 			break;
+		case 'n':
+			use_notifier = 1;
+			break;
 		case 'd':
 			idevice_set_debug_level(1);
 			break;
@@ -654,34 +661,36 @@
 		goto leave_cleanup;
 	}
 
-	if ((lockdownd_start_service
-		 (client, "com.apple.mobile.notification_proxy",
-		  &service) != LOCKDOWN_E_SUCCESS) || !service) {
-		fprintf(stderr,
-				"Could not start com.apple.mobile.notification_proxy!\n");
-		res = -1;
-		goto leave_cleanup;
+	if (use_notifier) {
+		if ((lockdownd_start_service
+			 (client, "com.apple.mobile.notification_proxy",
+			  &service) != LOCKDOWN_E_SUCCESS) || !service) {
+			fprintf(stderr,
+					"Could not start com.apple.mobile.notification_proxy!\n");
+			res = -1;
+			goto leave_cleanup;
+		}
+
+		np_error_t nperr = np_client_new(device, service, &np);
+
+		if (service) {
+			lockdownd_service_descriptor_free(service);
+		}
+		service = NULL;
+
+		if (nperr != NP_E_SUCCESS) {
+			fprintf(stderr, "Could not connect to notification_proxy!\n");
+			res = -1;
+			goto leave_cleanup;
+		}
+
+		np_set_notify_callback(np, notifier, NULL);
+
+		const char *noties[3] = { NP_APP_INSTALLED, NP_APP_UNINSTALLED, NULL };
+
+		np_observe_notifications(np, noties);
 	}
 
-	np_error_t nperr = np_client_new(device, service, &np);
-
-	if (service) {
-		lockdownd_service_descriptor_free(service);
-	}
-	service = NULL;
-
-	if (nperr != NP_E_SUCCESS) {
-		fprintf(stderr, "Could not connect to notification_proxy!\n");
-		res = -1;
-		goto leave_cleanup;
-	}
-
-	np_set_notify_callback(np, notifier, NULL);
-
-	const char *noties[3] = { NP_APP_INSTALLED, NP_APP_UNINSTALLED, NULL };
-
-	np_observe_notifications(np, noties);
-
 run_again:
 	if (service) {
 		lockdownd_service_descriptor_free(service);