aboutsummaryrefslogtreecommitdiff
path: root/lib/std/net.zig
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/net.zig')
-rw-r--r--lib/std/net.zig333
1 files changed, 167 insertions, 166 deletions
diff --git a/lib/std/net.zig b/lib/std/net.zig
index e68adc4207..b12fb1932d 100644
--- a/lib/std/net.zig
+++ b/lib/std/net.zig
@@ -5,15 +5,16 @@ const builtin = @import("builtin");
const assert = std.debug.assert;
const net = @This();
const mem = std.mem;
-const os = std.os;
const posix = std.posix;
const fs = std.fs;
const io = std.io;
const native_endian = builtin.target.cpu.arch.endian();
+const native_os = builtin.os.tag;
+const windows = std.os.windows;
// Windows 10 added support for unix sockets in build 17063, redstone 4 is the
// first release to support them.
-pub const has_unix_sockets = switch (builtin.os.tag) {
+pub const has_unix_sockets = switch (native_os) {
.windows => builtin.os.version_range.windows.isAtLeast(.win10_rs4) orelse false,
else => true,
};
@@ -28,14 +29,14 @@ pub const IPParseError = error{
pub const IPv4ParseError = IPParseError || error{NonCanonical};
pub const IPv6ParseError = IPParseError || error{InvalidIpv4Mapping};
-pub const IPv6InterfaceError = os.SocketError || os.IoCtl_SIOCGIFINDEX_Error || error{NameTooLong};
+pub const IPv6InterfaceError = posix.SocketError || posix.IoCtl_SIOCGIFINDEX_Error || error{NameTooLong};
pub const IPv6ResolveError = IPv6ParseError || IPv6InterfaceError;
pub const Address = extern union {
- any: os.sockaddr,
+ any: posix.sockaddr,
in: Ip4Address,
in6: Ip6Address,
- un: if (has_unix_sockets) os.sockaddr.un else void,
+ un: if (has_unix_sockets) posix.sockaddr.un else void,
/// Parse the given IP address string into an Address value.
/// It is recommended to use `resolveIp` instead, to handle
@@ -85,38 +86,38 @@ pub const Address = extern union {
return error.InvalidIPAddressFormat;
}
- pub fn parseExpectingFamily(name: []const u8, family: os.sa_family_t, port: u16) !Address {
+ pub fn parseExpectingFamily(name: []const u8, family: posix.sa_family_t, port: u16) !Address {
switch (family) {
- os.AF.INET => return parseIp4(name, port),
- os.AF.INET6 => return parseIp6(name, port),
- os.AF.UNSPEC => return parseIp(name, port),
+ posix.AF.INET => return parseIp4(name, port),
+ posix.AF.INET6 => return parseIp6(name, port),
+ posix.AF.UNSPEC => return parseIp(name, port),
else => unreachable,
}
}
pub fn parseIp6(buf: []const u8, port: u16) IPv6ParseError!Address {
- return Address{ .in6 = try Ip6Address.parse(buf, port) };
+ return .{ .in6 = try Ip6Address.parse(buf, port) };
}
pub fn resolveIp6(buf: []const u8, port: u16) IPv6ResolveError!Address {
- return Address{ .in6 = try Ip6Address.resolve(buf, port) };
+ return .{ .in6 = try Ip6Address.resolve(buf, port) };
}
pub fn parseIp4(buf: []const u8, port: u16) IPv4ParseError!Address {
- return Address{ .in = try Ip4Address.parse(buf, port) };
+ return .{ .in = try Ip4Address.parse(buf, port) };
}
pub fn initIp4(addr: [4]u8, port: u16) Address {
- return Address{ .in = Ip4Address.init(addr, port) };
+ return .{ .in = Ip4Address.init(addr, port) };
}
pub fn initIp6(addr: [16]u8, port: u16, flowinfo: u32, scope_id: u32) Address {
- return Address{ .in6 = Ip6Address.init(addr, port, flowinfo, scope_id) };
+ return .{ .in6 = Ip6Address.init(addr, port, flowinfo, scope_id) };
}
pub fn initUnix(path: []const u8) !Address {
- var sock_addr = os.sockaddr.un{
- .family = os.AF.UNIX,
+ var sock_addr = posix.sockaddr.un{
+ .family = posix.AF.UNIX,
.path = undefined,
};
@@ -133,8 +134,8 @@ pub const Address = extern union {
/// Asserts that the address is ip4 or ip6.
pub fn getPort(self: Address) u16 {
return switch (self.any.family) {
- os.AF.INET => self.in.getPort(),
- os.AF.INET6 => self.in6.getPort(),
+ posix.AF.INET => self.in.getPort(),
+ posix.AF.INET6 => self.in6.getPort(),
else => unreachable,
};
}
@@ -143,8 +144,8 @@ pub const Address = extern union {
/// Asserts that the address is ip4 or ip6.
pub fn setPort(self: *Address, port: u16) void {
switch (self.any.family) {
- os.AF.INET => self.in.setPort(port),
- os.AF.INET6 => self.in6.setPort(port),
+ posix.AF.INET => self.in.setPort(port),
+ posix.AF.INET6 => self.in6.setPort(port),
else => unreachable,
}
}
@@ -152,10 +153,10 @@ pub const Address = extern union {
/// Asserts that `addr` is an IP address.
/// This function will read past the end of the pointer, with a size depending
/// on the address family.
- pub fn initPosix(addr: *align(4) const os.sockaddr) Address {
+ pub fn initPosix(addr: *align(4) const posix.sockaddr) Address {
switch (addr.family) {
- os.AF.INET => return Address{ .in = Ip4Address{ .sa = @as(*const os.sockaddr.in, @ptrCast(addr)).* } },
- os.AF.INET6 => return Address{ .in6 = Ip6Address{ .sa = @as(*const os.sockaddr.in6, @ptrCast(addr)).* } },
+ posix.AF.INET => return Address{ .in = Ip4Address{ .sa = @as(*const posix.sockaddr.in, @ptrCast(addr)).* } },
+ posix.AF.INET6 => return Address{ .in6 = Ip6Address{ .sa = @as(*const posix.sockaddr.in6, @ptrCast(addr)).* } },
else => unreachable,
}
}
@@ -168,9 +169,9 @@ pub const Address = extern union {
) !void {
if (fmt.len != 0) std.fmt.invalidFmtError(fmt, self);
switch (self.any.family) {
- os.AF.INET => try self.in.format(fmt, options, out_stream),
- os.AF.INET6 => try self.in6.format(fmt, options, out_stream),
- os.AF.UNIX => {
+ posix.AF.INET => try self.in.format(fmt, options, out_stream),
+ posix.AF.INET6 => try self.in6.format(fmt, options, out_stream),
+ posix.AF.UNIX => {
if (!has_unix_sockets) {
unreachable;
}
@@ -187,11 +188,11 @@ pub const Address = extern union {
return mem.eql(u8, a_bytes, b_bytes);
}
- pub fn getOsSockLen(self: Address) os.socklen_t {
+ pub fn getOsSockLen(self: Address) posix.socklen_t {
switch (self.any.family) {
- os.AF.INET => return self.in.getOsSockLen(),
- os.AF.INET6 => return self.in6.getOsSockLen(),
- os.AF.UNIX => {
+ posix.AF.INET => return self.in.getOsSockLen(),
+ posix.AF.INET6 => return self.in6.getOsSockLen(),
+ posix.AF.UNIX => {
if (!has_unix_sockets) {
unreachable;
}
@@ -204,7 +205,7 @@ pub const Address = extern union {
// provide the full buffer size (e.g. getsockname, getpeername, recvfrom, accept).
//
// To access the path, std.mem.sliceTo(&address.un.path, 0) should be used.
- return @as(os.socklen_t, @intCast(@sizeOf(os.sockaddr.un)));
+ return @as(posix.socklen_t, @intCast(@sizeOf(posix.sockaddr.un)));
},
else => unreachable,
@@ -247,7 +248,7 @@ pub const Address = extern union {
posix.SO.REUSEADDR,
&mem.toBytes(@as(c_int, 1)),
);
- switch (builtin.os.tag) {
+ switch (native_os) {
.windows => {},
else => try posix.setsockopt(
sockfd,
@@ -267,7 +268,7 @@ pub const Address = extern union {
};
pub const Ip4Address = extern struct {
- sa: os.sockaddr.in,
+ sa: posix.sockaddr.in,
pub fn parse(buf: []const u8, port: u16) IPv4ParseError!Ip4Address {
var result = Ip4Address{
@@ -330,7 +331,7 @@ pub const Ip4Address = extern struct {
pub fn init(addr: [4]u8, port: u16) Ip4Address {
return Ip4Address{
- .sa = os.sockaddr.in{
+ .sa = posix.sockaddr.in{
.port = mem.nativeToBig(u16, port),
.addr = @as(*align(1) const u32, @ptrCast(&addr)).*,
},
@@ -367,21 +368,21 @@ pub const Ip4Address = extern struct {
});
}
- pub fn getOsSockLen(self: Ip4Address) os.socklen_t {
+ pub fn getOsSockLen(self: Ip4Address) posix.socklen_t {
_ = self;
- return @sizeOf(os.sockaddr.in);
+ return @sizeOf(posix.sockaddr.in);
}
};
pub const Ip6Address = extern struct {
- sa: os.sockaddr.in6,
+ sa: posix.sockaddr.in6,
/// Parse a given IPv6 address string into an Address.
/// Assumes the Scope ID of the address is fully numeric.
/// For non-numeric addresses, see `resolveIp6`.
pub fn parse(buf: []const u8, port: u16) IPv6ParseError!Ip6Address {
var result = Ip6Address{
- .sa = os.sockaddr.in6{
+ .sa = posix.sockaddr.in6{
.scope_id = 0,
.port = mem.nativeToBig(u16, port),
.flowinfo = 0,
@@ -499,7 +500,7 @@ pub const Ip6Address = extern struct {
pub fn resolve(buf: []const u8, port: u16) IPv6ResolveError!Ip6Address {
// TODO: Unify the implementations of resolveIp6 and parseIp6.
var result = Ip6Address{
- .sa = os.sockaddr.in6{
+ .sa = posix.sockaddr.in6{
.scope_id = 0,
.port = mem.nativeToBig(u16, port),
.flowinfo = 0,
@@ -516,7 +517,7 @@ pub const Ip6Address = extern struct {
var abbrv = false;
var scope_id = false;
- var scope_id_value: [os.IFNAMESIZE - 1]u8 = undefined;
+ var scope_id_value: [posix.IFNAMESIZE - 1]u8 = undefined;
var scope_id_index: usize = 0;
for (buf, 0..) |c, i| {
@@ -632,7 +633,7 @@ pub const Ip6Address = extern struct {
pub fn init(addr: [16]u8, port: u16, flowinfo: u32, scope_id: u32) Ip6Address {
return Ip6Address{
- .sa = os.sockaddr.in6{
+ .sa = posix.sockaddr.in6{
.addr = addr,
.port = mem.nativeToBig(u16, port),
.flowinfo = flowinfo,
@@ -702,51 +703,51 @@ pub const Ip6Address = extern struct {
try std.fmt.format(out_stream, "]:{}", .{port});
}
- pub fn getOsSockLen(self: Ip6Address) os.socklen_t {
+ pub fn getOsSockLen(self: Ip6Address) posix.socklen_t {
_ = self;
- return @sizeOf(os.sockaddr.in6);
+ return @sizeOf(posix.sockaddr.in6);
}
};
pub fn connectUnixSocket(path: []const u8) !Stream {
const opt_non_block = 0;
- const sockfd = try os.socket(
- os.AF.UNIX,
- os.SOCK.STREAM | os.SOCK.CLOEXEC | opt_non_block,
+ const sockfd = try posix.socket(
+ posix.AF.UNIX,
+ posix.SOCK.STREAM | posix.SOCK.CLOEXEC | opt_non_block,
0,
);
errdefer Stream.close(.{ .handle = sockfd });
var addr = try std.net.Address.initUnix(path);
- try os.connect(sockfd, &addr.any, addr.getOsSockLen());
+ try posix.connect(sockfd, &addr.any, addr.getOsSockLen());
- return Stream{ .handle = sockfd };
+ return .{ .handle = sockfd };
}
fn if_nametoindex(name: []const u8) IPv6InterfaceError!u32 {
- if (builtin.target.os.tag == .linux) {
- var ifr: os.ifreq = undefined;
- const sockfd = try os.socket(os.AF.UNIX, os.SOCK.DGRAM | os.SOCK.CLOEXEC, 0);
+ if (native_os == .linux) {
+ var ifr: posix.ifreq = undefined;
+ const sockfd = try posix.socket(posix.AF.UNIX, posix.SOCK.DGRAM | posix.SOCK.CLOEXEC, 0);
defer Stream.close(.{ .handle = sockfd });
@memcpy(ifr.ifrn.name[0..name.len], name);
ifr.ifrn.name[name.len] = 0;
// TODO investigate if this needs to be integrated with evented I/O.
- try os.ioctl_SIOCGIFINDEX(sockfd, &ifr);
+ try posix.ioctl_SIOCGIFINDEX(sockfd, &ifr);
- return @as(u32, @bitCast(ifr.ifru.ivalue));
+ return @bitCast(ifr.ifru.ivalue);
}
- if (comptime builtin.target.os.tag.isDarwin()) {
- if (name.len >= os.IFNAMESIZE)
+ if (native_os.isDarwin()) {
+ if (name.len >= posix.IFNAMESIZE)
return error.NameTooLong;
- var if_name: [os.IFNAMESIZE:0]u8 = undefined;
+ var if_name: [posix.IFNAMESIZE:0]u8 = undefined;
@memcpy(if_name[0..name.len], name);
if_name[name.len] = 0;
const if_slice = if_name[0..name.len :0];
- const index = os.system.if_nametoindex(if_slice);
+ const index = std.c.if_nametoindex(if_slice);
if (index == 0)
return error.InterfaceNotFound;
return @as(u32, @bitCast(index));
@@ -786,24 +787,24 @@ pub fn tcpConnectToHost(allocator: mem.Allocator, name: []const u8, port: u16) T
else => return err,
};
}
- return std.os.ConnectError.ConnectionRefused;
+ return posix.ConnectError.ConnectionRefused;
}
-pub const TcpConnectToAddressError = std.os.SocketError || std.os.ConnectError;
+pub const TcpConnectToAddressError = posix.SocketError || posix.ConnectError;
pub fn tcpConnectToAddress(address: Address) TcpConnectToAddressError!Stream {
const nonblock = 0;
- const sock_flags = os.SOCK.STREAM | nonblock |
- (if (builtin.target.os.tag == .windows) 0 else os.SOCK.CLOEXEC);
- const sockfd = try os.socket(address.any.family, sock_flags, os.IPPROTO.TCP);
+ const sock_flags = posix.SOCK.STREAM | nonblock |
+ (if (native_os == .windows) 0 else posix.SOCK.CLOEXEC);
+ const sockfd = try posix.socket(address.any.family, sock_flags, posix.IPPROTO.TCP);
errdefer Stream.close(.{ .handle = sockfd });
- try os.connect(sockfd, &address.any, address.getOsSockLen());
+ try posix.connect(sockfd, &address.any, address.getOsSockLen());
return Stream{ .handle = sockfd };
}
-const GetAddressListError = std.mem.Allocator.Error || std.fs.File.OpenError || std.fs.File.ReadError || std.os.SocketError || std.os.BindError || std.os.SetSockOptError || error{
+const GetAddressListError = std.mem.Allocator.Error || std.fs.File.OpenError || std.fs.File.ReadError || posix.SocketError || posix.BindError || posix.SetSockOptError || error{
// TODO: break this up into error sets from the various underlying functions
TemporaryNameServerFailure,
@@ -844,30 +845,30 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) Get
const arena = result.arena.allocator();
errdefer result.deinit();
- if (builtin.target.os.tag == .windows) {
+ if (native_os == .windows) {
const name_c = try allocator.dupeZ(u8, name);
defer allocator.free(name_c);
const port_c = try std.fmt.allocPrintZ(allocator, "{}", .{port});
defer allocator.free(port_c);
- const ws2_32 = os.windows.ws2_32;
- const hints = os.addrinfo{
+ const ws2_32 = windows.ws2_32;
+ const hints = posix.addrinfo{
.flags = ws2_32.AI.NUMERICSERV,
- .family = os.AF.UNSPEC,
- .socktype = os.SOCK.STREAM,
- .protocol = os.IPPROTO.TCP,
+ .family = posix.AF.UNSPEC,
+ .socktype = posix.SOCK.STREAM,
+ .protocol = posix.IPPROTO.TCP,
.canonname = null,
.addr = null,
.addrlen = 0,
.next = null,
};
- var res: ?*os.addrinfo = null;
+ var res: ?*posix.addrinfo = null;
var first = true;
while (true) {
const rc = ws2_32.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res);
- switch (@as(os.windows.ws2_32.WinsockError, @enumFromInt(@as(u16, @intCast(rc))))) {
- @as(os.windows.ws2_32.WinsockError, @enumFromInt(0)) => break,
+ switch (@as(windows.ws2_32.WinsockError, @enumFromInt(@as(u16, @intCast(rc))))) {
+ @as(windows.ws2_32.WinsockError, @enumFromInt(0)) => break,
.WSATRY_AGAIN => return error.TemporaryNameServerFailure,
.WSANO_RECOVERY => return error.NameServerFailure,
.WSAEAFNOSUPPORT => return error.AddressFamilyNotSupported,
@@ -879,10 +880,10 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) Get
.WSANOTINITIALISED => {
if (!first) return error.Unexpected;
first = false;
- try os.windows.callWSAStartup();
+ try windows.callWSAStartup();
continue;
},
- else => |err| return os.windows.unexpectedWSAError(err),
+ else => |err| return windows.unexpectedWSAError(err),
}
}
defer ws2_32.freeaddrinfo(res);
@@ -923,18 +924,18 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) Get
const port_c = try std.fmt.allocPrintZ(allocator, "{}", .{port});
defer allocator.free(port_c);
- const sys = if (builtin.target.os.tag == .windows) os.windows.ws2_32 else os.system;
- const hints = os.addrinfo{
+ const sys = if (native_os == .windows) windows.ws2_32 else posix.system;
+ const hints = posix.addrinfo{
.flags = sys.AI.NUMERICSERV,
- .family = os.AF.UNSPEC,
- .socktype = os.SOCK.STREAM,
- .protocol = os.IPPROTO.TCP,
+ .family = posix.AF.UNSPEC,
+ .socktype = posix.SOCK.STREAM,
+ .protocol = posix.IPPROTO.TCP,
.canonname = null,
.addr = null,
.addrlen = 0,
.next = null,
};
- var res: ?*os.addrinfo = null;
+ var res: ?*posix.addrinfo = null;
switch (sys.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res)) {
@as(sys.EAI, @enumFromInt(0)) => {},
.ADDRFAMILY => return error.HostLacksNetworkAddresses,
@@ -947,8 +948,8 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) Get
.NONAME => return error.UnknownHostName,
.SERVICE => return error.ServiceUnavailable,
.SOCKTYPE => unreachable, // Invalid socket type requested in hints
- .SYSTEM => switch (os.errno(-1)) {
- else => |e| return os.unexpectedErrno(e),
+ .SYSTEM => switch (posix.errno(-1)) {
+ else => |e| return posix.unexpectedErrno(e),
},
else => unreachable,
}
@@ -983,9 +984,9 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) Get
return result;
}
- if (builtin.target.os.tag == .linux) {
+ if (native_os == .linux) {
const flags = std.c.AI.NUMERICSERV;
- const family = os.AF.UNSPEC;
+ const family = posix.AF.UNSPEC;
var lookup_addrs = std.ArrayList(LookupAddr).init(allocator);
defer lookup_addrs.deinit();
@@ -1026,7 +1027,7 @@ fn linuxLookupName(
addrs: *std.ArrayList(LookupAddr),
canon: *std.ArrayList(u8),
opt_name: ?[]const u8,
- family: os.sa_family_t,
+ family: posix.sa_family_t,
flags: u32,
port: u16,
) !void {
@@ -1066,9 +1067,9 @@ fn linuxLookupName(
// No further processing is needed if there are fewer than 2
// results or if there are only IPv4 results.
- if (addrs.items.len == 1 or family == os.AF.INET) return;
+ if (addrs.items.len == 1 or family == posix.AF.INET) return;
const all_ip4 = for (addrs.items) |addr| {
- if (addr.addr.any.family != os.AF.INET) break false;
+ if (addr.addr.any.family != posix.AF.INET) break false;
} else true;
if (all_ip4) return;
@@ -1081,42 +1082,42 @@ fn linuxLookupName(
// A more idiomatic "ziggy" implementation would be welcome.
for (addrs.items, 0..) |*addr, i| {
var key: i32 = 0;
- var sa6: os.sockaddr.in6 = undefined;
- @memset(@as([*]u8, @ptrCast(&sa6))[0..@sizeOf(os.sockaddr.in6)], 0);
- var da6 = os.sockaddr.in6{
- .family = os.AF.INET6,
+ var sa6: posix.sockaddr.in6 = undefined;
+ @memset(@as([*]u8, @ptrCast(&sa6))[0..@sizeOf(posix.sockaddr.in6)], 0);
+ var da6 = posix.sockaddr.in6{
+ .family = posix.AF.INET6,
.scope_id = addr.addr.in6.sa.scope_id,
.port = 65535,
.flowinfo = 0,
.addr = [1]u8{0} ** 16,
};
- var sa4: os.sockaddr.in = undefined;
- @memset(@as([*]u8, @ptrCast(&sa4))[0..@sizeOf(os.sockaddr.in)], 0);
- var da4 = os.sockaddr.in{
- .family = os.AF.INET,
+ var sa4: posix.sockaddr.in = undefined;
+ @memset(@as([*]u8, @ptrCast(&sa4))[0..@sizeOf(posix.sockaddr.in)], 0);
+ var da4 = posix.sockaddr.in{
+ .family = posix.AF.INET,
.port = 65535,
.addr = 0,
.zero = [1]u8{0} ** 8,
};
- var sa: *align(4) os.sockaddr = undefined;
- var da: *align(4) os.sockaddr = undefined;
- var salen: os.socklen_t = undefined;
- var dalen: os.socklen_t = undefined;
- if (addr.addr.any.family == os.AF.INET6) {
+ var sa: *align(4) posix.sockaddr = undefined;
+ var da: *align(4) posix.sockaddr = undefined;
+ var salen: posix.socklen_t = undefined;
+ var dalen: posix.socklen_t = undefined;
+ if (addr.addr.any.family == posix.AF.INET6) {
da6.addr = addr.addr.in6.sa.addr;
da = @ptrCast(&da6);
- dalen = @sizeOf(os.sockaddr.in6);
+ dalen = @sizeOf(posix.sockaddr.in6);
sa = @ptrCast(&sa6);
- salen = @sizeOf(os.sockaddr.in6);
+ salen = @sizeOf(posix.sockaddr.in6);
} else {
sa6.addr[0..12].* = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff".*;
da6.addr[0..12].* = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff".*;
mem.writeInt(u32, da6.addr[12..], addr.addr.in.sa.addr, native_endian);
da4.addr = addr.addr.in.sa.addr;
da = @ptrCast(&da4);
- dalen = @sizeOf(os.sockaddr.in);
+ dalen = @sizeOf(posix.sockaddr.in);
sa = @ptrCast(&sa4);
- salen = @sizeOf(os.sockaddr.in);
+ salen = @sizeOf(posix.sockaddr.in);
}
const dpolicy = policyOf(da6.addr);
const dscope: i32 = scopeOf(da6.addr);
@@ -1124,13 +1125,13 @@ fn linuxLookupName(
const dprec: i32 = dpolicy.prec;
const MAXADDRS = 3;
var prefixlen: i32 = 0;
- const sock_flags = os.SOCK.DGRAM | os.SOCK.CLOEXEC;
- if (os.socket(addr.addr.any.family, sock_flags, os.IPPROTO.UDP)) |fd| syscalls: {
+ const sock_flags = posix.SOCK.DGRAM | posix.SOCK.CLOEXEC;
+ if (posix.socket(addr.addr.any.family, sock_flags, posix.IPPROTO.UDP)) |fd| syscalls: {
defer Stream.close(.{ .handle = fd });
- os.connect(fd, da, dalen) catch break :syscalls;
+ posix.connect(fd, da, dalen) catch break :syscalls;
key |= DAS_USABLE;
- os.getsockname(fd, sa, &salen) catch break :syscalls;
- if (addr.addr.any.family == os.AF.INET) {
+ posix.getsockname(fd, sa, &salen) catch break :syscalls;
+ if (addr.addr.any.family == posix.AF.INET) {
mem.writeInt(u32, sa6.addr[12..16], sa4.addr, native_endian);
}
if (dscope == @as(i32, scopeOf(sa6.addr))) key |= DAS_MATCHINGSCOPE;
@@ -1267,28 +1268,28 @@ fn addrCmpLessThan(context: void, b: LookupAddr, a: LookupAddr) bool {
fn linuxLookupNameFromNull(
addrs: *std.ArrayList(LookupAddr),
- family: os.sa_family_t,
+ family: posix.sa_family_t,
flags: u32,
port: u16,
) !void {
if ((flags & std.c.AI.PASSIVE) != 0) {
- if (family != os.AF.INET6) {
+ if (family != posix.AF.INET6) {
(try addrs.addOne()).* = LookupAddr{
.addr = Address.initIp4([1]u8{0} ** 4, port),
};
}
- if (family != os.AF.INET) {
+ if (family != posix.AF.INET) {
(try addrs.addOne()).* = LookupAddr{
.addr = Address.initIp6([1]u8{0} ** 16, port, 0, 0),
};
}
} else {
- if (family != os.AF.INET6) {
+ if (family != posix.AF.INET6) {
(try addrs.addOne()).* = LookupAddr{
.addr = Address.initIp4([4]u8{ 127, 0, 0, 1 }, port),
};
}
- if (family != os.AF.INET) {
+ if (family != posix.AF.INET) {
(try addrs.addOne()).* = LookupAddr{
.addr = Address.initIp6(([1]u8{0} ** 15) ++ [1]u8{1}, port, 0, 0),
};
@@ -1300,7 +1301,7 @@ fn linuxLookupNameFromHosts(
addrs: *std.ArrayList(LookupAddr),
canon: *std.ArrayList(u8),
name: []const u8,
- family: os.sa_family_t,
+ family: posix.sa_family_t,
port: u16,
) !void {
const file = fs.openFileAbsoluteZ("/etc/hosts", .{}) catch |err| switch (err) {
@@ -1374,7 +1375,7 @@ fn linuxLookupNameFromDnsSearch(
addrs: *std.ArrayList(LookupAddr),
canon: *std.ArrayList(u8),
name: []const u8,
- family: os.sa_family_t,
+ family: posix.sa_family_t,
port: u16,
) !void {
var rc: ResolvConf = undefined;
@@ -1429,7 +1430,7 @@ fn linuxLookupNameFromDns(
addrs: *std.ArrayList(LookupAddr),
canon: *std.ArrayList(u8),
name: []const u8,
- family: os.sa_family_t,
+ family: posix.sa_family_t,
rc: ResolvConf,
port: u16,
) !void {
@@ -1439,12 +1440,12 @@ fn linuxLookupNameFromDns(
.port = port,
};
const AfRr = struct {
- af: os.sa_family_t,
+ af: posix.sa_family_t,
rr: u8,
};
const afrrs = [_]AfRr{
- AfRr{ .af = os.AF.INET6, .rr = os.RR.A },
- AfRr{ .af = os.AF.INET, .rr = os.RR.AAAA },
+ AfRr{ .af = posix.AF.INET6, .rr = posix.RR.A },
+ AfRr{ .af = posix.AF.INET, .rr = posix.RR.AAAA },
};
var qbuf: [2][280]u8 = undefined;
var abuf: [2][512]u8 = undefined;
@@ -1454,7 +1455,7 @@ fn linuxLookupNameFromDns(
for (afrrs) |afrr| {
if (family != afrr.af) {
- const len = os.res_mkquery(0, name, 1, afrr.rr, &[_]u8{}, null, &qbuf[nq]);
+ const len = posix.res_mkquery(0, name, 1, afrr.rr, &[_]u8{}, null, &qbuf[nq]);
qp[nq] = qbuf[nq][0..len];
nq += 1;
}
@@ -1582,8 +1583,8 @@ fn resMSendRc(
const timeout = 1000 * rc.timeout;
const attempts = rc.attempts;
- var sl: os.socklen_t = @sizeOf(os.sockaddr.in);
- var family: os.sa_family_t = os.AF.INET;
+ var sl: posix.socklen_t = @sizeOf(posix.sockaddr.in);
+ var family: posix.sa_family_t = posix.AF.INET;
var ns_list = std.ArrayList(Address).init(rc.ns.allocator);
defer ns_list.deinit();
@@ -1594,18 +1595,18 @@ fn resMSendRc(
for (rc.ns.items, 0..) |iplit, i| {
ns[i] = iplit.addr;
assert(ns[i].getPort() == 53);
- if (iplit.addr.any.family != os.AF.INET) {
- family = os.AF.INET6;
+ if (iplit.addr.any.family != posix.AF.INET) {
+ family = posix.AF.INET6;
}
}
- const flags = os.SOCK.DGRAM | os.SOCK.CLOEXEC | os.SOCK.NONBLOCK;
- const fd = os.socket(family, flags, 0) catch |err| switch (err) {
+ const flags = posix.SOCK.DGRAM | posix.SOCK.CLOEXEC | posix.SOCK.NONBLOCK;
+ const fd = posix.socket(family, flags, 0) catch |err| switch (err) {
error.AddressFamilyNotSupported => blk: {
// Handle case where system lacks IPv6 support
- if (family == os.AF.INET6) {
- family = os.AF.INET;
- break :blk try os.socket(os.AF.INET, flags, 0);
+ if (family == posix.AF.INET6) {
+ family = posix.AF.INET;
+ break :blk try posix.socket(posix.AF.INET, flags, 0);
}
return err;
},
@@ -1618,33 +1619,33 @@ fn resMSendRc(
// packet which is up to the caller to interpret.
// Convert any IPv4 addresses in a mixed environment to v4-mapped
- if (family == os.AF.INET6) {
- try os.setsockopt(
+ if (family == posix.AF.INET6) {
+ try posix.setsockopt(
fd,
- os.SOL.IPV6,
- os.linux.IPV6.V6ONLY,
+ posix.SOL.IPV6,
+ std.os.linux.IPV6.V6ONLY,
&mem.toBytes(@as(c_int, 0)),
);
for (0..ns.len) |i| {
- if (ns[i].any.family != os.AF.INET) continue;
+ if (ns[i].any.family != posix.AF.INET) continue;
mem.writeInt(u32, ns[i].in6.sa.addr[12..], ns[i].in.sa.addr, native_endian);
ns[i].in6.sa.addr[0..12].* = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff".*;
- ns[i].any.family = os.AF.INET6;
+ ns[i].any.family = posix.AF.INET6;
ns[i].in6.sa.flowinfo = 0;
ns[i].in6.sa.scope_id = 0;
}
- sl = @sizeOf(os.sockaddr.in6);
+ sl = @sizeOf(posix.sockaddr.in6);
}
// Get local address and open/bind a socket
var sa: Address = undefined;
@memset(@as([*]u8, @ptrCast(&sa))[0..@sizeOf(Address)], 0);
sa.any.family = family;
- try os.bind(fd, &sa.any, sl);
+ try posix.bind(fd, &sa.any, sl);
- var pfd = [1]os.pollfd{os.pollfd{
+ var pfd = [1]posix.pollfd{posix.pollfd{
.fd = fd,
- .events = os.POLL.IN,
+ .events = posix.POLL.IN,
.revents = undefined,
}};
const retry_interval = timeout / attempts;
@@ -1663,7 +1664,7 @@ fn resMSendRc(
if (answers[i].len == 0) {
var j: usize = 0;
while (j < ns.len) : (j += 1) {
- _ = os.sendto(fd, queries[i], os.MSG.NOSIGNAL, &ns[j].any, sl) catch undefined;
+ _ = posix.sendto(fd, queries[i], posix.MSG.NOSIGNAL, &ns[j].any, sl) catch undefined;
}
}
}
@@ -1673,12 +1674,12 @@ fn resMSendRc(
// Wait for a response, or until time to retry
const clamped_timeout = @min(@as(u31, std.math.maxInt(u31)), t1 + retry_interval - t2);
- const nevents = os.poll(&pfd, clamped_timeout) catch 0;
+ const nevents = posix.poll(&pfd, clamped_timeout) catch 0;
if (nevents == 0) continue;
while (true) {
var sl_copy = sl;
- const rlen = os.recvfrom(fd, answer_bufs[next], 0, &sa.any, &sl_copy) catch break;
+ const rlen = posix.recvfrom(fd, answer_bufs[next], 0, &sa.any, &sl_copy) catch break;
// Ignore non-identifiable packets
if (rlen < 4) continue;
@@ -1704,7 +1705,7 @@ fn resMSendRc(
0, 3 => {},
2 => if (servfail_retry != 0) {
servfail_retry -= 1;
- _ = os.sendto(fd, queries[i], os.MSG.NOSIGNAL, &ns[j].any, sl) catch undefined;
+ _ = posix.sendto(fd, queries[i], posix.MSG.NOSIGNAL, &ns[j].any, sl) catch undefined;
},
else => continue,
}
@@ -1758,24 +1759,24 @@ fn dnsParse(
fn dnsParseCallback(ctx: dpc_ctx, rr: u8, data: []const u8, packet: []const u8) !void {
switch (rr) {
- os.RR.A => {
+ posix.RR.A => {
if (data.len != 4) return error.InvalidDnsARecord;
const new_addr = try ctx.addrs.addOne();
new_addr.* = LookupAddr{
.addr = Address.initIp4(data[0..4].*, ctx.port),
};
},
- os.RR.AAAA => {
+ posix.RR.AAAA => {
if (data.len != 16) return error.InvalidDnsAAAARecord;
const new_addr = try ctx.addrs.addOne();
new_addr.* = LookupAddr{
.addr = Address.initIp6(data[0..16].*, ctx.port, 0, 0),
};
},
- os.RR.CNAME => {
+ posix.RR.CNAME => {
var tmp: [256]u8 = undefined;
// Returns len of compressed name. strlen to get canon name.
- _ = try os.dn_expand(packet, data, &tmp);
+ _ = try posix.dn_expand(packet, data, &tmp);
const canon_name = mem.sliceTo(&tmp, 0);
if (isValidHostName(canon_name)) {
ctx.canon.items.len = 0;
@@ -1792,14 +1793,14 @@ pub const Stream = struct {
handle: posix.socket_t,
pub fn close(s: Stream) void {
- switch (builtin.os.tag) {
- .windows => std.os.windows.closesocket(s.handle) catch unreachable,
+ switch (native_os) {
+ .windows => windows.closesocket(s.handle) catch unreachable,
else => posix.close(s.handle),
}
}
- pub const ReadError = os.ReadError;
- pub const WriteError = os.WriteError;
+ pub const ReadError = posix.ReadError;
+ pub const WriteError = posix.WriteError;
pub const Reader = io.Reader(Stream, ReadError, read);
pub const Writer = io.Writer(Stream, WriteError, write);
@@ -1813,22 +1814,22 @@ pub const Stream = struct {
}
pub fn read(self: Stream, buffer: []u8) ReadError!usize {
- if (builtin.os.tag == .windows) {
- return os.windows.ReadFile(self.handle, buffer, null);
+ if (native_os == .windows) {
+ return windows.ReadFile(self.handle, buffer, null);
}
- return os.read(self.handle, buffer);
+ return posix.read(self.handle, buffer);
}
- pub fn readv(s: Stream, iovecs: []const os.iovec) ReadError!usize {
- if (builtin.os.tag == .windows) {
+ pub fn readv(s: Stream, iovecs: []const posix.iovec) ReadError!usize {
+ if (native_os == .windows) {
// TODO improve this to use ReadFileScatter
if (iovecs.len == 0) return @as(usize, 0);
const first = iovecs[0];
- return os.windows.ReadFile(s.handle, first.iov_base[0..first.iov_len], null);
+ return windows.ReadFile(s.handle, first.iov_base[0..first.iov_len], null);
}
- return os.readv(s.handle, iovecs);
+ return posix.readv(s.handle, iovecs);
}
/// Returns the number of bytes read. If the number read is smaller than
@@ -1858,11 +1859,11 @@ pub const Stream = struct {
/// file system thread instead of non-blocking. It needs to be reworked to properly
/// use non-blocking I/O.
pub fn write(self: Stream, buffer: []const u8) WriteError!usize {
- if (builtin.os.tag == .windows) {
- return os.windows.WriteFile(self.handle, buffer, null);
+ if (native_os == .windows) {
+ return windows.WriteFile(self.handle, buffer, null);
}
- return os.write(self.handle, buffer);
+ return posix.write(self.handle, buffer);
}
pub fn writeAll(self: Stream, bytes: []const u8) WriteError!void {
@@ -1874,15 +1875,15 @@ pub const Stream = struct {
/// See https://github.com/ziglang/zig/issues/7699
/// See equivalent function: `std.fs.File.writev`.
- pub fn writev(self: Stream, iovecs: []const os.iovec_const) WriteError!usize {
- return os.writev(self.handle, iovecs);
+ pub fn writev(self: Stream, iovecs: []const posix.iovec_const) WriteError!usize {
+ return posix.writev(self.handle, iovecs);
}
/// The `iovecs` parameter is mutable because this function needs to mutate the fields in
/// order to handle partial writes from the underlying OS layer.
/// See https://github.com/ziglang/zig/issues/7699
/// See equivalent function: `std.fs.File.writevAll`.
- pub fn writevAll(self: Stream, iovecs: []os.iovec_const) WriteError!void {
+ pub fn writevAll(self: Stream, iovecs: []posix.iovec_const) WriteError!void {
if (iovecs.len == 0) return;
var i: usize = 0;