summaryrefslogtreecommitdiffstats
path: root/tools/idevicebackup2.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/idevicebackup2.c')
-rw-r--r--tools/idevicebackup2.c75
1 files changed, 51 insertions, 24 deletions
diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c
index eebbd87..353d5f3 100644
--- a/tools/idevicebackup2.c
+++ b/tools/idevicebackup2.c
@@ -71,7 +71,8 @@ enum cmd_mode {
CMD_LIST,
CMD_UNBACK,
CMD_CHANGEPW,
- CMD_LEAVE
+ CMD_LEAVE,
+ CMD_CLOUD
};
enum plist_format_t {
@@ -89,7 +90,8 @@ enum cmd_flags {
CMD_FLAG_ENCRYPTION_DISABLE = (1 << 7),
CMD_FLAG_ENCRYPTION_CHANGEPW = (1 << 8),
CMD_FLAG_FORCE_FULL_BACKUP = (1 << 9),
- CMD_FLAG_ENABLE_CLOUD_BACKUP = (1 << 10)
+ CMD_FLAG_CLOUD_ENABLE = (1 << 10),
+ CMD_FLAG_CLOUD_DISABLE = (1 << 11)
};
static int backup_domain_changed = 0;
@@ -1278,13 +1280,13 @@ static void print_usage(int argc, char **argv)
printf(" NOTE: password will be requested in interactive mode if omitted\n");
printf(" changepw [OLD NEW] change backup password on target device\n");
printf(" NOTE: passwords will be requested in interactive mode if omitted\n");
+ printf(" cloud on|off\tenable or disable cloud use (requires iCloud account)\n");
printf("\n");
printf("options:\n");
printf(" -d, --debug\t\tenable communication debugging\n");
printf(" -u, --udid UDID\ttarget specific device by its 40-digit device UDID\n");
printf(" -s, --source UDID\tuse backup data from device specified by UDID\n");
printf(" -i, --interactive\trequest passwords interactively\n");
- printf(" -c, --cloud\t\tUse cloud storage using iCloud account of device\n");
printf(" -h, --help\t\tprints usage information\n");
printf("\n");
}
@@ -1382,8 +1384,22 @@ int main(int argc, char *argv[])
backup_password = strdup(argv[i]);
continue;
}
- else if (!strcmp(argv[i], "-c") || !strcmp(argv[i], "--cloud")) {
- cmd_flags |= CMD_FLAG_ENABLE_CLOUD_BACKUP;
+ else if (!strcmp(argv[i], "cloud")) {
+ cmd = CMD_CLOUD;
+ i++;
+ if (!argv[i]) {
+ printf("No argument given for cloud command; requires either 'on' or 'off'.\n");
+ print_usage(argc, argv);
+ return -1;
+ }
+ if (!strcmp(argv[i], "on")) {
+ cmd_flags |= CMD_FLAG_CLOUD_ENABLE;
+ } else if (!strcmp(argv[i], "off")) {
+ cmd_flags |= CMD_FLAG_CLOUD_DISABLE;
+ } else {
+ printf("Invalid argument '%s' for cloud command; must be either 'on' or 'off'.\n", argv[i]);
+ }
+ continue;
}
else if (!strcmp(argv[i], "--full")) {
cmd_flags |= CMD_FLAG_FORCE_FULL_BACKUP;
@@ -1474,7 +1490,7 @@ int main(int argc, char *argv[])
return -1;
}
- if (cmd == CMD_CHANGEPW) {
+ if (cmd == CMD_CHANGEPW || cmd == CMD_CLOUD) {
backup_directory = strdup(".this_folder_is_not_present_on_purpose");
} else {
if (backup_directory == NULL) {
@@ -1519,7 +1535,7 @@ int main(int argc, char *argv[])
printf("ERROR: Can't get password input in non-interactive mode. Either pass password(s) on the command line, or enable interactive mode with -i or --interactive.\n");
return -1;
}
- } else {
+ } else if (cmd != CMD_CLOUD) {
/* backup directory must contain an Info.plist */
info_path = build_path(backup_directory, source_udid, "Info.plist", NULL);
if (cmd == CMD_RESTORE) {
@@ -1550,7 +1566,7 @@ int main(int argc, char *argv[])
PRINT_VERBOSE(1, "Backup directory is \"%s\"\n", backup_directory);
}
- if (is_encrypted) {
+ if (cmd != CMD_CLOUD && is_encrypted) {
PRINT_VERBOSE(1, "This is an encrypted backup.\n");
if (backup_password == NULL) {
if (interactive_mode) {
@@ -1639,7 +1655,7 @@ int main(int argc, char *argv[])
}
/* verify existing Info.plist */
- if (info_path && (stat(info_path, &st) == 0)) {
+ if (info_path && (stat(info_path, &st) == 0) && cmd != CMD_CLOUD) {
PRINT_VERBOSE(1, "Reading Info.plist from backup.\n");
plist_read_from_filename(&info_plist, info_path);
@@ -1656,21 +1672,6 @@ int main(int argc, char *argv[])
}
}
- opts = plist_new_dict();
- if (cmd_flags & CMD_FLAG_ENABLE_CLOUD_BACKUP) {
- PRINT_VERBOSE(1, "Enabling cloud backup for device...\n");
- } else {
- PRINT_VERBOSE(1, "Disabling cloud backup for device...\n");
- }
- plist_dict_insert_item(opts, "CloudBackupState", plist_new_bool(cmd & CMD_FLAG_ENABLE_CLOUD_BACKUP ? 1: 0));
- err = mobilebackup2_send_request(mobilebackup2, "EnableCloudBackup", udid, source_udid, opts);
- plist_free(opts);
- opts = NULL;
- if (err != MOBILEBACKUP2_E_SUCCESS) {
- printf("Error setting cloud backup state on device, error code %d\n", err);
- cmd = CMD_LEAVE;
- }
-
uint64_t lockfile = 0;
if (cmd == CMD_BACKUP) {
do_post_notification(device, NP_SYNC_WILL_START);
@@ -1715,6 +1716,17 @@ int main(int argc, char *argv[])
checkpoint:
switch(cmd) {
+ case CMD_CLOUD:
+ opts = plist_new_dict();
+ plist_dict_insert_item(opts, "CloudBackupState", plist_new_bool(cmd_flags & CMD_FLAG_CLOUD_ENABLE ? 1: 0));
+ err = mobilebackup2_send_request(mobilebackup2, "EnableCloudBackup", udid, source_udid, opts);
+ plist_free(opts);
+ opts = NULL;
+ if (err != MOBILEBACKUP2_E_SUCCESS) {
+ printf("Error setting cloud backup state on device, error code %d\n", err);
+ cmd = CMD_LEAVE;
+ }
+ break;
case CMD_BACKUP:
PRINT_VERBOSE(1, "Starting backup...\n");
@@ -2214,6 +2226,21 @@ files_out:
/* report operation status to user */
switch (cmd) {
+ case CMD_CLOUD:
+ if (cmd_flags & CMD_FLAG_CLOUD_ENABLE) {
+ if (operation_ok) {
+ PRINT_VERBOSE(1, "Cloud backup has been enabled successfully.\n");
+ } else {
+ PRINT_VERBOSE(1, "Could not enable cloud backup.\n");
+ }
+ } else if (cmd_flags & CMD_FLAG_CLOUD_DISABLE) {
+ if (operation_ok) {
+ PRINT_VERBOSE(1, "Cloud backup has been disabled successfully.\n");
+ } else {
+ PRINT_VERBOSE(1, "Could not disable cloud backup.\n");
+ }
+ }
+ break;
case CMD_BACKUP:
PRINT_VERBOSE(1, "Received %d files from device.\n", file_count);
if (operation_ok && mb2_status_check_snapshot_state(backup_directory, udid, "finished")) {