mirror of
https://github.com/ziglang/zig.git
synced 2025-12-21 13:43:10 +00:00
std.Io.Threaded: implement Unix sockets for Windows
This commit is contained in:
parent
b39f3d294d
commit
c4dc7d7c3d
@ -3172,10 +3172,62 @@ fn netListenUnixWindows(
|
|||||||
) net.UnixAddress.ListenError!net.Socket.Handle {
|
) net.UnixAddress.ListenError!net.Socket.Handle {
|
||||||
if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
|
if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
|
||||||
const t: *Threaded = @ptrCast(@alignCast(userdata));
|
const t: *Threaded = @ptrCast(@alignCast(userdata));
|
||||||
|
|
||||||
|
const socket_handle = openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream }) catch |err| switch (err) {
|
||||||
|
error.ProtocolUnsupportedByAddressFamily => return error.AddressFamilyUnsupported,
|
||||||
|
else => |e| return e,
|
||||||
|
};
|
||||||
|
errdefer closeSocketWindows(socket_handle);
|
||||||
|
|
||||||
|
var storage: WsaAddress = undefined;
|
||||||
|
const addr_len = addressUnixToWsa(address, &storage);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
try t.checkCancel();
|
try t.checkCancel();
|
||||||
_ = address;
|
const rc = ws2_32.bind(socket_handle, &storage.any, addr_len);
|
||||||
_ = options;
|
if (rc != ws2_32.SOCKET_ERROR) break;
|
||||||
@panic("TODO implement netListenUnixWindows");
|
switch (ws2_32.WSAGetLastError()) {
|
||||||
|
.EINTR => continue,
|
||||||
|
.ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => return error.Canceled,
|
||||||
|
.NOTINITIALISED => {
|
||||||
|
try initializeWsa(t);
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
.EADDRINUSE => return error.AddressInUse,
|
||||||
|
.EADDRNOTAVAIL => return error.AddressUnavailable,
|
||||||
|
.ENOTSOCK => |err| return wsaErrorBug(err),
|
||||||
|
.EFAULT => |err| return wsaErrorBug(err),
|
||||||
|
.EINVAL => |err| return wsaErrorBug(err),
|
||||||
|
.ENOBUFS => return error.SystemResources,
|
||||||
|
.ENETDOWN => return error.NetworkDown,
|
||||||
|
else => |err| return windows.unexpectedWSAError(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
try t.checkCancel();
|
||||||
|
const rc = ws2_32.listen(socket_handle, options.kernel_backlog);
|
||||||
|
if (rc != ws2_32.SOCKET_ERROR) break;
|
||||||
|
switch (ws2_32.WSAGetLastError()) {
|
||||||
|
.EINTR => continue,
|
||||||
|
.ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => return error.Canceled,
|
||||||
|
.NOTINITIALISED => {
|
||||||
|
try initializeWsa(t);
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
.ENETDOWN => return error.NetworkDown,
|
||||||
|
.EADDRINUSE => return error.AddressInUse,
|
||||||
|
.EISCONN => |err| return wsaErrorBug(err),
|
||||||
|
.EINVAL => |err| return wsaErrorBug(err),
|
||||||
|
.EMFILE, .ENOBUFS => return error.SystemResources,
|
||||||
|
.ENOTSOCK => |err| return wsaErrorBug(err),
|
||||||
|
.EOPNOTSUPP => |err| return wsaErrorBug(err),
|
||||||
|
.EINPROGRESS => |err| return wsaErrorBug(err),
|
||||||
|
else => |err| return windows.unexpectedWSAError(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return socket_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn netListenUnixUnavailable(
|
fn netListenUnixUnavailable(
|
||||||
@ -3493,9 +3545,37 @@ fn netConnectUnixWindows(
|
|||||||
) net.UnixAddress.ConnectError!net.Socket.Handle {
|
) net.UnixAddress.ConnectError!net.Socket.Handle {
|
||||||
if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
|
if (!net.has_unix_sockets) return error.AddressFamilyUnsupported;
|
||||||
const t: *Threaded = @ptrCast(@alignCast(userdata));
|
const t: *Threaded = @ptrCast(@alignCast(userdata));
|
||||||
try t.checkCancel();
|
|
||||||
_ = address;
|
const socket_handle = try openSocketWsa(t, posix.AF.UNIX, .{ .mode = .stream });
|
||||||
@panic("TODO implement netConnectUnixWindows");
|
errdefer closeSocketWindows(socket_handle);
|
||||||
|
var storage: WsaAddress = undefined;
|
||||||
|
const addr_len = addressUnixToWsa(address, &storage);
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const rc = ws2_32.connect(socket_handle, &storage.any, addr_len);
|
||||||
|
if (rc != ws2_32.SOCKET_ERROR) break;
|
||||||
|
switch (ws2_32.WSAGetLastError()) {
|
||||||
|
.EINTR => continue,
|
||||||
|
.ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => return error.Canceled,
|
||||||
|
.NOTINITIALISED => {
|
||||||
|
try initializeWsa(t);
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
|
||||||
|
.ECONNREFUSED => return error.FileNotFound,
|
||||||
|
.EFAULT => |err| return wsaErrorBug(err),
|
||||||
|
.EINVAL => |err| return wsaErrorBug(err),
|
||||||
|
.EISCONN => |err| return wsaErrorBug(err),
|
||||||
|
.ENOTSOCK => |err| return wsaErrorBug(err),
|
||||||
|
.EWOULDBLOCK => return error.WouldBlock,
|
||||||
|
.EACCES => return error.AccessDenied,
|
||||||
|
.ENOBUFS => return error.SystemResources,
|
||||||
|
.EAFNOSUPPORT => return error.AddressFamilyUnsupported,
|
||||||
|
else => |err| return windows.unexpectedWSAError(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return socket_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn netConnectUnixUnavailable(
|
fn netConnectUnixUnavailable(
|
||||||
@ -4935,6 +5015,13 @@ fn addressUnixToPosix(a: *const net.UnixAddress, storage: *UnixAddress) posix.so
|
|||||||
return @sizeOf(posix.sockaddr.un);
|
return @sizeOf(posix.sockaddr.un);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn addressUnixToWsa(a: *const net.UnixAddress, storage: *WsaAddress) i32 {
|
||||||
|
@memcpy(storage.un.path[0..a.path.len], a.path);
|
||||||
|
storage.un.family = posix.AF.UNIX;
|
||||||
|
storage.un.path[a.path.len] = 0;
|
||||||
|
return @sizeOf(posix.sockaddr.un);
|
||||||
|
}
|
||||||
|
|
||||||
fn address4FromPosix(in: *const posix.sockaddr.in) net.Ip4Address {
|
fn address4FromPosix(in: *const posix.sockaddr.in) net.Ip4Address {
|
||||||
return .{
|
return .{
|
||||||
.port = std.mem.bigToNative(u16, in.port),
|
.port = std.mem.bigToNative(u16, in.port),
|
||||||
|
|||||||
@ -879,6 +879,7 @@ pub const UnixAddress = struct {
|
|||||||
NotDir,
|
NotDir,
|
||||||
ReadOnlyFileSystem,
|
ReadOnlyFileSystem,
|
||||||
WouldBlock,
|
WouldBlock,
|
||||||
|
NetworkDown,
|
||||||
} || Io.Cancelable || Io.UnexpectedError;
|
} || Io.Cancelable || Io.UnexpectedError;
|
||||||
|
|
||||||
pub fn connect(ua: *const UnixAddress, io: Io) ConnectError!Stream {
|
pub fn connect(ua: *const UnixAddress, io: Io) ConnectError!Stream {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user