Add flag for retaining layout version

Needed on Sony mint (Xperia T) as the /data/media folder is a
separate partition and normal data media wiping is not appropriate
for this device but the layout version file needs to be retained
for Android 4.2 multi-user.
This commit is contained in:
Dees_Troy 2013-01-15 16:51:18 +00:00
parent 999b39d041
commit 16c2b31827
3 changed files with 52 additions and 37 deletions

View File

@ -90,6 +90,7 @@ TWPartition::TWPartition(void) {
Fstab_File_System = "";
Format_Block_Size = 0;
Ignore_Blkid = false;
Retain_Layout_Version = false;
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
EcryptFS_Password = "";
#endif
@ -353,6 +354,8 @@ bool TWPartition::Process_Flags(string Flags, bool Display_Error) {
SubPartition_Of = ptr;
} else if (strcmp(ptr, "ignoreblkid") == 0) {
Ignore_Blkid = true;
} else if (strcmp(ptr, "retainlayoutversion") == 0) {
Retain_Layout_Version = true;
} else if (strlen(ptr) > 8 && strncmp(ptr, "symlink=", 8) == 0) {
ptr += 8;
Symlink_Path = ptr;
@ -767,6 +770,10 @@ bool TWPartition::UnMount(bool Display_Error) {
}
bool TWPartition::Wipe(string New_File_System) {
bool wiped = false, update_crypt = false;
int check;
string Layout_Filename = Mount_Point + "/.layout_version";
if (!Can_Be_Wiped) {
LOGE("Partition '%s' cannot be wiped.\n", Mount_Point.c_str());
return false;
@ -782,28 +789,35 @@ bool TWPartition::Wipe(string New_File_System) {
}
#endif
if (Has_Data_Media)
return Wipe_Data_Without_Wiping_Media();
if (Retain_Layout_Version && Mount(false) && TWFunc::Path_Exists(Layout_Filename))
TWFunc::copy_file(Layout_Filename, "/.layout_version", 0600);
else
unlink("/.layout_version");
int check;
bool wiped = false;
DataManager::GetValue(TW_RM_RF_VAR, check);
if (Has_Data_Media) {
wiped = Wipe_Data_Without_Wiping_Media();
} else {
if (check)
wiped = Wipe_RMRF();
else if (New_File_System == "ext4")
wiped = Wipe_EXT4();
else if (New_File_System == "ext2" || New_File_System == "ext3")
wiped = Wipe_EXT23(New_File_System);
else if (New_File_System == "vfat")
wiped = Wipe_FAT();
else if (New_File_System == "exfat")
wiped = Wipe_EXFAT();
else if (New_File_System == "yaffs2")
wiped = Wipe_MTD();
else {
LOGE("Unable to wipe '%s' -- unknown file system '%s'\n", Mount_Point.c_str(), New_File_System.c_str());
return false;
DataManager::GetValue(TW_RM_RF_VAR, check);
if (check)
wiped = Wipe_RMRF();
else if (New_File_System == "ext4")
wiped = Wipe_EXT4();
else if (New_File_System == "ext2" || New_File_System == "ext3")
wiped = Wipe_EXT23(New_File_System);
else if (New_File_System == "vfat")
wiped = Wipe_FAT();
else if (New_File_System == "exfat")
wiped = Wipe_EXFAT();
else if (New_File_System == "yaffs2")
wiped = Wipe_MTD();
else {
LOGE("Unable to wipe '%s' -- unknown file system '%s'\n", Mount_Point.c_str(), New_File_System.c_str());
unlink("/.layout_version");
return false;
}
update_crypt = wiped;
}
if (wiped) {
@ -815,15 +829,21 @@ bool TWPartition::Wipe(string New_File_System) {
}
}
#endif
Setup_File_System(false);
if (Is_Encrypted && !Is_Decrypted) {
// just wiped an encrypted partition back to its unencrypted state
Is_Encrypted = false;
Is_Decrypted = false;
Decrypted_Block_Device = "";
if (Mount_Point == "/data") {
DataManager::SetValue(TW_IS_ENCRYPTED, 0);
DataManager::SetValue(TW_IS_DECRYPTED, 0);
if (TWFunc::Path_Exists("/.layout_version") && Mount(false))
TWFunc::copy_file("/.layout_version", Layout_Filename, 0600);
if (update_crypt) {
Setup_File_System(false);
if (Is_Encrypted && !Is_Decrypted) {
// just wiped an encrypted partition back to its unencrypted state
Is_Encrypted = false;
Is_Decrypted = false;
Decrypted_Block_Device = "";
if (Mount_Point == "/data") {
DataManager::SetValue(TW_IS_ENCRYPTED, 0);
DataManager::SetValue(TW_IS_DECRYPTED, 0);
}
}
}
}
@ -1217,14 +1237,6 @@ bool TWPartition::Wipe_Data_Without_Wiping_Media() {
}
closedir(d);
ui_print("Done.\n");
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
if (Mount_Point == "/data" && Mount(false)) {
if (TWFunc::Path_Exists("/tmp/edk_p_sd")) {
Make_Dir("/data/system", true);
TWFunc::copy_file("/tmp/edk_p_sd", "/data/system/edk_p_sd", 0600);
}
}
#endif
return true;
}
ui_print("Dirent failed to open /data, error!\n");

View File

@ -163,6 +163,8 @@ void TWPartitionManager::Output_Partition(TWPartition* Part) {
printf("Is_Storage ");
if (Part->Ignore_Blkid)
printf("Ignore_Blkid ");
if (Part->Retain_Layout_Version)
printf("Retain_Layout_Version ");
printf("\n");
if (!Part->SubPartition_Of.empty())
printf(" SubPartition_Of: %s\n", Part->SubPartition_Of.c_str());

View File

@ -107,6 +107,7 @@ protected:
string Fstab_File_System; // File system from the recovery.fstab
int Format_Block_Size; // Block size for formatting
bool Ignore_Blkid; // Ignore blkid results due to superblocks lying to us on certain devices / partitions
bool Retain_Layout_Version; // Retains the .layout_version file during a wipe (needed on devices like Sony Xperia T where /data and /data/media are separate partitions)
#ifdef TW_INCLUDE_CRYPTO_SAMSUNG
string EcryptFS_Password; // Have to store the encryption password to remount
#endif