aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/libarchive/libarchive-bindings.zig3
-rw-r--r--src/libarchive/libarchive.zig11
2 files changed, 12 insertions, 2 deletions
diff --git a/src/libarchive/libarchive-bindings.zig b/src/libarchive/libarchive-bindings.zig
index cefca76a7..e1c3ef920 100644
--- a/src/libarchive/libarchive-bindings.zig
+++ b/src/libarchive/libarchive-bindings.zig
@@ -7,7 +7,7 @@ pub const archive = struct_archive;
pub const archive_entry = struct_archive_entry;
const mode_t = @import("std").c.mode_t;
const FILE = @import("std").c.FILE;
-const time_t = @import("std").c.time_t;
+// const time_t = @import("std").c.time_t;
const dev_t = @import("std").c.dev_t;
pub const FileType = enum(mode_t) {
@@ -25,6 +25,7 @@ pub const SymlinkType = enum(c_int) {
file = 1,
directory = 2,
};
+pub const time_t = isize;
pub const ARCHIVE_VERSION_ONLY_STRING = "3.5.3dev";
pub const ARCHIVE_VERSION_STRING = "libarchive " ++ ARCHIVE_VERSION_ONLY_STRING;
diff --git a/src/libarchive/libarchive.zig b/src/libarchive/libarchive.zig
index 909b26ac1..1ec9a1f37 100644
--- a/src/libarchive/libarchive.zig
+++ b/src/libarchive/libarchive.zig
@@ -222,6 +222,13 @@ pub const BufferReadStream = struct {
_ = lib.archive_read_support_format_tar(this.archive);
_ = lib.archive_read_support_format_gnutar(this.archive);
_ = lib.archive_read_support_compression_gzip(this.archive);
+
+ // Ignore zeroed blocks in the archive, which occurs when multiple tar archives
+ // have been concatenated together.
+ // Without this option, only the contents of
+ // the first concatenated archive would be read.
+ _ = lib.archive_read_set_options(this.archive, "read_concatenated_archives");
+
// _ = lib.archive_read_support_filter_none(this.archive);
const rc = lib.archive_read_open_memory(this.archive, this.buf.ptr, this.buf.len);
@@ -545,12 +552,14 @@ pub const Archive = struct {
};
},
Kind.File => {
- const file = dir.createFileZ(pathname, .{ .truncate = true, .mode = @intCast(std.os.mode_t, lib.archive_entry_perm(entry)) }) catch |err| brk: {
+ const mode = @intCast(std.os.mode_t, lib.archive_entry_perm(entry));
+ const file = dir.createFileZ(pathname, .{ .truncate = true, .mode = mode }) catch |err| brk: {
switch (err) {
error.AccessDenied, error.FileNotFound => {
dir.makePath(std.fs.path.dirname(slice) orelse return err) catch {};
break :brk try dir.createFileZ(pathname, .{
.truncate = true,
+ .mode = mode,
});
},
else => {