Commit 0c8ec369f0
Changed files (3)
lib
std
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,