| author | |
| committer | |
| log | 730428bfd615cab415b2942fc9b781428a0ff692 |
| tree | 9741033742a82f8f3023acd9d1dfde790ec0c0ba |
| parent | e85c89630e78ccc0e4bab44064779a07a029cecd |
Signed-off-by: Loris Cro <kappaloris@gmail.com>3 files changed, 23 insertions(+), 11 deletions(-)
lib/std/event/loop.zig+10| ... | @@ -754,6 +754,16 @@ pub const Loop = struct { | ... | @@ -754,6 +754,16 @@ pub const Loop = struct { |
| 754 | } | 754 | } |
| 755 | } | 755 | } |
| 756 | 756 | ||
| 757 | pub fn connect(self: *Loop, sockfd: os.socket_t, sock_addr: *const os.sockaddr, len: os.socklen_t) os.ConnectError!void { | ||
| 758 | os.connect(sockfd, sock_addr, len) catch |err| switch (err) { | ||
| 759 | error.WouldBlock => { | ||
| 760 | self.waitUntilFdWritable(sockfd); | ||
| 761 | return os.getsockoptError(sockfd); | ||
| 762 | }, | ||
| 763 | else => return err, | ||
| 764 | }; | ||
| 765 | } | ||
| 766 | |||
| 757 | /// Performs an async `os.open` using a separate thread. | 767 | /// Performs an async `os.open` using a separate thread. |
| 758 | pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t { | 768 | pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t { |
| 759 | var req_node = Request.Node{ | 769 | var req_node = Request.Node{ |
lib/std/net.zig+12-6| ... | @@ -614,11 +614,11 @@ pub fn connectUnixSocket(path: []const u8) !fs.File { | ... | @@ -614,11 +614,11 @@ pub fn connectUnixSocket(path: []const u8) !fs.File { |
| 614 | 614 | ||
| 615 | var addr = try std.net.Address.initUnix(path); | 615 | var addr = try std.net.Address.initUnix(path); |
| 616 | 616 | ||
| 617 | try os.connect( | 617 | if (std.io.is_async) { |
| 618 | sockfd, | 618 | try loop.connect(sockfd, &addr.any, addr.getOsSockLen()); |
| 619 | &addr.any, | 619 | } else { |
| 620 | addr.getOsSockLen(), | 620 | try os.connect(sockfd, &addr.any, addr.getOsSockLen()); |
| 621 | ); | 621 | } |
| 622 | 622 | ||
| 623 | return fs.File{ | 623 | return fs.File{ |
| 624 | .handle = sockfd, | 624 | .handle = sockfd, |
| ... | @@ -677,7 +677,13 @@ pub fn tcpConnectToAddress(address: Address) !fs.File { | ... | @@ -677,7 +677,13 @@ pub fn tcpConnectToAddress(address: Address) !fs.File { |
| 677 | (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC); | 677 | (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC); |
| 678 | const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP); | 678 | const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP); |
| 679 | errdefer os.close(sockfd); | 679 | errdefer os.close(sockfd); |
| 680 | try os.connect(sockfd, &address.any, address.getOsSockLen()); | 680 | |
| 681 | if (std.io.is_async) { | ||
| 682 | const loop = std.event.Loop.instance orelse return error.WouldBlock; | ||
| 683 | try loop.connect(sockfd, &address.any, address.getOsSockLen()); | ||
| 684 | } else { | ||
| 685 | try os.connect(sockfd, &address.any, address.getOsSockLen()); | ||
| 686 | } | ||
| 681 | 687 | ||
| 682 | return fs.File{ .handle = sockfd }; | 688 | return fs.File{ .handle = sockfd }; |
| 683 | } | 689 | } |
lib/std/os.zig+1-5| ... | @@ -3108,11 +3108,7 @@ pub fn connect(sockfd: socket_t, sock_addr: *const sockaddr, len: socklen_t) Con | ... | @@ -3108,11 +3108,7 @@ pub fn connect(sockfd: socket_t, sock_addr: *const sockaddr, len: socklen_t) Con |
| 3108 | EADDRINUSE => return error.AddressInUse, | 3108 | EADDRINUSE => return error.AddressInUse, |
| 3109 | EADDRNOTAVAIL => return error.AddressNotAvailable, | 3109 | EADDRNOTAVAIL => return error.AddressNotAvailable, |
| 3110 | EAFNOSUPPORT => return error.AddressFamilyNotSupported, | 3110 | EAFNOSUPPORT => return error.AddressFamilyNotSupported, |
| 3111 | EAGAIN, EINPROGRESS => { | 3111 | EAGAIN, EINPROGRESS => return error.WouldBlock, |
| 3112 | const loop = std.event.Loop.instance orelse return error.WouldBlock; | ||
| 3113 | loop.waitUntilFdWritable(sockfd); | ||
| 3114 | return getsockoptError(sockfd); | ||
| 3115 | }, | ||
| 3116 | EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed. | 3112 | EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed. |
| 3117 | EBADF => unreachable, // sockfd is not a valid open file descriptor. | 3113 | EBADF => unreachable, // sockfd is not a valid open file descriptor. |
| 3118 | ECONNREFUSED => return error.ConnectionRefused, | 3114 | ECONNREFUSED => return error.ConnectionRefused, |