diff options
-rw-r--r-- | libtar/extract.c | 25 | ||||
-rw-r--r-- | libtar/libtar.h | 4 | ||||
-rw-r--r-- | libtar/wrapper.c | 4 | ||||
-rw-r--r-- | twrpTar.cpp | 12 | ||||
-rw-r--r-- | variables.h | 4 |
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 |