int nandroid_restore_datamedia(const char* backup_path) { char tmp[PATH_MAX]; ui_print("\n>> Restoring /data/media...\n"); if (is_data_media_volume_path(backup_path)) { // non fatal failure LOGE(" - can't restore folder to its self, skipping...\n"); return 0; } Volume *v = volume_for_path("/data"); if (v == NULL) return -1; sprintf(tmp, "%s/%s", get_primary_storage_path(), NANDROID_HIDE_PROGRESS_FILE); ensure_path_mounted(tmp); int callback = !file_found(tmp); struct stat s; char backup_file_image[PATH_MAX]; const char *filesystems[] = { "yaffs2", "ext2", "ext3", "ext4", "vfat", "exfat", "rfs", "f2fs", "auto", NULL }; const char *filesystem; int i = 0; nandroid_restore_handler restore_handler = NULL; while ((filesystem = filesystems[i]) != NULL) { sprintf(backup_file_image, "%s/datamedia.%s.tar", backup_path, filesystem); if (0 == stat(backup_file_image, &s)) { restore_handler = tar_extract_wrapper; sprintf(tmp, "cd / ; set -o pipefail ; cat %s* | tar -xpv ; exit $?", backup_file_image); break; } sprintf(backup_file_image, "%s/datamedia.%s.tar.gz", backup_path, filesystem); if (0 == stat(backup_file_image, &s)) { restore_handler = tar_gzip_extract_wrapper; sprintf(tmp, "cd / ; set -o pipefail ; cat %s* | pigz -d -c | tar -xpv ; exit $?", backup_file_image); break; } i++; } if (filesystem == NULL || restore_handler == NULL) { LOGE("No backup found, skipping...\n"); return 0; } if (0 != format_unknown_device(NULL, "/data/media", NULL)) return print_and_error("Error while erasing /data/media\n", NANDROID_ERROR_GENERAL); // data can be unmounted by format_unknown_device() if (0 != ensure_path_mounted("/data")) return -1; if (0 != do_tar_extract(tmp, backup_file_image, "/data", callback)) return print_and_error("Failed to restore /data/media!\n", NANDROID_ERROR_GENERAL); ui_print("Restore of /data/media completed.\n"); return 0; }
static int tar_extract_wrapper(const char* backup_file_image, const char* backup_path, int callback) { char tmp[PATH_MAX]; sprintf(tmp, "cd $(dirname %s) ; cat %s* | tar xv ; exit $?", backup_path, backup_file_image); return do_tar_extract(tmp, callback); }