add some clarifying comments

This commit is contained in:
Motiejus Jakštys 2022-02-25 13:58:06 +02:00 committed by Motiejus Jakštys
parent b9fb07121b
commit eed4f4e234

View File

@ -7,10 +7,12 @@ const ArrayList = std.ArrayList;
const math = std.math; const math = std.math;
const mem = std.mem; const mem = std.mem;
// TODO(motiejus) move to the struct where it's used. // ShellIndexProto is a function prototype that, given a shell's index (in
const shellIndexProto = fn (u6) []const u8; // global shell section), will return a shell string. Matches ShelReader.get.
const PackedUserAlignmentBits = 3; const ShellIndexProto = fn (u6) []const u8;
// User is a convenient public struct for record construction and
// serialization. Iterator can help retrieve these records.
pub const User = struct { pub const User = struct {
uid: u32, uid: u32,
gid: u32, gid: u32,
@ -21,6 +23,7 @@ pub const User = struct {
}; };
pub const PackedUser = struct { pub const PackedUser = struct {
const AlignmentBits = 3;
const shellIndexFnType = fn ([]const u8) ?u6; const shellIndexFnType = fn ([]const u8) ?u6;
const InnerSize = @divExact(@bitSizeOf(Inner), 8); const InnerSize = @divExact(@bitSizeOf(Inner), 8);
@ -87,6 +90,8 @@ pub const PackedUser = struct {
} }
}; };
// PackedUser does not allocate; it re-interprets the "bytes" blob field.
// Both of those fields are pointers to "our representation" of that field.
inner: *const Inner, inner: *const Inner,
userdata: []const u8, userdata: []const u8,
@ -98,6 +103,7 @@ pub const PackedUser = struct {
pub fn fromBytes(bytes: []const u8) Entry { pub fn fromBytes(bytes: []const u8) Entry {
const inner = std.mem.bytesAsValue( const inner = std.mem.bytesAsValue(
Inner, Inner,
// Should use InnerSize instead of sizeOf, see
// https://github.com/ziglang/zig/issues/10958 // https://github.com/ziglang/zig/issues/10958
bytes[0..@sizeOf(Inner)], bytes[0..@sizeOf(Inner)],
); );
@ -105,7 +111,7 @@ pub const PackedUser = struct {
const startBlob = InnerSize; const startBlob = InnerSize;
const endBlob = startBlob + inner.blobLength(); const endBlob = startBlob + inner.blobLength();
const nextStart = pad.roundUp(usize, PackedUserAlignmentBits, endBlob); const nextStart = pad.roundUp(usize, AlignmentBits, endBlob);
var next: ?[]const u8 = null; var next: ?[]const u8 = null;
if (nextStart < bytes.len) { if (nextStart < bytes.len) {
next = bytes[nextStart..]; next = bytes[nextStart..];
@ -188,7 +194,7 @@ pub const PackedUser = struct {
pos += user.shell.len; pos += user.shell.len;
} }
const padding = pad.roundUpPadding(u64, PackedUserAlignmentBits, pos); const padding = pad.roundUpPadding(u64, AlignmentBits, pos);
buf.*.len += padding; buf.*.len += padding;
mem.set(u8, buf.*[pos .. pos + padding], 0); mem.set(u8, buf.*[pos .. pos + padding], 0);
} }
@ -202,7 +208,7 @@ pub const PackedUser = struct {
std.math.maxInt(u5) + // name std.math.maxInt(u5) + // name
std.math.maxInt(u6) + // shell std.math.maxInt(u6) + // shell
std.math.maxInt(u8); // gecos std.math.maxInt(u8); // gecos
return pad.roundUp(u64, PackedUserAlignmentBits, unpadded); return pad.roundUp(u64, AlignmentBits, unpadded);
} }
} }
@ -230,7 +236,7 @@ pub const PackedUser = struct {
return self.userdata[gecos_pos .. gecos_pos + gecos_len]; return self.userdata[gecos_pos .. gecos_pos + gecos_len];
} }
pub fn shell(self: *const PackedUser, shellIndex: shellIndexProto) []const u8 { pub fn shell(self: *const PackedUser, shellIndex: ShellIndexProto) []const u8 {
if (self.inner.shell_here) { if (self.inner.shell_here) {
const shell_pos = self.inner.maybeShellStart(); const shell_pos = self.inner.maybeShellStart();
const shell_len = self.inner.shellLen(); const shell_len = self.inner.shellLen();
@ -240,7 +246,7 @@ pub const PackedUser = struct {
} }
}; };
pub fn userIterator(section: []const u8, shellIndex: shellIndexProto) Iterator { pub fn userIterator(section: []const u8, shellIndex: ShellIndexProto) Iterator {
return Iterator{ return Iterator{
.section = section, .section = section,
.shellIndex = shellIndex, .shellIndex = shellIndex,
@ -249,7 +255,7 @@ pub fn userIterator(section: []const u8, shellIndex: shellIndexProto) Iterator {
pub const Iterator = struct { pub const Iterator = struct {
section: ?[]const u8, section: ?[]const u8,
shellIndex: shellIndexProto, shellIndex: ShellIndexProto,
pub fn next(it: *Iterator) ?PackedUser { pub fn next(it: *Iterator) ?PackedUser {
if (it.section) |section| { if (it.section) |section| {
@ -264,7 +270,7 @@ pub const Iterator = struct {
const testing = std.testing; const testing = std.testing;
test "PackedUser internal and external alignment" { test "PackedUser internal and external alignment" {
// External padding (PackedUserAlignmentBits) must be higher or equal to // External padding (AlignmentBits) must be higher or equal to
// the "internal" PackedUser alignment. By aligning PackedUser we are also // the "internal" PackedUser alignment. By aligning PackedUser we are also
// working around https://github.com/ziglang/zig/issues/10958 ; PackedUser // working around https://github.com/ziglang/zig/issues/10958 ; PackedUser
// cannot be converted from/to [@bitSizeOf(PackedUser)/8]u8; // cannot be converted from/to [@bitSizeOf(PackedUser)/8]u8;