| author | |
| committer | |
| log | 0c8ec369f051d616434cff309fe737c52fd98199 |
| tree | 2a1cae5baadc8c45c4ab0f8c1d213e606976ea24 |
| parent | 8186211404552a31eaf2a7bc182a46a7e40eacda |
| signature | Commit is signed but in an unrecognized format. |
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; |
| 3290 | 3294 | ||
| 3291 | pub fn memfd_createC(name: [*:0]const u8, flags: u32) !fd_t { | 3295 | pub 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" { |
| 241 | test "memfd_create" { | 241 | test "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 is | 244 | 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 avoid | 246 | 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/4019 | 248 | }; |
| 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 | } |
| 599 | 599 | ||
| 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, |