aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os.zig
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/os.zig')
-rw-r--r--lib/std/os.zig20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig
index 3d1b3540b6..27327c1016 100644
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -3250,3 +3250,23 @@ pub fn sched_yield() SchedYieldError!void {
else => return error.SystemCannotYield,
}
}
+
+/// Set a socket's options.
+pub fn setsockopt(fd: fd_t, level: u32, optname: u32, optval: [*]const u8, optlen: socklen_t) SetSockOptError!void {
+ const rc = system.setsockopt();
+
+ switch (errno(system.setsockopt(fd, level, optname, optval, optlen))) {
+ 0 => {},
+ EBADF => unreachable,
+ EINVAL => unreachable,
+ EDOM => return error.TimeoutTooBig,
+ EISCONN => return error.AlreadyConnected,
+ ENOPROTOOOPT => return error.InvalidProtocolOption,
+ ENOTSOCK => return error.NotSocket,
+
+ ENOMEM => return error.OutOfMemory,
+ ENOBUFS => return error.SystemResources,
+
+ else => |err| return std.os.unexpectedErrno(err),
+ }
+}