authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-10-28 10:03:23+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-10-28 10:03:23+01:00
log7f4667219339e92dc75e7dfd5f0078f229804567
tree07306346291fd98b13c12fa415abd1383ab9b048
parent1ea0d40e5e07a5fe615355d4c33832ed3c81f8c3

More fixups for Windows targets

* Use closeSocket on sockets instead of plain old close, the latter doesn't work on them. * Use winsocket2 everywhere, mingw has no BSD sockets.

3 files changed, 25 insertions(+), 10 deletions(-)

lib/std/net.zig+7-7
......@@ -606,7 +606,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
606606 os.SOCK_STREAM | os.SOCK_CLOEXEC | opt_non_block,
607607 0,
608608 );
609 errdefer os.close(sockfd);
609 errdefer os.closeSocket(sockfd);
610610
611611 var addr = try std.net.Address.initUnix(path);
612612
......@@ -625,7 +625,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
625625fn if_nametoindex(name: []const u8) !u32 {
626626 var ifr: os.ifreq = undefined;
627627 var sockfd = try os.socket(os.AF_UNIX, os.SOCK_DGRAM | os.SOCK_CLOEXEC, 0);
628 defer os.close(sockfd);
628 defer os.closeSocket(sockfd);
629629
630630 std.mem.copy(u8, &ifr.ifrn.name, name);
631631 ifr.ifrn.name[name.len] = 0;
......@@ -673,7 +673,7 @@ pub fn tcpConnectToAddress(address: Address) !fs.File {
673673 const sock_flags = os.SOCK_STREAM | nonblock |
674674 (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC);
675675 const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP);
676 errdefer os.close(sockfd);
676 errdefer os.closeSocket(sockfd);
677677
678678 if (std.io.is_async) {
679679 const loop = std.event.Loop.instance orelse return error.WouldBlock;
......@@ -908,7 +908,7 @@ fn linuxLookupName(
908908 var prefixlen: i32 = 0;
909909 const sock_flags = os.SOCK_DGRAM | os.SOCK_CLOEXEC;
910910 if (os.socket(addr.addr.any.family, sock_flags, os.IPPROTO_UDP)) |fd| syscalls: {
911 defer os.close(fd);
911 defer os.closeSocket(fd);
912912 os.connect(fd, da, dalen) catch break :syscalls;
913913 key |= DAS_USABLE;
914914 os.getsockname(fd, sa, &salen) catch break :syscalls;
......@@ -1388,7 +1388,7 @@ fn resMSendRc(
13881388 },
13891389 else => |e| return e,
13901390 };
1391 defer os.close(fd);
1391 defer os.closeSocket(fd);
13921392 try os.bind(fd, &sa.any, sl);
13931393
13941394 // Past this point, there are no errors. Each individual query will
......@@ -1610,7 +1610,7 @@ pub const StreamServer = struct {
16101610 const sockfd = try os.socket(address.any.family, sock_flags, proto);
16111611 self.sockfd = sockfd;
16121612 errdefer {
1613 os.close(sockfd);
1613 os.closeSocket(sockfd);
16141614 self.sockfd = null;
16151615 }
16161616
......@@ -1634,7 +1634,7 @@ pub const StreamServer = struct {
16341634 /// not listening.
16351635 pub fn close(self: *StreamServer) void {
16361636 if (self.sockfd) |fd| {
1637 os.close(fd);
1637 os.closeSocket(fd);
16381638 self.sockfd = null;
16391639 self.listen_address = undefined;
16401640 }
lib/std/net/test.zig+2
......@@ -148,6 +148,8 @@ test "listen on a port, send bytes, receive bytes" {
148148 const localhost = try net.Address.parseIp("127.0.0.1", 8080);
149149
150150 var server = net.StreamServer.init(.{});
151 defer server.deinit();
152
151153 try server.listen(localhost);
152154
153155 const S = struct {
lib/std/os.zig+16-3
......@@ -2687,6 +2687,14 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) SocketError!socket_t
26872687 }
26882688}
26892689
2690pub fn closeSocket(sock: socket_t) void {
2691 if (builtin.os.tag == .windows) {
2692 windows.closesocket(sock) catch unreachable;
2693 } else {
2694 close(sock);
2695 }
2696}
2697
26902698pub const BindError = error{
26912699 /// The address is protected, and the user is not the superuser.
26922700 /// For UNIX domain sockets: Search permission is denied on a component
......@@ -2731,8 +2739,8 @@ pub const BindError = error{
27312739
27322740/// addr is `*const T` where T is one of the sockaddr
27332741pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void {
2734 const rc = system.bind(sock, addr, len);
27352742 if (builtin.os.tag == .windows) {
2743 const rc = windows.bind(sock, addr, len);
27362744 if (rc == windows.ws2_32.SOCKET_ERROR) {
27372745 switch (windows.ws2_32.WSAGetLastError()) {
27382746 .WSANOTINITIALISED => unreachable, // not initialized WSA
......@@ -2750,6 +2758,7 @@ pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!voi
27502758 }
27512759 return;
27522760 } else {
2761 const rc = system.bind(sock, addr, len);
27532762 switch (errno(rc)) {
27542763 0 => return,
27552764 EACCES => return error.AccessDenied,
......@@ -2800,8 +2809,8 @@ const ListenError = error{
28002809} || UnexpectedError;
28012810
28022811pub fn listen(sock: socket_t, backlog: u31) ListenError!void {
2803 const rc = system.listen(sock, backlog);
28042812 if (builtin.os.tag == .windows) {
2813 const rc = windows.listen(sock, backlog);
28052814 if (rc == windows.ws2_32.SOCKET_ERROR) {
28062815 switch (windows.ws2_32.WSAGetLastError()) {
28072816 .WSANOTINITIALISED => unreachable, // not initialized WSA
......@@ -2818,6 +2827,7 @@ pub fn listen(sock: socket_t, backlog: u31) ListenError!void {
28182827 }
28192828 return;
28202829 } else {
2830 const rc = system.listen(sock, backlog);
28212831 switch (errno(rc)) {
28222832 0 => return,
28232833 EADDRINUSE => return error.AddressInUse,
......@@ -2905,6 +2915,8 @@ pub fn accept(
29052915 const accepted_sock = while (true) {
29062916 const rc = if (have_accept4)
29072917 system.accept4(sock, addr, addr_size, flags)
2918 else if (builtin.os.tag == .windows)
2919 windows.accept(sock, addr, addr_size)
29082920 else
29092921 system.accept(sock, addr, addr_size);
29102922
......@@ -3077,8 +3089,8 @@ pub const GetSockNameError = error{
30773089} || UnexpectedError;
30783090
30793091pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSockNameError!void {
3080 const rc = system.getsockname(sock, addr, addrlen);
30813092 if (builtin.os.tag == .windows) {
3093 const rc = windows.getsockname(sock, addr, addrlen);
30823094 if (rc == windows.ws2_32.SOCKET_ERROR) {
30833095 switch (windows.ws2_32.WSAGetLastError()) {
30843096 .WSANOTINITIALISED => unreachable,
......@@ -3091,6 +3103,7 @@ pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSock
30913103 }
30923104 return;
30933105 } else {
3106 const rc = system.getsockname(sock, addr, addrlen);
30943107 switch (errno(rc)) {
30953108 0 => return,
30963109 else => |err| return unexpectedErrno(err),