change libtar to fork instead of pthread

Conflicts:

	twrpTar.cpp
diff --git a/partition.cpp b/partition.cpp
index 53e7ba6..73aa8af 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -1313,7 +1313,7 @@
 		sprintf(back_name, "%s", Backup_Path.c_str());
 		tar.setdir(back_name);
 		tar.setfn(Full_FileName);
-		backup_count = tar.splitArchiveThread();
+		backup_count = tar.splitArchiveFork();
 		if (backup_count == -1) {
 			LOGE("Error tarring split files!\n");
 			return false;
@@ -1324,7 +1324,7 @@
 		if (use_compression) {
 			tar.setdir(Backup_Path);
 			tar.setfn(Full_FileName);
-			if (tar.createTarGZThread() != 0)
+			if (tar.createTarGZFork() != 0)
 				return -1;
 			string gzname = Full_FileName + ".gz";
 			rename(gzname.c_str(), Full_FileName.c_str());
@@ -1332,7 +1332,7 @@
 		else {
 			tar.setdir(Backup_Path);
 			tar.setfn(Full_FileName);
-			if (tar.createTarThread() != 0)
+			if (tar.createTarFork() != 0)
 				return -1;
 		}
 		if (TWFunc::Get_File_Size(Full_FileName) == 0) {
@@ -1424,7 +1424,7 @@
 				twrpTar tar;
 				tar.setdir("/");
 				tar.setfn(Full_FileName);
-				if (tar.extractTarThread() != 0)
+				if (tar.extractTarFork() != 0)
 					return false;
 				sprintf(split_index, "%03i", index);
 				Full_FileName = restore_folder + "/" + Backup_FileName + split_index;
@@ -1438,7 +1438,7 @@
 		twrpTar tar;
 		tar.setdir(Backup_Path);
 		tar.setfn(Full_FileName);
-		if (tar.extractTarThread() != 0)
+		if (tar.extractTarFork() != 0)
 			return false;
 	}
 	return true;
diff --git a/twrpTar.cpp b/twrpTar.cpp
index 4344867..5d17521 100644
--- a/twrpTar.cpp
+++ b/twrpTar.cpp
@@ -24,6 +24,7 @@
 }
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/wait.h>
 #include <string.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -49,51 +50,139 @@
 	tardir = dir;
 }
 
