An HTTP/1.1 server for zig
0

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #204 from by965738071/dev

posix:通过SetHandleInformation在Windows上实现CLOEXEC

+31 -2
+10 -2
src/posix.zig
··· 87 87 fn setSockFlags(sock: socket_t, flags: u32) !void { 88 88 if ((flags & CLOEXEC) != 0) { 89 89 if (native_os == .windows) { 90 - // TODO: Find out if this is supported for sockets 90 + // Windows: disable handle inheritance. This prevents child 91 + // processes from inheriting the socket, equivalent to FD_CLOEXEC. 92 + // Socket handles are HANDLE objects in Windows NT, so 93 + // SetHandleInformation works on them. 94 + try windows.setNoInherit(@ptrCast(sock)); 91 95 } else { 92 96 var fd_flags = fcntl(sock, F.GETFD, 0) catch |err| switch (err) { 93 97 error.FileBusy => unreachable, ··· 116 120 .WSANOTINITIALISED => unreachable, 117 121 .WSAENETDOWN => return error.NetworkSubsystemFailed, 118 122 .WSAENOTSOCK => return error.FileDescriptorNotASocket, 119 - // TODO: handle more errors 123 + .WSAEINVAL => return error.Unexpected, 124 + .WSAEFAULT, 125 + .WSAEOPNOTSUPP, 126 + .WSAEINPROGRESS, 127 + => unreachable, 120 128 else => |err| return windows.unexpectedWSAError(err), 121 129 } 122 130 }
+21
src/windows.zig
··· 294 294 hEvent: ?HANDLE, 295 295 }; 296 296 297 + pub const HANDLE_FLAG_INHERIT = 1; 298 + pub const HANDLE_FLAG_PROTECT_FROM_CLOSE = 2; 299 + 300 + /// Disables handle inheritance for the given handle (Windows equivalent of 301 + /// FD_CLOEXEC). Works on socket handles as well as regular file handles. 302 + pub fn setNoInherit(handle: HANDLE) !void { 303 + if (kernel32.SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0) == .FALSE) { 304 + switch (GetLastError()) { 305 + .INVALID_HANDLE => return error.Unexpected, 306 + .ACCESS_DENIED => return error.AccessDenied, 307 + else => |err| return std_windows.unexpectedError(err), 308 + } 309 + } 310 + } 311 + 297 312 /// kernel32 was severely trimmed in Zig 0.16, so re-declare the few entry 298 313 /// points we need. 299 314 const kernel32 = struct { ··· 311 326 nNumberOfBytesToWrite: DWORD, 312 327 lpNumberOfBytesWritten: ?*DWORD, 313 328 lpOverlapped: ?*OVERLAPPED, 329 + ) callconv(.winapi) BOOL; 330 + 331 + pub extern "kernel32" fn SetHandleInformation( 332 + hObject: HANDLE, 333 + dwMask: DWORD, 334 + dwFlags: DWORD, 314 335 ) callconv(.winapi) BOOL; 315 336 };