filling packed user
This commit is contained in:
parent
eacfc08592
commit
da727113e5
@ -1,5 +1,5 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const shells = @import("shell.zig");
|
const shell = @import("shell.zig");
|
||||||
|
|
||||||
const HeaderSize = @sizeOf(Header);
|
const HeaderSize = @sizeOf(Header);
|
||||||
const Magic = [4]u8{ 0xf0, 0x9f, 0xa4, 0xb7 };
|
const Magic = [4]u8{ 0xf0, 0x9f, 0xa4, 0xb7 };
|
||||||
@ -43,7 +43,7 @@ const Header = packed struct {
|
|||||||
if (self.bom != Bom) {
|
if (self.bom != Bom) {
|
||||||
return error.InvalidBom;
|
return error.InvalidBom;
|
||||||
}
|
}
|
||||||
if (self.num_shells > shells.MaxShells) {
|
if (self.num_shells > shell.MaxShells) {
|
||||||
return error.TooManyShells;
|
return error.TooManyShells;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,7 +116,7 @@ test "header pack, unpack and validation" {
|
|||||||
|
|
||||||
{
|
{
|
||||||
var header = goodHeader;
|
var header = goodHeader;
|
||||||
header.num_shells = shells.MaxShells + 1;
|
header.num_shells = shell.MaxShells + 1;
|
||||||
try testing.expectError(error.TooManyShells, Header.init(header.asArray()));
|
try testing.expectError(error.TooManyShells, Header.init(header.asArray()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
50
src/user.zig
50
src/user.zig
@ -1,4 +1,7 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const shell = @import("shell.zig");
|
||||||
|
|
||||||
|
const Allocator = std.mem.Allocator;
|
||||||
|
|
||||||
pub const PackedUserSize = @sizeOf(PackedUser);
|
pub const PackedUserSize = @sizeOf(PackedUser);
|
||||||
pub const PackedUser = packed struct {
|
pub const PackedUser = packed struct {
|
||||||
@ -13,6 +16,53 @@ pub const PackedUser = packed struct {
|
|||||||
gecos_len: u8,
|
gecos_len: u8,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const User = struct {
|
||||||
|
uid: u32,
|
||||||
|
gid: u32,
|
||||||
|
name: []const u8,
|
||||||
|
gecos: []const u8,
|
||||||
|
home: []const u8,
|
||||||
|
shell: []const u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
// UserWriter accepts a naive User struct and returns a PackedUser
|
||||||
|
pub const UserWriter = struct {
|
||||||
|
allocator: Allocator,
|
||||||
|
|
||||||
|
pub fn init(allocator: Allocator) UserWriter {
|
||||||
|
return UserWriter{
|
||||||
|
.allocator = allocator,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn fromUser(user: User, shellw: shell.ShellWriter) !PackedUser {
|
||||||
|
var shell_here: u1 = undefined;
|
||||||
|
var shell_len_or_place: u6 = undefined;
|
||||||
|
if (shellw.getIndex(user.shell)) |idx| {
|
||||||
|
shell_here = false;
|
||||||
|
shell_len_or_place = idx;
|
||||||
|
} else {
|
||||||
|
shell_here = true;
|
||||||
|
shell_len_or_place = user.shell.len;
|
||||||
|
}
|
||||||
|
|
||||||
|
var puser = PackedUser{
|
||||||
|
.uid = user.uid,
|
||||||
|
.gid = user.gid,
|
||||||
|
.additional_gids_offset = 0, // second pass
|
||||||
|
.shell_here = shell_here,
|
||||||
|
.shell_len_or_place = shell_len_or_place,
|
||||||
|
.homedir_len = undefined,
|
||||||
|
.username_is_a_suffix = undefined,
|
||||||
|
.username_offset_or_len = undefined,
|
||||||
|
.gecos_len = undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
_ = shellw;
|
||||||
|
return puser;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
test "PackedUser is byte-aligned" {
|
test "PackedUser is byte-aligned" {
|
||||||
|
Loading…
Reference in New Issue
Block a user