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{...@@ -3286,9 +3286,13 @@ pub const MemFdCreateError = error{
3286 SystemFdQuotaExceeded,3286 SystemFdQuotaExceeded,
3287 ProcessFdQuotaExceeded,3287 ProcessFdQuotaExceeded,
3288 OutOfMemory,3288 OutOfMemory,
3289
3290 /// memfd_create is available in Linux 3.17 and later. This error is returned
3291 /// for older kernel versions.
3292 SystemOutdated,
3289} || UnexpectedError;3293} || 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 {
3292 // memfd_create is available only in glibc versions starting with 2.27.3296 // memfd_create is available only in glibc versions starting with 2.27.
3293 const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok;3297 const use_c = std.c.versionCheck(.{ .major = 2, .minor = 27, .patch = 0 }).ok;
3294 const sys = if (use_c) std.c else linux;3298 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 {...@@ -3301,6 +3305,7 @@ pub fn memfd_createC(name: [*:0]const u8, flags: u32) !fd_t {
3301 ENFILE => return error.SystemFdQuotaExceeded,3305 ENFILE => return error.SystemFdQuotaExceeded,
3302 EMFILE => return error.ProcessFdQuotaExceeded,3306 EMFILE => return error.ProcessFdQuotaExceeded,
3303 ENOMEM => return error.OutOfMemory,3307 ENOMEM => return error.OutOfMemory,
3308 ENOSYS => return error.SystemOutdated,
3304 else => |err| return unexpectedErrno(err),3309 else => |err| return unexpectedErrno(err),
3305 }3310 }
3306}3311}
lib/std/os/test.zig+5-8
...@@ -241,14 +241,11 @@ test "argsAlloc" {...@@ -241,14 +241,11 @@ test "argsAlloc" {
241test "memfd_create" {241test "memfd_create" {
242 // memfd_create is linux specific.242 // memfd_create is linux specific.
243 if (builtin.os != .linux) return error.SkipZigTest;243 if (builtin.os != .linux) return error.SkipZigTest;
244 // Zig's CI testing infrastructure uses QEMU. Currently the version is244 const fd = std.os.memfd_create("test", 0) catch |err| switch (err) {
245 // qemu 2.11 from Ubuntu 18.04, which does not have memfd_create support.245 // Related: https://github.com/ziglang/zig/issues/4019
246 // memfd_create support is introduced in qemu 4.2. To avoid246 error.SystemOutdated => return error.SkipZigTest,
247 // "invalid syscall" errors from qemu, we disable the test when not linking libc.247 else => |e| return e,
248 // https://github.com/ziglang/zig/issues/4019248 };
249 if (!builtin.link_libc) return error.SkipZigTest;
250
251 const fd = try std.os.memfd_create("test", 0);
252 defer std.os.close(fd);249 defer std.os.close(fd);
253 try std.os.write(fd, "test");250 try std.os.write(fd, "test");
254 try std.os.lseek_SET(fd, 0);251 try std.os.lseek_SET(fd, 0);
lib/std/target.zig+7
...@@ -597,6 +597,13 @@ pub const Target = union(enum) {...@@ -597,6 +597,13 @@ pub const Target = union(enum) {
597 };597 };
598 }598 }
599599
600 pub fn isMusl(self: Target) bool {
601 return switch (self.getAbi()) {
602 .musl, .musleabi, .musleabihf => true,
603 else => false,
604 };
605 }
606
600 pub fn isDarwin(self: Target) bool {607 pub fn isDarwin(self: Target) bool {
601 return switch (self.getOs()) {608 return switch (self.getOs()) {
602 .ios, .macosx, .watchos, .tvos => true,609 .ios, .macosx, .watchos, .tvos => true,