DoxigAlpha

next

Function parameters

Parameters

#
self:*Self

Type definitions in this namespace

Types

#
Diagnostics
Provide this to receive detailed error messages.
PipeOptions
pipeToFileSystem options
FileKind
Type of the file returned by iterator `next` method.
Iterator
Iterator over entries in the tar file represented by reader.

Saves tar file content to the file systems.

Functions

#
pipeToFileSystem
Saves tar file content to the file systems.

Source

Implementation

#
pub fn next(self: *Self) !?Attribute {
    // Pax extended header consists of one or more attributes, each constructed as follows:
    // "%d %s=%s\n", <length>, <keyword>, <value>
    while (self.size > 0) {
        const length_buf = try self.reader.takeSentinel(' ');
        const length = try std.fmt.parseInt(usize, length_buf, 10); // record length in bytes

        const keyword = try self.reader.takeSentinel('=');
        if (hasNull(keyword)) return error.PaxNullInKeyword;

        // calculate value_len
        const value_start = length_buf.len + keyword.len + 2; // 2 separators
        if (length < value_start + 1 or self.size < length) return error.UnexpectedEndOfStream;
        const value_len = length - value_start - 1; // \n separator at end
        self.size -= length;

        const kind: PaxAttributeKind = if (eql(keyword, "path"))
            .path
        else if (eql(keyword, "linkpath"))
            .linkpath
        else if (eql(keyword, "size"))
            .size
        else {
            try self.reader.discardAll(value_len);
            try validateAttributeEnding(self.reader);
            continue;
        };
        if (kind == .size and value_len > pax_max_size_attr_len) {
            return error.PaxSizeAttrOverflow;
        }
        return .{
            .kind = kind,
            .len = value_len,
            .reader = self.reader,
        };
    }

    return null;
}