diff options
Diffstat (limited to 'twrpTar.cpp')
-rw-r--r-- | twrpTar.cpp | 145 |
1 files changed, 117 insertions, 28 deletions
diff --git a/twrpTar.cpp b/twrpTar.cpp index 43448672c..5d1752131 100644 --- a/twrpTar.cpp +++ b/twrpTar.cpp @@ -24,6 +24,7 @@ extern "C" { } #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 @@ void twrpTar::setdir(string dir) { 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; } |