Update injecttwrp for Epic 4G Touch
diff --git a/gui/action.cpp b/gui/action.cpp
index 4d9c9df..dd38b31 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -670,7 +670,13 @@
 				if (simulate) {
 					simulate_progress_bar();
 				} else {
-					system("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+					TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+					if (Boot == NULL || Boot->Current_File_System != "emmc")
+						system("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+					else {
+						string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+						system(injectcmd.c_str());
+					}
 					ui_print("TWRP injection complete.\n");
 				}
 			}
@@ -1042,6 +1048,22 @@
 					ret = 1; // failure
 				else if (wipe_cache)
 					PartitionManager.Wipe_By_Path("/cache");
+				if (DataManager::GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager::GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
+					operation_start("ReinjectTWRP");
+					ui_print("Injecting TWRP into boot image...\n");
+					if (simulate) {
+						simulate_progress_bar();
+					} else {
+						TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+						if (Boot == NULL || Boot->Current_File_System != "emmc")
+							system("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+						else {
+							string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+							system(injectcmd.c_str());
+						}
+						ui_print("TWRP injection complete.\n");
+					}
+				}
 			}
 			operation_end(ret, simulate);
 			return 0;
diff --git a/injecttwrp/Android.mk b/injecttwrp/Android.mk
index 9c39c29..2557523 100644
--- a/injecttwrp/Android.mk
+++ b/injecttwrp/Android.mk
@@ -1,13 +1,13 @@
-LOCAL_PATH:= $(call my-dir)

-include $(CLEAR_VARS)

-

-ifeq ($(TW_INCLUDE_INJECTTWRP), true)

-	LOCAL_SRC_FILES:= \

-		injecttwrp.c

-	LOCAL_CFLAGS:= -g -c -W

-	LOCAL_MODULE:=injecttwrp

-	LOCAL_MODULE_TAGS:= eng

-	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES

-	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin

-	include $(BUILD_EXECUTABLE)

-endif

