os: add setsockopt

- net: use os.setsockopt()
master
Luna 2019-11-29 17:17:09 -03:00 committed by Andrew Kelley
parent 631eb6783d
commit 4a4d2c0d80
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 25 additions and 7 deletions

View File

@ -1323,14 +1323,12 @@ pub const StreamServer = struct {
self.sockfd = null;
}
// TODO proper interface with errors in std.os
var optval: c_int = 1;
if (self.options.reuse_address) {
_ = os.linux.setsockopt(
server.sockfd.?,
os.linux.SOL_SOCKET,
os.linux.SO_REUSEADDR,
var optval: c_int = 1;
try os.setsockopt(
self.sockfd.?,
os.SOL_SOCKET,
os.SO_REUSEADDR,
@ptrCast([*]const u8, &optval),
@sizeOf(c_int),
);

View File

@ -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),
}
}