aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-12-31 20:41:30 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-12-31 20:41:30 -0500
commit0fb3e6608c160a0cd9db75fe1ba3d5bb7dac8fa8 (patch)
tree763b53d7ddba82762ee32f4e7b724ffe9f97103d /lib/std/os
parentc8c65b0168ae18f8bd8bf8f38590109a30df73a8 (diff)
parent0c8ec369f051d616434cff309fe737c52fd98199 (diff)
downloadzig-0fb3e6608c160a0cd9db75fe1ba3d5bb7dac8fa8.tar.gz
zig-0fb3e6608c160a0cd9db75fe1ba3d5bb7dac8fa8.zip
Merge branch 'lun-4-linux-memfd-create'
Closes #3687
Diffstat (limited to 'lib/std/os')
-rw-r--r--lib/std/os/bits/linux.zig36
-rw-r--r--lib/std/os/linux.zig4
-rw-r--r--lib/std/os/test.zig18
3 files changed, 58 insertions, 0 deletions
diff --git a/lib/std/os/bits/linux.zig b/lib/std/os/bits/linux.zig
index 8033f27c2b..3fb160e3ec 100644
--- a/lib/std/os/bits/linux.zig
+++ b/lib/std/os/bits/linux.zig
@@ -26,6 +26,7 @@ pub const uid_t = i32;
pub const gid_t = u32;
pub const clock_t = isize;
+pub const NAME_MAX = 255;
pub const PATH_MAX = 4096;
pub const IOV_MAX = 1024;
@@ -1417,3 +1418,38 @@ pub const POLLHUP = 0x010;
pub const POLLNVAL = 0x020;
pub const POLLRDNORM = 0x040;
pub const POLLRDBAND = 0x080;
+
+pub const MFD_CLOEXEC = 0x0001;
+pub const MFD_ALLOW_SEALING = 0x0002;
+pub const MFD_HUGETLB = 0x0004;
+pub const MFD_ALL_FLAGS = MFD_CLOEXEC | MFD_ALLOW_SEALING | MFD_HUGETLB;
+
+pub const HUGETLB_FLAG_ENCODE_SHIFT = 26;
+pub const HUGETLB_FLAG_ENCODE_MASK = 0x3f;
+pub const HUGETLB_FLAG_ENCODE_64KB = 16 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_512KB = 19 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_1MB = 20 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_2MB = 21 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_8MB = 23 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_16MB = 24 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_32MB = 25 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_256MB = 28 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_512MB = 29 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_1GB = 30 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_2GB = 31 << HUGETLB_FLAG_ENCODE_SHIFT;
+pub const HUGETLB_FLAG_ENCODE_16GB = 34 << HUGETLB_FLAG_ENCODE_SHIFT;
+
+pub const MFD_HUGE_SHIFT = HUGETLB_FLAG_ENCODE_SHIFT;
+pub const MFD_HUGE_MASK = HUGETLB_FLAG_ENCODE_MASK;
+pub const MFD_HUGE_64KB = HUGETLB_FLAG_ENCODE_64KB;
+pub const MFD_HUGE_512KB = HUGETLB_FLAG_ENCODE_512KB;
+pub const MFD_HUGE_1MB = HUGETLB_FLAG_ENCODE_1MB;
+pub const MFD_HUGE_2MB = HUGETLB_FLAG_ENCODE_2MB;
+pub const MFD_HUGE_8MB = HUGETLB_FLAG_ENCODE_8MB;
+pub const MFD_HUGE_16MB = HUGETLB_FLAG_ENCODE_16MB;
+pub const MFD_HUGE_32MB = HUGETLB_FLAG_ENCODE_32MB;
+pub const MFD_HUGE_256MB = HUGETLB_FLAG_ENCODE_256MB;
+pub const MFD_HUGE_512MB = HUGETLB_FLAG_ENCODE_512MB;
+pub const MFD_HUGE_1GB = HUGETLB_FLAG_ENCODE_1GB;
+pub const MFD_HUGE_2GB = HUGETLB_FLAG_ENCODE_2GB;
+pub const MFD_HUGE_16GB = HUGETLB_FLAG_ENCODE_16GB;
diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig
index d5bab64493..b6030fe2fe 100644
--- a/lib/std/os/linux.zig
+++ b/lib/std/os/linux.zig
@@ -1110,6 +1110,10 @@ pub fn io_uring_register(fd: i32, opcode: u32, arg: ?*const c_void, nr_args: u32
return syscall4(SYS_io_uring_register, @bitCast(usize, @as(isize, fd)), opcode, @ptrToInt(arg), nr_args);
}
+pub fn memfd_create(name: [*:0]const u8, flags: u32) usize {
+ return syscall2(SYS_memfd_create, @ptrToInt(name), flags);
+}
+
test "" {
if (builtin.os == .linux) {
_ = @import("linux/test.zig");
diff --git a/lib/std/os/test.zig b/lib/std/os/test.zig
index f61e8b4657..09e8c24899 100644
--- a/lib/std/os/test.zig
+++ b/lib/std/os/test.zig
@@ -237,3 +237,21 @@ test "argsAlloc" {
var args = try std.process.argsAlloc(std.heap.page_allocator);
std.process.argsFree(std.heap.page_allocator, args);
}
+
+test "memfd_create" {
+ // memfd_create is linux specific.
+ if (builtin.os != .linux) return error.SkipZigTest;
+ 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);
+
+ var buf: [10]u8 = undefined;
+ const bytes_read = try std.os.read(fd, &buf);
+ expect(bytes_read == 4);
+ expect(mem.eql(u8, buf[0..4], "test"));
+}