aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-12-31 17:57:20 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-12-31 17:57:20 -0500
commit0c8ec369f051d616434cff309fe737c52fd98199 (patch)
tree2a1cae5baadc8c45c4ab0f8c1d213e606976ea24 /lib/std
parent8186211404552a31eaf2a7bc182a46a7e40eacda (diff)
downloadzig-0c8ec369f051d616434cff309fe737c52fd98199.tar.gz
zig-0c8ec369f051d616434cff309fe737c52fd98199.zip
std.os.memfd_create: add error.SystemOutdated
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/os.zig7
-rw-r--r--lib/std/os/test.zig13
-rw-r--r--lib/std/target.zig7
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,