authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 17:57:20-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 17:57:20-05:00
log0c8ec369f051d616434cff309fe737c52fd98199
tree2a1cae5baadc8c45c4ab0f8c1d213e606976ea24
parent8186211404552a31eaf2a7bc182a46a7e40eacda
signature Commit is signed but in an unrecognized format.

std.os.memfd_create: add error.SystemOutdated


3 files changed, 18 insertions(+), 9 deletions(-)

lib/std/os.zig+6-1
......@@ -3286,9 +3286,13 @@ pub const MemFdCreateError = error{
32863286 SystemFdQuotaExceeded,
32873287 ProcessFdQuotaExceeded,
32883288 OutOfMemory,
3289
3290 /// memfd_create is available in Linux 3.17 and later. This error is returned
3291 /// for older kernel versions.
3292 SystemOutdated,
32893293} || UnexpectedError;
32903294
3291pub fn memfd_createC(name: [*:0]const u8, flags: u32) !fd_t {
3295pub fn memfd_createC(name: [*:0]const u8, flags: u32) MemFdCreateError!fd_t {
32923296 // memfd_create is available only in glibc versions starting with 2.27.
32933297 const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok;
32943298 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 {
33013305 ENFILE => return error.SystemFdQuotaExceeded,
33023306 EMFILE => return error.ProcessFdQuotaExceeded,
33033307 ENOMEM => return error.OutOfMemory,
3308 ENOSYS => return error.SystemOutdated,
33043309 else => |err| return unexpectedErrno(err),
33053310 }
33063311}
lib/std/os/test.zig+5-8
......@@ -241,14 +241,11 @@ test "argsAlloc" {
241241test "memfd_create" {
242242 // memfd_create is linux specific.
243243 if (builtin.os != .linux) return error.SkipZigTest;
244 // Zig's CI testing infrastructure uses QEMU. Currently the version is
245 // qemu 2.11 from Ubuntu 18.04, which does not have memfd_create support.
246 // memfd_create support is introduced in qemu 4.2. To avoid
247 // "invalid syscall" errors from qemu, we disable the test when not linking libc.
248 // https://github.com/ziglang/zig/issues/4019
249 if (!builtin.link_libc) return error.SkipZigTest;
250
251 const fd = try std.os.memfd_create("test", 0);
244 const fd = std.os.memfd_create("test", 0) catch |err| switch (err) {
245 // Related: https://github.com/ziglang/zig/issues/4019
246 error.SystemOutdated => return error.SkipZigTest,
247 else => |e| return e,
248 };
252249 defer std.os.close(fd);
253250 try std.os.write(fd, "test");
254251 try std.os.lseek_SET(fd, 0);
lib/std/target.zig+7
......@@ -597,6 +597,13 @@ pub const Target = union(enum) {
597597 };
598598 }
599599
600 pub fn isMusl(self: Target) bool {
601 return switch (self.getAbi()) {
602 .musl, .musleabi, .musleabihf => true,
603 else => false,
604 };
605 }
606
600607 pub fn isDarwin(self: Target) bool {
601608 return switch (self.getOs()) {
602609 .ios, .macosx, .watchos, .tvos => true,