feature. See also
. The project being documented here (as the example) is the Zig library itself.
Threaded.openSocketAfd
fn openSocketAfd(family: ws2_32.ADDRESS_FAMILY, options: IpAddress.BindOptions) !net.Socket.Handle
File
Code
fn openSocketAfd(family: ws2_32.ADDRESS_FAMILY, options: IpAddress.BindOptions) !net.Socket.Handle {
const mode, const protocol = try posixSocketModeProtocol(family, options.mode, options.protocol);
var handle: windows.HANDLE = undefined;
var iosb: windows.IO_STATUS_BLOCK = undefined;
var syscall: Syscall = try .start();
while (true) switch (windows.ntdll.NtCreateFile(
&handle,
.{
.STANDARD = .{ .RIGHTS = .{ .WRITE_DAC = true }, .SYNCHRONIZE = true },
.GENERIC = .{ .WRITE = true, .READ = true },
},
&.{
.ObjectName = @constCast(&windows.UNICODE_STRING.init(
windows.AFD.DEVICE_NAME ++ .{ '\\', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't' },
)),
},
&iosb,
null,
.{},
.{ .READ = true, .WRITE = true },
.OPEN_IF,
.{ .IO = .ASYNCHRONOUS },
&windows.AFD.OPEN_PACKET.FULL_EA_INFORMATION{ .Value = .{
.EndpointType = .{
.CONNECTIONLESS = switch (options.mode) {
.stream, .seqpacket, .rdm => false,
.dgram, .raw => true,
},
.MESSAGEMODE = options.mode != .stream,
.RAW = options.mode == .raw,
},
.GroupID = 0,
.AddressFamily = family,
.SocketType = @bitCast(mode),
.Protocol = @bitCast(protocol),
.TransportDeviceNameLength = 0,
.TransportDeviceName = undefined,
} },
@sizeOf(windows.AFD.OPEN_PACKET.FULL_EA_INFORMATION),
)) {
.SUCCESS => {
syscall.finish();
return handle;
},
.CANCELLED => {
try syscall.checkCancel();
continue;
},
.PROTOCOL_NOT_SUPPORTED => return syscall.fail(error.AddressFamilyUnsupported),
.NO_SUCH_FILE => return syscall.fail(error.ProtocolUnsupportedByAddressFamily),
else => |status| return syscall.unexpectedNtstatus(status),
};
}