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
diff --git a/partition.cpp b/partition.cpp
index df408e6..a17a647 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -879,6 +879,26 @@
 	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 @@
 		}
 	}
 
+	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 @@
 		Find_Actual_Block_Device();
 		command = "/sbin/resize2fs " + Actual_Block_Device;
 		if (Length != 0) {
-			unsigned int block_device_size;
-			int fd, ret;
+			unsigned long long Actual_Size = IOCTL_Get_Block_Size();
+			if (Actual_Size == 0)
+				return false;
 
-			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");
-				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