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/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;
 }