diff options
Diffstat (limited to 'lib/std/net.zig')
| -rw-r--r-- | lib/std/net.zig | 333 |
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; |
