int format_volume(const char* volume) { Volume* v = volume_for_path(volume); if (v == NULL) { LOGE("unknown volume \"%s\"\n", volume); return -1; } if (strcmp(v->mount_point, volume) != 0) { LOGE("can't give path \"%s\" to format_volume\n", volume); return -1; } // Retrieve the fs_type const char* fs_type = v->fs_type; if (memcmp(fs_type, "ext", 3) == 0) { if (strcmp(v->mount_point,"/system") == 0) fs_type = sys.fst; else if (strcmp(v->mount_point,"/data") == 0) fs_type = dat.fst; else if (strcmp(v->mount_point,"/cache") == 0) fs_type = cac.fst; } return tw_format(fs_type, v->device); }
int tw_restore(struct dInfo rMnt, char *rDir) { int i; FILE *reFp; char rUppr[20]; char rMount[30]; char rFilesystem[10]; char rFilename[255]; char rCommand[255]; char rOutput[255]; time_t rStart, rStop; strcpy(rUppr,rMnt.mnt); for (i = 0; i < strlen(rUppr); i++) { rUppr[i] = toupper(rUppr[i]); } ui_print("[%s]\n",rUppr); ui_show_progress(1,150); time(&rStart); ui_print("...Verifying md5 hash for %s.\n",rMnt.mnt); if(checkMD5(rDir,rMnt.fnm) == 0) // verify md5, check if no error; 0 = no error. { strcpy(rFilename,rDir); strcat(rFilename,rMnt.fnm); sprintf(rCommand,"ls -l %s | awk -F'.' '{ print $2 }'",rFilename); // let's get the filesystem type from filename reFp = __popen(rCommand, "r"); LOGI("=> Filename is: %s\n",rMnt.fnm); while (fscanf(reFp,"%s",rFilesystem) == 1) { // if we get a match, store filesystem type LOGI("=> Filesystem is: %s\n",rFilesystem); // show it off to the world! } __pclose(reFp); if (DataManager_GetIntValue(TW_RM_RF_VAR) == 1 && (strcmp(rMnt.mnt,"system") == 0 || strcmp(rMnt.mnt,"data") == 0 || strcmp(rMnt.mnt,"cache") == 0)) { // we'll use rm -rf instead of formatting for system, data and cache if the option is set ui_print("...using rm -rf to wipe %s\n", rMnt.mnt); tw_mount(rMnt); // mount the partition first sprintf(rCommand,"rm -rf %s%s/*", "/", rMnt.mnt); LOGI("rm rf commad: %s\n", rCommand); reFp = __popen(rCommand, "r"); while (fscanf(reFp,"%s",rOutput) == 1) { ui_print_overwrite("%s",rOutput); } __pclose(reFp); } else { ui_print("...Formatting %s\n",rMnt.mnt); tw_format(rFilesystem,rMnt.blk); // let's format block, based on filesystem from filename above } ui_print("....Done.\n"); if (strcmp(rFilesystem,"mtd") == 0) { // if filesystem is mtd, we use flash image sprintf(rCommand,"flash_image %s %s",rMnt.mnt,rFilename); strcpy(rMount,rMnt.mnt); } else if (strcmp(rFilesystem,"emmc") == 0) { // if filesystem is emmc, we use dd sprintf(rCommand,"dd bs=%s if=%s of=%s",bs_size,rFilename,rMnt.dev); strcpy(rMount,rMnt.mnt); } else { tw_mount(rMnt); strcpy(rMount,"/"); if (strcmp(rMnt.mnt,".android_secure") == 0) { // if it's android_secure, we have add prefix strcat(rMount,"sdcard/"); } strcat(rMount,rMnt.mnt); sprintf(rCommand,"cd %s && tar -xvf %s",rMount,rFilename); // formulate shell command to restore } ui_print("...Restoring %s\n",rMount); reFp = __popen(rCommand, "r"); if(DataManager_GetIntValue(TW_SHOW_SPAM_VAR) == 2) { // twrp spam while (fgets(rOutput,sizeof(rOutput),reFp) != NULL) { ui_print_overwrite("%s",rOutput); } } else { while (fscanf(reFp,"%s",rOutput) == 1) { if(DataManager_GetIntValue(TW_SHOW_SPAM_VAR) == 1) ui_print_overwrite("%s",rOutput); } } __pclose(reFp); ui_print_overwrite("....Done.\n"); if (strcmp(rMnt.mnt,".android_secure") != 0) { // any partition other than android secure, tw_unmount(rMnt); // let's unmount (unmountable partitions won't matter) } } else { ui_print("...Failed md5 check. Aborted.\n\n"); return 1; } ui_reset_progress(); time(&rStop); output_time(rUppr, "DONE", (int)difftime(rStop,rStart)); return 0; }