-int twrpTar::createTarGZThread() {
-	pthread_t thread;
-	ThreadPtr tarptr = &twrpTar::createTGZ;
-	PThreadPtr p = *(PThreadPtr*)&tarptr;
-	pthread_create(&thread, NULL, p, this);
-	if(pthread_join(thread, NULL)) {
+int twrpTar::createTarGZFork() {
+	int status;
+	pid_t pid;
+	if ((pid = fork()) == -1) {
+		LOGI("create tar failed to fork.\n");
 		return -1;
 	}
-	TWFunc::drop_caches();
+	if (pid == 0) {
+		if (createTGZ() != 0)
+			exit(-1);
+		else
+			exit(0);
+	}
+	else {
+		if ((pid = wait(&status)) == -1) {
+			LOGI("Tar creation failed\n");
+			return -1;
+		}
+		else {
+			if (WIFSIGNALED(status) != 0) {
+				LOGI("Child process ended with signal: %d\n", WTERMSIG(status));
+				return -1;
+			}
+			else if (WIFEXITED(status) != 0)
+				LOGI("Tar creation successful\n");
+			else {
+				LOGI("Tar creation failed\n");
+				return -1;
+			}
+		}
+	}
 	return 0;
 }
 
-int twrpTar::createTarThread() {
-	pthread_t thread;
-	ThreadPtr tarptr = &twrpTar::create;
-	PThreadPtr p = *(PThreadPtr*)&tarptr;
-	pthread_create(&thread, NULL, p, this);
-	if(pthread_join(thread, NULL)) {
+int twrpTar::createTarFork() {
+	int status;
+	pid_t pid;
+	if ((pid = fork()) == -1) {
+		LOGI("create tar failed to fork.\n");
 		return -1;
 	}
-	TWFunc::drop_caches();
+	if (pid == 0) {
+		if (create() != 0)
+			exit(-1);
+		else
+			exit(0);
+	}
+	else {
+		if ((pid = wait(&status)) == -1) {
+			LOGI("Tar creation failed\n");
+			return -1;
+		}
+		else {
+			if (WIFSIGNALED(status) != 0) {
+				LOGI("Child process ended with signal: %d\n", WTERMSIG(status));
+				return -1;
+			}
+			else if (WIFEXITED(status) != 0)
+				LOGI("Tar creation successful\n");
+			else {
+				LOGI("Tar creation failed\n");
+				return -1;
+			}
+		}
+	}
 	return 0;
 }
 
-int twrpTar::extractTarThread() {
-	pthread_t thread;
-	ThreadPtr tarptr = &twrpTar::extract;
-	PThreadPtr p = *(PThreadPtr*)&tarptr;
-	pthread_create(&thread, NULL, p, this);
-	if(pthread_join(thread, NULL)) {
+int twrpTar::extractTarFork() {
+	int status;
+	pid_t pid;
+	if ((pid = fork()) == -1) {
+		LOGI("create tar failed to fork.\n");
 		return -1;
 	}
-	TWFunc::drop_caches();
+	if (pid == 0) {
+		if (extract() != 0)
+			exit(-1);
+		else
+			exit(0);
+	}
+	else {
+		if ((pid = wait(&status)) == -1) {
+			LOGI("Tar creation failed\n");
+			return -1;
+		}
+		else {
+			if (WIFSIGNALED(status) != 0) {
+				LOGI("Child process ended with signal: %d\n", WTERMSIG(status));
+				return -1;
+			}
+			else if (WIFEXITED(status) != 0)
+				LOGI("Tar creation successful\n");
+			else {
+				LOGI("Tar creation failed\n");
+				return -1;
+			}
+		}
+	}
 	return 0;
 }
 
-int twrpTar::splitArchiveThread() {
-	pthread_t thread;
-	ThreadPtr tarptr = &twrpTar::Split_Archive;
-	PThreadPtr p = *(PThreadPtr*)&tarptr;
-	pthread_create(&thread, NULL, p, this);
-	if(pthread_join(thread, NULL)) {
+int twrpTar::splitArchiveFork() {
+	int status;
+	pid_t pid;
+	if ((pid = fork()) == -1) {
+		LOGI("create tar failed to fork.\n");
 		return -1;
 	}
-	TWFunc::drop_caches();
+	if (pid == 0) {
+		if (Split_Archive() != 0)
+			exit(-1);
+		else
+			exit(0);
+	}
+	else {
+		if ((pid = wait(&status)) == -1) {
+			LOGI("Tar creation failed\n");
+			return -1;
+		}
+		else {
+			if (WIFSIGNALED(status) != 0) {
+				LOGI("Child process ended with signal: %d\n", WTERMSIG(status));
+				return -1;
+			}
+			else if (WIFEXITED(status) != 0)
+				LOGI("Tar creation successful\n");
+			else {
+				LOGI("Tar creation failed\n");
+				return -1;
+			}
+		}
+	}
 	return 0;
 }
 
diff --git a/twrpTar.hpp b/twrpTar.hpp
index db9cf9b..427e6d1 100644
--- a/twrpTar.hpp
+++ b/twrpTar.hpp
@@ -39,10 +39,10 @@
 		int createTar();
 		int addFile(string fn, bool include_root);
 		int closeTar(bool gzip);
-		int createTarGZThread();
-		int createTarThread();
-		int extractTarThread();
-		int splitArchiveThread();
+		int createTarGZFork();
+		int createTarFork();
+		int extractTarFork();
+		int splitArchiveFork();
                 void setfn(string fn);
                 void setdir(string dir);
 	private:
@@ -65,6 +65,4 @@
 		string tardir;
 		string tarfn;
 		string basefn;
-		typedef int (twrpTar::*ThreadPtr)(void);
-		typedef void* (*PThreadPtr)(void*);
 };