diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-12-31 17:57:20 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-12-31 17:57:20 -0500 |
| commit | 0c8ec369f051d616434cff309fe737c52fd98199 (patch) | |
| tree | 2a1cae5baadc8c45c4ab0f8c1d213e606976ea24 /lib/std | |
| parent | 8186211404552a31eaf2a7bc182a46a7e40eacda (diff) | |
| download | zig-0c8ec369f051d616434cff309fe737c52fd98199.tar.gz zig-0c8ec369f051d616434cff309fe737c52fd98199.zip | |
std.os.memfd_create: add error.SystemOutdated
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/os.zig | 7 | ||||
| -rw-r--r-- | lib/std/os/test.zig | 13 | ||||
| -rw-r--r-- | lib/std/target.zig | 7 |
3 files changed, 18 insertions, 9 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig index b51dbe7d2a..878d1a57e7 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -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), } } diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig index 16946660e4..09e8c24899 100644 --- a/lib/std/os/test.zig +++ b/lib/std/os/test.zig @@ -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); diff --git a/lib/std/target.zig b/lib/std/target.zig index 50c749d30b..22fea691c4 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -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, |
