summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk5
-rw-r--r--partition.cpp24
-rw-r--r--prebuilt/Android.mk1
-rw-r--r--simg2img/Android.mk14
4 files changed, 40 insertions, 4 deletions
diff --git a/Android.mk b/Android.mk
index 52c2907de..0a5692c85 100644
--- a/Android.mk
+++ b/Android.mk
@@ -99,6 +99,7 @@ LOCAL_C_INCLUDES += \
system/vold \
system/extras/ext4_utils \
system/core/adb \
+ system/core/libsparse
LOCAL_C_INCLUDES += bionic external/openssl/include $(LOCAL_PATH)/libmincrypt/includes
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
@@ -351,7 +352,8 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \
fsck.fat \
fatlabel \
mkfs.fat \
- permissive.sh
+ permissive.sh \
+ simg2img_twrp
ifneq ($(TARGET_ARCH), arm64)
ifneq ($(TARGET_ARCH), x86_64)
@@ -586,6 +588,7 @@ include $(commands_recovery_local_path)/injecttwrp/Android.mk \
$(commands_recovery_local_path)/dosfstools/Android.mk \
$(commands_recovery_local_path)/etc/Android.mk \
$(commands_recovery_local_path)/toybox/Android.mk \
+ $(commands_recovery_local_path)/simg2img/Android.mk \
$(commands_recovery_local_path)/libpixelflinger/Android.mk
ifeq ($(TW_INCLUDE_CRYPTO), true)
diff --git a/partition.cpp b/partition.cpp
index d038c38f1..c511298ec 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -68,6 +68,7 @@ extern "C" {
#include <sys/xattr.h>
#include <linux/xattr.h>
#endif
+#include <sparse_format.h>
using namespace std;
@@ -407,12 +408,12 @@ bool TWPartition::Process_Fstab_Line(string Line, bool Display_Error) {
} else if (Mount_Point == "/system_image") {
Display_Name = "System Image";
Backup_Display_Name = Display_Name;
- Can_Flash_Img = false;
+ Can_Flash_Img = true;
Can_Be_Backed_Up = true;
} else if (Mount_Point == "/vendor_image") {
Display_Name = "Vendor Image";
Backup_Display_Name = Display_Name;
- Can_Flash_Img = false;
+ Can_Flash_Img = true;
Can_Be_Backed_Up = true;
}
}
@@ -2375,7 +2376,24 @@ bool TWPartition::Flash_Image_DD(string Filename) {
string Command;
gui_msg(Msg("flashing=Flashing {1}...")(Display_Name));
- Command = "dd bs=8388608 if='" + Filename + "' of=" + Actual_Block_Device;
+
+ uint32_t magic = 0;
+ int fd = open(Filename.c_str(), O_RDONLY);
+ if (fd < 0) {
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Filename)(strerror(errno)));
+ return false;
+ }
+ if (read(fd, &magic, sizeof(magic)) != sizeof(magic)) {
+ gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Filename)(strerror(errno)));
+ close(fd);
+ return false;
+ }
+ close(fd);
+ if (magic == SPARSE_HEADER_MAGIC) {
+ Command = "simg2img '" + Filename + "' " + Actual_Block_Device;
+ } else {
+ Command = "dd bs=8388608 if='" + Filename + "' of=" + Actual_Block_Device;
+ }
LOGINFO("Flash command: '%s'\n", Command.c_str());
TWFunc::Exec_Cmd(Command);
return true;
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index dba181003..a5deb9aba 100644
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -36,6 +36,7 @@ RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mke2fs
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/tune2fs
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/resize2fs
+RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/simg2img
ifneq ($(TARGET_ARCH), x86_64)
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker
endif
diff --git a/simg2img/Android.mk b/simg2img/Android.mk
new file mode 100644
index 000000000..74755e7db
--- /dev/null
+++ b/simg2img/Android.mk
@@ -0,0 +1,14 @@
+LOCAL_PATH := system/core/libsparse
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := simg2img.c \
+ sparse_crc32.c
+LOCAL_MODULE := simg2img_twrp
+LOCAL_MODULE_STEM := simg2img
+LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+LOCAL_MODULE_TAGS := optional
+LOCAL_SHARED_LIBRARIES := \
+ libsparse \
+ libz
+LOCAL_CFLAGS := -Werror
+include $(BUILD_EXECUTABLE)