diff options
-rw-r--r-- | src/libarchive/libarchive-bindings.zig | 3 | ||||
-rw-r--r-- | src/libarchive/libarchive.zig | 11 |
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 => { |