Backup of Froyo apps on external storage.
diff --git a/nandroid.c b/nandroid.c
index 763ce5b..00afbd9 100644
--- a/nandroid.c
+++ b/nandroid.c
@@ -75,7 +75,7 @@
ui_show_progress(1, 0);
}
-int nandroid_backup_partition(const char* backup_path, char* root) {
+int nandroid_backup_partition_extended(const char* backup_path, char* root, int umount_when_finished) {
int ret = 0;
char mount_point[PATH_MAX];
translate_root_path(root, mount_point, PATH_MAX);
@@ -96,7 +96,9 @@
char tmp[PATH_MAX];
sprintf(tmp, "%s/%s.img", backup_path, name);
ret = mkyaffs2image(mount_point, tmp, 0, callback);
- ensure_root_path_unmounted(root);
+ if (umount_when_finished) {
+ ensure_root_path_unmounted(root);
+ }
if (0 != ret) {
ui_print("Error while making a yaffs2 image of %s!\n", mount_point);
return ret;
@@ -104,6 +106,10 @@
return 0;
}
+int nandroid_backup_partition(const char* backup_path, char* root) {
+ return nandroid_backup_partition_extended(backup_path, root, 1);
+}
+
int nandroid_backup(const char* backup_path)
{
ui_set_background(BACKGROUND_ICON_INSTALLING);
@@ -150,10 +156,20 @@
return ret;
#endif
- if (0 != (ret = nandroid_backup_partition(backup_path, "CACHE:")))
+ struct stat st;
+ if (0 != stat("/sdcard/.android_secure", &st))
+ {
+ ui_print("No /sdcard/.android_secure found. Skipping backup of applications on external storage.\n");
+ }
+ else
+ {
+ if (0 != (ret = nandroid_backup_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
+ return ret;
+ }
+
+ if (0 != (ret = nandroid_backup_partition_extended(backup_path, "CACHE:", 0)))
return ret;
- struct stat st;
if (0 != stat(SDEXT_DEVICE, &st))
{
ui_print("No sd-ext found. Skipping backup of sd-ext.\n");
@@ -165,7 +181,7 @@
else if (0 != (ret = nandroid_backup_partition(backup_path, "SDEXT:")))
return ret;
}
-
+
ui_print("Generating md5 sum...\n");
sprintf(tmp, "nandroid-md5.sh %s", backup_path);
if (0 != (ret = __system(tmp))) {
@@ -182,7 +198,7 @@
typedef int (*format_function)(char* root);
-int nandroid_restore_partition(const char* backup_path, const char* root) {
+int nandroid_restore_partition_extended(const char* backup_path, const char* root, int umount_when_finished) {
int ret = 0;
char mount_point[PATH_MAX];
translate_root_path(root, mount_point, PATH_MAX);
@@ -216,12 +232,17 @@
return ret;
}
- if (0 != strcmp(root, "CACHE")) {
+ if (umount_when_finished) {
ensure_root_path_unmounted(root);
}
+
return 0;
}
+int nandroid_restore_partition(const char* backup_path, const char* root) {
+ return nandroid_restore_partition_extended(backup_path, root, 1);
+}
+
int nandroid_restore(const char* backup_path, int restore_boot, int restore_system, int restore_data, int restore_cache, int restore_sdext)
{
ui_set_background(BACKGROUND_ICON_INSTALLING);
@@ -263,7 +284,23 @@
return ret;
#endif
- if (restore_cache && 0 != (ret = nandroid_restore_partition(backup_path, "CACHE:")))
+ if (restore_data)
+ {
+ struct statfs s;
+ sprintf(tmp, "%s/.android_secure.img", backup_path);
+ if (0 != (ret = statfs(tmp, &s)))
+ {
+ ui_print(".android_secure.img not found. Skipping restore of applications on external storage.");
+ }
+ else
+ {
+ __system("mkdir -p /sdcard/.android_secure");
+ if (0 != (ret = nandroid_restore_partition_extended(backup_path, "SDCARD:/.android_secure", 0)))
+ return ret;
+ }
+ }
+
+ if (restore_cache && 0 != (ret = nandroid_restore_partition_extended(backup_path, "CACHE:", 0)))
return ret;
if (restore_sdext)