authorgravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-06-16 22:39:09+02:00
committergravatar for kappaloris@gmail.comLoris Cro <kappaloris@gmail.com> 2020-09-24 21:56:27+02:00
log730428bfd615cab415b2942fc9b781428a0ff692
tree9741033742a82f8f3023acd9d1dfde790ec0c0ba
parente85c89630e78ccc0e4bab44064779a07a029cecd

connect

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 {
754754 }
755755 }
756756
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
757767 /// Performs an async `os.open` using a separate thread.
758768 pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t {
759769 var req_node = Request.Node{
lib/std/net.zig+12-6
......@@ -614,11 +614,11 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
614614
615615 var addr = try std.net.Address.initUnix(path);
616616
617 try os.connect(
618 sockfd,
619 &addr.any,
620 addr.getOsSockLen(),
621 );
617 if (std.io.is_async) {
618 try loop.connect(sockfd, &addr.any, addr.getOsSockLen());
619 } else {
620 try os.connect(sockfd, &addr.any, addr.getOsSockLen());
621 }
622622
623623 return fs.File{
624624 .handle = sockfd,
......@@ -677,7 +677,13 @@ pub fn tcpConnectToAddress(address: Address) !fs.File {
677677 (if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC);
678678 const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP);
679679 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 }
681687
682688 return fs.File{ .handle = sockfd };
683689}
lib/std/os.zig+1-5
......@@ -3108,11 +3108,7 @@ pub fn connect(sockfd: socket_t, sock_addr: *const sockaddr, len: socklen_t) Con
31083108 EADDRINUSE => return error.AddressInUse,
31093109 EADDRNOTAVAIL => return error.AddressNotAvailable,
31103110 EAFNOSUPPORT => return error.AddressFamilyNotSupported,
3111 EAGAIN, EINPROGRESS => {
3112 const loop = std.event.Loop.instance orelse return error.WouldBlock;
3113 loop.waitUntilFdWritable(sockfd);
3114 return getsockoptError(sockfd);
3115 },
3111 EAGAIN, EINPROGRESS => return error.WouldBlock,
31163112 EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed.
31173113 EBADF => unreachable, // sockfd is not a valid open file descriptor.
31183114 ECONNREFUSED => return error.ConnectionRefused,