MTP: Use fork instead of pthread

Change-Id: I95cf6f4def0c86f40c775738f0712323f0a0f146
diff --git a/mtp/twrpMtp.cpp b/mtp/twrpMtp.cpp
index 6fe0ee3..e7c3f2c 100755
--- a/mtp/twrpMtp.cpp
+++ b/mtp/twrpMtp.cpp
@@ -82,7 +82,7 @@
 	return 0;
 }
 
-pthread_t twrpMtp::runserver(void) {
+pthread_t twrpMtp::threadserver(void) {
 	pthread_t thread;
 	ThreadPtr mtpptr = &twrpMtp::start;
 	PThreadPtr p = *(PThreadPtr*)&mtpptr;
@@ -90,6 +90,21 @@
 	return thread;
 }
 
+pid_t twrpMtp::forkserver(void) {
+	pid_t pid;
+	if ((pid = fork()) == -1) {
+		MTPE("MTP fork failed.\n");
+		return 0;
+	}
+	if (pid == 0) {
+		// Child process
+		start();
+	} else {
+		return pid;
+	}
+	return 0;
+}
+
 void twrpMtp::addStorage(std::string display, std::string path, int mtpid) {
 	s = new storage;
 	s->display = display;
diff --git a/mtp/twrpMtp.hpp b/mtp/twrpMtp.hpp
index bed81c0..f0d8f4b 100755
--- a/mtp/twrpMtp.hpp
+++ b/mtp/twrpMtp.hpp
@@ -34,7 +34,8 @@
 class twrpMtp {
 	public:
 		twrpMtp(int debug_enabled /* = 0 */);
-		pthread_t runserver(void);
+		pthread_t threadserver(void);
+		pid_t forkserver(void);
 		void addStorage(std::string display, std::string path, int mtpid);
 	private:
 		int start(void);
diff --git a/partitionmanager.cpp b/partitionmanager.cpp
index a8b61c3..bc27ccb 100644
--- a/partitionmanager.cpp
+++ b/partitionmanager.cpp
@@ -2153,7 +2153,7 @@
 
 bool TWPartitionManager::Enable_MTP(void) {
 #ifdef TW_HAS_MTP
-	if (mtpthread) {
+	if (mtppid) {
 		LOGERR("MTP already enabled\n");
 		return true;
 	}
@@ -2183,9 +2183,14 @@
 		}
 	}
 	if (count) {
-		mtpthread = mtp->runserver();
-		DataManager::SetValue("tw_mtp_enabled", 1);
-		return true;
+		mtppid = mtp->forkserver();
+		if (mtppid) {
+			DataManager::SetValue("tw_mtp_enabled", 1);
+			return true;
+		} else {
+			LOGERR("Failed to enable MTP\n");
+			return false;
+		}
 	}
 	LOGERR("No valid storage partitions found for MTP.\n");
 #else
@@ -2206,9 +2211,9 @@
 	string productstr = product;
 	TWFunc::write_file("/sys/class/android_usb/android0/idVendor", vendorstr);
 	TWFunc::write_file("/sys/class/android_usb/android0/idProduct", productstr);
-	if (mtpthread) {
-		pthread_kill(mtpthread, 0);
-		mtpthread = NULL;
+	if (mtppid) {
+		kill(mtppid, SIGTERM);
+		mtppid = 0;
 	}
 	property_set("sys.usb.config", "adb");
 	DataManager::SetValue("tw_mtp_enabled", 0);
diff --git a/partitions.hpp b/partitions.hpp
index 00f435a..4fe155e 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -239,7 +239,7 @@
 	TWPartition* Find_Next_Storage(string Path, string Exclude);
 	int Open_Lun_File(string Partition_Path, string Lun_File);
 	int mtpid;
-	pthread_t mtpthread;
+	pid_t mtppid;
 	bool mtp_was_enabled;
 
 private: