diff options
-rw-r--r-- | libarchive/archive.h | 2 | ||||
-rw-r--r-- | libarchive/archive_read_disk_entry_from_file.c | 8 | ||||
-rw-r--r-- | libarchive/archive_read_disk_posix.c | 4 | ||||
-rw-r--r-- | libarchive/archive_read_disk_private.h | 2 | ||||
-rw-r--r-- | tar/bsdtar.c | 6 | ||||
-rw-r--r-- | tar/bsdtar.h | 1 | ||||
-rw-r--r-- | tar/cmdline.c | 1 |
7 files changed, 21 insertions, 3 deletions
diff --git a/libarchive/archive.h b/libarchive/archive.h index 81ed63a1..1f0fc387 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 e81cbecc..38303aa8 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 71e63ac6..7a5a159f 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 e5af16b9..de0142ed 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 4b4a5824..a8c846b0 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 4050a81a..8e64b0a7 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 974b6af8..bb905812 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' }, |