aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/tar.test5
-rw-r--r--toys/posix/tar.c12
2 files changed, 13 insertions, 4 deletions
diff --git a/tests/tar.test b/tests/tar.test
index c2ca4895..d6c505ae 100644
--- a/tests/tar.test
+++ b/tests/tar.test
@@ -262,6 +262,11 @@ for i in {0..12}; do touch links/orig$i; ln links/{orig,link}$i; done
testcmd 'links2' '-cf test.tar links' '' '' ''
rm -rf links
+install -m 000 -d folder/skip/oof &&
+testcmd 'exclude' '--exclude skip -cvf tar.tar folder && echo yes' \
+ 'folder/\nyes\n' '' ''
+rm -rf folder tar.tar
+
if false
then
diff --git a/toys/posix/tar.c b/toys/posix/tar.c
index b257a34f..4b8dd901 100644
--- a/toys/posix/tar.c
+++ b/toys/posix/tar.c
@@ -179,7 +179,7 @@ static int add_to_tar(struct dirtree *node)
struct tar_hdr hdr;
struct passwd *pw = pw;
struct group *gr = gr;
- int i, fd =-1;
+ int i, fd = -1, norecurse = FLAG(no_recursion);
char *name, *lnk, *hname;
if (!dirtree_notdotdot(node)) return 0;
@@ -193,7 +193,11 @@ static int add_to_tar(struct dirtree *node)
// exclusion defaults to --no-anchored and --wildcards-match-slash
for (lnk = name; *lnk;) {
- if (filter(TT.excl, lnk)) goto done;
+ if (filter(TT.excl, lnk)) {
+ norecurse++;
+
+ goto done;
+ }
while (*lnk && *lnk!='/') lnk++;
while (*lnk=='/') lnk++;
}
@@ -339,7 +343,7 @@ static int add_to_tar(struct dirtree *node)
itoo(hdr.chksum, sizeof(hdr.chksum)-1, tar_cksum(&hdr));
hdr.chksum[7] = ' ';
- if (FLAG(v)) dprintf(TT.fd ? 2 : 1, "%s\n", hname);
+ if (FLAG(v)) dprintf((TT.fd==1) ? 2 : 1, "%s\n", hname);
// Write header and data to archive
xwrite(TT.fd, &hdr, 512);
@@ -375,7 +379,7 @@ static int add_to_tar(struct dirtree *node)
done:
free(name);
- return (DIRTREE_RECURSE|(FLAG(h)?DIRTREE_SYMFOLLOW:0))*!FLAG(no_recursion);
+ return (DIRTREE_RECURSE|(FLAG(h)?DIRTREE_SYMFOLLOW:0))*!norecurse;
}
static void wsettime(char *s, long long sec)