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 {...@@ -754,6 +754,16 @@ pub const Loop = struct {
754 }754 }
755 }755 }
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
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 {
614614
615 var addr = try std.net.Address.initUnix(path);615 var addr = try std.net.Address.initUnix(path);
616616
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 }
622622
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 }
681687
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,