diff --git a/Android.mk b/Android.mk
index 44149736..0ac82ba9 100644
--- a/Android.mk
+++ b/Android.mk
@@ -374,7 +374,11 @@ ifneq ($(TW_NO_EXFAT), true)
LOCAL_ADDITIONAL_DEPENDENCIES += mkexfatfs fsckexfat
endif
ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
- LOCAL_ADDITIONAL_DEPENDENCIES += parted
+ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
+ LOCAL_ADDITIONAL_DEPENDENCIES += sgdisk
+ else
+ LOCAL_ADDITIONAL_DEPENDENCIES += sgdisk_static
+ endif
endif
ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true)
LOCAL_ADDITIONAL_DEPENDENCIES += openaes ../openaes/LICENSE
diff --git a/data.cpp b/data.cpp
index 5cca3a10..c945f2af 100644
--- a/data.cpp
+++ b/data.cpp
@@ -794,8 +794,8 @@ void DataManager::SetDefaultValues()
mValues.insert(make_pair(TW_RM_RF_VAR, make_pair("0", 1)));
mValues.insert(make_pair(TW_SKIP_MD5_CHECK_VAR, make_pair("0", 1)));
mValues.insert(make_pair(TW_SKIP_MD5_GENERATE_VAR, make_pair("0", 1)));
- mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("512", 1)));
- mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("32", 1)));
+ mValues.insert(make_pair(TW_SDEXT_SIZE, make_pair("0", 1)));
+ mValues.insert(make_pair(TW_SWAP_SIZE, make_pair("0", 1)));
mValues.insert(make_pair(TW_SDPART_FILE_SYSTEM, make_pair("ext3", 1)));
mValues.insert(make_pair(TW_TIME_ZONE_GUISEL, make_pair("CST6;CDT,M3.2.0,M11.1.0", 1)));
mValues.insert(make_pair(TW_TIME_ZONE_GUIOFFSET, make_pair("0", 1)));
diff --git a/gui/action.cpp b/gui/action.cpp
index 656c687b..e13d15c6 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -792,25 +792,27 @@ int GUIAction::generatebackupname(std::string arg __unused)
return 0;
}
-int GUIAction::checkpartitionlist(std::string arg __unused)
+int GUIAction::checkpartitionlist(std::string arg)
{
- string Wipe_List, wipe_path;
+ string List, part_path;
int count = 0;
- DataManager::GetValue("tw_wipe_list", Wipe_List);
- LOGINFO("checkpartitionlist list '%s'\n", Wipe_List.c_str());
- if (!Wipe_List.empty()) {
- size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
- while (end_pos != string::npos && start_pos < Wipe_List.size()) {
- wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
- LOGINFO("checkpartitionlist wipe_path '%s'\n", wipe_path.c_str());
- if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
+ if (arg.empty())
+ arg = "tw_wipe_list";
+ DataManager::GetValue(arg, List);
+ LOGINFO("checkpartitionlist list '%s'\n", List.c_str());
+ if (!List.empty()) {
+ size_t start_pos = 0, end_pos = List.find(";", start_pos);
+ while (end_pos != string::npos && start_pos < List.size()) {
+ part_path = List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("checkpartitionlist part_path '%s'\n", part_path.c_str());
+ if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") {
// Do nothing
} else {
count++;
}
start_pos = end_pos + 1;
- end_pos = Wipe_List.find(";", start_pos);
+ end_pos = List.find(";", start_pos);
}
DataManager::SetValue("tw_check_partition_list", count);
} else {
@@ -819,29 +821,32 @@ int GUIAction::checkpartitionlist(std::string arg __unused)
return 0;
}
-int GUIAction::getpartitiondetails(std::string arg __unused)
+int GUIAction::getpartitiondetails(std::string arg)
{
- string Wipe_List, wipe_path;
+ string List, part_path;
int count = 0;
- DataManager::GetValue("tw_wipe_list", Wipe_List);
- LOGINFO("getpartitiondetails list '%s'\n", Wipe_List.c_str());
- if (!Wipe_List.empty()) {
- size_t start_pos = 0, end_pos = Wipe_List.find(";", start_pos);
- while (end_pos != string::npos && start_pos < Wipe_List.size()) {
- wipe_path = Wipe_List.substr(start_pos, end_pos - start_pos);
- LOGINFO("getpartitiondetails wipe_path '%s'\n", wipe_path.c_str());
- if (wipe_path == "/and-sec" || wipe_path == "DALVIK" || wipe_path == "INTERNAL") {
+ if (arg.empty())
+ arg = "tw_wipe_list";
+ DataManager::GetValue(arg, List);
+ LOGINFO("getpartitiondetails list '%s'\n", List.c_str());
+ if (!List.empty()) {
+ size_t start_pos = 0, end_pos = List.find(";", start_pos);
+ part_path = List;
+ while (end_pos != string::npos && start_pos < List.size()) {
+ part_path = List.substr(start_pos, end_pos - start_pos);
+ LOGINFO("getpartitiondetails part_path '%s'\n", part_path.c_str());
+ if (part_path == "/and-sec" || part_path == "DALVIK" || part_path == "INTERNAL") {
// Do nothing
} else {
- DataManager::SetValue("tw_partition_path", wipe_path);
+ DataManager::SetValue("tw_partition_path", part_path);
break;
}
start_pos = end_pos + 1;
- end_pos = Wipe_List.find(";", start_pos);
+ end_pos = List.find(";", start_pos);
}
- if (!wipe_path.empty()) {
- TWPartition* Part = PartitionManager.Find_Partition_By_Path(wipe_path);
+ if (!part_path.empty()) {
+ TWPartition* Part = PartitionManager.Find_Partition_By_Path(part_path);
if (Part) {
unsigned long long mb = 1048576;
@@ -881,12 +886,14 @@ int GUIAction::getpartitiondetails(std::string arg __unused)
DataManager::SetValue("tw_partition_ext", 0);
return 0;
} else {
- LOGERR("Unable to locate partition: '%s'\n", wipe_path.c_str());
+ LOGERR("Unable to locate partition: '%s'\n", part_path.c_str());
}
}
}
DataManager::SetValue("tw_partition_name", "");
DataManager::SetValue("tw_partition_file_system", "");
+ // Set this to 0 to prevent trying to partition this device, just in case
+ DataManager::SetValue("tw_partition_removable", 0);
return 0;
}
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index 6c91d065..57fef404 100755
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -1068,7 +1068,7 @@
{@repair_change_btn=Repair or Change File System}
-
+ tw_wipe_list
checkpartitionlist
@@ -1179,7 +1179,7 @@
partitionlisterror=0
-
+ tw_wipe_list
partitionoptions
@@ -1188,7 +1188,6 @@
partitionlisterror=1
- tw_wipe_list=
advancedwipe
@@ -1271,6 +1270,7 @@
tw_action_param=%tw_partition_mount_point%
tw_has_action2=1
tw_action2=getpartitiondetails
+ tw_action2_param=tw_wipe_list
tw_text1={@resize_confirm=Resize %tw_partition_name%?}
tw_text2=
tw_action_text1={@resizing=Resizing...}
@@ -1320,7 +1320,7 @@
partitionlisterror=0
-
+ tw_wipe_list
selectfilesystem
@@ -3091,7 +3091,10 @@
{@part_sd_btn=Partition SD Card}
- partsdcard
+
+ partitionlisterror=0
+ partsdcardsel
+
@@ -1136,7 +1136,7 @@
partitionlisterror=0
-
+ tw_wipe_list
partitionoptions
@@ -1145,7 +1145,6 @@
partitionlisterror=1
- tw_wipe_list=
advancedwipe
@@ -1228,6 +1227,7 @@
tw_action_param=%tw_partition_mount_point%
tw_has_action2=1
tw_action2=getpartitiondetails
+ tw_action2_param=tw_wipe_list
tw_text1={@resize_confirm=Resize %tw_partition_name%?}
tw_text2=
tw_action_text1={@resizing=Resizing...}
@@ -1277,7 +1277,7 @@
partitionlisterror=0
-
+ tw_wipe_list
selectfilesystem
@@ -3161,7 +3161,10 @@
{@part_sd_btn=Partition SD Card}
- partsdcard
+
+ partitionlisterror=0
+ partsdcardsel
+
@@ -3221,6 +3224,69 @@
+
+
+
+
+
+ {@advanced_hdr=Advanced}
+
+
+
+
+ {@part_sd_hdr=Partition SD Card}
+
+
+
+ {@sel_storage_list=Select Storage}
+
+
+
+
+
+
+
+ {@invalid_partsd_sel=You must select a removable device}
+
+
+
+
+ {@ok_btn=OK}
+
+ tw_storage_path
+ partsdcardcheck
+
+
+
+
+
+ main
+
+
+
+
+ advanced
+
+
+
+
+
+
+
+ partitionlisterror=0
+ partsdcard
+
+
+
+
+
+
+ partitionlisterror=1
+ partsdcardsel
+
+
+
+
@@ -3257,13 +3323,13 @@
{@part_sd_m=-}
- tw_sdext_size-128
+ tw_sdext_size-256
{@part_sd_p=+}
- tw_sdext_size+128
+ tw_sdext_size+256
@@ -3279,13 +3345,13 @@
{@part_sd_m=-}
- tw_swap_size-32
+ tw_swap_size-64
{@part_sd_p=+}
- tw_swap_size+32
+ tw_swap_size+64
@@ -3333,7 +3399,10 @@
- advanced
+
+ partitionlisterror=0
+ partsdcardsel
+
@@ -4242,7 +4311,6 @@
{@swipe_to_sideload=Swipe to Start Sideload}
- partsdcardaction
tw_back=advanced
tw_action=adbsideload
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index 7d343ddb..6ed0b837 100755
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -1422,7 +1422,7 @@
partitionlisterror=0
-
+ tw_wipe_list
partitionoptions
@@ -1431,7 +1431,6 @@
partitionlisterror=1
- tw_wipe_list=
partitionoptions_select
@@ -1471,7 +1470,7 @@
-
+ tw_wipe_list
checkpartitionlist
@@ -1562,6 +1561,7 @@
tw_action_param=%tw_partition_mount_point%
tw_has_action2=1
tw_action2=getpartitiondetails
+ tw_action2_param=tw_wipe_list
tw_text1={@resize_confirm=Resize %tw_partition_name%?}
tw_text2=
tw_action_text1={@resizing=Resizing...}
@@ -1618,7 +1618,7 @@
partitionlisterror=0
-
+ tw_wipe_list
selectfilesystem
@@ -3896,7 +3896,10 @@
{@part_sd_s_btn=SD Card}
- partsdcard
+
+ partitionlisterror=0
+ partsdcardsel
+
@@ -3932,6 +3935,73 @@
+
+
+
+
+
+
+
+ {@advanced_hdr=Advanced} > {@part_sd_hdr=Partition SD Card}
+
+
+
+
+
+
+
+
+
+
+ {@invalid_partsd_sel=You must select a removable device}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tw_storage_path
+ partsdcardcheck
+
+
+
+
+
+ main
+
+
+
+
+ advanced
+
+
+
+
+
+
+
+ partitionlisterror=0
+ partsdcard
+
+
+
+
+
+
+ partitionlisterror=1
+ partsdcardsel
+
+
+
+
@@ -3965,13 +4035,13 @@
{@part_sd_m=-}
- tw_sdext_size-128
+ tw_sdext_size-256
{@part_sd_p=+}
- tw_sdext_size+128
+ tw_sdext_size+256
@@ -3988,7 +4058,7 @@
- advanced
+ partsdcardsel
@@ -4025,13 +4095,13 @@
{@part_sd_m=-}
- tw_swap_size-32
+ tw_swap_size-64
{@part_sd_p=+}
- tw_swap_size+32
+ tw_swap_size+64
@@ -5052,7 +5122,6 @@
{@swipe_sideload= Start}
- partsdcardaction
tw_back=install_type
tw_action=adbsideload
diff --git a/partition.cpp b/partition.cpp
index 2f37d6f8..a8de4a90 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -880,23 +880,9 @@ bool TWPartition::Get_Size_Via_df(bool Display_Error) {
}
unsigned long long TWPartition::IOCTL_Get_Block_Size() {
- unsigned long block_device_size;
- int ret = 0;
-
Find_Actual_Block_Device();
- int fd = open(Actual_Block_Device.c_str(), O_RDONLY);
- if (fd < 0) {
- LOGINFO("Find_Partition_Size: Failed to open '%s', (%s)\n", Actual_Block_Device.c_str(), strerror(errno));
- } else {
- ret = ioctl(fd, BLKGETSIZE, &block_device_size);
- close(fd);
- if (ret) {
- LOGINFO("Find_Partition_Size: ioctl error: (%s)\n", strerror(errno));
- } else {
- return (unsigned long long)(block_device_size) * 512LLU;
- }
- }
- return 0;
+
+ return TWFunc::IOCTL_Get_Block_Size(Actual_Block_Device.c_str());
}
bool TWPartition::Find_Partition_Size(void) {
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index c1cd29f2..4cd3e7d5 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -30,6 +30,8 @@
#include
#include
#include
+#include
+#include
#include "variables.h"
#include "twcommon.h"
#include "partitions.hpp"
@@ -1658,20 +1660,20 @@ void TWPartitionManager::UnMount_Main_Partitions(void) {
int TWPartitionManager::Partition_SDCard(void) {
char mkdir_path[255], temp[255], line[512];
- string Command, Device, fat_str, ext_str, swap_str, start_loc, end_loc, ext_format, sd_path, tmpdevice;
+ string Storage_Path, Command, Device, fat_str, ext_str, start_loc, end_loc, ext_format, sd_path, tmpdevice;
int ext, swap, total_size = 0, fat_size;
- FILE* fp;
gui_msg("start_partition_sd=Partitioning SD Card...");
-#ifdef TW_EXTERNAL_STORAGE_PATH
- TWPartition* SDCard = Find_Partition_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH));
-#else
- TWPartition* SDCard = Find_Partition_By_Path("/sdcard");
-#endif
+
+ // Locate and validate device to partition
+ TWPartition* SDCard = Find_Partition_By_Path(DataManager::GetCurrentStoragePath());
+
if (SDCard == NULL || !SDCard->Removable || SDCard->Has_Data_Media) {
gui_err("partition_sd_locate=Unable to locate device to partition.");
return false;
}
+
+ // Unmount everything
if (!SDCard->UnMount(true))
return false;
TWPartition* SDext = Find_Partition_By_Path("/sd-ext");
@@ -1679,58 +1681,57 @@ int TWPartitionManager::Partition_SDCard(void) {
if (!SDext->UnMount(true))
return false;
}
+ char* swappath = getenv("SWAPPATH");
+ if (swappath != NULL) {
+ LOGINFO("Unmounting swap at '%s'\n", swappath);
+ umount(swappath);
+ }
- TWFunc::Exec_Cmd("umount \"$SWAPPATH\"");
- Device = SDCard->Actual_Block_Device;
- // Just use the root block device
- Device.resize(strlen("/dev/block/mmcblkX"));
+ // Determine block device
+ if (SDCard->Alternate_Block_Device.empty()) {
+ SDCard->Find_Actual_Block_Device();
+ Device = SDCard->Actual_Block_Device;
+ // Just use the root block device
+ Device.resize(strlen("/dev/block/mmcblkX"));
+ } else {
+ Device = SDCard->Alternate_Block_Device;
+ }
// Find the size of the block device:
- fp = fopen("/proc/partitions", "rt");
- if (fp == NULL) {
- gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")("/proc/partitions")(strerror(errno)));
- return false;
- }
-
- while (fgets(line, sizeof(line), fp) != NULL)
- {
- unsigned long major, minor, blocks;
- char device[512];
- char tmpString[64];
-
- if (strlen(line) < 7 || line[0] == 'm') continue;
- sscanf(line + 1, "%lu %lu %lu %s", &major, &minor, &blocks, device);
-
- tmpdevice = "/dev/block/";
- tmpdevice += device;
- if (tmpdevice == Device) {
- // Adjust block size to byte size
- total_size = (int)(blocks * 1024ULL / 1000000LLU);
- break;
- }
- }
- fclose(fp);
+ total_size = (int)(TWFunc::IOCTL_Get_Block_Size(Device.c_str()) / (1048576));
DataManager::GetValue("tw_sdext_size", ext);
DataManager::GetValue("tw_swap_size", swap);
DataManager::GetValue("tw_sdpart_file_system", ext_format);
fat_size = total_size - ext - swap;
- LOGINFO("sd card block device is '%s', sdcard size is: %iMB, fat size: %iMB, ext size: %iMB, ext system: '%s', swap size: %iMB\n", Device.c_str(), total_size, fat_size, ext, ext_format.c_str(), swap);
- memset(temp, 0, sizeof(temp));
- sprintf(temp, "%i", fat_size);
- fat_str = temp;
- memset(temp, 0, sizeof(temp));
- sprintf(temp, "%i", fat_size + ext);
- ext_str = temp;
- memset(temp, 0, sizeof(temp));
- sprintf(temp, "%i", fat_size + ext + swap);
- swap_str = temp;
+ LOGINFO("sd card mount point %s block device is '%s', sdcard size is: %iMB, fat size: %iMB, ext size: %iMB, ext system: '%s', swap size: %iMB\n", DataManager::GetCurrentStoragePath().c_str(), Device.c_str(), total_size, fat_size, ext, ext_format.c_str(), swap);
+
+ // Determine partition sizes
+ if (swap == 0 && ext == 0) {
+ fat_str = "-0";
+ } else {
+ memset(temp, 0, sizeof(temp));
+ sprintf(temp, "%i", fat_size);
+ fat_str = temp;
+ fat_str += "MB";
+ }
+ if (swap == 0) {
+ ext_str = "-0";
+ } else {
+ memset(temp, 0, sizeof(temp));
+ sprintf(temp, "%i", ext);
+ ext_str = "+";
+ ext_str += temp;
+ ext_str += "MB";
+ }
+
if (ext + swap > total_size) {
gui_err("ext_swap_size=EXT + Swap size is larger than sdcard size.");
return false;
}
+
gui_msg("remove_part_table=Removing partition table...");
- Command = "parted -s " + Device + " mklabel msdos";
+ Command = "sgdisk --zap-all " + Device;
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
gui_err("unable_rm_part=Unable to remove partition table.");
@@ -1738,7 +1739,7 @@ int TWPartitionManager::Partition_SDCard(void) {
return false;
}
gui_msg(Msg("create_part=Creating {1} partition...")("FAT32"));
- Command = "parted " + Device + " mkpartfs primary fat32 0 " + fat_str + "MB";
+ Command = "sgdisk --new=0:0:" + fat_str + " --change-name=0:\"Microsoft basic data\" " + Device;
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("FAT32"));
@@ -1746,7 +1747,7 @@ int TWPartitionManager::Partition_SDCard(void) {
}
if (ext > 0) {
gui_msg(Msg("create_part=Creating {1} partition...")("EXT"));
- Command = "parted " + Device + " mkpartfs primary ext2 " + fat_str + "MB " + ext_str + "MB";
+ Command = "sgdisk --new=0:0:" + ext_str + " --change-name=0:\"Linux filesystem\" " + Device;
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("EXT"));
@@ -1756,7 +1757,7 @@ int TWPartitionManager::Partition_SDCard(void) {
}
if (swap > 0) {
gui_msg(Msg("create_part=Creating {1} partition...")("swap"));
- Command = "parted " + Device + " mkpartfs primary linux-swap " + ext_str + "MB " + swap_str + "MB";
+ Command = "sgdisk --new=0:0:-0 --change-name=0:\"Linux swap\" --typecode=0:0657FD6D-A4AB-43C4-84E5-0933C84B4F4F " + Device;
LOGINFO("Command is: '%s'\n", Command.c_str());
if (TWFunc::Exec_Cmd(Command) != 0) {
gui_msg(Msg(msg::kError, "unable_to_create_part=Unable to create {1} partition.")("swap"));
@@ -1764,38 +1765,52 @@ int TWPartitionManager::Partition_SDCard(void) {
return false;
}
}
- // recreate TWRP folder and rewrite settings - these will be gone after sdcard is partitioned
-#ifdef TW_EXTERNAL_STORAGE_PATH
- Mount_By_Path(EXPAND(TW_EXTERNAL_STORAGE_PATH), 1);
- DataManager::GetValue(TW_EXTERNAL_PATH, sd_path);
- memset(mkdir_path, 0, sizeof(mkdir_path));
- sprintf(mkdir_path, "%s/TWRP", sd_path.c_str());
-#else
- Mount_By_Path("/sdcard", 1);
- strcpy(mkdir_path, "/sdcard/TWRP");
-#endif
- mkdir(mkdir_path, 0777);
- DataManager::Flush();
-#ifdef TW_EXTERNAL_STORAGE_PATH
- DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, EXPAND(TW_EXTERNAL_STORAGE_PATH));
- if (DataManager::GetIntValue(TW_USE_EXTERNAL_STORAGE) == 1)
- DataManager::SetValue(TW_ZIP_LOCATION_VAR, EXPAND(TW_EXTERNAL_STORAGE_PATH));
-#else
- DataManager::SetValue(TW_ZIP_EXTERNAL_VAR, "/sdcard");
- if (DataManager::GetIntValue(TW_USE_EXTERNAL_STORAGE) == 1)
- DataManager::SetValue(TW_ZIP_LOCATION_VAR, "/sdcard");
-#endif
+
+ // Convert GPT to MBR
+ Command = "sgdisk --gpttombr " + Device;
+ if (TWFunc::Exec_Cmd(Command) != 0)
+ LOGINFO("Failed to covert partition GPT to MBR\n");
+
+ // Tell the kernel to rescan the partition table
+ int fd = open(Device.c_str(), O_RDONLY);
+ ioctl(fd, BLKRRPART, 0);
+ close(fd);
+
+ string format_device = Device;
+ if (Device.substr(0, 17) == "/dev/block/mmcblk")
+ format_device += "p";
+
+ // Format new partitions to proper file system
+ if (fat_size > 0) {
+ Command = "mkfs.fat " + format_device + "1";
+ TWFunc::Exec_Cmd(Command);
+ }
if (ext > 0) {
if (SDext == NULL) {
- LOGERR("Unable to locate sd-ext partition.\n");
- return false;
+ Command = "mke2fs -t " + ext_format + " -m 0 " + format_device + "2";
+ gui_msg(Msg("format_sdext_as=Formatting sd-ext as {1}...")(ext_format));
+ LOGINFO("Formatting sd-ext after partitioning, command: '%s'\n", Command.c_str());
+ TWFunc::Exec_Cmd(Command);
+ } else {
+ SDext->Wipe(ext_format);
}
- Command = "mke2fs -t " + ext_format + " -m 0 " + SDext->Actual_Block_Device;
- gui_msg(Msg("format_sdext_as=Formatting sd-ext as {1}...")(ext_format));
- LOGINFO("Formatting sd-ext after partitioning, command: '%s'\n", Command.c_str());
+ }
+ if (swap > 0) {
+ Command = "mkswap " + format_device;
+ if (ext > 0)
+ Command += "3";
+ else
+ Command += "2";
TWFunc::Exec_Cmd(Command);
}
+ // recreate TWRP folder and rewrite settings - these will be gone after sdcard is partitioned
+ if (SDCard->Mount(true)) {
+ string TWRP_Folder = SDCard->Mount_Point + "/TWRP";
+ mkdir(TWRP_Folder.c_str(), 0777);
+ DataManager::Flush();
+ }
+
Update_System_Details();
gui_msg("part_complete=Partitioning complete.");
return true;
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index df14bbda..81954257 100644
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -201,6 +201,11 @@ else
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkntfs
endif
endif
+ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
+ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 22; echo $$?),0)
+ RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sgdisk
+ endif
+endif
TWRP_AUTOGEN := $(intermediates)/teamwin
@@ -241,14 +246,25 @@ LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
ifeq ($(BOARD_HAS_NO_REAL_SDCARD),)
+ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
+ #prebuilt, static sgdisk
+ include $(CLEAR_VARS)
+ LOCAL_MODULE := sgdisk_static
+ LOCAL_MODULE_STEM := sgdisk
+ LOCAL_MODULE_TAGS := eng
+ LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+ LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+ LOCAL_SRC_FILES := $(LOCAL_MODULE)
+ include $(BUILD_PREBUILT)
+ endif
#parted
- include $(CLEAR_VARS)
- LOCAL_MODULE := parted
- LOCAL_MODULE_TAGS := eng
- LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
- LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
- LOCAL_SRC_FILES := $(LOCAL_MODULE)
- include $(BUILD_PREBUILT)
+ #include $(CLEAR_VARS)
+ #LOCAL_MODULE := parted
+ #LOCAL_MODULE_TAGS := eng
+ #LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+ #LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+ #LOCAL_SRC_FILES := $(LOCAL_MODULE)
+ #include $(BUILD_PREBUILT)
endif
# copy license file for OpenAES
diff --git a/prebuilt/sgdisk_static b/prebuilt/sgdisk_static
new file mode 100755
index 00000000..eb8a129c
Binary files /dev/null and b/prebuilt/sgdisk_static differ
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 6eb6cd59..def265ca 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -1043,4 +1043,23 @@ void TWFunc::Disable_Stock_Recovery_Replace(void) {
}
}
+unsigned long long TWFunc::IOCTL_Get_Block_Size(const char* block_device) {
+ unsigned long block_device_size;
+ int ret = 0;
+
+ int fd = open(block_device, O_RDONLY);
+ if (fd < 0) {
+ LOGINFO("Find_Partition_Size: Failed to open '%s', (%s)\n", block_device, strerror(errno));
+ } else {
+ ret = ioctl(fd, BLKGETSIZE, &block_device_size);
+ close(fd);
+ if (ret) {
+ LOGINFO("Find_Partition_Size: ioctl error: (%s)\n", strerror(errno));
+ } else {
+ return (unsigned long long)(block_device_size) * 512LLU;
+ }
+ }
+ return 0;
+}
+
#endif // ndef BUILD_TWRPTAR_MAIN
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index d49cd849..d72c9161 100644
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -85,6 +85,7 @@ public:
static std::string to_string(unsigned long value); //convert ul to string
static void SetPerformanceMode(bool mode); // support recovery.perf.mode
static void Disable_Stock_Recovery_Replace(); // Disable stock ROMs from replacing TWRP with stock recovery
+ static unsigned long long IOCTL_Get_Block_Size(const char* block_device);
private:
static void Copy_Log(string Source, string Destination);