Io.net: use resolve for IPv6

/etc/resolv.conf might have IPv6 addresses with scope in it, so this is
needed.
This commit is contained in:
Andrew Kelley 2025-09-21 23:39:14 -07:00
parent d776a6bbbe
commit e7c9df9fb0
4 changed files with 13 additions and 10 deletions

View file

@ -668,7 +668,7 @@ pub const VTable = struct {
netRead: *const fn (?*anyopaque, src: net.Stream, data: [][]u8) net.Stream.Reader.Error!usize,
netWrite: *const fn (?*anyopaque, dest: net.Stream, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,
netClose: *const fn (?*anyopaque, stream: net.Stream) void,
netInterfaceNameResolve: *const fn (?*anyopaque, net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,
netInterfaceNameResolve: *const fn (?*anyopaque, *const net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,
netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,
};

View file

@ -1124,7 +1124,10 @@ fn netClose(userdata: ?*anyopaque, stream: Io.net.Stream) void {
return net_stream.close();
}
fn netInterfaceNameResolve(userdata: ?*anyopaque, name: Io.net.Interface.Name) Io.net.Interface.Name.ResolveError!Io.net.Interface {
fn netInterfaceNameResolve(
userdata: ?*anyopaque,
name: *const Io.net.Interface.Name,
) Io.net.Interface.Name.ResolveError!Io.net.Interface {
const pool: *Pool = @ptrCast(@alignCast(userdata));
try pool.checkCancel();

View file

@ -538,7 +538,7 @@ pub const Interface = struct {
} || Io.UnexpectedError || Io.Cancelable;
/// Corresponds to "if_nametoindex" in libc.
pub fn resolve(n: []const u8, io: Io) ResolveError!Interface {
pub fn resolve(n: *const Name, io: Io) ResolveError!Interface {
return io.vtable.netInterfaceNameResolve(io.userdata, n);
}
};

View file

@ -542,7 +542,7 @@ pub const ResolvConf = struct {
error.NotDir,
error.AccessDenied,
=> {
try addNumeric(&rc, "127.0.0.1", 53);
try addNumeric(&rc, io, "127.0.0.1", 53);
return rc;
},
@ -552,7 +552,7 @@ pub const ResolvConf = struct {
var line_buf: [512]u8 = undefined;
var file_reader = file.reader(io, &line_buf);
parse(&rc, &file_reader.interface) catch |err| switch (err) {
parse(&rc, io, &file_reader.interface) catch |err| switch (err) {
error.ReadFailed => return file_reader.err.?,
else => |e| return e,
};
@ -562,7 +562,7 @@ pub const ResolvConf = struct {
const Directive = enum { options, nameserver, domain, search };
const Option = enum { ndots, attempts, timeout };
fn parse(rc: *ResolvConf, reader: *Io.Reader) !void {
fn parse(rc: *ResolvConf, io: Io, reader: *Io.Reader) !void {
while (reader.takeSentinel('\n')) |line_with_comment| {
const line = line: {
var split = std.mem.splitScalar(u8, line_with_comment, '#');
@ -588,7 +588,7 @@ pub const ResolvConf = struct {
},
.nameserver => {
const ip_txt = line_it.next() orelse continue;
try addNumeric(rc, ip_txt, 53);
try addNumeric(rc, io, ip_txt, 53);
},
.domain, .search => {
const rest = line_it.rest();
@ -602,13 +602,13 @@ pub const ResolvConf = struct {
}
if (rc.nameservers_len == 0) {
try addNumeric(rc, "127.0.0.1", 53);
try addNumeric(rc, io, "127.0.0.1", 53);
}
}
fn addNumeric(rc: *ResolvConf, name: []const u8, port: u16) !void {
fn addNumeric(rc: *ResolvConf, io: Io, name: []const u8, port: u16) !void {
assert(rc.nameservers_len < rc.nameservers_buffer.len);
rc.nameservers_buffer[rc.nameservers_len] = try .parse(name, port);
rc.nameservers_buffer[rc.nameservers_len] = try .resolve(io, name, port);
rc.nameservers_len += 1;
}