int do_lagfix(int do_fr) { ui_print("old config was:\n"); ui_print_file("/system/etc/lagfix.conf.old"); ui_print("new config is:\n"); ui_print_file("/system/etc/lagfix.conf"); ui_print("checking mounts available\n"); if (ensure_root_path_mounted("DATA:")!=0) return -1; if (ensure_root_path_mounted("DATADATA:")!=0) return -1; if (ensure_root_path_mounted("CACHE:")!=0) return -1; if (ensure_root_path_mounted("SDCARD:")!=0) return -1; char tmp[PATH_MAX]; nandroid_generate_timestamp_path(tmp); if (do_fr!=2) { ui_print("Creating a nandroid backup at %s\n",tmp); if (nandroid_backup_flags(tmp,DONT_BACKUP_SYSTEM)!=0) return -1; } else { ui_print("Not creating a backup\n"); } ui_print("Backup completed, recreating file systems\n"); ui_print("Unmounting\n"); unmount_all_lagfixed(); ui_print("Switching to new config\n"); __system("cp /system/etc/lagfix.conf /system/etc/lagfix.conf.old"); ui_print("Creating /data\n"); create_lagfix_partition(0); ui_print("Creating /dbdata\n"); create_lagfix_partition(1); ui_print("Creating /cache\n"); create_lagfix_partition(2); ui_print("Mounting to test\n"); dont_use_bind_options = 1; if (ensure_root_path_mounted("DATA:")!=0) return -1; if (ensure_root_path_mounted("DATADATA:")!=0) return -1; if (ensure_root_path_mounted("CACHE:")!=0) return -1; dont_use_bind_options = 0; __system("mount"); // for debug purposes if (get_bind_options()) { ui_print("Creating bind directories\n"); __system("mkdir -p /dbdata/.data/data"); __system("mkdir -p /data/data"); } ui_print("Unmounting again\n"); unmount_all_lagfixed(); if (do_fr) { ui_print("Factory reset was requested, not restoring backed up data\n"); } else { ui_print("Restoring data\n"); nandroid_restore(tmp,0,0,1,1,0); // restore might have brought some .data into dbdata, clear them if (!get_bind_options()) { if (ensure_root_path_mounted("DATADATA:")!=0) return -1; __system("rm -rf /dbdata/.data"); } } __system("mount"); ui_print("Unmounting again to be sure\n"); sync(); sleep(5); unmount_all_lagfixed(); sync(); return 0; }