authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-02 16:12:55-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-12-02 16:12:55-05:00
logb7be57766b8c6d7fee27fd7c23e8c999a134bb27
treecadd0d933c1a189ddd2f02a534ca389eb3057587
parent55202a021a2b30271a94d3c63a43a00ff4a56f63
parent8a71f77c4a094c98c57fc3a3332bb4e17ed6febf
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #3715 from daurnimator/towards-afd

Misc windows additions+fixes

9 files changed, 313 insertions(+), 85 deletions(-)

lib/std/child_process.zig+1-1
...@@ -235,7 +235,7 @@ pub const ChildProcess = struct {...@@ -235,7 +235,7 @@ pub const ChildProcess = struct {
235 }235 }
236236
237 fn waitUnwrappedWindows(self: *ChildProcess) !void {237 fn waitUnwrappedWindows(self: *ChildProcess) !void {
238 const result = windows.WaitForSingleObject(self.handle, windows.INFINITE);238 const result = windows.WaitForSingleObjectEx(self.handle, windows.INFINITE, false);
239239
240 self.term = @as(SpawnError!Term, x: {240 self.term = @as(SpawnError!Term, x: {
241 var exit_code: windows.DWORD = undefined;241 var exit_code: windows.DWORD = undefined;
lib/std/os/bits/windows.zig+56-72
...@@ -1,6 +1,7 @@...@@ -1,6 +1,7 @@
1// The reference for these types and values is Microsoft Windows's ucrt (Universal C RunTime).1// The reference for these types and values is Microsoft Windows's ucrt (Universal C RunTime).
22
3usingnamespace @import("../windows/bits.zig");3usingnamespace @import("../windows/bits.zig");
4const ws2_32 = @import("../windows/ws2_32.zig");
45
5pub const fd_t = HANDLE;6pub const fd_t = HANDLE;
6pub const pid_t = HANDLE;7pub const pid_t = HANDLE;
...@@ -163,80 +164,63 @@ pub const F_OK = 0;...@@ -163,80 +164,63 @@ pub const F_OK = 0;
163pub const AT_REMOVEDIR = 0x200;164pub const AT_REMOVEDIR = 0x200;
164165
165pub const in_port_t = u16;166pub const in_port_t = u16;
166pub const sa_family_t = u16;167pub const sa_family_t = ws2_32.ADDRESS_FAMILY;
167pub const socklen_t = u32;168pub const socklen_t = u32;
168169
169pub const sockaddr = extern struct {170pub const sockaddr = ws2_32.sockaddr;
170 family: sa_family_t,171pub const sockaddr_in = ws2_32.sockaddr_in;
171 data: [14]u8,172pub const sockaddr_in6 = ws2_32.sockaddr_in6;
172};173pub const sockaddr_un = ws2_32.sockaddr_un;
173pub const sockaddr_in = extern struct {174
174 family: sa_family_t = AF_INET,
175 port: in_port_t,
176 addr: in_addr,
177 zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
178};
179pub const sockaddr_in6 = extern struct {
180 family: sa_family_t = AF_INET6,
181 port: in_port_t,
182 flowinfo: u32,
183 addr: in6_addr,
184 scope_id: u32,
185};
186pub const in6_addr = [16]u8;175pub const in6_addr = [16]u8;
187pub const in_addr = u32;176pub const in_addr = u32;
188177
189pub const sockaddr_un = extern struct {178pub const AF_UNSPEC = ws2_32.AF_UNSPEC;
190 family: sa_family_t = AF_UNIX,179pub const AF_UNIX = ws2_32.AF_UNIX;
191 path: [108]u8,180pub const AF_INET = ws2_32.AF_INET;
192};181pub const AF_IMPLINK = ws2_32.AF_IMPLINK;
193182pub const AF_PUP = ws2_32.AF_PUP;
194pub const AF_UNSPEC = 0;183pub const AF_CHAOS = ws2_32.AF_CHAOS;
195pub const AF_UNIX = 1;184pub const AF_NS = ws2_32.AF_NS;
196pub const AF_INET = 2;185pub const AF_IPX = ws2_32.AF_IPX;
197pub const AF_IMPLINK = 3;186pub const AF_ISO = ws2_32.AF_ISO;
198pub const AF_PUP = 4;187pub const AF_OSI = ws2_32.AF_OSI;
199pub const AF_CHAOS = 5;188pub const AF_ECMA = ws2_32.AF_ECMA;
200pub const AF_NS = 6;189pub const AF_DATAKIT = ws2_32.AF_DATAKIT;
201pub const AF_IPX = AF_NS;190pub const AF_CCITT = ws2_32.AF_CCITT;
202pub const AF_ISO = 7;191pub const AF_SNA = ws2_32.AF_SNA;
203pub const AF_OSI = AF_ISO;192pub const AF_DECnet = ws2_32.AF_DECnet;
204pub const AF_ECMA = 8;193pub const AF_DLI = ws2_32.AF_DLI;
205pub const AF_DATAKIT = 9;194pub const AF_LAT = ws2_32.AF_LAT;
206pub const AF_CCITT = 10;195pub const AF_HYLINK = ws2_32.AF_HYLINK;
207pub const AF_SNA = 11;196pub const AF_APPLETALK = ws2_32.AF_APPLETALK;
208pub const AF_DECnet = 12;197pub const AF_NETBIOS = ws2_32.AF_NETBIOS;
209pub const AF_DLI = 13;198pub const AF_VOICEVIEW = ws2_32.AF_VOICEVIEW;
210pub const AF_LAT = 14;199pub const AF_FIREFOX = ws2_32.AF_FIREFOX;
211pub const AF_HYLINK = 15;200pub const AF_UNKNOWN1 = ws2_32.AF_UNKNOWN1;
212pub const AF_APPLETALK = 16;201pub const AF_BAN = ws2_32.AF_BAN;
213pub const AF_NETBIOS = 17;202pub const AF_ATM = ws2_32.AF_ATM;
214pub const AF_VOICEVIEW = 18;203pub const AF_INET6 = ws2_32.AF_INET6;
215pub const AF_FIREFOX = 19;204pub const AF_CLUSTER = ws2_32.AF_CLUSTER;
216pub const AF_UNKNOWN1 = 20;205pub const AF_12844 = ws2_32.AF_12844;
217pub const AF_BAN = 21;206pub const AF_IRDA = ws2_32.AF_IRDA;
218pub const AF_ATM = 22;207pub const AF_NETDES = ws2_32.AF_NETDES;
219pub const AF_INET6 = 23;208pub const AF_TCNPROCESS = ws2_32.AF_TCNPROCESS;
220pub const AF_CLUSTER = 24;209pub const AF_TCNMESSAGE = ws2_32.AF_TCNMESSAGE;
221pub const AF_12844 = 25;210pub const AF_ICLFXBM = ws2_32.AF_ICLFXBM;
222pub const AF_IRDA = 26;211pub const AF_BTH = ws2_32.AF_BTH;
223pub const AF_NETDES = 28;212pub const AF_MAX = ws2_32.AF_MAX;
224pub const AF_TCNPROCESS = 29;213
225pub const AF_TCNMESSAGE = 30;214pub const SOCK_STREAM = ws2_32.SOCK_STREAM;
226pub const AF_ICLFXBM = 31;215pub const SOCK_DGRAM = ws2_32.SOCK_DGRAM;
227pub const AF_BTH = 32;216pub const SOCK_RAW = ws2_32.SOCK_RAW;
228pub const AF_MAX = 33;217pub const SOCK_RDM = ws2_32.SOCK_RDM;
229218pub const SOCK_SEQPACKET = ws2_32.SOCK_SEQPACKET;
230pub const SOCK_STREAM = 1;219
231pub const SOCK_DGRAM = 2;220pub const IPPROTO_ICMP = ws2_32.IPPROTO_ICMP;
232pub const SOCK_RAW = 3;221pub const IPPROTO_IGMP = ws2_32.IPPROTO_IGMP;
233pub const SOCK_RDM = 4;222pub const BTHPROTO_RFCOMM = ws2_32.BTHPROTO_RFCOMM;
234pub const SOCK_SEQPACKET = 5;223pub const IPPROTO_TCP = ws2_32.IPPROTO_TCP;
235224pub const IPPROTO_UDP = ws2_32.IPPROTO_UDP;
236pub const IPPROTO_ICMP = 1;225pub const IPPROTO_ICMPV6 = ws2_32.IPPROTO_ICMPV6;
237pub const IPPROTO_IGMP = 2;226pub const IPPROTO_RM = ws2_32.IPPROTO_RM;
238pub const BTHPROTO_RFCOMM = 3;
239pub const IPPROTO_TCP = 6;
240pub const IPPROTO_UDP = 17;
241pub const IPPROTO_ICMPV6 = 58;
242pub const IPPROTO_RM = 113;
lib/std/os/windows.zig+60-5
...@@ -97,6 +97,22 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C...@@ -97,6 +97,22 @@ pub fn CreatePipe(rd: *HANDLE, wr: *HANDLE, sattr: *const SECURITY_ATTRIBUTES) C
97 }97 }
98}98}
9999
100pub fn CreateEventEx(attributes: ?*SECURITY_ATTRIBUTES, name: []const u8, flags: DWORD, desired_access: DWORD) !HANDLE {
101 const nameW = try sliceToPrefixedFileW(name);
102 return CreateEventExW(attributes, &nameW, flags, desired_access);
103}
104
105pub fn CreateEventExW(attributes: ?*SECURITY_ATTRIBUTES, nameW: [*:0]const u16, flags: DWORD, desired_access: DWORD) !HANDLE {
106 const handle = kernel32.CreateEventExW(attributes, nameW, flags, desired_access);
107 if (handle) |h| {
108 return h;
109 } else {
110 switch (kernel32.GetLastError()) {
111 else => |err| return unexpectedError(err),
112 }
113 }
114}
115
100pub fn DeviceIoControl(116pub fn DeviceIoControl(
101 h: HANDLE,117 h: HANDLE,
102 ioControlCode: DWORD,118 ioControlCode: DWORD,
...@@ -116,6 +132,7 @@ pub fn DeviceIoControl(...@@ -116,6 +132,7 @@ pub fn DeviceIoControl(
116 overlapped,132 overlapped,
117 ) == 0) {133 ) == 0) {
118 switch (kernel32.GetLastError()) {134 switch (kernel32.GetLastError()) {
135 ERROR.IO_PENDING => if (overlapped == null) unreachable,
119 else => |err| return unexpectedError(err),136 else => |err| return unexpectedError(err),
120 }137 }
121 }138 }
...@@ -124,9 +141,9 @@ pub fn DeviceIoControl(...@@ -124,9 +141,9 @@ pub fn DeviceIoControl(
124141
125pub fn GetOverlappedResult(h: HANDLE, overlapped: *OVERLAPPED, wait: bool) !DWORD {142pub fn GetOverlappedResult(h: HANDLE, overlapped: *OVERLAPPED, wait: bool) !DWORD {
126 var bytes: DWORD = undefined;143 var bytes: DWORD = undefined;
127 if (kernel32.GetOverlappedResult(h, overlapped, &bytes, wait) == 0) {144 if (kernel32.GetOverlappedResult(h, overlapped, &bytes, @boolToInt(wait)) == 0) {
128 switch (kernel32.GetLastError()) {145 switch (kernel32.GetLastError()) {
129 ERROR_IO_INCOMPLETE => if (!wait) return error.WouldBlock else unreachable,146 ERROR.IO_INCOMPLETE => if (!wait) return error.WouldBlock else unreachable,
130 else => |err| return unexpectedError(err),147 else => |err| return unexpectedError(err),
131 }148 }
132 }149 }
...@@ -171,8 +188,8 @@ pub const WaitForSingleObjectError = error{...@@ -171,8 +188,8 @@ pub const WaitForSingleObjectError = error{
171 Unexpected,188 Unexpected,
172};189};
173190
174pub fn WaitForSingleObject(handle: HANDLE, milliseconds: DWORD) WaitForSingleObjectError!void {191pub fn WaitForSingleObjectEx(handle: HANDLE, milliseconds: DWORD, alertable: bool) WaitForSingleObjectError!void {
175 switch (kernel32.WaitForSingleObject(handle, milliseconds)) {192 switch (kernel32.WaitForSingleObjectEx(handle, milliseconds, @boolToInt(alertable))) {
176 WAIT_ABANDONED => return error.WaitAbandoned,193 WAIT_ABANDONED => return error.WaitAbandoned,
177 WAIT_OBJECT_0 => return,194 WAIT_OBJECT_0 => return,
178 WAIT_TIMEOUT => return error.WaitTimeOut,195 WAIT_TIMEOUT => return error.WaitTimeOut,
...@@ -183,6 +200,34 @@ pub fn WaitForSingleObject(handle: HANDLE, milliseconds: DWORD) WaitForSingleObj...@@ -183,6 +200,34 @@ pub fn WaitForSingleObject(handle: HANDLE, milliseconds: DWORD) WaitForSingleObj
183 }200 }
184}201}
185202
203pub fn WaitForMultipleObjectsEx(handles: []const HANDLE, waitAll: bool, milliseconds: DWORD, alertable: bool) !u32 {
204 assert(handles.len < MAXIMUM_WAIT_OBJECTS);
205 const nCount: DWORD = @intCast(DWORD, handles.len);
206 switch (kernel32.WaitForMultipleObjectsEx(
207 nCount,
208 handles.ptr,
209 @boolToInt(waitAll),
210 milliseconds,
211 @boolToInt(alertable),
212 )) {
213 WAIT_OBJECT_0...WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS => |n| {
214 const handle_index = n - WAIT_OBJECT_0;
215 assert(handle_index < nCount);
216 return handle_index;
217 },
218 WAIT_ABANDONED_0...WAIT_ABANDONED_0 + MAXIMUM_WAIT_OBJECTS => |n| {
219 const handle_index = n - WAIT_ABANDONED_0;
220 assert(handle_index < nCount);
221 return error.WaitAbandoned;
222 },
223 WAIT_TIMEOUT => return error.WaitTimeOut,
224 WAIT_FAILED => switch (kernel32.GetLastError()) {
225 else => |err| return unexpectedError(err),
226 },
227 else => return error.Unexpected,
228 }
229}
230
186pub const FindFirstFileError = error{231pub const FindFirstFileError = error{
187 FileNotFound,232 FileNotFound,
188 InvalidUtf8,233 InvalidUtf8,
...@@ -647,13 +692,23 @@ pub fn WSASocketW(...@@ -647,13 +692,23 @@ pub fn WSASocketW(
647 return rc;692 return rc;
648}693}
649694
695pub fn closesocket(s: ws2_32.SOCKET) !void {
696 switch (ws2_32.closesocket(s)) {
697 0 => {},
698 ws2_32.SOCKET_ERROR => switch (ws2_32.WSAGetLastError()) {
699 else => |err| return unexpectedWSAError(err),
700 },
701 else => unreachable,
702 }
703}
704
650pub fn WSAIoctl(705pub fn WSAIoctl(
651 s: ws2_32.SOCKET,706 s: ws2_32.SOCKET,
652 dwIoControlCode: DWORD,707 dwIoControlCode: DWORD,
653 inBuffer: ?[]const u8,708 inBuffer: ?[]const u8,
654 outBuffer: []u8,709 outBuffer: []u8,
655 overlapped: ?*ws2_32.WSAOVERLAPPED,710 overlapped: ?*ws2_32.WSAOVERLAPPED,
656 completionRoutine: ?*ws2_32.WSAOVERLAPPED_COMPLETION_ROUTINE,711 completionRoutine: ?ws2_32.WSAOVERLAPPED_COMPLETION_ROUTINE,
657) !DWORD {712) !DWORD {
658 var bytes: DWORD = undefined;713 var bytes: DWORD = undefined;
659 switch (ws2_32.WSAIoctl(714 switch (ws2_32.WSAIoctl(
lib/std/os/windows/bits.zig+17-2
...@@ -19,7 +19,6 @@ pub const STD_OUTPUT_HANDLE = maxInt(DWORD) - 11 + 1;...@@ -19,7 +19,6 @@ pub const STD_OUTPUT_HANDLE = maxInt(DWORD) - 11 + 1;
19/// The standard error device. Initially, this is the active console screen buffer, CONOUT$.19/// The standard error device. Initially, this is the active console screen buffer, CONOUT$.
20pub const STD_ERROR_HANDLE = maxInt(DWORD) - 12 + 1;20pub const STD_ERROR_HANDLE = maxInt(DWORD) - 12 + 1;
2121
22pub const SHORT = c_short;
23pub const BOOL = c_int;22pub const BOOL = c_int;
24pub const BOOLEAN = BYTE;23pub const BOOLEAN = BYTE;
25pub const BYTE = u8;24pub const BYTE = u8;
...@@ -54,6 +53,8 @@ pub const UNICODE = false;...@@ -54,6 +53,8 @@ pub const UNICODE = false;
54pub const WCHAR = u16;53pub const WCHAR = u16;
55pub const WORD = u16;54pub const WORD = u16;
56pub const LARGE_INTEGER = i64;55pub const LARGE_INTEGER = i64;
56pub const USHORT = u16;
57pub const SHORT = i16;
57pub const ULONG = u32;58pub const ULONG = u32;
58pub const LONG = i32;59pub const LONG = i32;
59pub const ULONGLONG = u64;60pub const ULONGLONG = u64;
...@@ -236,7 +237,11 @@ pub const FILE_NAME_INFORMATION = extern struct {...@@ -236,7 +237,11 @@ pub const FILE_NAME_INFORMATION = extern struct {
236};237};
237238
238pub const IO_STATUS_BLOCK = extern struct {239pub const IO_STATUS_BLOCK = extern struct {
239 Status: usize,240 // "DUMMYUNIONNAME" expands to "u"
241 u: extern union {
242 Status: NTSTATUS,
243 Pointer: ?*c_void,
244 },
240 Information: ULONG_PTR,245 Information: ULONG_PTR,
241};246};
242247
...@@ -489,6 +494,13 @@ pub const FILE_ATTRIBUTE_SYSTEM = 0x4;...@@ -489,6 +494,13 @@ pub const FILE_ATTRIBUTE_SYSTEM = 0x4;
489pub const FILE_ATTRIBUTE_TEMPORARY = 0x100;494pub const FILE_ATTRIBUTE_TEMPORARY = 0x100;
490pub const FILE_ATTRIBUTE_VIRTUAL = 0x10000;495pub const FILE_ATTRIBUTE_VIRTUAL = 0x10000;
491496
497// flags for CreateEvent
498pub const CREATE_EVENT_INITIAL_SET = 0x00000002;
499pub const CREATE_EVENT_MANUAL_RESET = 0x00000001;
500
501pub const EVENT_ALL_ACCESS = 0x1F0003;
502pub const EVENT_MODIFY_STATE = 0x0002;
503
492pub const PROCESS_INFORMATION = extern struct {504pub const PROCESS_INFORMATION = extern struct {
493 hProcess: HANDLE,505 hProcess: HANDLE,
494 hThread: HANDLE,506 hThread: HANDLE,
...@@ -534,7 +546,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;...@@ -534,7 +546,10 @@ pub const STARTF_USESTDHANDLES = 0x00000100;
534546
535pub const INFINITE = 4294967295;547pub const INFINITE = 4294967295;
536548
549pub const MAXIMUM_WAIT_OBJECTS = 64;
550
537pub const WAIT_ABANDONED = 0x00000080;551pub const WAIT_ABANDONED = 0x00000080;
552pub const WAIT_ABANDONED_0 = WAIT_ABANDONED + 0;
538pub const WAIT_OBJECT_0 = 0x00000000;553pub const WAIT_OBJECT_0 = 0x00000000;
539pub const WAIT_TIMEOUT = 0x00000102;554pub const WAIT_TIMEOUT = 0x00000102;
540pub const WAIT_FAILED = 0xFFFFFFFF;555pub const WAIT_FAILED = 0xFFFFFFFF;
lib/std/os/windows/kernel32.zig+20-1
...@@ -9,6 +9,13 @@ pub extern "kernel32" stdcallcc fn CloseHandle(hObject: HANDLE) BOOL;...@@ -9,6 +9,13 @@ pub extern "kernel32" stdcallcc fn CloseHandle(hObject: HANDLE) BOOL;
99
10pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: [*]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;10pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: [*]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;
1111
12pub extern "kernel32" stdcallcc fn CreateEventExW(
13 lpEventAttributes: ?*SECURITY_ATTRIBUTES,
14 lpName: [*:0]const u16,
15 dwFlags: DWORD,
16 dwDesiredAccess: DWORD,
17) ?HANDLE;
18
12pub extern "kernel32" stdcallcc fn CreateFileW(19pub extern "kernel32" stdcallcc fn CreateFileW(
13 lpFileName: [*]const u16, // TODO null terminated pointer type20 lpFileName: [*]const u16, // TODO null terminated pointer type
14 dwDesiredAccess: DWORD,21 dwDesiredAccess: DWORD,
...@@ -52,7 +59,7 @@ pub extern "kernel32" stdcallcc fn DeviceIoControl(...@@ -52,7 +59,7 @@ pub extern "kernel32" stdcallcc fn DeviceIoControl(
52 nInBufferSize: DWORD,59 nInBufferSize: DWORD,
53 lpOutBuffer: ?LPVOID,60 lpOutBuffer: ?LPVOID,
54 nOutBufferSize: DWORD,61 nOutBufferSize: DWORD,
55 lpBytesReturned: LPDWORD,62 lpBytesReturned: ?*DWORD,
56 lpOverlapped: ?*OVERLAPPED,63 lpOverlapped: ?*OVERLAPPED,
57) BOOL;64) BOOL;
5865
...@@ -205,6 +212,18 @@ pub extern "kernel32" stdcallcc fn TlsFree(dwTlsIndex: DWORD) BOOL;...@@ -205,6 +212,18 @@ pub extern "kernel32" stdcallcc fn TlsFree(dwTlsIndex: DWORD) BOOL;
205212
206pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) DWORD;213pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) DWORD;
207214
215pub extern "kernel32" stdcallcc fn WaitForSingleObjectEx(hHandle: HANDLE, dwMilliseconds: DWORD, bAlertable: BOOL) DWORD;
216
217pub extern "kernel32" stdcallcc fn WaitForMultipleObjects(nCount: DWORD, lpHandle: [*]const HANDLE, bWaitAll:BOOL, dwMilliseconds: DWORD) DWORD;
218
219pub extern "kernel32" stdcallcc fn WaitForMultipleObjectsEx(
220 nCount: DWORD,
221 lpHandle: [*]const HANDLE,
222 bWaitAll:BOOL,
223 dwMilliseconds: DWORD,
224 bAlertable: BOOL,
225) DWORD;
226
208pub extern "kernel32" stdcallcc fn WriteFile(227pub extern "kernel32" stdcallcc fn WriteFile(
209 in_hFile: HANDLE,228 in_hFile: HANDLE,
210 in_lpBuffer: [*]const u8,229 in_lpBuffer: [*]const u8,
lib/std/os/windows/ntdll.zig+2-2
...@@ -24,8 +24,8 @@ pub extern "NtDll" stdcallcc fn NtCreateFile(...@@ -24,8 +24,8 @@ pub extern "NtDll" stdcallcc fn NtCreateFile(
24pub extern "NtDll" stdcallcc fn NtDeviceIoControlFile(24pub extern "NtDll" stdcallcc fn NtDeviceIoControlFile(
25 FileHandle: HANDLE,25 FileHandle: HANDLE,
26 Event: ?HANDLE,26 Event: ?HANDLE,
27 ApcRoutine: ?*IO_APC_ROUTINE,27 ApcRoutine: ?IO_APC_ROUTINE,
28 ApcContext: usize,28 ApcContext: ?*c_void,
29 IoStatusBlock: *IO_STATUS_BLOCK,29 IoStatusBlock: *IO_STATUS_BLOCK,
30 IoControlCode: ULONG,30 IoControlCode: ULONG,
31 InputBuffer: ?*const c_void,31 InputBuffer: ?*const c_void,
lib/std/os/windows/status.zig+7
...@@ -11,8 +11,13 @@ pub const ABANDONED_WAIT_0 = 0x00000080;...@@ -11,8 +11,13 @@ pub const ABANDONED_WAIT_0 = 0x00000080;
11pub const ABANDONED_WAIT_63 = 0x000000BF;11pub const ABANDONED_WAIT_63 = 0x000000BF;
12pub const USER_APC = 0x000000C0;12pub const USER_APC = 0x000000C0;
13pub const ALERTED = 0x00000101;13pub const ALERTED = 0x00000101;
14
15/// The given Timeout interval expired.
14pub const TIMEOUT = 0x00000102;16pub const TIMEOUT = 0x00000102;
17
18/// The operation that was requested is pending completion.
15pub const PENDING = 0x00000103;19pub const PENDING = 0x00000103;
20
16pub const REPARSE = 0x00000104;21pub const REPARSE = 0x00000104;
17pub const MORE_ENTRIES = 0x00000105;22pub const MORE_ENTRIES = 0x00000105;
18pub const NOT_ALL_ASSIGNED = 0x00000106;23pub const NOT_ALL_ASSIGNED = 0x00000106;
...@@ -128,6 +133,8 @@ pub const GUARD_PAGE_VIOLATION = 0x80000001;...@@ -128,6 +133,8 @@ pub const GUARD_PAGE_VIOLATION = 0x80000001;
128pub const DATATYPE_MISALIGNMENT = 0x80000002;133pub const DATATYPE_MISALIGNMENT = 0x80000002;
129pub const BREAKPOINT = 0x80000003;134pub const BREAKPOINT = 0x80000003;
130pub const SINGLE_STEP = 0x80000004;135pub const SINGLE_STEP = 0x80000004;
136
137/// The data was too large to fit into the specified buffer.
131pub const BUFFER_OVERFLOW = 0x80000005;138pub const BUFFER_OVERFLOW = 0x80000005;
132pub const NO_MORE_FILES = 0x80000006;139pub const NO_MORE_FILES = 0x80000006;
133pub const WAKE_SYSTEM_DEBUGGER = 0x80000007;140pub const WAKE_SYSTEM_DEBUGGER = 0x80000007;
lib/std/os/windows/ws2_32.zig+149-1
...@@ -108,6 +108,103 @@ pub const WSAOVERLAPPED = extern struct {...@@ -108,6 +108,103 @@ pub const WSAOVERLAPPED = extern struct {
108108
109pub const WSAOVERLAPPED_COMPLETION_ROUTINE = extern fn (dwError: DWORD, cbTransferred: DWORD, lpOverlapped: *WSAOVERLAPPED, dwFlags: DWORD) void;109pub const WSAOVERLAPPED_COMPLETION_ROUTINE = extern fn (dwError: DWORD, cbTransferred: DWORD, lpOverlapped: *WSAOVERLAPPED, dwFlags: DWORD) void;
110110
111pub const ADDRESS_FAMILY = u16;
112
113// Microsoft use the signed c_int for this, but it should never be negative
114const socklen_t = u32;
115
116pub const AF_UNSPEC = 0;
117pub const AF_UNIX = 1;
118pub const AF_INET = 2;
119pub const AF_IMPLINK = 3;
120pub const AF_PUP = 4;
121pub const AF_CHAOS = 5;
122pub const AF_NS = 6;
123pub const AF_IPX = AF_NS;
124pub const AF_ISO = 7;
125pub const AF_OSI = AF_ISO;
126pub const AF_ECMA = 8;
127pub const AF_DATAKIT = 9;
128pub const AF_CCITT = 10;
129pub const AF_SNA = 11;
130pub const AF_DECnet = 12;
131pub const AF_DLI = 13;
132pub const AF_LAT = 14;
133pub const AF_HYLINK = 15;
134pub const AF_APPLETALK = 16;
135pub const AF_NETBIOS = 17;
136pub const AF_VOICEVIEW = 18;
137pub const AF_FIREFOX = 19;
138pub const AF_UNKNOWN1 = 20;
139pub const AF_BAN = 21;
140pub const AF_ATM = 22;
141pub const AF_INET6 = 23;
142pub const AF_CLUSTER = 24;
143pub const AF_12844 = 25;
144pub const AF_IRDA = 26;
145pub const AF_NETDES = 28;
146pub const AF_TCNPROCESS = 29;
147pub const AF_TCNMESSAGE = 30;
148pub const AF_ICLFXBM = 31;
149pub const AF_BTH = 32;
150pub const AF_MAX = 33;
151
152pub const SOCK_STREAM = 1;
153pub const SOCK_DGRAM = 2;
154pub const SOCK_RAW = 3;
155pub const SOCK_RDM = 4;
156pub const SOCK_SEQPACKET = 5;
157
158pub const IPPROTO_ICMP = 1;
159pub const IPPROTO_IGMP = 2;
160pub const BTHPROTO_RFCOMM = 3;
161pub const IPPROTO_TCP = 6;
162pub const IPPROTO_UDP = 17;
163pub const IPPROTO_ICMPV6 = 58;
164pub const IPPROTO_RM = 113;
165
166pub const sockaddr = extern struct {
167 family: ADDRESS_FAMILY,
168 data: [14]u8,
169};
170
171/// IPv4 socket address
172pub const sockaddr_in = extern struct {
173 family: ADDRESS_FAMILY = AF_INET,
174 port: USHORT,
175 addr: u32,
176 zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
177};
178
179/// IPv6 socket address
180pub const sockaddr_in6 = extern struct {
181 family: ADDRESS_FAMILY = AF_INET6,
182 port: USHORT,
183 flowinfo: u32,
184 addr: [16]u8,
185 scope_id: u32,
186};
187
188/// UNIX domain socket address
189pub const sockaddr_un = extern struct {
190 family: ADDRESS_FAMILY = AF_UNIX,
191 path: [108]u8,
192};
193
194pub const WSABUF = extern struct {
195 len: ULONG,
196 buf: [*]u8,
197};
198
199pub const WSAMSG = extern struct {
200 name: *const sockaddr,
201 namelen: INT,
202 lpBuffers: [*]WSABUF,
203 dwBufferCount: DWORD,
204 Control: WSABUF,
205 dwFlags: DWORD,
206};
207
111pub const WSA_INVALID_HANDLE = 6;208pub const WSA_INVALID_HANDLE = 6;
112pub const WSA_NOT_ENOUGH_MEMORY = 8;209pub const WSA_NOT_ENOUGH_MEMORY = 8;
113pub const WSA_INVALID_PARAMETER = 87;210pub const WSA_INVALID_PARAMETER = 87;
...@@ -240,6 +337,7 @@ pub extern "ws2_32" stdcallcc fn WSASocketW(...@@ -240,6 +337,7 @@ pub extern "ws2_32" stdcallcc fn WSASocketW(
240 g: GROUP,337 g: GROUP,
241 dwFlags: DWORD,338 dwFlags: DWORD,
242) SOCKET;339) SOCKET;
340pub extern "ws2_32" stdcallcc fn closesocket(s: SOCKET) c_int;
243pub extern "ws2_32" stdcallcc fn WSAIoctl(341pub extern "ws2_32" stdcallcc fn WSAIoctl(
244 s: SOCKET,342 s: SOCKET,
245 dwIoControlCode: DWORD,343 dwIoControlCode: DWORD,
...@@ -249,5 +347,55 @@ pub extern "ws2_32" stdcallcc fn WSAIoctl(...@@ -249,5 +347,55 @@ pub extern "ws2_32" stdcallcc fn WSAIoctl(
249 cbOutBuffer: DWORD,347 cbOutBuffer: DWORD,
250 lpcbBytesReturned: LPDWORD,348 lpcbBytesReturned: LPDWORD,
251 lpOverlapped: ?*WSAOVERLAPPED,349 lpOverlapped: ?*WSAOVERLAPPED,
252 lpCompletionRoutine: ?*WSAOVERLAPPED_COMPLETION_ROUTINE,350 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
351) c_int;
352pub extern "ws2_32" stdcallcc fn accept(
353 s: SOCKET,
354 addr: ?*sockaddr,
355 addrlen: socklen_t,
356) SOCKET;
357pub extern "ws2_32" stdcallcc fn connect(
358 s: SOCKET,
359 name: *const sockaddr,
360 namelen: socklen_t,
361) c_int;
362pub extern "ws2_32" stdcallcc fn WSARecv(
363 s: SOCKET,
364 lpBuffers: [*]const WSABUF,
365 dwBufferCount: DWORD,
366 lpNumberOfBytesRecvd: ?*DWORD,
367 lpFlags: *DWORD,
368 lpOverlapped: ?*WSAOVERLAPPED,
369 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
370) c_int;
371pub extern "ws2_32" stdcallcc fn WSARecvFrom(
372 s: SOCKET,
373 lpBuffers: [*]const WSABUF,
374 dwBufferCount: DWORD,
375 lpNumberOfBytesRecvd: ?*DWORD,
376 lpFlags: *DWORD,
377 lpFrom: ?*sockaddr,
378 lpFromlen: socklen_t,
379 lpOverlapped: ?*WSAOVERLAPPED,
380 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
381) c_int;
382pub extern "ws2_32" stdcallcc fn WSASend(
383 s: SOCKET,
384 lpBuffers: [*]WSABUF,
385 dwBufferCount: DWORD,
386 lpNumberOfBytesSent: ?*DWORD,
387 dwFlags: DWORD,
388 lpOverlapped: ?*WSAOVERLAPPED,
389 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
390) c_int;
391pub extern "ws2_32" stdcallcc fn WSASendTo(
392 s: SOCKET,
393 lpBuffers: [*]WSABUF,
394 dwBufferCount: DWORD,
395 lpNumberOfBytesSent: ?*DWORD,
396 dwFlags: DWORD,
397 lpTo: ?*const sockaddr,
398 iTolen: socklen_t,
399 lpOverlapped: ?*WSAOVERLAPPED,
400 lpCompletionRoutine: ?WSAOVERLAPPED_COMPLETION_ROUTINE,
253) c_int;401) c_int;
lib/std/thread.zig+1-1
...@@ -99,7 +99,7 @@ pub const Thread = struct {...@@ -99,7 +99,7 @@ pub const Thread = struct {
99 os.munmap(self.data.memory);99 os.munmap(self.data.memory);
100 },100 },
101 .windows => {101 .windows => {
102 windows.WaitForSingleObject(self.data.handle, windows.INFINITE) catch unreachable;102 windows.WaitForSingleObjectEx(self.data.handle, windows.INFINITE, false) catch unreachable;
103 windows.CloseHandle(self.data.handle);103 windows.CloseHandle(self.data.handle);
104 windows.HeapFree(self.data.heap_handle, 0, self.data.alloc_start);104 windows.HeapFree(self.data.heap_handle, 0, self.data.alloc_start);
105 },105 },