| ... | ... | @@ -231,12 +231,27 @@ fn nullStr(str: []const u8) []const u8 { |
| 231 | 231 | return str; |
| 232 | 232 | } |
| 233 | 233 | |
| 234 | pub const IteratorOptions = struct { |
| 235 | /// Use a buffer with length `std.fs.MAX_PATH_BYTES` to match file system capabilities. |
| 236 | file_name_buffer: []u8, |
| 237 | /// Use a buffer with length `std.fs.MAX_PATH_BYTES` to match file system capabilities. |
| 238 | link_name_buffer: []u8, |
| 239 | diagnostics: ?*Diagnostics = null, |
| 240 | |
| 241 | pub const Diagnostics = Options.Diagnostics; |
| 242 | }; |
| 243 | |
| 234 | 244 | /// Iterates over files in tar archive. |
| 235 | 245 | /// `next` returns each file in `reader` tar archive. |
| 236 | | pub fn iterator(reader: anytype, diagnostics: ?*Options.Diagnostics) Iterator(@TypeOf(reader)) { |
| 246 | pub fn iterator(reader: anytype, options: IteratorOptions) Iterator(@TypeOf(reader)) { |
| 237 | 247 | return .{ |
| 238 | 248 | .reader = reader, |
| 239 | | .diagnostics = diagnostics, |
| 249 | .diagnostics = options.diagnostics, |
| 250 | .header_buffer = undefined, |
| 251 | .file_name_buffer = options.file_name_buffer, |
| 252 | .link_name_buffer = options.link_name_buffer, |
| 253 | .padding = 0, |
| 254 | .file = undefined, |
| 240 | 255 | }; |
| 241 | 256 | } |
| 242 | 257 | |
| ... | ... | @@ -246,14 +261,14 @@ fn Iterator(comptime ReaderType: type) type { |
| 246 | 261 | diagnostics: ?*Options.Diagnostics, |
| 247 | 262 | |
| 248 | 263 | // buffers for heeader and file attributes |
| 249 | | header_buffer: [Header.SIZE]u8 = undefined, |
| 250 | | file_name_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined, |
| 251 | | link_name_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined, |
| 264 | header_buffer: [Header.SIZE]u8, |
| 265 | file_name_buffer: []u8, |
| 266 | link_name_buffer: []u8, |
| 252 | 267 | |
| 253 | 268 | // bytes of padding to the end of the block |
| 254 | | padding: usize = 0, |
| 269 | padding: usize, |
| 255 | 270 | // current tar file |
| 256 | | file: File = undefined, |
| 271 | file: File, |
| 257 | 272 | |
| 258 | 273 | pub const File = struct { |
| 259 | 274 | name: []const u8, // name of file, symlink or directory |
| ... | ... | @@ -305,7 +320,7 @@ fn Iterator(comptime ReaderType: type) type { |
| 305 | 320 | } |
| 306 | 321 | |
| 307 | 322 | fn initFile(self: *Self) void { |
| 308 | | self.file = File{ |
| 323 | self.file = .{ |
| 309 | 324 | .name = self.file_name_buffer[0..0], |
| 310 | 325 | .link_name = self.link_name_buffer[0..0], |
| 311 | 326 | .size = 0, |
| ... | ... | @@ -357,10 +372,10 @@ fn Iterator(comptime ReaderType: type) type { |
| 357 | 372 | }, |
| 358 | 373 | // Prefix header types |
| 359 | 374 | .gnu_long_name => { |
| 360 | | self.file.name = try self.readString(@intCast(size), &self.file_name_buffer); |
| 375 | self.file.name = try self.readString(@intCast(size), self.file_name_buffer); |
| 361 | 376 | }, |
| 362 | 377 | .gnu_long_link => { |
| 363 | | self.file.link_name = try self.readString(@intCast(size), &self.link_name_buffer); |
| 378 | self.file.link_name = try self.readString(@intCast(size), self.link_name_buffer); |
| 364 | 379 | }, |
| 365 | 380 | .extended_header => { |
| 366 | 381 | // Use just attributes from last extended header. |
| ... | ... | @@ -370,10 +385,10 @@ fn Iterator(comptime ReaderType: type) type { |
| 370 | 385 | while (try rdr.next()) |attr| { |
| 371 | 386 | switch (attr.kind) { |
| 372 | 387 | .path => { |
| 373 | | self.file.name = try attr.value(&self.file_name_buffer); |
| 388 | self.file.name = try attr.value(self.file_name_buffer); |
| 374 | 389 | }, |
| 375 | 390 | .linkpath => { |
| 376 | | self.file.link_name = try attr.value(&self.link_name_buffer); |
| 391 | self.file.link_name = try attr.value(self.link_name_buffer); |
| 377 | 392 | }, |
| 378 | 393 | .size => { |
| 379 | 394 | var buf: [pax_max_size_attr_len]u8 = undefined; |
| ... | ... | @@ -536,7 +551,13 @@ pub fn pipeToFileSystem(dir: std.fs.Dir, reader: anytype, options: Options) !voi |
| 536 | 551 | }, |
| 537 | 552 | } |
| 538 | 553 | |
| 539 | | var iter = iterator(reader, options.diagnostics); |
| 554 | var file_name_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; |
| 555 | var link_name_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; |
| 556 | var iter = iterator(reader, .{ |
| 557 | .file_name_buffer = &file_name_buffer, |
| 558 | .link_name_buffer = &link_name_buffer, |
| 559 | .diagnostics = options.diagnostics, |
| 560 | }); |
| 540 | 561 | while (try iter.next()) |file| { |
| 541 | 562 | switch (file.kind) { |
| 542 | 563 | .directory => { |