mirror of
https://codeberg.org/ziglang/zig.git
synced 2026-03-08 02:44:43 +01:00
parent
ceae9600e3
commit
d10a730480
2 changed files with 19 additions and 40 deletions
|
|
@ -529,7 +529,7 @@ test "sendmsg/recvmsg" {
|
|||
.addr = @bitCast([4]u8{ 127, 0, 0, 1 }),
|
||||
};
|
||||
|
||||
const server = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
|
||||
const server = try socket(address_server.family, posix.SOCK.DGRAM, 0);
|
||||
defer posix.close(server);
|
||||
try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEPORT, &mem.toBytes(@as(c_int, 1)));
|
||||
try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
|
||||
|
|
@ -539,7 +539,7 @@ test "sendmsg/recvmsg" {
|
|||
var slen: posix.socklen_t = @sizeOf(linux.sockaddr.in);
|
||||
try posix.getsockname(server, addrAny(&address_server), &slen);
|
||||
|
||||
const client = try posix.socket(address_server.family, posix.SOCK.DGRAM, 0);
|
||||
const client = try socket(address_server.family, posix.SOCK.DGRAM, 0);
|
||||
defer posix.close(client);
|
||||
|
||||
const buffer_send = [_]u8{42} ** 128;
|
||||
|
|
@ -1033,7 +1033,7 @@ test "shutdown" {
|
|||
|
||||
// Socket bound, expect shutdown to work
|
||||
{
|
||||
const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
defer posix.close(server);
|
||||
try posix.setsockopt(server, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
|
||||
try posix.bind(server, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
|
|
@ -1066,7 +1066,7 @@ test "shutdown" {
|
|||
|
||||
// Socket not bound, expect to fail with ENOTCONN
|
||||
{
|
||||
const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const server = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
defer posix.close(server);
|
||||
|
||||
const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) {
|
||||
|
|
@ -1753,7 +1753,7 @@ test "accept multishot" {
|
|||
var nr: usize = 4; // number of clients to connect
|
||||
while (nr > 0) : (nr -= 1) {
|
||||
// connect client
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
errdefer posix.close(client);
|
||||
try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
|
||||
|
|
@ -1862,7 +1862,7 @@ test "accept_direct" {
|
|||
try testing.expectEqual(@as(u32, 1), try ring.submit());
|
||||
|
||||
// connect
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
defer posix.close(client);
|
||||
|
||||
|
|
@ -1896,7 +1896,7 @@ test "accept_direct" {
|
|||
_ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0);
|
||||
try testing.expectEqual(@as(u32, 1), try ring.submit());
|
||||
// connect
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
defer posix.close(client);
|
||||
// completion with error
|
||||
|
|
@ -1946,7 +1946,7 @@ test "accept_multishot_direct" {
|
|||
|
||||
for (registered_fds) |_| {
|
||||
// connect
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
defer posix.close(client);
|
||||
|
||||
|
|
@ -1961,7 +1961,7 @@ test "accept_multishot_direct" {
|
|||
// Multishot is terminated (more flag is not set).
|
||||
{
|
||||
// connect
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
try posix.connect(client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
defer posix.close(client);
|
||||
// completion with error
|
||||
|
|
@ -2617,7 +2617,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
|
|||
_ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0);
|
||||
|
||||
// Create a TCP client socket
|
||||
const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const client = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
errdefer posix.close(client);
|
||||
_ = try ring.connect(0xcccccccc, client, addrAny(&address), @sizeOf(linux.sockaddr.in));
|
||||
|
||||
|
|
@ -2657,7 +2657,7 @@ pub fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
|
|||
|
||||
fn createListenerSocket(address: *linux.sockaddr.in) !posix.socket_t {
|
||||
const kernel_backlog = 1;
|
||||
const listener_socket = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
const listener_socket = try socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0);
|
||||
errdefer posix.close(listener_socket);
|
||||
|
||||
try posix.setsockopt(listener_socket, posix.SOL.SOCKET, posix.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1)));
|
||||
|
|
@ -2695,3 +2695,11 @@ inline fn skipKernelLessThan(required: std.SemanticVersion) !void {
|
|||
fn addrAny(addr: *linux.sockaddr.in) *linux.sockaddr {
|
||||
return @ptrCast(addr);
|
||||
}
|
||||
|
||||
fn socket(domain: u32, socket_type: u32, protocol: u32) !posix.socket_t {
|
||||
const rc = posix.system.socket(domain, socket_type, protocol);
|
||||
switch (posix.errno(rc)) {
|
||||
.SUCCESS => return @intCast(rc),
|
||||
else => return error.SocketCreationFailure,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -579,35 +579,6 @@ pub const SocketError = error{
|
|||
SocketTypeNotSupported,
|
||||
} || UnexpectedError;
|
||||
|
||||
pub fn socket(domain: u32, socket_type: u32, protocol: u32) SocketError!socket_t {
|
||||
const have_sock_flags = !builtin.target.os.tag.isDarwin() and native_os != .haiku;
|
||||
const filtered_sock_type = if (!have_sock_flags)
|
||||
socket_type & ~@as(u32, SOCK.NONBLOCK | SOCK.CLOEXEC)
|
||||
else
|
||||
socket_type;
|
||||
const rc = system.socket(domain, filtered_sock_type, protocol);
|
||||
switch (errno(rc)) {
|
||||
.SUCCESS => {
|
||||
const fd: fd_t = @intCast(rc);
|
||||
errdefer close(fd);
|
||||
if (!have_sock_flags) {
|
||||
try setSockFlags(fd, socket_type);
|
||||
}
|
||||
return fd;
|
||||
},
|
||||
.ACCES => return error.AccessDenied,
|
||||
.AFNOSUPPORT => return error.AddressFamilyUnsupported,
|
||||
.INVAL => return error.ProtocolFamilyNotAvailable,
|
||||
.MFILE => return error.ProcessFdQuotaExceeded,
|
||||
.NFILE => return error.SystemFdQuotaExceeded,
|
||||
.NOBUFS => return error.SystemResources,
|
||||
.NOMEM => return error.SystemResources,
|
||||
.PROTONOSUPPORT => return error.ProtocolNotSupported,
|
||||
.PROTOTYPE => return error.SocketTypeNotSupported,
|
||||
else => |err| return unexpectedErrno(err),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn socketpair(domain: u32, socket_type: u32, protocol: u32) SocketError![2]socket_t {
|
||||
// Note to the future: we could provide a shim here for e.g. windows which
|
||||
// creates a listening socket, then creates a second socket and connects it
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue