summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libarchive/archive.h2
-rw-r--r--libarchive/archive_read_disk_entry_from_file.c8
-rw-r--r--libarchive/archive_read_disk_posix.c4
-rw-r--r--libarchive/archive_read_disk_private.h2
-rw-r--r--tar/bsdtar.c6
-rw-r--r--tar/bsdtar.h1
-rw-r--r--tar/cmdline.c1
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' },