Refactor nandroid so the availability of boot backup is determined automatically. Boot backups are also no longer assumes to be on raw partitions, as they may be on a VFAT partition or someting different, such as in the case of Nook.
Change-Id: I036befb44f0d873fde02485e34aab14faf8bfe8d
diff --git a/nandroid.c b/nandroid.c
index f1564dc..df33cee 100644
--- a/nandroid.c
+++ b/nandroid.c
@@ -100,7 +100,26 @@
return 0;
}
-int nandroid_backup_partition(const char* backup_path, char* root) {
+int nandroid_backup_partition(const char* backup_path, const char* root) {
+ Volume *vol = volume_for_path(root);
+ // make sure the volume exists before attempting anything...
+ if (vol == NULL || vol->fs_type == NULL)
+ return NULL;
+
+ // see if we need a raw backup (mtd)
+ char tmp[PATH_MAX];
+ int ret;
+ if (strcmp(vol->fs_type, "mtd") == 0) {
+ const char* name = basename(root);
+ sprintf(tmp, "%s/%s.img", backup_path, name);
+ ui_print("Backing up %s image...\n", name);
+ if (0 != (ret = backup_raw_partition(vol->device, tmp))) {
+ ui_print("Error while backing up %s image!", name);
+ return ret;
+ }
+ return 0;
+ }
+
return nandroid_backup_partition_extended(backup_path, root, 1);
}
@@ -127,19 +146,11 @@
sprintf(tmp, "mkdir -p %s", backup_path);
__system(tmp);
-#ifndef BOARD_RECOVERY_IGNORE_BOOTABLES
- ui_print("Backing up boot...\n");
- sprintf(tmp, "%s/%s", backup_path, "boot.img");
- ret = backup_raw_partition("boot", tmp);
- if (0 != ret)
- return print_and_error("Error while dumping boot image!\n");
+ if (0 != (ret = nandroid_backup_partition(backup_path, "/boot")))
+ return ret;
- ui_print("Backing up recovery...\n");
- sprintf(tmp, "%s/%s", backup_path, "recovery.img");
- ret = backup_raw_partition("recovery", tmp);
- if (0 != ret)
- return print_and_error("Error while dumping recovery image!\n");
-#endif
+ if (0 != (ret = nandroid_backup_partition(backup_path, "/recovery")))
+ return ret;
if (0 == (ret = get_partition_device("wimax", tmp)))
{
@@ -262,6 +273,29 @@
}
int nandroid_restore_partition(const char* backup_path, const char* root) {
+ Volume *vol = volume_for_path(root);
+ // make sure the volume exists...
+ if (vol == NULL || vol->fs_type == NULL)
+ return 0;
+
+ // see if we need a raw restore (mtd)
+ char tmp[PATH_MAX];
+ if (strcmp(vol->fs_type, "mtd") == 0) {
+ int ret;
+ const char* name = basename(root);
+ ui_print("Erasing %s before restore...\n", name);
+ if (0 != (ret = format_volume(root))) {
+ ui_print("Error while erasing %s image!", name);
+ return ret;
+ }
+ sprintf(tmp, "%s%s.img", backup_path, root);
+ ui_print("Restoring %s image...\n", name);
+ if (0 != (ret = restore_raw_partition(vol->device, tmp))) {
+ ui_print("Error while flashing %s image!", name);
+ return ret;
+ }
+ return 0;
+ }
return nandroid_restore_partition_extended(backup_path, root, 1);
}
@@ -282,20 +316,9 @@
return print_and_error("MD5 mismatch!\n");
int ret;
-#ifndef BOARD_RECOVERY_IGNORE_BOOTABLES
- if (restore_boot)
- {
- ui_print("Erasing boot before restore...\n");
- if (0 != (ret = format_volume("/boot")))
- return print_and_error("Error while formatting BOOT:!\n");
- sprintf(tmp, "%s/boot.img", backup_path);
- ui_print("Restoring boot image...\n");
- if (0 != (ret = restore_raw_partition("boot", tmp))) {
- ui_print("Error while flashing boot image!");
- return ret;
- }
- }
-#endif
+
+ if (restore_boot && NULL != volume_for_path("/boot") && 0 != (ret = nandroid_restore_partition(backup_path, "/boot")))
+ return ret;
if (restore_wimax && 0 == (ret = get_partition_device("wimax", tmp)))
{