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 {...@@ -606,7 +606,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
606 os.SOCK_STREAM | os.SOCK_CLOEXEC | opt_non_block,606 os.SOCK_STREAM | os.SOCK_CLOEXEC | opt_non_block,
607 0,607 0,
608 );608 );
609 errdefer os.close(sockfd);609 errdefer os.closeSocket(sockfd);
610610
611 var addr = try std.net.Address.initUnix(path);611 var addr = try std.net.Address.initUnix(path);
612612
...@@ -625,7 +625,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {...@@ -625,7 +625,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
625fn if_nametoindex(name: []const u8) !u32 {625fn if_nametoindex(name: []const u8) !u32 {
626 var ifr: os.ifreq = undefined;626 var ifr: os.ifreq = undefined;
627 var sockfd = try os.socket(os.AF_UNIX, os.SOCK_DGRAM | os.SOCK_CLOEXEC, 0);627 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
630 std.mem.copy(u8, &ifr.ifrn.name, name);630 std.mem.copy(u8, &ifr.ifrn.name, name);
631 ifr.ifrn.name[name.len] = 0;631 ifr.ifrn.name[name.len] = 0;
...@@ -673,7 +673,7 @@ pub fn tcpConnectToAddress(address: Address) !fs.File {...@@ -673,7 +673,7 @@ pub fn tcpConnectToAddress(address: Address) !fs.File {
673 const sock_flags = os.SOCK_STREAM | nonblock |673 const sock_flags = os.SOCK_STREAM | nonblock |
674 (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC);674 (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC);
675 const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP);675 const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP);
676 errdefer os.close(sockfd);676 errdefer os.closeSocket(sockfd);
677677
678 if (std.io.is_async) {678 if (std.io.is_async) {
679 const loop = std.event.Loop.instance orelse return error.WouldBlock;679 const loop = std.event.Loop.instance orelse return error.WouldBlock;
...@@ -908,7 +908,7 @@ fn linuxLookupName(...@@ -908,7 +908,7 @@ fn linuxLookupName(
908 var prefixlen: i32 = 0;908 var prefixlen: i32 = 0;
909 const sock_flags = os.SOCK_DGRAM | os.SOCK_CLOEXEC;909 const sock_flags = os.SOCK_DGRAM | os.SOCK_CLOEXEC;
910 if (os.socket(addr.addr.any.family, sock_flags, os.IPPROTO_UDP)) |fd| syscalls: {910 if (os.socket(addr.addr.any.family, sock_flags, os.IPPROTO_UDP)) |fd| syscalls: {
911 defer os.close(fd);911 defer os.closeSocket(fd);
912 os.connect(fd, da, dalen) catch break :syscalls;912 os.connect(fd, da, dalen) catch break :syscalls;
913 key |= DAS_USABLE;913 key |= DAS_USABLE;
914 os.getsockname(fd, sa, &salen) catch break :syscalls;914 os.getsockname(fd, sa, &salen) catch break :syscalls;
...@@ -1388,7 +1388,7 @@ fn resMSendRc(...@@ -1388,7 +1388,7 @@ fn resMSendRc(
1388 },1388 },
1389 else => |e| return e,1389 else => |e| return e,
1390 };1390 };
1391 defer os.close(fd);1391 defer os.closeSocket(fd);
1392 try os.bind(fd, &sa.any, sl);1392 try os.bind(fd, &sa.any, sl);
13931393
1394 // Past this point, there are no errors. Each individual query will1394 // Past this point, there are no errors. Each individual query will
...@@ -1610,7 +1610,7 @@ pub const StreamServer = struct {...@@ -1610,7 +1610,7 @@ pub const StreamServer = struct {
1610 const sockfd = try os.socket(address.any.family, sock_flags, proto);1610 const sockfd = try os.socket(address.any.family, sock_flags, proto);
1611 self.sockfd = sockfd;1611 self.sockfd = sockfd;
1612 errdefer {1612 errdefer {
1613 os.close(sockfd);1613 os.closeSocket(sockfd);
1614 self.sockfd = null;1614 self.sockfd = null;
1615 }1615 }
16161616
...@@ -1634,7 +1634,7 @@ pub const StreamServer = struct {...@@ -1634,7 +1634,7 @@ pub const StreamServer = struct {
1634 /// not listening.1634 /// not listening.
1635 pub fn close(self: *StreamServer) void {1635 pub fn close(self: *StreamServer) void {
1636 if (self.sockfd) |fd| {1636 if (self.sockfd) |fd| {
1637 os.close(fd);1637 os.closeSocket(fd);
1638 self.sockfd = null;1638 self.sockfd = null;
1639 self.listen_address = undefined;1639 self.listen_address = undefined;
1640 }1640 }
lib/std/net/test.zig+2
...@@ -148,6 +148,8 @@ test "listen on a port, send bytes, receive bytes" {...@@ -148,6 +148,8 @@ test "listen on a port, send bytes, receive bytes" {
148 const localhost = try net.Address.parseIp("127.0.0.1", 8080);148 const localhost = try net.Address.parseIp("127.0.0.1", 8080);
149149
150 var server = net.StreamServer.init(.{});150 var server = net.StreamServer.init(.{});
151 defer server.deinit();
152
151 try server.listen(localhost);153 try server.listen(localhost);
152154
153 const S = struct {155 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...@@ -2687,6 +2687,14 @@ pub fn socket(domain: u32, socket_type: u32, protocol: u32) SocketError!socket_t
2687 }2687 }
2688}2688}
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
2690pub const BindError = error{2698pub const BindError = error{
2691 /// The address is protected, and the user is not the superuser.2699 /// The address is protected, and the user is not the superuser.
2692 /// For UNIX domain sockets: Search permission is denied on a component2700 /// For UNIX domain sockets: Search permission is denied on a component
...@@ -2731,8 +2739,8 @@ pub const BindError = error{...@@ -2731,8 +2739,8 @@ pub const BindError = error{
27312739
2732/// addr is `*const T` where T is one of the sockaddr2740/// addr is `*const T` where T is one of the sockaddr
2733pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void {2741pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void {
2734 const rc = system.bind(sock, addr, len);
2735 if (builtin.os.tag == .windows) {2742 if (builtin.os.tag == .windows) {
2743 const rc = windows.bind(sock, addr, len);
2736 if (rc == windows.ws2_32.SOCKET_ERROR) {2744 if (rc == windows.ws2_32.SOCKET_ERROR) {
2737 switch (windows.ws2_32.WSAGetLastError()) {2745 switch (windows.ws2_32.WSAGetLastError()) {
2738 .WSANOTINITIALISED => unreachable, // not initialized WSA2746 .WSANOTINITIALISED => unreachable, // not initialized WSA
...@@ -2750,6 +2758,7 @@ pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!voi...@@ -2750,6 +2758,7 @@ pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!voi
2750 }2758 }
2751 return;2759 return;
2752 } else {2760 } else {
2761 const rc = system.bind(sock, addr, len);
2753 switch (errno(rc)) {2762 switch (errno(rc)) {
2754 0 => return,2763 0 => return,
2755 EACCES => return error.AccessDenied,2764 EACCES => return error.AccessDenied,
...@@ -2800,8 +2809,8 @@ const ListenError = error{...@@ -2800,8 +2809,8 @@ const ListenError = error{
2800} || UnexpectedError;2809} || UnexpectedError;
28012810
2802pub fn listen(sock: socket_t, backlog: u31) ListenError!void {2811pub fn listen(sock: socket_t, backlog: u31) ListenError!void {
2803 const rc = system.listen(sock, backlog);
2804 if (builtin.os.tag == .windows) {2812 if (builtin.os.tag == .windows) {
2813 const rc = windows.listen(sock, backlog);
2805 if (rc == windows.ws2_32.SOCKET_ERROR) {2814 if (rc == windows.ws2_32.SOCKET_ERROR) {
2806 switch (windows.ws2_32.WSAGetLastError()) {2815 switch (windows.ws2_32.WSAGetLastError()) {
2807 .WSANOTINITIALISED => unreachable, // not initialized WSA2816 .WSANOTINITIALISED => unreachable, // not initialized WSA
...@@ -2818,6 +2827,7 @@ pub fn listen(sock: socket_t, backlog: u31) ListenError!void {...@@ -2818,6 +2827,7 @@ pub fn listen(sock: socket_t, backlog: u31) ListenError!void {
2818 }2827 }
2819 return;2828 return;
2820 } else {2829 } else {
2830 const rc = system.listen(sock, backlog);
2821 switch (errno(rc)) {2831 switch (errno(rc)) {
2822 0 => return,2832 0 => return,
2823 EADDRINUSE => return error.AddressInUse,2833 EADDRINUSE => return error.AddressInUse,
...@@ -2905,6 +2915,8 @@ pub fn accept(...@@ -2905,6 +2915,8 @@ pub fn accept(
2905 const accepted_sock = while (true) {2915 const accepted_sock = while (true) {
2906 const rc = if (have_accept4)2916 const rc = if (have_accept4)
2907 system.accept4(sock, addr, addr_size, flags)2917 system.accept4(sock, addr, addr_size, flags)
2918 else if (builtin.os.tag == .windows)
2919 windows.accept(sock, addr, addr_size)
2908 else2920 else
2909 system.accept(sock, addr, addr_size);2921 system.accept(sock, addr, addr_size);
29102922
...@@ -3077,8 +3089,8 @@ pub const GetSockNameError = error{...@@ -3077,8 +3089,8 @@ pub const GetSockNameError = error{
3077} || UnexpectedError;3089} || UnexpectedError;
30783090
3079pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSockNameError!void {3091pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSockNameError!void {
3080 const rc = system.getsockname(sock, addr, addrlen);
3081 if (builtin.os.tag == .windows) {3092 if (builtin.os.tag == .windows) {
3093 const rc = windows.getsockname(sock, addr, addrlen);
3082 if (rc == windows.ws2_32.SOCKET_ERROR) {3094 if (rc == windows.ws2_32.SOCKET_ERROR) {
3083 switch (windows.ws2_32.WSAGetLastError()) {3095 switch (windows.ws2_32.WSAGetLastError()) {
3084 .WSANOTINITIALISED => unreachable,3096 .WSANOTINITIALISED => unreachable,
...@@ -3091,6 +3103,7 @@ pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSock...@@ -3091,6 +3103,7 @@ pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSock
3091 }3103 }
3092 return;3104 return;
3093 } else {3105 } else {
3106 const rc = system.getsockname(sock, addr, addrlen);
3094 switch (errno(rc)) {3107 switch (errno(rc)) {
3095 0 => return,3108 0 => return,
3096 else => |err| return unexpectedErrno(err),3109 else => |err| return unexpectedErrno(err),