Commit 6469900e79

daurnimator <quae@daurnimator.com>
2019-11-14 04:37:08
std: add WSAStartup and WSACleanup for windows
1 parent 4cf535a
Changed files (2)
lib
std
lib/std/os/windows/ws2_32.zig
@@ -2,6 +2,31 @@ usingnamespace @import("bits.zig");
 
 pub const SOCKET = *@OpaqueType();
 pub const INVALID_SOCKET = @intToPtr(SOCKET, ~@as(usize, 0));
+pub const SOCKET_ERROR = -1;
+
+pub const WSADESCRIPTION_LEN = 256;
+pub const WSASYS_STATUS_LEN = 128;
+
+pub const WSADATA = if (usize.bit_count == u64.bit_count)
+    extern struct {
+        wVersion: WORD,
+        wHighVersion: WORD,
+        iMaxSockets: u16,
+        iMaxUdpDg: u16,
+        lpVendorInfo: *u8,
+        szDescription: [WSADESCRIPTION_LEN + 1]u8,
+        szSystemStatus: [WSASYS_STATUS_LEN + 1]u8,
+    }
+else
+    extern struct {
+        wVersion: WORD,
+        wHighVersion: WORD,
+        szDescription: [WSADESCRIPTION_LEN + 1]u8,
+        szSystemStatus: [WSASYS_STATUS_LEN + 1]u8,
+        iMaxSockets: u16,
+        iMaxUdpDg: u16,
+        lpVendorInfo: *u8,
+    };
 
 pub const MAX_PROTOCOL_CHAIN = 7;
 
@@ -167,6 +192,11 @@ pub const WSA_QOS_ESDMODEOBJ = 11029;
 pub const WSA_QOS_ESHAPERATEOBJ = 11030;
 pub const WSA_QOS_RESERVED_PETYPE = 11031;
 
+pub extern "ws2_32" stdcallcc fn WSAStartup(
+    wVersionRequired: WORD,
+    lpWSAData: *WSADATA,
+) c_int;
+pub extern "ws2_32" stdcallcc fn WSACleanup() c_int;
 pub extern "ws2_32" stdcallcc fn WSAGetLastError() c_int;
 pub extern "ws2_32" stdcallcc fn WSASocketA(
     af: c_int,
lib/std/os/windows.zig
@@ -608,6 +608,24 @@ pub fn GetFileAttributesW(lpFileName: [*]const u16) GetFileAttributesError!DWORD
     return rc;
 }
 
+pub fn WSAStartup(majorVersion: u8, minorVersion: u8) !ws2_32.WSADATA {
+    var wsadata: ws2_32.WSADATA = undefined;
+    return switch (ws2_32.WSAStartup((@as(WORD, minorVersion) << 8) | majorVersion, &wsadata)) {
+        0 => wsadata,
+        else => |err| unexpectedWSAError(err),
+    };
+}
+
+pub fn WSACleanup() !void {
+    return switch (ws2_32.WSACleanup()) {
+        0 => {},
+        ws2_32.SOCKET_ERROR => switch (ws2_32.WSAGetLastError()) {
+            else => |err| return unexpectedWSAError(err),
+        },
+        else => unreachable,
+    };
+}
+
 pub fn WSASocketW(
     af: i32,
     socket_type: i32,