mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 07:03:11 +00:00
std.Io.Kqueue: implement netConnect
This commit is contained in:
parent
9d6750f01c
commit
f17c6bba57
@ -1265,12 +1265,57 @@ fn netBindIp(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
fn netConnectIp(userdata: ?*anyopaque, address: *const net.IpAddress, options: net.IpAddress.ConnectOptions) net.IpAddress.ConnectError!net.Stream {
|
fn netConnectIp(userdata: ?*anyopaque, address: *const net.IpAddress, options: net.IpAddress.ConnectOptions) net.IpAddress.ConnectError!net.Stream {
|
||||||
|
if (options.timeout != .none) @panic("TODO");
|
||||||
const k: *Kqueue = @ptrCast(@alignCast(userdata));
|
const k: *Kqueue = @ptrCast(@alignCast(userdata));
|
||||||
_ = k;
|
const family = Io.Threaded.posixAddressFamily(address);
|
||||||
_ = address;
|
const socket_fd = try openSocketPosix(k, family, .{
|
||||||
_ = options;
|
.mode = options.mode,
|
||||||
@panic("TODO");
|
.protocol = options.protocol,
|
||||||
|
});
|
||||||
|
errdefer posix.close(socket_fd);
|
||||||
|
var storage: Io.Threaded.PosixAddress = undefined;
|
||||||
|
var addr_len = Io.Threaded.addressToPosix(address, &storage);
|
||||||
|
try posixConnect(k, socket_fd, &storage.any, addr_len);
|
||||||
|
try posixGetSockName(k, socket_fd, &storage.any, &addr_len);
|
||||||
|
return .{ .socket = .{
|
||||||
|
.handle = socket_fd,
|
||||||
|
.address = Io.Threaded.addressFromPosix(&storage),
|
||||||
|
} };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn posixConnect(k: *Kqueue, socket_fd: posix.socket_t, addr: *const posix.sockaddr, addr_len: posix.socklen_t) !void {
|
||||||
|
while (true) {
|
||||||
|
try k.checkCancel();
|
||||||
|
switch (posix.errno(posix.system.connect(socket_fd, addr, addr_len))) {
|
||||||
|
.SUCCESS => return,
|
||||||
|
.INTR => continue,
|
||||||
|
.CANCELED => return error.Canceled,
|
||||||
|
.AGAIN => @panic("TODO"),
|
||||||
|
.INPROGRESS => return, // Due to TCP fast open, we find out possible error later.
|
||||||
|
|
||||||
|
.ADDRNOTAVAIL => return error.AddressUnavailable,
|
||||||
|
.AFNOSUPPORT => return error.AddressFamilyUnsupported,
|
||||||
|
.ALREADY => return error.ConnectionPending,
|
||||||
|
.BADF => |err| return errnoBug(err), // File descriptor used after closed.
|
||||||
|
.CONNREFUSED => return error.ConnectionRefused,
|
||||||
|
.CONNRESET => return error.ConnectionResetByPeer,
|
||||||
|
.FAULT => |err| return errnoBug(err),
|
||||||
|
.ISCONN => |err| return errnoBug(err),
|
||||||
|
.HOSTUNREACH => return error.HostUnreachable,
|
||||||
|
.NETUNREACH => return error.NetworkUnreachable,
|
||||||
|
.NOTSOCK => |err| return errnoBug(err),
|
||||||
|
.PROTOTYPE => |err| return errnoBug(err),
|
||||||
|
.TIMEDOUT => return error.Timeout,
|
||||||
|
.CONNABORTED => |err| return errnoBug(err),
|
||||||
|
.ACCES => return error.AccessDenied,
|
||||||
|
.PERM => |err| return errnoBug(err),
|
||||||
|
.NOENT => |err| return errnoBug(err),
|
||||||
|
.NETDOWN => return error.NetworkDown,
|
||||||
|
else => |err| return posix.unexpectedErrno(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn netListenUnix(
|
fn netListenUnix(
|
||||||
userdata: ?*anyopaque,
|
userdata: ?*anyopaque,
|
||||||
unix_address: *const net.UnixAddress,
|
unix_address: *const net.UnixAddress,
|
||||||
@ -1343,6 +1388,7 @@ fn netSendOne(
|
|||||||
},
|
},
|
||||||
.INTR => continue,
|
.INTR => continue,
|
||||||
.CANCELED => return error.Canceled,
|
.CANCELED => return error.Canceled,
|
||||||
|
.AGAIN => @panic("TODO register kevent"),
|
||||||
|
|
||||||
.ACCES => return error.AccessDenied,
|
.ACCES => return error.AccessDenied,
|
||||||
.ALREADY => return error.FastOpenAlreadyInProgress,
|
.ALREADY => return error.FastOpenAlreadyInProgress,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user