| author | |
| committer | |
| log | 7f4667219339e92dc75e7dfd5f0078f229804567 |
| tree | 07306346291fd98b13c12fa415abd1383ab9b048 |
| parent | 1ea0d40e5e07a5fe615355d4c33832ed3c81f8c3 |
* 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); |
| 610 | 610 | ||
| 611 | var addr = try std.net.Address.initUnix(path); | 611 | var addr = try std.net.Address.initUnix(path); |
| 612 | 612 | ||
| ... | @@ -625,7 +625,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File { | ... | @@ -625,7 +625,7 @@ pub fn connectUnixSocket(path: []const u8) !fs.File { |
| 625 | fn if_nametoindex(name: []const u8) !u32 { | 625 | fn 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); |
| 629 | 629 | ||
| 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); |
| 677 | 677 | ||
| 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); |
| 1393 | 1393 | ||
| 1394 | // Past this point, there are no errors. Each individual query will | 1394 | // 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 | } |
| 1616 | 1616 | ||
| ... | @@ -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); |
| 149 | 149 | ||
| 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); |
| 152 | 154 | ||
| 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 | } |
| 2689 | 2689 | ||
| 2690 | pub 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 | |||
| 2690 | pub const BindError = error{ | 2698 | pub 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 component | 2700 | /// 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{ |
| 2731 | 2739 | ||
| 2732 | /// addr is `*const T` where T is one of the sockaddr | 2740 | /// addr is `*const T` where T is one of the sockaddr |
| 2733 | pub fn bind(sock: socket_t, addr: *const sockaddr, len: socklen_t) BindError!void { | 2741 | pub 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 WSA | 2746 | .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; |
| 2801 | 2810 | ||
| 2802 | pub fn listen(sock: socket_t, backlog: u31) ListenError!void { | 2811 | pub 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 WSA | 2816 | .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 | else | 2920 | else |
| 2909 | system.accept(sock, addr, addr_size); | 2921 | system.accept(sock, addr, addr_size); |
| 2910 | 2922 | ||
| ... | @@ -3077,8 +3089,8 @@ pub const GetSockNameError = error{ | ... | @@ -3077,8 +3089,8 @@ pub const GetSockNameError = error{ |
| 3077 | } || UnexpectedError; | 3089 | } || UnexpectedError; |
| 3078 | 3090 | ||
| 3079 | pub fn getsockname(sock: socket_t, addr: *sockaddr, addrlen: *socklen_t) GetSockNameError!void { | 3091 | pub 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), |