summaryrefslogtreecommitdiffstats
path: root/twrpTar.cpp
diff options
context:
space:
mode:
authorDees Troy <dees_troy@teamw.in>2013-02-19 15:59:49 +0100
committerGerrit Code Review <gerrit@5.9.244.119>2013-02-19 15:59:49 +0100
commit7cb4698ce15365a173bda2c06754494daa36b102 (patch)
treef678827161f8286fb871e5478493ddd5aba6cf78 /twrpTar.cpp
parentMerge "Fix keyboard layout on 800x1280" into twrp2.4 (diff)
parentchange libtar to fork instead of pthread (diff)
downloadandroid_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar.gz
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar.bz2
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar.lz
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar.xz
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.tar.zst
android_bootable_recovery-7cb4698ce15365a173bda2c06754494daa36b102.zip
Diffstat (limited to '')
-rw-r--r--twrpTar.cpp145
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;
}