diff options
-rw-r--r-- | tools/idevicebackup2.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c index 8ad8355..ff31189 100644 --- a/tools/idevicebackup2.c +++ b/tools/idevicebackup2.c @@ -71,6 +71,13 @@ enum plist_format_t { PLIST_FORMAT_BINARY }; +enum cmd_flags { + CMD_FLAG_RESTORE_SYSTEM_FILES = 0, + CMD_FLAG_RESTORE_REBOOT = (1 << 1), + CMD_FLAG_RESTORE_DONT_COPY_BACKUP = (1 << 2), + CMD_FLAG_RESTORE_SETTINGS = (1 << 3) +}; + static void notify_cb(const char *notification, void *userdata) { if (!strcmp(notification, NP_SYNC_CANCEL_REQUEST)) { @@ -1063,11 +1070,15 @@ static void print_usage(int argc, char **argv) { char *name = NULL; name = strrchr(argv[0], '/'); - printf("Usage: %s [OPTIONS] CMD DIRECTORY\n", (name ? name + 1: argv[0])); + printf("Usage: %s [OPTIONS] CMD [CMDOPTIONS] DIRECTORY\n", (name ? name + 1: argv[0])); printf("Create or restore backup from the current or specified directory.\n\n"); printf("commands:\n"); printf(" backup\tcreate backup for the device\n"); printf(" restore\trestore last backup to the device\n"); + printf(" --system\trestore system files, too.\n"); + printf(" --reboot\treboot the system when done.\n"); + printf(" --nocopy\tdo not copy backup folder before restoring.\n"); + printf(" --settings\trestore device settings from the backup.\n"); printf(" info\t\tshow details about last completed backup of device\n"); printf(" list\t\tlist files of last completed backup in CSV format\n"); printf(" unback\tUnpack a completed backup in DIRECTORY/_unback_/\n\n"); @@ -1086,11 +1097,13 @@ int main(int argc, char *argv[]) uint16_t port = 0; uuid[0] = 0; int cmd = -1; + int cmd_flags = 0; int is_full_backup = 0; char *backup_directory = NULL; struct stat st; plist_t node_tmp = NULL; plist_t info_plist = NULL; + plist_t opts = NULL; mobilebackup2_error_t err; /* we need to exit cleanly on running backups and restores or we cause havok */ @@ -1124,6 +1137,18 @@ int main(int argc, char *argv[]) else if (!strcmp(argv[i], "restore")) { cmd = CMD_RESTORE; } + else if (!strcmp(argv[i], "--system")) { + cmd_flags |= CMD_FLAG_RESTORE_SYSTEM_FILES; + } + else if (!strcmp(argv[i], "--reboot")) { + cmd_flags |= CMD_FLAG_RESTORE_REBOOT; + } + else if (!strcmp(argv[i], "--nocopy")) { + cmd_flags |= CMD_FLAG_RESTORE_DONT_COPY_BACKUP; + } + else if (!strcmp(argv[i], "--settings")) { + cmd_flags |= CMD_FLAG_RESTORE_SETTINGS; + } else if (!strcmp(argv[i], "info")) { cmd = CMD_INFO; verbose = 0; @@ -1369,8 +1394,18 @@ checkpoint: PRINT_VERBOSE(1, "Starting Restore...\n"); - plist_t opts = plist_new_dict(); - plist_dict_insert_item(opts, "shouldRestoreSystemFiles", plist_new_bool(0)); + opts = plist_new_dict(); + plist_dict_insert_item(opts, "RestoreSystemFiles", plist_new_bool(cmd_flags & CMD_FLAG_RESTORE_SYSTEM_FILES)); + PRINT_VERBOSE(1, "Restoring system files: %s\n", (cmd_flags & CMD_FLAG_RESTORE_SYSTEM_FILES ? "Yes":"No")); + if ((cmd_flags & CMD_FLAG_RESTORE_REBOOT) == 0) + plist_dict_insert_item(opts, "RestoreShouldReboot", plist_new_bool(0)); + PRINT_VERBOSE(1, "Rebooting after restore: %s\n", (cmd_flags & CMD_FLAG_RESTORE_REBOOT ? "Yes":"No")); + if (cmd_flags & CMD_FLAG_RESTORE_DONT_COPY_BACKUP) + plist_dict_insert_item(opts, "RestoreDontCopyBackup", plist_new_bool(1)); + PRINT_VERBOSE(1, "Don't copy backup: %s\n", (cmd_flags & CMD_FLAG_RESTORE_DONT_COPY_BACKUP ? "Yes":"No")); + plist_dict_insert_item(opts, "RestorePreserveSettings", plist_new_bool((cmd_flags & CMD_FLAG_RESTORE_SETTINGS) == 0)); + PRINT_VERBOSE(1, "Preserve settings of device: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_SETTINGS) == 0 ? "Yes":"No")); + err = mobilebackup2_send_request(mobilebackup2, "Restore", uuid, uuid, opts); plist_free(opts); if (err != MOBILEBACKUP2_E_SUCCESS) { |