aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os.zig
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-09-11 14:10:55 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-09-11 22:32:23 +0200
commit744b73ab46a75140537f9cf705939ecf0a2d229d (patch)
treefca57450c53bf64f4bce860eec2b0b6899203221 /lib/std/os.zig
parent7b961a876b56d5926fe7ba6437a0459da9aa60bc (diff)
downloadzig-744b73ab46a75140537f9cf705939ecf0a2d229d.tar.gz
zig-744b73ab46a75140537f9cf705939ecf0a2d229d.zip
std: add prctl wrapper to std.os
Diffstat (limited to 'lib/std/os.zig')
-rw-r--r--lib/std/os.zig39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig
index 25c71e5d15..91365c81dd 100644
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -5418,3 +5418,42 @@ pub fn fdatasync(fd: fd_t) SyncError!void {
else => |err| return std.os.unexpectedErrno(err),
}
}
+
+pub const PrctlError = error{
+ /// Can only occur with PR_SET_SECCOMP/SECCOMP_MODE_FILTER or
+ /// PR_SET_MM/PR_SET_MM_EXE_FILE
+ AccessDenied,
+ /// Can only occur with PR_SET_MM/PR_SET_MM_EXE_FILE
+ InvalidFileDescriptor,
+ InvalidAddress,
+ /// Can only occur with PR_SET_SPECULATION_CTRL, PR_MPX_ENABLE_MANAGEMENT,
+ /// or PR_MPX_DISABLE_MANAGEMENT
+ UnsupportedFeature,
+ /// Can only occur wih PR_SET_FP_MODE
+ OperationNotSupported,
+ PermissionDenied,
+} || UnexpectedError;
+
+pub fn prctl(option: i32, args: anytype) PrctlError!u31 {
+ if (@typeInfo(@TypeOf(args)) != .Struct)
+ @compileError("Expected tuple or struct argument, found " ++ @typeName(@TypeOf(args)));
+ if (args.len > 4)
+ @compileError("prctl takes a maximum of 4 optional arguments");
+
+ var buf: [4]usize = undefined;
+ inline for (args) |arg, i| buf[i] = arg;
+
+ const rc = system.prctl(option, buf[0], buf[1], buf[2], buf[3]);
+ switch (errno(rc)) {
+ 0 => return @intCast(u31, rc),
+ EACCES => return error.AccessDenied,
+ EBADF => return error.InvalidFileDescriptor,
+ EFAULT => return error.InvalidAddress,
+ EINVAL => unreachable,
+ ENODEV, ENXIO => return error.UnsupportedFeature,
+ EOPNOTSUPP => return error.OperationNotSupported,
+ EPERM, EBUSY => return error.PermissionDenied,
+ ERANGE => unreachable,
+ else => |err| return std.os.unexpectedErrno(err),
+ }
+}