Commit 0c8ec369f0

Andrew Kelley <andrew@ziglang.org>
2019-12-31 23:57:20
std.os.memfd_create: add error.SystemOutdated
1 parent 8186211
Changed files (3)
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);
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),
     }
 }
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,