Function next [src]

Prototype

pub fn next(self: *Self) !?Attribute

Parameters

self: *Self

Source

pub fn next(self: *Self) !?Attribute { // Pax extended header consists of one or more attributes, each constructed as follows: // "%d %s=%s\n", , , 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; }