Add libtar to TWRP instead of using busybox tar
Add proper mkdosfs tool
Add fuse to TWRP
Add experimental exfat-fuse to TWRP
Convert all system() functions to use new Exec_Cmd function
diff --git a/gui/action.cpp b/gui/action.cpp
index dd38b31..85ad8ec 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -208,12 +208,13 @@
 
 		// Now, check if we need to ensure TWRP remains installed...
 		struct stat st;
+		string result;
 		if (stat("/sbin/installTwrp", &st) == 0)
 		{
 			DataManager::SetValue("tw_operation", "Configuring TWRP");
 			DataManager::SetValue("tw_partition", "");
 			ui_print("Configuring TWRP...\n");
-			if (system("/sbin/installTwrp reinstall") < 0)
+			if (TWFunc::Exec_Cmd("/sbin/installTwrp reinstall", result) < 0)
 			{
 				ui_print("Unable to configure TWRP with this kernel.\n");
 			}
@@ -274,7 +275,6 @@
 void GUIAction::operation_end(const int operation_status, const int simulate)
 {
 	int simulate_fail;
-
 	DataManager::SetValue("ui_progress", 100);
 	if (simulate) {
 		DataManager::GetValue(TW_SIMULATE_FAIL, simulate_fail);
@@ -283,10 +283,12 @@
 		else
 			DataManager::SetValue("tw_operation_status", 0);
 	} else {
-		if (operation_status != 0)
+		if (operation_status != 0) {
 			DataManager::SetValue("tw_operation_status", 1);
-		else
+		}
+		else {
 			DataManager::SetValue("tw_operation_status", 0);
+		}
 	}
 	DataManager::SetValue("tw_operation_state", 1);
 	DataManager::SetValue(TW_ACTION_BUSY, 0);
@@ -462,11 +464,10 @@
 		operation_start("Copy Log");
 		if (!simulate)
 		{
-			char command[255];
-
+			string dst;
 			PartitionManager.Mount_Current_Storage(true);
-			sprintf(command, "cp /tmp/recovery.log %s", DataManager::GetCurrentStoragePath().c_str());
-			system(command);
+			dst = DataManager::GetCurrentStoragePath() + "/recovery.log";
+			TWFunc::copy_file("/tmp/recovery.log", dst.c_str(), 0755);
 			sync();
 			ui_print("Copied recovery log to %s.\n", DataManager::GetCurrentStoragePath().c_str());
 		} else
@@ -663,7 +664,7 @@
 
 			if (wipe_cache)
 				PartitionManager.Wipe_By_Path("/cache");
-
+			string result;
 			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");
@@ -672,10 +673,10 @@
 				} 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");
+						TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash", result);
 					else {
 						string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
-						system(injectcmd.c_str());
+						TWFunc::Exec_Cmd(injectcmd, result);
 					}
 					ui_print("TWRP injection complete.\n");
 				}
@@ -766,8 +767,9 @@
 				if (arg == "backup") {
 					string Backup_Name;
 					DataManager::GetValue(TW_BACKUP_NAME, Backup_Name);
-					if (Backup_Name == "(Current Date)" || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0)
+					if (Backup_Name == "(Current Date)" || Backup_Name == "0" || Backup_Name == "(" || PartitionManager.Check_Backup_Name(true) == 0) {
 						ret = PartitionManager.Run_Backup();
+					}
 					else {
 						operation_end(1, simulate);
 						return -1;
@@ -786,8 +788,8 @@
 				ret = 1; // 1 for failure
 			else
 				ret = 0; // 0 for success
-            operation_end(ret, simulate);
-			return 0;
+            	operation_end(ret, simulate);
+		return 0;
         }
 		if (function == "fixpermissions")
 		{
@@ -810,9 +812,9 @@
 			if (simulate) {
 				simulate_progress_bar();
 			} else {
-				char cmd[512];
-				sprintf(cmd, "dd %s", arg.c_str());
-				system(cmd);
+				string result;
+				string cmd = "dd " + arg;
+				TWFunc::Exec_Cmd(cmd, result);
 			}
             operation_end(0, simulate);
             return 0;
@@ -873,13 +875,14 @@
 		if (function == "cmd")
 		{
 			int op_status = 0;
+			string result;
 
 			operation_start("Command");
 			LOGI("Running command: '%s'\n", arg.c_str());
 			if (simulate) {
 				simulate_progress_bar();
 			} else {
-				op_status = system(arg.c_str());
+				op_status = TWFunc::Exec_Cmd(arg, result);
 				if (op_status != 0)
 					op_status = 1;
 			}
@@ -930,13 +933,13 @@
 		if (function == "reinjecttwrp")
 		{
 			int op_status = 0;
-
+			string result;
 			operation_start("ReinjectTWRP");
 			ui_print("Injecting TWRP into boot image...\n");
 			if (simulate) {
 				simulate_progress_bar();
 			} else {
-				system("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash");
+				TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash", result);
 				ui_print("TWRP injection complete.\n");
 			}
 
@@ -1031,7 +1034,7 @@
 				simulate_progress_bar();
 			} else {
 				int wipe_cache = 0;
-				string Command, Sideload_File;
+				string result, Sideload_File;
 
 				if (!PartitionManager.Mount_Current_Storage(true)) {
 					operation_end(1, simulate);
@@ -1039,8 +1042,7 @@
 				}
 				Sideload_File = DataManager::GetCurrentStoragePath() + "/sideload.zip";
 				if (TWFunc::Path_Exists(Sideload_File)) {
-					Command = "rm " + Sideload_File;
-					system(Command.c_str());
+					unlink(Sideload_File.c_str());
 				}
 				ui_print("Starting ADB sideload feature...\n");
 				ret = apply_from_adb(ui, &wipe_cache, Sideload_File.c_str());
@@ -1056,10 +1058,10 @@
 					} 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");
+							TWFunc::Exec_Cmd("injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash", result);
 						else {
 							string injectcmd = "injecttwrp --dump /tmp/backup_recovery_ramdisk.img /tmp/injected_boot.img --flash bd=" + Boot->Actual_Block_Device;
-							system(injectcmd.c_str());
+							TWFunc::Exec_Cmd(injectcmd, result);
 						}
 						ui_print("TWRP injection complete.\n");
 					}
@@ -1071,10 +1073,9 @@
 		if (function == "adbsideloadcancel")
 		{
 			int child_pid;
-			string Command, Sideload_File;
+			string Sideload_File;
 			Sideload_File = DataManager::GetCurrentStoragePath() + "/sideload.zip";
-			Command = "rm " + Sideload_File;
-			system(Command.c_str());
+			unlink(Sideload_File.c_str());
 			DataManager::GetValue("tw_child_pid", child_pid);
 			ui_print("Cancelling ADB sideload...\n");
 			kill(child_pid, SIGTERM);