summaryrefslogtreecommitdiffstats
path: root/partitionmanager.cpp
diff options
context:
space:
mode:
authorDees_Troy <dees_troy@teamw.in>2012-09-18 21:40:25 +0200
committerDees_Troy <dees_troy@teamw.in>2012-09-18 21:44:39 +0200
commit8170a921453945caffb31c06d563010e8a182b3d (patch)
tree570e5aebccc70b1c4ba2ae29b9e3dd16dd44e16d /partitionmanager.cpp
parentImprove backup and restore (diff)
downloadandroid_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar.gz
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar.bz2
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar.lz
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar.xz
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.tar.zst
android_bootable_recovery-8170a921453945caffb31c06d563010e8a182b3d.zip
Diffstat (limited to 'partitionmanager.cpp')
-rw-r--r--partitionmanager.cpp307
1 files changed, 287 insertions, 20 deletions
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index 855b311be..b2bbf8e8e 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -29,6 +29,8 @@
#include <vector>
#include <dirent.h>
#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
#include "variables.h"
#include "common.h"
@@ -36,11 +38,6 @@
#include "data.hpp"
#include "twrp-functions.hpp"
-extern "C" {
- #include "extra-functions.h"
- int __system(const char *command);
-}
-
#ifdef TW_INCLUDE_CRYPTO
#ifdef TW_INCLUDE_JB_CRYPTO
#include "crypto/jb/cryptfs.h"
@@ -111,6 +108,81 @@ int TWPartitionManager::Write_Fstab(void) {
return true;
}
+void TWPartitionManager::Output_Partition_Logging(void) {
+ std::vector<TWPartition*>::iterator iter;
+
+ printf("\n\nPartition Logs:\n");
+ for (iter = Partitions.begin(); iter != Partitions.end(); iter++)
+ Output_Partition((*iter));
+}
+
+void TWPartitionManager::Output_Partition(TWPartition* Part) {
+ unsigned long long mb = 1048576;
+
+ if (Part->Can_Be_Mounted) {
+ printf("%s | %s | Size: %iMB Used: %iMB Free: %iMB Backup Size: %iMB\n Flags: ", Part->Mount_Point.c_str(), Part->Actual_Block_Device.c_str(), (int)(Part->Size / mb), (int)(Part->Used / mb), (int)(Part->Free / mb), (int)(Part->Backup_Size / mb));
+ if (Part->Can_Be_Wiped)
+ printf("Can_Be_Wiped ");
+ if (Part->Wipe_During_Factory_Reset)
+ printf("Wipe_During_Factory_Reset ");
+ if (Part->Wipe_Available_in_GUI)
+ printf("Wipe_Available_in_GUI ");
+ if (Part->Is_SubPartition)
+ printf("Is_SubPartition ");
+ if (Part->Has_SubPartition)
+ printf("Has_SubPartition ");
+ if (Part->Removable)
+ printf("Removable ");
+ if (Part->Is_Present)
+ printf("IsPresent ");
+ if (Part->Can_Be_Encrypted)
+ printf("Can_Be_Encrypted ");
+ if (Part->Is_Encrypted)
+ printf("Is_Encrypted ");
+ if (Part->Is_Decrypted)
+ printf("Is_Decrypted ");
+ if (Part->Has_Data_Media)
+ printf("Has_Data_Media ");
+ if (Part->Is_Storage)
+ printf("Is_Storage ");
+ printf("\n");
+ if (!Part->SubPartition_Of.empty())
+ printf(" SubPartition_Of: %s\n", Part->SubPartition_Of.c_str());
+ if (!Part->Symlink_Path.empty())
+ printf(" Symlink_Path: %s\n", Part->Symlink_Path.c_str());
+ if (!Part->Symlink_Mount_Point.empty())
+ printf(" Symlink_Mount_Point: %s\n", Part->Symlink_Mount_Point.c_str());
+ if (!Part->Primary_Block_Device.empty())
+ printf(" Primary_Block_Device: %s\n", Part->Primary_Block_Device.c_str());
+ if (!Part->Alternate_Block_Device.empty())
+ printf(" Alternate_Block_Device: %s\n", Part->Alternate_Block_Device.c_str());
+ if (!Part->Decrypted_Block_Device.empty())
+ printf(" Decrypted_Block_Device: %s\n", Part->Decrypted_Block_Device.c_str());
+ if (Part->Length != 0)
+ printf(" Length: %i\n", Part->Length);
+ if (!Part->Display_Name.empty())
+ printf(" Display_Name: %s\n", Part->Display_Name.c_str());
+ if (!Part->Backup_Name.empty())
+ printf(" Backup_Name: %s\n", Part->Backup_Name.c_str());
+ if (!Part->Backup_FileName.empty())
+ printf(" Backup_FileName: %s\n", Part->Backup_FileName.c_str());
+ if (!Part->MTD_Name.empty())
+ printf(" MTD_Name: %s\n", Part->MTD_Name.c_str());
+ if (!Part->Storage_Path.empty())
+ printf(" Storage_Path: %s\n", Part->Storage_Path.c_str());
+ if (!Part->Current_File_System.empty())
+ printf(" Current_File_System: %s\n", Part->Current_File_System.c_str());
+ if (!Part->Fstab_File_System.empty())
+ printf(" Fstab_File_System: %s\n", Part->Fstab_File_System.c_str());
+ if (Part->Format_Block_Size != 0)
+ printf(" Format_Block_Size: %i\n", Part->Format_Block_Size);
+ } else {
+ printf("%s | %s | Size: %iMB\n", Part->Mount_Point.c_str(), Part->Actual_Block_Device.c_str(), (int)(Part->Size / mb));
+ }
+ string back_meth = Part->Backup_Method_By_Name();
+ printf(" Backup_Method: %s\n\n", back_meth.c_str());
+}
+
int TWPartitionManager::Mount_By_Path(string Path, bool Display_Error) {
std::vector<TWPartition*>::iterator iter;
int ret = false;
@@ -382,6 +454,18 @@ bool TWPartitionManager::Backup_Partition(TWPartition* Part, string Backup_Folde
time(&start);
if (Part->Backup(Backup_Folder)) {
+ if (Part->Has_SubPartition) {
+ std::vector<TWPartition*>::iterator subpart;
+
+ for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
+ if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == Part->Mount_Point) {
+ if (!(*subpart)->Backup(Backup_Folder))
+ return false;
+ if (!Make_MD5(generate_md5, Backup_Folder, (*subpart)->Backup_FileName))
+ return false;
+ }
+ }
+ }
time(&stop);
if (Part->Backup_Method == 1) {
*file_bytes_remaining -= Part->Backup_Size;
@@ -399,7 +483,7 @@ bool TWPartitionManager::Backup_Partition(TWPartition* Part, string Backup_Folde
int TWPartitionManager::Run_Backup(void) {
int check, do_md5, partition_count = 0;
string Backup_Folder, Backup_Name, Full_Backup_Path;
- unsigned long long total_bytes = 0, file_bytes = 0, img_bytes = 0, free_space = 0, img_bytes_remaining, file_bytes_remaining;
+ unsigned long long total_bytes = 0, file_bytes = 0, img_bytes = 0, free_space = 0, img_bytes_remaining, file_bytes_remaining, subpart_size;
unsigned long img_time = 0, file_time = 0;
TWPartition* backup_sys = NULL;
TWPartition* backup_data = NULL;
@@ -412,6 +496,7 @@ int TWPartitionManager::Run_Backup(void) {
TWPartition* backup_sp2 = NULL;
TWPartition* backup_sp3 = NULL;
TWPartition* storage = NULL;
+ std::vector<TWPartition*>::iterator subpart;
struct tm *t;
time_t start, stop, seconds, total_start, total_stop;
seconds = time(0);
@@ -466,10 +551,17 @@ int TWPartitionManager::Run_Backup(void) {
backup_data = Find_Partition_By_Path("/data");
if (backup_data != NULL) {
partition_count++;
+ subpart_size = 0;
+ if (backup_data->Has_SubPartition) {
+ for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
+ if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == backup_data->Mount_Point)
+ subpart_size += (*subpart)->Backup_Size;
+ }
+ }
if (backup_data->Backup_Method == 1)
- file_bytes += backup_data->Backup_Size;
+ file_bytes += backup_data->Backup_Size + subpart_size;
else
- img_bytes += backup_data->Backup_Size;
+ img_bytes += backup_data->Backup_Size + subpart_size;
} else {
LOGE("Unable to locate data partition.\n");
return false;
@@ -665,6 +757,16 @@ bool TWPartitionManager::Restore_Partition(TWPartition* Part, string Restore_Nam
time(&Start);
if (!Part->Restore(Restore_Name))
return false;
+ if (Part->Has_SubPartition) {
+ std::vector<TWPartition*>::iterator subpart;
+
+ for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
+ if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == Part->Mount_Point) {
+ if (!(*subpart)->Restore(Restore_Name))
+ return false;
+ }
+ }
+ }
time(&Stop);
ui_print("[%s done (%d seconds)]\n\n", Part->Display_Name.c_str(), (int)difftime(Stop, Start));
return true;
@@ -791,6 +893,16 @@ int TWPartitionManager::Run_Restore(string Restore_Name) {
return false;
if (restore_data != NULL && !restore_data->Check_MD5(Restore_Name))
return false;
+ if (restore_data != NULL && restore_data->Has_SubPartition) {
+ std::vector<TWPartition*>::iterator subpart;
+
+ for (subpart = Partitions.begin(); subpart != Partitions.end(); subpart++) {
+ if ((*subpart)->Is_SubPartition && (*subpart)->SubPartition_Of == restore_data->Mount_Point) {
+ if (!(*subpart)->Check_MD5(Restore_Name))
+ return false;
+ }
+ }
+ }
if (restore_cache != NULL && !restore_cache->Check_MD5(Restore_Name))
return false;
if (restore_boot != NULL && !restore_boot->Check_MD5(Restore_Name))
@@ -1043,18 +1155,18 @@ int TWPartitionManager::Wipe_Dalvik_Cache(void) {
return false;
ui_print("\nWiping Dalvik Cache Directories...\n");
- __system("rm -rf /data/dalvik-cache");
+ system("rm -rf /data/dalvik-cache");
ui_print("Cleaned: /data/dalvik-cache...\n");
- __system("rm -rf /cache/dalvik-cache");
+ system("rm -rf /cache/dalvik-cache");
ui_print("Cleaned: /cache/dalvik-cache...\n");
- __system("rm -rf /cache/dc");
+ system("rm -rf /cache/dc");
ui_print("Cleaned: /cache/dc\n");
TWPartition* sdext = Find_Partition_By_Path("/sd-ext");
if (sdext != NULL) {
if (sdext->Is_Present && sdext->Mount(false)) {
if (stat("/sd-ext/dalvik-cache", &st) == 0) {
- __system("rm -rf /sd-ext/dalvik-cache");
+ system("rm -rf /sd-ext/dalvik-cache");
ui_print("Cleaned: /sd-ext/dalvik-cache...\n");
}
}
@@ -1067,8 +1179,9 @@ int TWPartitionManager::Wipe_Rotate_Data(void) {
if (!Mount_By_Path("/data", true))
return false;
- __system("rm -r /data/misc/akmd*");
- __system("rm -r /data/misc/rild*");
+ system("rm -r /data/misc/akmd*");
+ system("rm -r /data/misc/rild*");
+ system("rm -r /data/misc/rild*");
ui_print("Rotation data wiped.\n");
return true;
}
@@ -1115,8 +1228,8 @@ int TWPartitionManager::Wipe_Media_From_Data(void) {
return false;
ui_print("Wiping internal storage -- /data/media...\n");
- __system("rm -rf /data/media");
- __system("cd /data && mkdir media && chmod 775 media");
+ system("rm -rf /data/media");
+ system("cd /data && mkdir media && chmod 775 media");
if (dat->Has_Data_Media) {
dat->Recreate_Media_Folder();
}
@@ -1157,16 +1270,55 @@ void TWPartitionManager::Update_System_Details(void) {
DataManager::SetValue(TW_BACKUP_SDEXT_VAR, 0);
} else
DataManager::SetValue(TW_HAS_SDEXT_PARTITION, 1);
+ } else if ((*iter)->Mount_Point == "/and-sec") {
+ int backup_display_size = (int)((*iter)->Backup_Size / 1048576LLU);
+ DataManager::SetValue(TW_BACKUP_SDEXT_SIZE, backup_display_size);
+ if ((*iter)->Backup_Size == 0) {
+ DataManager::SetValue(TW_HAS_ANDROID_SECURE, 0);
+ DataManager::SetValue(TW_BACKUP_ANDSEC_VAR, 0);
+ } else
+ DataManager::SetValue(TW_HAS_ANDROID_SECURE, 1);
}
}
}
DataManager::SetValue(TW_BACKUP_DATA_SIZE, data_size);
string current_storage_path = DataManager::GetCurrentStoragePath();
TWPartition* FreeStorage = Find_Partition_By_Path(current_storage_path);
- if (FreeStorage)
- DataManager::SetValue(TW_STORAGE_FREE_SIZE, (int)(FreeStorage->Free / 1048576LLU));
- else
+ if (FreeStorage != NULL) {
+ // Attempt to mount storage
+ if (!FreeStorage->Mount(false)) {
+ // We couldn't mount storage... check to see if we have dual storage
+ int has_dual_storage;
+ DataManager::GetValue(TW_HAS_DUAL_STORAGE, has_dual_storage);
+ if (has_dual_storage == 1) {
+ // We have dual storage, see if we're using the internal storage that should always be present
+ if (current_storage_path == DataManager::GetSettingsStoragePath()) {
+ // Not able to use internal, so error!
+ LOGE("Unable to mount internal storage.\n");
+ DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
+ } else {
+ // We were using external, flip to internal
+ DataManager::SetValue(TW_USE_EXTERNAL_STORAGE, 0);
+ current_storage_path = DataManager::GetCurrentStoragePath();
+ FreeStorage = Find_Partition_By_Path(current_storage_path);
+ if (FreeStorage != NULL) {
+ DataManager::SetValue(TW_STORAGE_FREE_SIZE, (int)(FreeStorage->Free / 1048576LLU));
+ } else {
+ LOGE("Unable to locate internal storage partition.\n");
+ DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
+ }
+ }
+ } else {
+ // No dual storage and unable to mount storage, error!
+ LOGE("Unable to mount storage.\n");
+ DataManager::SetValue(TW_STORAGE_FREE_SIZE, 0);
+ }
+ } else {
+ DataManager::SetValue(TW_STORAGE_FREE_SIZE, (int)(FreeStorage->Free / 1048576LLU));
+ }
+ } else {
LOGI("Unable to find storage partition '%s'.\n", current_storage_path.c_str());
+ }
if (!Write_Fstab())
LOGE("Error creating fstab\n");
return;
@@ -1227,7 +1379,122 @@ int TWPartitionManager::Fix_Permissions(void) {
return false;
ui_print("Fixing Permissions\nThis may take a few minutes.\n");
- __system("./sbin/fix_permissions.sh");
+ system("./sbin/fix_permissions.sh");
ui_print("Done.\n\n");
return true;
}
+
+//partial kangbang from system/vold
+#ifndef CUSTOM_LUN_FILE
+#define CUSTOM_LUN_FILE "/sys/devices/platform/usb_mass_storage/lun%d/file"
+#endif
+
+int TWPartitionManager::usb_storage_enable(void) {
+ int fd, has_dual, has_data_media;
+ char lun_file[255];
+ TWPartition* Part;
+ string ext_path;
+
+ DataManager::GetValue(TW_HAS_DUAL_STORAGE, has_dual);
+ DataManager::GetValue(TW_HAS_DATA_MEDIA, has_data_media);
+ if (has_dual == 1 && has_data_media == 0) {
+ Part = Find_Partition_By_Path(DataManager::GetSettingsStoragePath());
+ if (Part == NULL) {
+ LOGE("Unable to locate volume information.");
+ return false;
+ }
+ if (!Part->UnMount(true))
+ return false;
+
+ sprintf(lun_file, CUSTOM_LUN_FILE, 0);
+ if ((fd = open(lun_file, O_WRONLY)) < 0) {
+ LOGE("Unable to open ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ return false;
+ }
+
+ if (write(fd, Part->Actual_Block_Device.c_str(), Part->Actual_Block_Device.size()) < 0) {
+ LOGE("Unable to write to ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ close(fd);
+ return false;
+ }
+ close(fd);
+
+ DataManager::GetValue(TW_EXTERNAL_PATH, ext_path);
+ Part = Find_Partition_By_Path(ext_path);
+ if (Part == NULL) {
+ LOGE("Unable to locate volume information.\n");
+ return false;
+ }
+ if (!Part->UnMount(true))
+ return false;
+
+ sprintf(lun_file, CUSTOM_LUN_FILE, 1);
+ if ((fd = open(lun_file, O_WRONLY)) < 0) {
+ LOGE("Unable to open ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ return false;
+ }
+
+ if (write(fd, Part->Actual_Block_Device.c_str(), Part->Actual_Block_Device.size()) < 0) {
+ LOGE("Unable to write to ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ close(fd);
+ return false;
+ }
+ close(fd);
+ } else {
+ if (has_data_media == 0)
+ ext_path = DataManager::GetCurrentStoragePath();
+ else
+ DataManager::GetValue(TW_EXTERNAL_PATH, ext_path);
+
+ Part = Find_Partition_By_Path(ext_path);
+ if (Part == NULL) {
+ LOGE("Unable to locate volume information.\n");
+ return false;
+ }
+ if (!Part->UnMount(true))
+ return false;
+
+ sprintf(lun_file, CUSTOM_LUN_FILE, 0);
+
+ if ((fd = open(lun_file, O_WRONLY)) < 0) {
+ LOGE("Unable to open ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ return false;
+ }
+
+ if (write(fd, Part->Actual_Block_Device.c_str(), Part->Actual_Block_Device.size()) < 0) {
+ LOGE("Unable to write to ums lunfile '%s': (%s)\n", lun_file, strerror(errno));
+ close(fd);
+ return false;
+ }
+ close(fd);
+ }
+ return true;
+}
+
+int TWPartitionManager::usb_storage_disable(void) {
+ int fd, index;
+ char lun_file[255];
+
+ for (index=0; index<2; index++) {
+ sprintf(lun_file, CUSTOM_LUN_FILE, index);
+
+ if ((fd = open(lun_file, O_WRONLY)) < 0) {
+ if (index == 0)
+ LOGE("Unable to open ums lunfile '%s': (%s)", lun_file, strerror(errno));
+ return false;
+ }
+
+ char ch = 0;
+ if (write(fd, &ch, 1) < 0) {
+ if (index == 0)
+ LOGE("Unable to write to ums lunfile '%s': (%s)", lun_file, strerror(errno));
+ close(fd);
+ return false;
+ }
+
+ close(fd);
+ }
+ Mount_By_Path(DataManager::GetSettingsStoragePath(), true);
+ Mount_By_Path(DataManager::GetCurrentStoragePath(), true);
+ return true;
+} \ No newline at end of file