+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+ifeq ($(TW_INCLUDE_INJECTTWRP), true)
+	LOCAL_SRC_FILES:= \
+		injecttwrp.c
+	LOCAL_CFLAGS:= -g -c -W
+	LOCAL_MODULE:=injecttwrp
+	LOCAL_MODULE_TAGS:= eng
+	LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
+	LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
+	include $(BUILD_EXECUTABLE)
+endif
diff --git a/injecttwrp/injecttwrp.c b/injecttwrp/injecttwrp.c
index 0daaf56..731f919 100644
--- a/injecttwrp/injecttwrp.c
+++ b/injecttwrp/injecttwrp.c
@@ -297,10 +297,10 @@
 }
 
 int main(int argc, char** argv) {
-	int arg_error = 0, delete_ind = 0, return_val;
+	int arg_error = 0, delete_ind = 0, return_val, index, len;
 	unsigned long address2;
 	unsigned char regular_check[8] = "ANDROID!";
-	char boot_image[512], backup_image[512];
+	char boot_image[512], backup_image[512], boot_block_device[512], command[512];
 
 	printf("-- InjectTWRP Recovery Ramdisk Injection Tool for Samsung devices. --\n");
 	printf("--                  by Dees_Troy and Team Win                      --\n");
@@ -308,17 +308,26 @@
 	printf("--                Bringing some win to Samsung!                    --\n");
 	printf("--        This tool comes with no warranties whatsoever!           --\n");
 	printf("--        Use at your own risk and always keep a backup!           --\n\n");
-	printf("Version 0.1 beta\n\n");
+	printf("Version 0.2 beta\n\n");
 
 	// Parse the arguments
-	if (argc < 2 || argc > 5)
+	if (argc < 2 || argc > 6)
 		arg_error = 1;
 	else {
-		if ((argc == 2 || argc == 3) && (strcmp(argv[1], "-b") == 0 || strcmp(argv[1], "--backup") == 0)) {
+		strcpy(boot_block_device, "boot");
+		for (index = 1; index < argc; index++) {
+			len = strlen(argv[index]);
+			if (len > 3 && strncmp(argv[index], "bd=", 3) == 0) {
+				strcpy(boot_block_device, argv[index] + 3);
+				index = argc;
+			}
+		}
+		if ((argc >= 2 && argc <= 4) && (strcmp(argv[1], "-b") == 0 || strcmp(argv[1], "--backup") == 0)) {
 			// Backup existing boot image
 			printf("Dumping boot image...\n");
 #ifdef INJECT_USE_TMP
-			system("dump_image boot /tmp/original_boot.img");
+			sprintf(command, "dump_image %s /tmp/original_boot.img", boot_block_device);
+			system(command);
 			strcpy(boot_image, "/tmp/original_boot.img");
 
 			if (argc == 2)
@@ -327,7 +336,8 @@
 				strcpy(backup_image, argv[2]);
 #else
 			system("mount /cache");
-			system("dump_image boot /cache/original_boot.img");
+			sprintf(command, "dump_image %s /cache/original_boot.img", boot_block_device);
+			system(command);
 			strcpy(boot_image, "/cache/original_boot.img");
 
 			if (argc == 2)
@@ -356,14 +366,16 @@
 			if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--dump") == 0) {
 				printf("Dumping boot image...\n");
 #ifdef INJECT_USE_TMP
-				system("dump_image boot /tmp/original_boot.img");
+				sprintf(command, "dump_image %s /tmp/original_boot.img", boot_block_device);
+				system(command);
 				strcpy(boot_image, "/tmp/original_boot.img");
 #else
 				system("mount /cache");
-				system("dump_image boot /cache/original_boot.img");
+				sprintf(command, "dump_image %s /cache/original_boot.img", boot_block_device);
+				system(command);
 				strcpy(boot_image, "/cache/original_boot.img");
-#endif
 				delete_ind = -1;
+#endif
 			} else
 				strcpy(boot_image, argv[1]);
 
@@ -389,13 +401,11 @@
 				system("rm /cache/original_boot.img");
 			}
 
-			if (argc == 5 && (strcmp(argv[4], "-f") == 0 || strcmp(argv[4], "--flash") == 0)) {
-				char command[512];
-
+			if (argc >= 5 && (strcmp(argv[4], "-f") == 0 || strcmp(argv[4], "--flash") == 0)) {
 				printf("Flashing new image...\n");
-				system("erase_image boot"); // Needed because flash_image checks the header and the header sometimes is the same while the ramdisks are different
-				strcpy(command, "flash_image boot ");
-				strcat(command, argv[3]);
+				sprintf(command, "erase_image %s", boot_block_device);
+				system(command);
+				sprintf(command, "flash_image %s %s", boot_block_device, argv[3]);
 				system(command);
 				printf("Flash complete.\n");
 			}
@@ -413,7 +423,9 @@
 		printf("injecttwrp --dump ramdisk-recovery.img outputboot.img [--flash]\n");
 		printf("--dump will use dump_image to dump your existing boot image\n");
 		printf("--flash will use flash_image to flash the new boot image\n\n");
-		printf("NOTE: dump_image, erase_image, and flash_image must already be installed!\n");
+		printf("NOTE: dump_image, erase_image, and flash_image must already be installed!\n\n");
+		printf("If needed you can add bd=/dev/block/mmcblk0p5 to indicate the location\n");
+		printf("of the boot partition on emmc devices as the final parameter.\n");
 		return 0;
 	}
 
diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp
index 9317ae7..47bf5d6 100644
--- a/openrecoveryscript.cpp
+++ b/openrecoveryscript.cpp
@@ -72,7 +72,7 @@
 
 int OpenRecoveryScript::run_script_file(void) {
 	FILE *fp = fopen(SCRIPT_FILE_TMP, "r");
-	int ret_val = 0, cindex, line_len, i, remove_nl;
+	int ret_val = 0, cindex, line_len, i, remove_nl, install_cmd = 0;
 	char script_line[SCRIPT_COMMAND_SIZE], command[SCRIPT_COMMAND_SIZE],
 		 value[SCRIPT_COMMAND_SIZE], mount[SCRIPT_COMMAND_SIZE],
 		 value1[SCRIPT_COMMAND_SIZE], value2[SCRIPT_COMMAND_SIZE];
@@ -112,6 +112,7 @@
 			if (strcmp(command, "install") == 0) {
 				// Install Zip
 				ret_val = Install_Command(value);
+				install_cmd = -1;
 			} else if (strcmp(command, "wipe") == 0) {
 				// Wipe
 				if (strcmp(value, "cache") == 0 || strcmp(value, "/cache") == 0) {
@@ -345,6 +346,17 @@
 		LOGE("Error opening script file '%s'\n", SCRIPT_FILE_TMP);
 		return 1;
 	}
+	if (install_cmd && DataManager_GetIntValue(TW_HAS_INJECTTWRP) == 1 && DataManager_GetIntValue(TW_INJECT_AFTER_ZIP) == 1) {
+		ui_print("Injecting TWRP into boot image...\n");
+		TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+		if (Boot == NULL || Boot->Current_File_System != "emmc")
+			system("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+		else {
+			string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
+			system(injectcmd.c_str());
+		}
+		ui_print("TWRP injection complete.\n");
+	}
 	return ret_val;
 }
 
diff --git a/recovery.cpp b/recovery.cpp
index b8fc45f..b1333ea 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -893,8 +893,15 @@
 
 #ifdef TW_INCLUDE_INJECTTWRP
 	// Back up TWRP Ramdisk if needed:
+	TWPartition* Boot = PartitionManager.Find_Partition_By_Path("/boot");
+
 	LOGI("Backing up TWRP ramdisk...\n");
-	system("injecttwrp --backup /tmp/backup_recovery_ramdisk.img");
+	if (Boot == NULL || Boot->Current_File_System != "emmc")
+		system("injecttwrp --backup /tmp/backup_recovery_ramdisk.img");
+	else {
+		string injectcmd = "injecttwrp --backup /tmp/backup_recovery_ramdisk.img bd=" + Boot->Actual_Block_Device;
+		system(injectcmd.c_str());
+	}
 	LOGI("Backup of TWRP ramdisk done.\n");
 #endif