From ab9352110092cf651b5602301371cd00691c7e13 Mon Sep 17 00:00:00 2001 From: Nikias Bassen Date: Thu, 13 Jun 2019 03:25:27 +0200 Subject: Make wait for install/uninstall notification optional with -n command line switch --- src/ideviceinstaller.c | 83 ++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 37 deletions(-) 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 * Copyright (C) 2010-2015 Martin Szulecki - * Copyright (C) 2010-2014 Nikias Bassen * * Licensed under the GNU General Public License Version 2 * @@ -109,6 +109,7 @@ int cmd = CMD_NONE; 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 @@ static void idevice_wait_for_command_to_complete() } /* 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 @@ static void print_usage(int argc, char **argv) " -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: \n"); @@ -412,24 +415,25 @@ static void print_usage(int argc, char **argv) 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 @@ static void parse_opts(int argc, char **argv) options = newopts; } break; + case 'n': + use_notifier = 1; + break; case 'd': idevice_set_debug_level(1); break; @@ -654,33 +661,35 @@ int main(int argc, char **argv) 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); + np_error_t nperr = np_client_new(device, service, &np); - if (service) { - lockdownd_service_descriptor_free(service); - } - service = NULL; + 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; - } + 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); + np_set_notify_callback(np, notifier, NULL); - const char *noties[3] = { NP_APP_INSTALLED, NP_APP_UNINSTALLED, NULL }; + const char *noties[3] = { NP_APP_INSTALLED, NP_APP_UNINSTALLED, NULL }; - np_observe_notifications(np, noties); + np_observe_notifications(np, noties); + } run_again: if (service) { -- cgit v1.1-32-gdbae