Commit e7c9df9fb0

Andrew Kelley <andrew@ziglang.org>
2025-09-22 08:39:14
Io.net: use resolve for IPv6
/etc/resolv.conf might have IPv6 addresses with scope in it, so this is needed.
1 parent d776a6b
Changed files (4)
lib/std/Io/net/HostName.zig
@@ -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;
     }
 
lib/std/Io/net.zig
@@ -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);
         }
     };
lib/std/Io/Threaded.zig
@@ -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();
 
lib/std/Io.zig
@@ -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,
 };