From d18a821e009a4e31208541d4c96cd54bd7f313ba Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Mon, 14 Dec 2015 10:17:00 -0600 Subject: Use ioctl to get block device size AMLogic based device uses paths like /dev/block/recovery and the stock init binary either deletes or does not create mmcblk0p12 which breaks TWRP because TWRP cannot match up the path / name. The ioctl method is probably more reliable anyway and certainly should be faster. Change-Id: I73f981dcec637cdf5b189bdefa00ea15b924b500 --- partition.cpp | 44 +++++++++++++++++++++++++++++--------------- partitions.hpp | 1 + 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/partition.cpp b/partition.cpp index df408e6b7..a17a647c4 100644 --- a/partition.cpp +++ b/partition.cpp @@ -879,6 +879,26 @@ bool TWPartition::Get_Size_Via_df(bool Display_Error) { return true; } +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; +} + bool TWPartition::Find_Partition_Size(void) { FILE* fp; char line[512]; @@ -907,6 +927,12 @@ bool TWPartition::Find_Partition_Size(void) { } } + unsigned long long ioctl_size = IOCTL_Get_Block_Size(); + if (ioctl_size) { + Size = ioctl_size; + return true; + } + // In this case, we'll first get the partitions we care about (with labels) fp = fopen("/proc/partitions", "rt"); if (fp == NULL) @@ -1360,22 +1386,10 @@ bool TWPartition::Resize() { Find_Actual_Block_Device(); command = "/sbin/resize2fs " + Actual_Block_Device; if (Length != 0) { - unsigned int block_device_size; - int fd, ret; - - fd = open(Actual_Block_Device.c_str(), O_RDONLY); - if (fd < 0) { - gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Actual_Block_Device)(strerror(errno))); - return false; - } - ret = ioctl(fd, BLKGETSIZE, &block_device_size); - close(fd); - if (ret) { - gui_msg(Msg(msg::kError, "unable_resize=Unable to resize {1}.")(Display_Name)); - LOGINFO("Resize: ioctl error\n"); + unsigned long long Actual_Size = IOCTL_Get_Block_Size(); + if (Actual_Size == 0) return false; - } - unsigned long long Actual_Size = (unsigned long long)(block_device_size) * 512LLU; + unsigned long long Block_Count; if (Length < 0) { // Reduce overall size by this length diff --git a/partitions.hpp b/partitions.hpp index ed2687090..60dc2e4de 100644 --- a/partitions.hpp +++ b/partitions.hpp @@ -99,6 +99,7 @@ private: void Setup_Image(bool Display_Error); // Sets defaults for an image partition void Setup_AndSec(void); // Sets up .android_secure settings void Find_Real_Block_Device(string& Block_Device, bool Display_Error); // Checks the block device given and follows symlinks until it gets to the real block device + unsigned long long IOCTL_Get_Block_Size(); // Finds the partition size using ioctl bool Find_Partition_Size(); // Finds the partition size from /proc/partitions unsigned long long Get_Size_Via_du(string Path, bool Display_Error); // Uses du to get sizes bool Wipe_EXT23(string File_System); // Formats as ext3 or ext2 -- cgit v1.2.3