diff options
| author | Isaac Freund <mail@isaacfreund.com> | 2022-05-14 14:16:19 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-05-16 17:43:44 -0400 |
| commit | 1392c24166f9edc1dd22c979689dcec456292ef4 (patch) | |
| tree | 08d7f0be23e22252d9e4649a40357f8dcd6aa30c /lib | |
| parent | 5b03d55c5ecf697086db7c454e0f3982fec42408 (diff) | |
| download | zig-1392c24166f9edc1dd22c979689dcec456292ef4.tar.gz zig-1392c24166f9edc1dd22c979689dcec456292ef4.zip | |
std.os: Add memfd_create for FreeBSD
This is minorly breaking as e.g. std.os.linux.MFD_CLOEXEC is now
std.os.linux.MFD.CLOEXEC.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/std/c/freebsd.zig | 9 | ||||
| -rw-r--r-- | lib/std/os.zig | 46 | ||||
| -rw-r--r-- | lib/std/os/linux.zig | 40 | ||||
| -rw-r--r-- | lib/std/os/test.zig | 5 |
4 files changed, 65 insertions, 35 deletions
diff --git a/lib/std/c/freebsd.zig b/lib/std/c/freebsd.zig index e40d7acd8d..997542439d 100644 --- a/lib/std/c/freebsd.zig +++ b/lib/std/c/freebsd.zig @@ -1640,3 +1640,12 @@ pub const POLL = struct { pub const STANDARD = IN | PRI | OUT | RDNORM | RDBAND | WRBAND | ERR | HUP | NVAL; }; + +pub const NAME_MAX = 255; + +pub const MFD = struct { + pub const CLOEXEC = 0x0001; + pub const ALLOW_SEALING = 0x0002; +}; + +pub extern "c" fn memfd_create(name: [*:0]const u8, flags: c_uint) c_int; diff --git a/lib/std/os.zig b/lib/std/os.zig index 6859427b78..cd4500d60f 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -97,6 +97,7 @@ pub const MADV = system.MADV; pub const MAP = system.MAP; pub const MSF = system.MSF; pub const MAX_ADDR_LEN = system.MAX_ADDR_LEN; +pub const MFD = system.MFD; pub const MMAP2_UNIT = system.MMAP2_UNIT; pub const MSG = system.MSG; pub const NAME_MAX = system.NAME_MAX; @@ -6522,20 +6523,37 @@ pub const MemFdCreateError = error{ } || UnexpectedError; pub fn memfd_createZ(name: [*:0]const u8, flags: u32) MemFdCreateError!fd_t { - // memfd_create is available only in glibc versions starting with 2.27. - const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok; - const sys = if (use_c) std.c else linux; - const getErrno = if (use_c) std.c.getErrno else linux.getErrno; - const rc = sys.memfd_create(name, flags); - switch (getErrno(rc)) { - .SUCCESS => return @intCast(fd_t, rc), - .FAULT => unreachable, // name has invalid memory - .INVAL => unreachable, // name/flags are faulty - .NFILE => return error.SystemFdQuotaExceeded, - .MFILE => return error.ProcessFdQuotaExceeded, - .NOMEM => return error.OutOfMemory, - .NOSYS => return error.SystemOutdated, - else => |err| return unexpectedErrno(err), + switch (builtin.os.tag) { + .linux => { + // memfd_create is available only in glibc versions starting with 2.27. + const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok; + const sys = if (use_c) std.c else linux; + const getErrno = if (use_c) std.c.getErrno else linux.getErrno; + const rc = sys.memfd_create(name, flags); + switch (getErrno(rc)) { + .SUCCESS => return @intCast(fd_t, rc), + .FAULT => unreachable, // name has invalid memory + .INVAL => unreachable, // name/flags are faulty + .NFILE => return error.SystemFdQuotaExceeded, + .MFILE => return error.ProcessFdQuotaExceeded, + .NOMEM => return error.OutOfMemory, + .NOSYS => return error.SystemOutdated, + else => |err| return unexpectedErrno(err), + } + }, + .freebsd => { + const rc = system.memfd_create(name, flags); + switch (errno(rc)) { + .SUCCESS => return rc, + .BADF => unreachable, // name argument NULL + .INVAL => unreachable, // name too long or invalid/unsupported flags. + .MFILE => return error.ProcessFdQuotaExceeded, + .NFILE => return error.SystemFdQuotaExceeded, + .NOSYS => return error.SystemOutdated, + else => |err| return unexpectedErrno(err), + } + }, + else => @compileError("target OS does not support memfd_create()"), } } diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index fec9f55ad1..35d2e88c17 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -3972,11 +3972,6 @@ pub const POLL = struct { pub const RDBAND = 0x080; }; -pub const MFD_CLOEXEC = 0x0001; -pub const MFD_ALLOW_SEALING = 0x0002; -pub const MFD_HUGETLB = 0x0004; -pub const MFD_ALL_FLAGS = MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB; - pub const HUGETLB_FLAG_ENCODE_SHIFT = 26; pub const HUGETLB_FLAG_ENCODE_MASK = 0x3f; pub const HUGETLB_FLAG_ENCODE_64KB = 16 << HUGETLB_FLAG_ENCODE_SHIFT; @@ -3992,20 +3987,27 @@ pub const HUGETLB_FLAG_ENCODE_1GB = 30 << HUGETLB_FLAG_ENCODE_SHIFT; pub const HUGETLB_FLAG_ENCODE_2GB = 31 << HUGETLB_FLAG_ENCODE_SHIFT; pub const HUGETLB_FLAG_ENCODE_16GB = 34 << HUGETLB_FLAG_ENCODE_SHIFT; -pub const MFD_HUGE_SHIFT = HUGETLB_FLAG_ENCODE_SHIFT; -pub const MFD_HUGE_MASK = HUGETLB_FLAG_ENCODE_MASK; -pub const MFD_HUGE_64KB = HUGETLB_FLAG_ENCODE_64KB; -pub const MFD_HUGE_512KB = HUGETLB_FLAG_ENCODE_512KB; -pub const MFD_HUGE_1MB = HUGETLB_FLAG_ENCODE_1MB; -pub const MFD_HUGE_2MB = HUGETLB_FLAG_ENCODE_2MB; -pub const MFD_HUGE_8MB = HUGETLB_FLAG_ENCODE_8MB; -pub const MFD_HUGE_16MB = HUGETLB_FLAG_ENCODE_16MB; -pub const MFD_HUGE_32MB = HUGETLB_FLAG_ENCODE_32MB; -pub const MFD_HUGE_256MB = HUGETLB_FLAG_ENCODE_256MB; -pub const MFD_HUGE_512MB = HUGETLB_FLAG_ENCODE_512MB; -pub const MFD_HUGE_1GB = HUGETLB_FLAG_ENCODE_1GB; -pub const MFD_HUGE_2GB = HUGETLB_FLAG_ENCODE_2GB; -pub const MFD_HUGE_16GB = HUGETLB_FLAG_ENCODE_16GB; +pub const MFD = struct { + pub const CLOEXEC = 0x0001; + pub const ALLOW_SEALING = 0x0002; + pub const HUGETLB = 0x0004; + pub const ALL_FLAGS = CLOEXEC | ALLOW_SEALING | HUGETLB; + + pub const HUGE_SHIFT = HUGETLB_FLAG_ENCODE_SHIFT; + pub const HUGE_MASK = HUGETLB_FLAG_ENCODE_MASK; + pub const HUGE_64KB = HUGETLB_FLAG_ENCODE_64KB; + pub const HUGE_512KB = HUGETLB_FLAG_ENCODE_512KB; + pub const HUGE_1MB = HUGETLB_FLAG_ENCODE_1MB; + pub const HUGE_2MB = HUGETLB_FLAG_ENCODE_2MB; + pub const HUGE_8MB = HUGETLB_FLAG_ENCODE_8MB; + pub const HUGE_16MB = HUGETLB_FLAG_ENCODE_16MB; + pub const HUGE_32MB = HUGETLB_FLAG_ENCODE_32MB; + pub const HUGE_256MB = HUGETLB_FLAG_ENCODE_256MB; + pub const HUGE_512MB = HUGETLB_FLAG_ENCODE_512MB; + pub const HUGE_1GB = HUGETLB_FLAG_ENCODE_1GB; + pub const HUGE_2GB = HUGETLB_FLAG_ENCODE_2GB; + pub const HUGE_16GB = HUGETLB_FLAG_ENCODE_16GB; +}; pub const rusage = extern struct { utime: timeval, diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index ae0d14ef7e..dfe65f008d 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -495,8 +495,9 @@ test "argsAlloc" { } test "memfd_create" { - // memfd_create is linux specific. - if (native_os != .linux) return error.SkipZigTest; + // memfd_create is only supported by linux and freebsd. + if (native_os != .linux and native_os != .freebsd) return error.SkipZigTest; + const fd = std.os.memfd_create("test", 0) catch |err| switch (err) { // Related: https://github.com/ziglang/zig/issues/4019 error.SystemOutdated => return error.SkipZigTest, |
