int twrp_tar_extract_wrapper(const char* popen_command, const char* backup_path, int callback) { char tmp[PATH_MAX]; strcpy(tmp, popen_command); set_perf_mode(1); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute tar.\n"); set_perf_mode(0); return -1; } int nand_starts = 1; last_size_update = 0; while (fgets(tmp, PATH_MAX, fp) != NULL) { #ifdef PHILZ_TOUCH_RECOVERY if (user_cancel_nandroid(&fp, NULL, 0, &nand_starts)) { set_perf_mode(0); return -1; } #endif tmp[PATH_MAX - 1] = '\0'; if (callback) { update_size_progress(backup_path); nandroid_callback(tmp); } } #ifdef PHILZ_TOUCH_RECOVERY ui_print_preset_colors(0, NULL); #endif set_perf_mode(0); return __pclose(fp); }
static int do_tar_extract(char* command, int callback) { char buf[PATH_MAX]; set_perf_mode(1); FILE *fp = __popen(command, "r"); if (fp == NULL) { ui_print("Unable to execute tar command.\n"); set_perf_mode(0); return -1; } while (fgets(buf, PATH_MAX, fp) != NULL) { buf[PATH_MAX - 1] = '\0'; if (callback) nandroid_callback(buf); } set_perf_mode(0); return __pclose(fp); }
static int do_tar_compress(char* command, int callback) { char buf[PATH_MAX]; set_perf_mode(1); FILE *fp = __popen(command, "r"); if (fp == NULL) { #ifndef USE_CHINESE_FONT ui_print("Unable to execute tar command!\n"); #else ui_print("无法执行 tar 命令!\n"); #endif set_perf_mode(0); return -1; } while (fgets(buf, PATH_MAX, fp) != NULL) { buf[PATH_MAX - 1] = '\0'; if (callback) nandroid_callback(buf); } set_perf_mode(0); return __pclose(fp); }
int twrp_backup_wrapper(const char* backup_path, const char* backup_file_image, int callback) { Volume *v = volume_for_path(backup_path); if (v == NULL) { ui_print("Unable to find volume.\n"); return -1; } if (!is_path_mounted(backup_path)) { LOGE("Unable to find mounted volume: '%s'\n", v->mount_point); return -1; } // Always use split format (simpler code) - Build lists of files to backup char tmp[PATH_MAX]; int backup_count; ui_print("Breaking backup file into multiple archives...\nGenerating file lists\n"); backup_count = Make_File_List(backup_path); if (backup_count < 1) { LOGE("Error generating file list!\n"); return -1; } // check we are not backing up an empty volume as it would fail to restore (tar: short read) // check first if a filelist was generated. If not, ensure volume is 0 size. Else, it could be an error while if (!file_found("/tmp/list/filelist000")) { ui_print("Nothing to backup. Skipping %s\n", BaseName(backup_path)); return 0; } unsigned long long total_bsize = 0, file_size = 0; int index; int nand_starts = 1; last_size_update = 0; set_perf_mode(1); for (index = 0; index < backup_count; index++) { compute_twrp_backup_stats(index); // folder /data/media and google cached music are excluded from tar by Generate_File_Lists(...) if (nandroid_get_default_backup_format() == NANDROID_BACKUP_FORMAT_TAR) sprintf(tmp, "(tar -cpvf '%s%03i' -T /tmp/list/filelist%03i) 2> /proc/self/fd/1 ; exit $?", backup_file_image, index, index); else sprintf(tmp, "set -o pipefail ; (tar -cpv -T /tmp/list/filelist%03i | pigz -c -%d >'%s%03i') 2> /proc/self/fd/1 ; exit $?", index, compression_value.value, backup_file_image, index); ui_print(" * Backing up archive %i/%i\n", (index + 1), backup_count); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { LOGE("Unable to execute tar.\n"); set_perf_mode(0); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { #ifdef PHILZ_TOUCH_RECOVERY if (user_cancel_nandroid(&fp, backup_file_image, 1, &nand_starts)) { set_perf_mode(0); return -1; } #endif tmp[PATH_MAX - 1] = '\0'; if (callback) { update_size_progress(backup_file_image); nandroid_callback(tmp); } } #ifdef PHILZ_TOUCH_RECOVERY ui_print_preset_colors(0, NULL); #endif if (0 != __pclose(fp)) { set_perf_mode(0); return -1; } sprintf(tmp, "%s%03i", backup_file_image, index); file_size = Get_File_Size(tmp); if (file_size == 0) { LOGE("Backup file size for '%s' is 0 bytes!\n", tmp); set_perf_mode(0); return -1; } total_bsize += file_size; } __system("cd /tmp && rm -rf list"); set_perf_mode(0); ui_print("Total backup size:\n %llu bytes.\n", total_bsize); return 0; }