From 6f57f7c60167b11e0e7769310aa8878d2980a3da Mon Sep 17 00:00:00 2001 From: James Christopher Adduono Date: Tue, 1 Mar 2016 16:01:53 -0500 Subject: Merge code from upstream libtar + bug fixes All updates and fixes applied from upstream libtar as of March 1, 2016. Debug flag is disabled, however non-debug output now provides 1 line of useful output per object extracted. I've also merged some fixes from CyanogenMod's fork of libtar: From: Tom Marshall Date: Thu, 11 Feb 2016 16:24:40 -0800 Subject: libtar: Cleanup, secure, and extend numeric fields Commit: e18b457ea1cbf6be1adc3b75450ed1c737cd82ea From: Tom Marshall Date: Thu, 11 Feb 2016 12:49:30 -0800 Subject: libtar: Make file sizes 64-bit clean Commit: e628c2025549a24018bc568351465130a05daafb From: Tom Marshall Date: Thu, 17 Apr 2014 09:39:25 -0700 Subject: libtar: Add methods for in-memory files Commit: 8ec5627a8ff0a91724c6d5b344f0e887da922527 From: Tom Marshall Date: Wed, 2 Jul 2014 09:34:40 -0700 Subject: libtar: Fix hardlink extract Commit: 166d83a51e0c51abcea37694dbd7df92d03c1f56 From: philz-cwm6 Date: Sat, 26 Apr 2014 01:11:35 +0200 Subject: libtar: Various bug fixes and enhancements Commit: a271d763e94235ccee9ecaabdb52bf4b9b2f8c06 (Some of this was not merged in, as better solutions were available from upstream libtar) From: Tom Marshall Date: Wed, 9 Apr 2014 09:35:54 -0700 Subject: libtar: Add const qualifiers to reduce compile warnings Commit: 0600afa19fe827d06d3fcf24a7aabd52dbf487b4 Change-Id: I6d008cb6fdf950f835bbed63aeb8727cc5c86083 --- libtar/wrapper.c | 110 ++++++++++++++++++++----------------------------------- 1 file changed, 39 insertions(+), 71 deletions(-) (limited to 'libtar/wrapper.c') diff --git a/libtar/wrapper.c b/libtar/wrapper.c index 82f045f7d..d3d285f44 100644 --- a/libtar/wrapper.c +++ b/libtar/wrapper.c @@ -10,18 +10,19 @@ ** University of Illinois at Urbana-Champaign */ -#define DEBUG #include #include +#include #include #include #include -#include + #ifdef STDC_HEADERS # include #endif + int tar_extract_glob(TAR *t, char *globname, char *prefix) { @@ -44,7 +45,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, prefix, &fd) != 0) + if (tar_extract_file(t, buf, prefix, &fd) != 0) return -1; } @@ -58,11 +59,12 @@ tar_extract_all(TAR *t, char *prefix, const int *progress_fd) char *filename; char buf[MAXPATHLEN]; int i; - printf("prefix: %s\n", prefix); + #ifdef DEBUG printf("==> tar_extract_all(TAR *t, \"%s\")\n", (prefix ? prefix : "(null)")); #endif + while ((i = th_read(t)) == 0) { #ifdef DEBUG @@ -79,105 +81,71 @@ tar_extract_all(TAR *t, char *prefix, const int *progress_fd) printf(" tar_extract_all(): calling tar_extract_file(t, " "\"%s\")\n", buf); #endif - printf("item name: '%s'\n", filename); if (tar_extract_file(t, buf, prefix, progress_fd) != 0) return -1; } + return (i == 1 ? 0 : -1); } int -tar_append_tree(TAR *t, char *realdir, char *savedir, char *exclude) +tar_append_tree(TAR *t, char *realdir, char *savedir) { -#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; - if (exclude) { - int omit = 0; - for (i = 0; i < (n_spaces+1); i++) { - if (excluded[i] != NULL) { - if (strcmp(dent->d_name, excluded[i]) == 0 || strcmp(excluded[i], realdir) == 0) { - printf(" excluding '%s'\n", excluded[i]); - omit = 1; - break; - } - } - } - if (omit) - continue; - } - - snprintf(realpath, MAXPATHLEN, "%s/%s", realdir, dent->d_name); + 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), (exclude ? exclude : NULL)) != 0) - return -1; - continue; - } else { - if (tar_append_file(t, realpath, (savedir ? savepath : NULL)) != 0) + if (S_ISDIR(s.st_mode)) + { + if (tar_append_tree(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; } -- cgit v1.2.3