From: Tim Kientzle Date: Sat, 10 Jan 2015 19:55:29 +0000 (-0800) Subject: Issue #131: Implement tar --no-xattr X-Git-Tag: v3.1.900a~158 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48b288a03347e49f2f9501f040f626f916195de6;p=thirdparty%2Flibarchive.git Issue #131: Implement tar --no-xattr This option suppresses both archiving and restoring xattrs. The latter relies on existing machinery; for the former, I've added a ARCHIVE_READDISK_NO_XATTR flag to archive_read_disk. Caveat: I've not implemented any tests for these new features. --- diff --git a/libarchive/archive.h b/libarchive/archive.h index 81ed63a13..1f0fc3874 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -958,6 +958,8 @@ __LA_DECL int archive_read_disk_set_atime_restored(struct archive *); #define ARCHIVE_READDISK_MAC_COPYFILE (0x0004) /* Default: Do not traverse mount points. */ #define ARCHIVE_READDISK_NO_TRAVERSE_MOUNTS (0x0008) +/* Default: Xattrs are read from disk. */ +#define ARCHIVE_READDISK_NO_XATTR (0x0010) __LA_DECL int archive_read_disk_set_behavior(struct archive *, int flags); diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index e81cbeccd..38303aa87 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -251,9 +251,11 @@ archive_read_disk_entry_from_file(struct archive *_a, #endif /* HAVE_READLINK || HAVE_READLINKAT */ r = setup_acls(a, entry, &fd); - r1 = setup_xattrs(a, entry, &fd); - if (r1 < r) - r = r1; + if (!a->suppress_xattr) { + r1 = setup_xattrs(a, entry, &fd); + if (r1 < r) + r = r1; + } if (a->enable_copyfile) { r1 = setup_mac_metadata(a, entry, &fd); if (r1 < r) diff --git a/libarchive/archive_read_disk_posix.c b/libarchive/archive_read_disk_posix.c index 71e63ac62..7a5a159f6 100644 --- a/libarchive/archive_read_disk_posix.c +++ b/libarchive/archive_read_disk_posix.c @@ -609,6 +609,10 @@ archive_read_disk_set_behavior(struct archive *_a, int flags) a->traverse_mount_points = 0; else a->traverse_mount_points = 1; + if (flags & ARCHIVE_READDISK_NO_XATTR) + a->suppress_xattr = 1; + else + a->suppress_xattr = 0; return (r); } diff --git a/libarchive/archive_read_disk_private.h b/libarchive/archive_read_disk_private.h index e5af16b91..de0142edd 100644 --- a/libarchive/archive_read_disk_private.h +++ b/libarchive/archive_read_disk_private.h @@ -68,6 +68,8 @@ struct archive_read_disk { int enable_copyfile; /* Set 1 if users request to traverse mount points. */ int traverse_mount_points; + /* Set 1 if users want to suppress xattr information. */ + int suppress_xattr; const char * (*lookup_gname)(void *private, int64_t gid); void (*cleanup_gname)(void *private); diff --git a/tar/bsdtar.c b/tar/bsdtar.c index 4b4a5824b..a8c846b0c 100644 --- a/tar/bsdtar.c +++ b/tar/bsdtar.c @@ -472,6 +472,10 @@ main(int argc, char **argv) bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_FFLAGS; bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_MAC_METADATA; break; + case OPTION_NO_XATTR: /* Issue #131 */ + bsdtar->extract_flags &= ~ARCHIVE_EXTRACT_XATTR; + bsdtar->readdisk_flags |= ARCHIVE_READDISK_NO_XATTR; + break; case OPTION_NULL: /* GNU tar */ bsdtar->option_null++; break; @@ -707,6 +711,8 @@ main(int argc, char **argv) only_mode(bsdtar, "--nopreserveHFSCompression", "x"); if (bsdtar->readdisk_flags & ARCHIVE_READDISK_HONOR_NODUMP) only_mode(bsdtar, "--nodump", "cru"); + if (bsdtar->readdisk_flags & ARCHIVE_READDISK_NO_XATTR) + only_mode(bsdtar, "--no-xattr", "crux"); if (option_o > 0) { switch (bsdtar->mode) { case 'c': diff --git a/tar/bsdtar.h b/tar/bsdtar.h index 4050a81a7..8e64b0a79 100644 --- a/tar/bsdtar.h +++ b/tar/bsdtar.h @@ -143,6 +143,7 @@ enum { OPTION_NOPRESERVE_HFS_COMPRESSION, OPTION_NO_SAME_OWNER, OPTION_NO_SAME_PERMISSIONS, + OPTION_NO_XATTR, OPTION_NULL, OPTION_NUMERIC_OWNER, OPTION_OLDER_CTIME, diff --git a/tar/cmdline.c b/tar/cmdline.c index 974b6af89..bb905812d 100644 --- a/tar/cmdline.c +++ b/tar/cmdline.c @@ -116,6 +116,7 @@ static const struct bsdtar_option { { "no-recursion", 0, 'n' }, { "no-same-owner", 0, OPTION_NO_SAME_OWNER }, { "no-same-permissions", 0, OPTION_NO_SAME_PERMISSIONS }, + { "no-xattr", 0, OPTION_NO_XATTR }, { "nodump", 0, OPTION_NODUMP }, { "nopreserveHFSCompression",0, OPTION_NOPRESERVE_HFS_COMPRESSION }, { "norecurse", 0, 'n' },