summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libtar/extract.c25
-rw-r--r--libtar/libtar.h4
-rw-r--r--libtar/wrapper.c4
-rw-r--r--twrpTar.cpp12
-rw-r--r--variables.h4
5 files changed, 27 insertions, 22 deletions
diff --git a/libtar/extract.c b/libtar/extract.c
index 554428715..620513c29 100644
--- a/libtar/extract.c
+++ b/libtar/extract.c
@@ -89,13 +89,13 @@ tar_set_file_perms(TAR *t, char *realname)
/* switchboard */
int
-tar_extract_file(TAR *t, char *realname)
+tar_extract_file(TAR *t, char *realname, char *prefix)
{
int i;
char *lnp;
int pathname_len;
int realname_len;
-
+
if (t->options & TAR_NOOVERWRITE)
{
struct stat s;
@@ -115,7 +115,7 @@ tar_extract_file(TAR *t, char *realname)
}
else if (TH_ISLNK(t)) {
printf("link\n");
- i = tar_extract_hardlink(t, realname);
+ i = tar_extract_hardlink(t, realname, prefix);
}
else if (TH_ISSYM(t)) {
printf("sym\n");
@@ -139,13 +139,13 @@ tar_extract_file(TAR *t, char *realname)
}
if (i != 0) {
- printf("here i: %d\n", i);
+ printf("FAILED RESTORE OF FILE i: %s\n", realname);
return i;
}
i = tar_set_file_perms(t, realname);
if (i != 0) {
- printf("i: %d\n", i);
+ printf("FAILED SETTING PERMS: %d\n", i);
return i;
}
/*
@@ -300,7 +300,7 @@ tar_skip_regfile(TAR *t)
/* hardlink */
int
-tar_extract_hardlink(TAR * t, char *realname)
+tar_extract_hardlink(TAR * t, char *realname, char *prefix)
{
char *filename;
char *linktgt = NULL;
@@ -325,7 +325,8 @@ tar_extract_hardlink(TAR * t, char *realname)
}
else
linktgt = th_get_linkname(t);
-
+ char *newtgt = strdup(linktgt);
+ sprintf(linktgt, "%s/%s", prefix, newtgt);
#ifdef DEBUG
printf(" ==> extracting: %s (link to %s)\n", filename, linktgt);
#endif
@@ -346,7 +347,7 @@ int
tar_extract_symlink(TAR *t, char *realname)
{
char *filename;
-
+
if (!TH_ISSYM(t))
{
printf("not a sym\n");
@@ -412,9 +413,9 @@ tar_extract_chardev(TAR *t, char *realname)
compat_makedev(devmaj, devmin)) == -1)
{
#ifdef DEBUG
- perror("mknod()");
+ printf("mknod() failed, returning good anyway");
#endif
- return -1;
+ return 0;
}
return 0;
@@ -451,9 +452,9 @@ tar_extract_blockdev(TAR *t, char *realname)
compat_makedev(devmaj, devmin)) == -1)
{
#ifdef DEBUG
- perror("mknod()");
+ printf("mknod() failed but returning anyway");
#endif
- return -1;
+ return 0;
}
return 0;
diff --git a/libtar/libtar.h b/libtar/libtar.h
index 7a8f332ee..f2f423b9b 100644
--- a/libtar/libtar.h
+++ b/libtar/libtar.h
@@ -218,11 +218,11 @@ void th_finish(TAR *t);
/***** extract.c ***********************************************************/
/* sequentially extract next file from t */
-int tar_extract_file(TAR *t, char *realname);
+int tar_extract_file(TAR *t, char *realname, char *prefix);
/* extract different file types */
int tar_extract_dir(TAR *t, char *realname);
-int tar_extract_hardlink(TAR *t, char *realname);
+int tar_extract_hardlink(TAR *t, char *realname, char *prefix);
int tar_extract_symlink(TAR *t, char *realname);
int tar_extract_chardev(TAR *t, char *realname);
int tar_extract_blockdev(TAR *t, char *realname);
diff --git a/libtar/wrapper.c b/libtar/wrapper.c
index 7cd8ed12c..4d8216241 100644
--- a/libtar/wrapper.c
+++ b/libtar/wrapper.c
@@ -44,7 +44,7 @@ tar_extract_glob(TAR *t, char *globname, char *prefix)
snprintf(buf, sizeof(buf), "%s/%s", prefix, filename);
else
strlcpy(buf, filename, sizeof(buf));
- if (tar_extract_file(t, filename) != 0)
+ if (tar_extract_file(t, filename, prefix) != 0)
return -1;
}
@@ -86,7 +86,7 @@ tar_extract_all(TAR *t, char *prefix)
continue;
}
*/
- if (tar_extract_file(t, buf) != 0)
+ if (tar_extract_file(t, buf, prefix) != 0)
return -1;
}
return (i == 1 ? 0 : -1);
diff --git a/twrpTar.cpp b/twrpTar.cpp
index c4600aa4d..159c1d1b9 100644
--- a/twrpTar.cpp
+++ b/twrpTar.cpp
@@ -122,7 +122,7 @@ int twrpTar::extractTarFork() {
int status;
pid_t pid;
if ((pid = fork()) == -1) {
- LOGI("create tar failed to fork.\n");
+ LOGI("extract tar failed to fork.\n");
return -1;
}
if (pid == 0) {
@@ -133,7 +133,7 @@ int twrpTar::extractTarFork() {
}
else {
if ((pid = wait(&status)) == -1) {
- LOGI("Tar creation failed\n");
+ LOGI("Tar extraction failed\n");
return -1;
}
else {
@@ -142,9 +142,9 @@ int twrpTar::extractTarFork() {
return -1;
}
else if (WIFEXITED(status) != 0)
- LOGI("Tar creation successful\n");
+ LOGI("Tar extraction successful\n");
else {
- LOGI("Tar creation failed\n");
+ LOGI("Tar extraction failed\n");
return -1;
}
}
@@ -210,6 +210,8 @@ int twrpTar::Generate_Multiple_Archives(string Path) {
FileName += de->d_name;
if (has_data_media == 1 && FileName.size() >= 11 && strncmp(FileName.c_str(), "/data/media", 11) == 0)
continue; // Skip /data/media
+ if (de->d_type == DT_BLK || de->d_type == DT_CHR)
+ continue;
if (de->d_type == DT_DIR && strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0)
{
unsigned long long folder_size = TWFunc::Get_Folder_Size(FileName, false);
@@ -344,6 +346,8 @@ int twrpTar::tarDirs(bool include_root) {
LOGI("adding %s\n", de->d_name);
#ifdef RECOVERY_SDCARD_ON_DATA
if ((tardir == "/data" || tardir == "/data/") && strcmp(de->d_name, "media") == 0) continue;
+ if (de->d_type == DT_BLK || de->d_type == DT_CHR)
+ continue;
#endif
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue;
diff --git a/variables.h b/variables.h
index 826eb6bf5..6a87f2ca9 100644
--- a/variables.h
+++ b/variables.h
@@ -17,7 +17,7 @@
#ifndef _VARIABLES_HEADER_
#define _VARIABLES_HEADER_
-#define TW_VERSION_STR "2.4.1.0"
+#define TW_VERSION_STR "2.4.2.0"
#define TW_USE_COMPRESSION_VAR "tw_use_compression"
#define TW_FILENAME "tw_filename"
@@ -164,7 +164,7 @@
// tw_sp2_is_mountable
// tw_sp3_is_mountable
-// Max archive size for tar backups before we split (1.5GB)
+// Max archive size for tar backups before we split (1.5GB)
#define MAX_ARCHIVE_SIZE 1610612736LLU
#ifndef CUSTOM_LUN_FILE