std.os.memfd_create: add error.SystemOutdated

This commit is contained in:
Andrew Kelley 2019-12-31 17:57:20 -05:00
parent 8186211404
commit 0c8ec369f0
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
3 changed files with 18 additions and 9 deletions

View File

@ -3286,9 +3286,13 @@ pub const MemFdCreateError = error{
SystemFdQuotaExceeded,
ProcessFdQuotaExceeded,
OutOfMemory,
/// memfd_create is available in Linux 3.17 and later. This error is returned
/// for older kernel versions.
SystemOutdated,
} || UnexpectedError;
pub fn memfd_createC(name: [*:0]const u8, flags: u32) !fd_t {
pub fn memfd_createC(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;
@ -3301,6 +3305,7 @@ pub fn memfd_createC(name: [*:0]const u8, flags: u32) !fd_t {
ENFILE => return error.SystemFdQuotaExceeded,
EMFILE => return error.ProcessFdQuotaExceeded,
ENOMEM => return error.OutOfMemory,
ENOSYS => return error.SystemOutdated,
else => |err| return unexpectedErrno(err),
}
}

View File

@ -241,14 +241,11 @@ test "argsAlloc" {
test "memfd_create" {
// memfd_create is linux specific.
if (builtin.os != .linux) return error.SkipZigTest;
// Zig's CI testing infrastructure uses QEMU. Currently the version is
// qemu 2.11 from Ubuntu 18.04, which does not have memfd_create support.
// memfd_create support is introduced in qemu 4.2. To avoid
// "invalid syscall" errors from qemu, we disable the test when not linking libc.
// https://github.com/ziglang/zig/issues/4019
if (!builtin.link_libc) return error.SkipZigTest;
const fd = try std.os.memfd_create("test", 0);
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,
else => |e| return e,
};
defer std.os.close(fd);
try std.os.write(fd, "test");
try std.os.lseek_SET(fd, 0);

View File

@ -597,6 +597,13 @@ pub const Target = union(enum) {
};
}
pub fn isMusl(self: Target) bool {
return switch (self.getAbi()) {
.musl, .musleabi, .musleabihf => true,
else => false,
};
}
pub fn isDarwin(self: Target) bool {
return switch (self.getOs()) {
.ios, .macosx, .watchos, .tvos => true,