// backup /data/media support // we reach here only if backup_data_media == 1 // backup_data_media can be set to 1 only in "custom backup and restore" menu AND if is_data_media() && !twrp_backup_mode.value int nandroid_backup_datamedia(const char* backup_path) { char tmp[PATH_MAX]; ui_print("\n>> Backing up /data/media...\n"); if (is_data_media_volume_path(backup_path)) { // non fatal failure LOGE(" - can't backup folder to its self, skipping...\n"); return 0; } if (0 != ensure_path_mounted("/data")) return -1; sprintf(tmp, "%s/%s", get_primary_storage_path(), NANDROID_HIDE_PROGRESS_FILE); ensure_path_mounted(tmp); int callback = !file_found(tmp); compute_directory_stats("/data/media"); Volume *v = volume_for_path("/data"); if (v == NULL) return -1; char backup_file_image[PATH_MAX]; sprintf(backup_file_image, "%s/datamedia.%s", backup_path, v->fs_type == NULL ? "auto" : v->fs_type); int fmt; fmt = nandroid_get_default_backup_format(); if (fmt == NANDROID_BACKUP_FORMAT_TAR) { sprintf(tmp, "cd / ; touch %s.tar ; set -o pipefail ; (tar -cpv data/media | split -a 1 -b 1000000000 /proc/self/fd/0 %s.tar.) 2> /proc/self/fd/1 ; exit $?", backup_file_image, backup_file_image); } else if (fmt == NANDROID_BACKUP_FORMAT_TGZ) { sprintf(tmp, "cd / ; touch %s.tar.gz ; set -o pipefail ; (tar -cpv data/media | pigz -c -%d | split -a 1 -b 1000000000 /proc/self/fd/0 %s.tar.gz.) 2> /proc/self/fd/1 ; exit $?", backup_file_image, compression_value.value, backup_file_image); } else { // non fatal failure LOGE(" - backup format must be tar(.gz), skipping...\n"); return 0; } int ret; ret = do_tar_compress(tmp, callback, backup_file_image); ensure_path_unmounted("/data"); if (0 != ret) return print_and_error("Failed to backup /data/media!\n", ret); ui_print("Backup of /data/media completed.\n"); return 0; }
static int tar_gzip_compress_wrapper(const char* backup_path, const char* backup_file_image, int callback) { char tmp[PATH_MAX]; sprintf(tmp, "cd $(dirname %s) ; touch %s.tar.gz ; (tar cv --exclude=data/data/com.google.android.music/files/* %s $(basename %s) | pigz -c | split -a 1 -b 1000000000 /proc/self/fd/0 %s.tar.gz.) 2> /proc/self/fd/1 ; exit $?", backup_path, backup_file_image, strcmp(backup_path, "/data") == 0 && is_data_media() ? "--exclude 'media'" : "", backup_path, backup_file_image); return do_tar_compress(tmp, callback); }