Support encrypted backup files
Also includes features merged from:
Update twrpTar by kokotas
Revised function entryExists().
Added function to get archive's uncompressed size.
Added option to exclude item(s) from the archive.
Revised forks()
http://review.teamw.in/#/c/590/
Change-Id: I01fa2c81643161984eff2625247af75990684bd9
diff --git a/libtar/libtar.h b/libtar/libtar.h
index 1d6c1df..e7a355a 100644
--- a/libtar/libtar.h
+++ b/libtar/libtar.h
@@ -289,7 +289,7 @@
int tar_extract_all(TAR *t, char *prefix);
/* add a whole tree of files */
-int tar_append_tree(TAR *t, char *realdir, char *savedir);
+int tar_append_tree(TAR *t, char *realdir, char *savedir, char *exclude);
/* find an entry */
int tar_find(TAR *t, char *searchstr);
diff --git a/libtar/wrapper.c b/libtar/wrapper.c
index 7f65375..0673244 100644
--- a/libtar/wrapper.c
+++ b/libtar/wrapper.c
@@ -17,7 +17,7 @@
#include <sys/param.h>
#include <dirent.h>
#include <errno.h>
-
+#include <stdlib.h>
#ifdef STDC_HEADERS
# include <string.h>
#endif
@@ -94,62 +94,94 @@
int
-tar_append_tree(TAR *t, char *realdir, char *savedir)
+tar_append_tree(TAR *t, char *realdir, char *savedir, char *exclude)
{
+#ifdef DEBUG
+ printf("==> tar_append_tree(0x%lx, \"%s\", \"%s\")\n",
+ (long unsigned int)t, realdir, (savedir ? savedir : "[NULL]"));
+#endif
+
+ char temp[1024];
+ int skip = 0, i, n_spaces = 0;
+ char ** excluded = NULL;
+ char * p = NULL;
+ if (exclude) {
+ strcpy(temp, exclude);
+ p = strtok(exclude, " ");
+ if (p == NULL) {
+ excluded = realloc(excluded, sizeof(char*) * (++n_spaces));
+ excluded[0] = temp;
+ } else {
+ while (p) {
+ excluded = realloc(excluded, sizeof(char*) * (++n_spaces));
+ excluded[n_spaces-1] = p;
+ p = strtok(NULL, " ");
+ }
+ }
+ excluded = realloc(excluded, sizeof(char*) * (n_spaces+1));
+ excluded[n_spaces] = 0;
+ for (i = 0; i < (n_spaces+1); i++) {
+ if (realdir == excluded[i]) {
+ printf(" excluding '%s'\n", excluded[i]);
+ skip = 1;
+ break;
+ }
+ }
+ }
+ if (skip == 0) {
+ if (tar_append_file(t, realdir, savedir) != 0)
+ return -1;
+ }
+
char realpath[MAXPATHLEN];
char savepath[MAXPATHLEN];
struct dirent *dent;
DIR *dp;
struct stat s;
-#ifdef DEBUG
- printf("==> tar_append_tree(0x%lx, \"%s\", \"%s\")\n",
- t, realdir, (savedir ? savedir : "[NULL]"));
-#endif
-
- if (tar_append_file(t, realdir, savedir) != 0)
- return -1;
-
-#ifdef DEBUG
- puts(" tar_append_tree(): done with tar_append_file()...");
-#endif
-
dp = opendir(realdir);
- if (dp == NULL)
- {
+ if (dp == NULL) {
if (errno == ENOTDIR)
return 0;
return -1;
}
- while ((dent = readdir(dp)) != NULL)
- {
- if (strcmp(dent->d_name, ".") == 0 ||
- strcmp(dent->d_name, "..") == 0)
+ while ((dent = readdir(dp)) != NULL) {
+ if(strcmp(dent->d_name, ".") == 0
+ || strcmp(dent->d_name, "..") == 0)
continue;
- snprintf(realpath, MAXPATHLEN, "%s/%s", realdir,
- dent->d_name);
+ if (exclude) {
+ int omit = 0;
+ for (i = 0; i < (n_spaces+1); i++) {
+ if (dent->d_name == excluded[i]) {
+ printf(" excluding '%s'\n", excluded[i]);
+ omit = 1;
+ break;
+ }
+ }
+ if (omit)
+ continue;
+ }
+
+ snprintf(realpath, MAXPATHLEN, "%s/%s", realdir, dent->d_name);
if (savedir)
- snprintf(savepath, MAXPATHLEN, "%s/%s", savedir,
- dent->d_name);
+ snprintf(savepath, MAXPATHLEN, "%s/%s", savedir, dent->d_name);
if (lstat(realpath, &s) != 0)
return -1;
- if (S_ISDIR(s.st_mode))
- {
- if (tar_append_tree(t, realpath,
- (savedir ? savepath : NULL)) != 0)
+ if (S_ISDIR(s.st_mode)) {
+ if (tar_append_tree(t, realpath, (savedir ? savepath : NULL), (exclude ? exclude : NULL)) != 0)
+ return -1;
+ continue;
+ } else {
+ if (tar_append_file(t, realpath, (savedir ? savepath : NULL)) != 0)
return -1;
continue;
}
-
- if (tar_append_file(t, realpath,
- (savedir ? savepath : NULL)) != 0)
- return -1;
- }
-
+ }
closedir(dp);
+ free(excluded);
return 0;
}