authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-21 23:39:14-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-02 16:30:59-07:00
log888bf35ab0bd6a248c2bcccd0dc670b33c328641
tree6817da411c14f8bca1e93265277fa43df143c473
parentdac7ae1e438bcd9d5051fc53874002ee06278466

Io.net: use resolve for IPv6

/etc/resolv.conf might have IPv6 addresses with scope in it, so this is needed.

4 files changed, 13 insertions(+), 10 deletions(-)

lib/std/Io.zig+1-1
......@@ -668,7 +668,7 @@ pub const VTable = struct {
668668 netRead: *const fn (?*anyopaque, src: net.Stream, data: [][]u8) net.Stream.Reader.Error!usize,
669669 netWrite: *const fn (?*anyopaque, dest: net.Stream, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,
670670 netClose: *const fn (?*anyopaque, stream: net.Stream) void,
671 netInterfaceNameResolve: *const fn (?*anyopaque, net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,
671 netInterfaceNameResolve: *const fn (?*anyopaque, *const net.Interface.Name) net.Interface.Name.ResolveError!net.Interface,
672672 netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,
673673};
674674
lib/std/Io/Threaded.zig+4-1
......@@ -1124,7 +1124,10 @@ fn netClose(userdata: ?*anyopaque, stream: Io.net.Stream) void {
11241124 return net_stream.close();
11251125}
11261126
1127fn netInterfaceNameResolve(userdata: ?*anyopaque, name: Io.net.Interface.Name) Io.net.Interface.Name.ResolveError!Io.net.Interface {
1127fn netInterfaceNameResolve(
1128 userdata: ?*anyopaque,
1129 name: *const Io.net.Interface.Name,
1130) Io.net.Interface.Name.ResolveError!Io.net.Interface {
11281131 const pool: *Pool = @ptrCast(@alignCast(userdata));
11291132 try pool.checkCancel();
11301133
lib/std/Io/net.zig+1-1
......@@ -538,7 +538,7 @@ pub const Interface = struct {
538538 } || Io.UnexpectedError || Io.Cancelable;
539539
540540 /// Corresponds to "if_nametoindex" in libc.
541 pub fn resolve(n: []const u8, io: Io) ResolveError!Interface {
541 pub fn resolve(n: *const Name, io: Io) ResolveError!Interface {
542542 return io.vtable.netInterfaceNameResolve(io.userdata, n);
543543 }
544544 };
lib/std/Io/net/HostName.zig+7-7
......@@ -542,7 +542,7 @@ pub const ResolvConf = struct {
542542 error.NotDir,
543543 error.AccessDenied,
544544 => {
545 try addNumeric(&rc, "127.0.0.1", 53);
545 try addNumeric(&rc, io, "127.0.0.1", 53);
546546 return rc;
547547 },
548548
......@@ -552,7 +552,7 @@ pub const ResolvConf = struct {
552552
553553 var line_buf: [512]u8 = undefined;
554554 var file_reader = file.reader(io, &line_buf);
555 parse(&rc, &file_reader.interface) catch |err| switch (err) {
555 parse(&rc, io, &file_reader.interface) catch |err| switch (err) {
556556 error.ReadFailed => return file_reader.err.?,
557557 else => |e| return e,
558558 };
......@@ -562,7 +562,7 @@ pub const ResolvConf = struct {
562562 const Directive = enum { options, nameserver, domain, search };
563563 const Option = enum { ndots, attempts, timeout };
564564
565 fn parse(rc: *ResolvConf, reader: *Io.Reader) !void {
565 fn parse(rc: *ResolvConf, io: Io, reader: *Io.Reader) !void {
566566 while (reader.takeSentinel('\n')) |line_with_comment| {
567567 const line = line: {
568568 var split = std.mem.splitScalar(u8, line_with_comment, '#');
......@@ -588,7 +588,7 @@ pub const ResolvConf = struct {
588588 },
589589 .nameserver => {
590590 const ip_txt = line_it.next() orelse continue;
591 try addNumeric(rc, ip_txt, 53);
591 try addNumeric(rc, io, ip_txt, 53);
592592 },
593593 .domain, .search => {
594594 const rest = line_it.rest();
......@@ -602,13 +602,13 @@ pub const ResolvConf = struct {
602602 }
603603
604604 if (rc.nameservers_len == 0) {
605 try addNumeric(rc, "127.0.0.1", 53);
605 try addNumeric(rc, io, "127.0.0.1", 53);
606606 }
607607 }
608608
609 fn addNumeric(rc: *ResolvConf, name: []const u8, port: u16) !void {
609 fn addNumeric(rc: *ResolvConf, io: Io, name: []const u8, port: u16) !void {
610610 assert(rc.nameservers_len < rc.nameservers_buffer.len);
611 rc.nameservers_buffer[rc.nameservers_len] = try .parse(name, port);
611 rc.nameservers_buffer[rc.nameservers_len] = try .resolve(io, name, port);
612612 rc.nameservers_len += 1;
613613 }
614614