summaryrefslogtreecommitdiffstats
path: root/partitionmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'partitionmanager.cpp')
-rw-r--r--partitionmanager.cpp165
1 files changed, 90 insertions, 75 deletions
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index c1cd29f22..4cd3e7d59 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -30,6 +30,8 @@
#include <iostream>
#include <iomanip>
#include <sys/wait.h>
+#include <linux/fs.h>
+#include <sys/mount.h>
#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;
}
-
- TWFunc::Exec_Cmd("umount \"$SWAPPATH\"");
- Device = SDCard->Actual_Block_Device;
- // Just use the root block device
- Device.resize(strlen("/dev/block/mmcblkX"));
-
- // 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;
+ char* swappath = getenv("SWAPPATH");
+ if (swappath != NULL) {
+ LOGINFO("Unmounting swap at '%s'\n", swappath);
+ umount(swappath);
}
- 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;
- }
+ // 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;
}
- fclose(fp);
+
+ // Find the size of the block device:
+ 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;