static int dedupe_compress_wrapper(const char* backup_path, const char* backup_file_image, int callback) { char tmp[PATH_MAX]; char blob_dir[PATH_MAX]; strcpy(blob_dir, backup_file_image); char *d = dirname(blob_dir); strcpy(blob_dir, d); d = dirname(blob_dir); strcpy(blob_dir, d); d = dirname(blob_dir); strcpy(blob_dir, d); strcat(blob_dir, "/blobs"); ensure_directory(blob_dir); if (!(nandroid_backup_bitfield & NANDROID_FIELD_DEDUPE_CLEARED_SPACE)) { nandroid_backup_bitfield |= NANDROID_FIELD_DEDUPE_CLEARED_SPACE; nandroid_dedupe_gc(blob_dir); } sprintf(tmp, "dedupe c %s %s %s.dup %s", backup_path, blob_dir, backup_file_image, strcmp(backup_path, "/data") == 0 && is_data_media() ? "./media" : ""); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute dedupe.\n"); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = NULL; if (callback) nandroid_callback(tmp); } return __pclose(fp); }
static int dedupe_extract_wrapper(const char* backup_file_image, const char* backup_path, int callback) { char tmp[PATH_MAX]; char blob_dir[PATH_MAX]; strcpy(blob_dir, backup_file_image); char *bd = dirname(blob_dir); strcpy(blob_dir, bd); bd = dirname(blob_dir); strcpy(blob_dir, bd); bd = dirname(blob_dir); sprintf(tmp, "dedupe x %s %s/blobs %s; exit $?", backup_file_image, bd, backup_path); char path[PATH_MAX]; FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute dedupe.\n"); return -1; } while (fgets(path, PATH_MAX, fp) != NULL) { if (callback) nandroid_callback(path); } return __pclose(fp); }
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 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); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute tar.\n"); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = NULL; if (callback) nandroid_callback(tmp); } return __pclose(fp); }
static int unyaffs_wrapper(const char* backup_file_image, const char* backup_path, int callback) { char tmp[PATH_MAX]; sprintf(tmp, "cd %s ; unyaffs %s ; exit $?", backup_path, backup_file_image); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute unyaffs.\n"); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = NULL; if (callback) nandroid_callback(tmp); } return __pclose(fp); }
static int do_tar_extract(char* command, int callback) { char buf[PATH_MAX]; FILE *fp = __popen(command, "r"); if (fp == NULL) { ui_print("不能正确执行tar命令.\n"); return -1; } while (fgets(buf, PATH_MAX, fp) != NULL) { buf[PATH_MAX - 1] = '\0'; if (callback) nandroid_callback(buf); } return __pclose(fp); }
static int do_tar_compress(char* command, int callback) { char buf[PATH_MAX]; FILE *fp = __popen(command, "r"); if (fp == NULL) { ui_print("Unable to execute tar command!\n"); return -1; } while (fgets(buf, PATH_MAX, fp) != NULL) { buf[PATH_MAX - 1] = '\0'; if (callback) nandroid_callback(buf); } return __pclose(fp); }
static int tar_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 ; (tar cv %s $(basename %s) | split -a 1 -b 1000000000 /proc/self/fd/0 %s.tar.) 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); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("Unable to execute tar.\n"); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = NULL; if (callback) nandroid_callback(tmp); } return __pclose(fp); }
static int mkyaffs2image_wrapper(const char* backup_path, const char* backup_file_image, int callback) { char tmp[PATH_MAX]; sprintf(tmp, "cd %s ; mkyaffs2image . %s.img ; exit $?", backup_path, backup_file_image); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { ui_print("运行或者解析mkyaffs2image失败.\n"); return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = NULL; if (callback) nandroid_callback(tmp); } 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 mkyaffs2image_wrapper(const char* backup_path, const char* backup_file_image, int callback) { char tmp[PATH_MAX]; sprintf(tmp, "cd %s ; mkyaffs2image . %s.img ; exit $?", backup_path, backup_file_image); FILE *fp = __popen(tmp, "r"); if (fp == NULL) { #ifndef USE_CHINESE_FONT ui_print("Unable to execute mkyaffs2image.\n"); #else ui_print("无法执行 mkyaffs2image。\n"); #endif return -1; } while (fgets(tmp, PATH_MAX, fp) != NULL) { tmp[PATH_MAX - 1] = '\0'; if (callback) nandroid_callback(tmp); } 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; }