aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorLoris Cro <kappaloris@gmail.com>2020-06-16 22:39:09 +0200
committerLoris Cro <kappaloris@gmail.com>2020-09-24 21:56:27 +0200
commit730428bfd615cab415b2942fc9b781428a0ff692 (patch)
tree9741033742a82f8f3023acd9d1dfde790ec0c0ba /lib/std
parente85c89630e78ccc0e4bab44064779a07a029cecd (diff)
downloadzig-730428bfd615cab415b2942fc9b781428a0ff692.tar.gz
zig-730428bfd615cab415b2942fc9b781428a0ff692.zip
connect
Signed-off-by: Loris Cro <kappaloris@gmail.com>
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/event/loop.zig10
-rw-r--r--lib/std/net.zig18
-rw-r--r--lib/std/os.zig6
3 files changed, 23 insertions, 11 deletions
diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig
index f44b2f06e4..2dc1d5659e 100644
--- a/lib/std/event/loop.zig
+++ b/lib/std/event/loop.zig
@@ -754,6 +754,16 @@ pub const Loop = struct {
}
}
+ pub fn connect(self: *Loop, sockfd: os.socket_t, sock_addr: *const os.sockaddr, len: os.socklen_t) os.ConnectError!void {
+ os.connect(sockfd, sock_addr, len) catch |err| switch (err) {
+ error.WouldBlock => {
+ self.waitUntilFdWritable(sockfd);
+ return os.getsockoptError(sockfd);
+ },
+ else => return err,
+ };
+ }
+
/// Performs an async `os.open` using a separate thread.
pub fn openZ(self: *Loop, file_path: [*:0]const u8, flags: u32, mode: os.mode_t) os.OpenError!os.fd_t {
var req_node = Request.Node{
diff --git a/lib/std/net.zig b/lib/std/net.zig
index 6b6d234843..928ebbbce5 100644
--- a/lib/std/net.zig
+++ b/lib/std/net.zig
@@ -614,11 +614,11 @@ pub fn connectUnixSocket(path: []const u8) !fs.File {
var addr = try std.net.Address.initUnix(path);
- try os.connect(
- sockfd,
- &addr.any,
- addr.getOsSockLen(),
- );
+ if (std.io.is_async) {
+ try loop.connect(sockfd, &addr.any, addr.getOsSockLen());
+ } else {
+ try os.connect(sockfd, &addr.any, addr.getOsSockLen());
+ }
return fs.File{
.handle = sockfd,
@@ -677,7 +677,13 @@ pub fn tcpConnectToAddress(address: Address) !fs.File {
(if (builtin.os.tag == .windows) 0 else os.SOCK_CLOEXEC);
const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO_TCP);
errdefer os.close(sockfd);
- try os.connect(sockfd, &address.any, address.getOsSockLen());
+
+ if (std.io.is_async) {
+ const loop = std.event.Loop.instance orelse return error.WouldBlock;
+ try loop.connect(sockfd, &address.any, address.getOsSockLen());
+ } else {
+ try os.connect(sockfd, &address.any, address.getOsSockLen());
+ }
return fs.File{ .handle = sockfd };
}
diff --git a/lib/std/os.zig b/lib/std/os.zig
index c5c34d4f40..023c1d5971 100644
--- a/lib/std/os.zig
+++ b/lib/std/os.zig
@@ -3108,11 +3108,7 @@ pub fn connect(sockfd: socket_t, sock_addr: *const sockaddr, len: socklen_t) Con
EADDRINUSE => return error.AddressInUse,
EADDRNOTAVAIL => return error.AddressNotAvailable,
EAFNOSUPPORT => return error.AddressFamilyNotSupported,
- EAGAIN, EINPROGRESS => {
- const loop = std.event.Loop.instance orelse return error.WouldBlock;
- loop.waitUntilFdWritable(sockfd);
- return getsockoptError(sockfd);
- },
+ EAGAIN, EINPROGRESS => return error.WouldBlock,
EALREADY => unreachable, // The socket is nonblocking and a previous connection attempt has not yet been completed.
EBADF => unreachable, // sockfd is not a valid open file descriptor.
ECONNREFUSED => return error.ConnectionRefused,