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 {...@@ -668,7 +668,7 @@ pub const VTable = struct {
668 netRead: *const fn (?*anyopaque, src: net.Stream, data: [][]u8) net.Stream.Reader.Error!usize,668 netRead: *const fn (?*anyopaque, src: net.Stream, data: [][]u8) net.Stream.Reader.Error!usize,
669 netWrite: *const fn (?*anyopaque, dest: net.Stream, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,669 netWrite: *const fn (?*anyopaque, dest: net.Stream, header: []const u8, data: []const []const u8, splat: usize) net.Stream.Writer.Error!usize,
670 netClose: *const fn (?*anyopaque, stream: net.Stream) void,670 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,
672 netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,672 netInterfaceName: *const fn (?*anyopaque, net.Interface) net.Interface.NameError!net.Interface.Name,
673};673};
674674
lib/std/Io/Threaded.zig+4-1
...@@ -1124,7 +1124,10 @@ fn netClose(userdata: ?*anyopaque, stream: Io.net.Stream) void {...@@ -1124,7 +1124,10 @@ fn netClose(userdata: ?*anyopaque, stream: Io.net.Stream) void {
1124 return net_stream.close();1124 return net_stream.close();
1125}1125}
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 {
1128 const pool: *Pool = @ptrCast(@alignCast(userdata));1131 const pool: *Pool = @ptrCast(@alignCast(userdata));
1129 try pool.checkCancel();1132 try pool.checkCancel();
11301133
lib/std/Io/net.zig+1-1
...@@ -538,7 +538,7 @@ pub const Interface = struct {...@@ -538,7 +538,7 @@ pub const Interface = struct {
538 } || Io.UnexpectedError || Io.Cancelable;538 } || Io.UnexpectedError || Io.Cancelable;
539539
540 /// Corresponds to "if_nametoindex" in libc.540 /// 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 {
542 return io.vtable.netInterfaceNameResolve(io.userdata, n);542 return io.vtable.netInterfaceNameResolve(io.userdata, n);
543 }543 }
544 };544 };
lib/std/Io/net/HostName.zig+7-7
...@@ -542,7 +542,7 @@ pub const ResolvConf = struct {...@@ -542,7 +542,7 @@ pub const ResolvConf = struct {
542 error.NotDir,542 error.NotDir,
543 error.AccessDenied,543 error.AccessDenied,
544 => {544 => {
545 try addNumeric(&rc, "127.0.0.1", 53);545 try addNumeric(&rc, io, "127.0.0.1", 53);
546 return rc;546 return rc;
547 },547 },
548548
...@@ -552,7 +552,7 @@ pub const ResolvConf = struct {...@@ -552,7 +552,7 @@ pub const ResolvConf = struct {
552552
553 var line_buf: [512]u8 = undefined;553 var line_buf: [512]u8 = undefined;
554 var file_reader = file.reader(io, &line_buf);554 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) {
556 error.ReadFailed => return file_reader.err.?,556 error.ReadFailed => return file_reader.err.?,
557 else => |e| return e,557 else => |e| return e,
558 };558 };
...@@ -562,7 +562,7 @@ pub const ResolvConf = struct {...@@ -562,7 +562,7 @@ pub const ResolvConf = struct {
562 const Directive = enum { options, nameserver, domain, search };562 const Directive = enum { options, nameserver, domain, search };
563 const Option = enum { ndots, attempts, timeout };563 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 {
566 while (reader.takeSentinel('\n')) |line_with_comment| {566 while (reader.takeSentinel('\n')) |line_with_comment| {
567 const line = line: {567 const line = line: {
568 var split = std.mem.splitScalar(u8, line_with_comment, '#');568 var split = std.mem.splitScalar(u8, line_with_comment, '#');
...@@ -588,7 +588,7 @@ pub const ResolvConf = struct {...@@ -588,7 +588,7 @@ pub const ResolvConf = struct {
588 },588 },
589 .nameserver => {589 .nameserver => {
590 const ip_txt = line_it.next() orelse continue;590 const ip_txt = line_it.next() orelse continue;
591 try addNumeric(rc, ip_txt, 53);591 try addNumeric(rc, io, ip_txt, 53);
592 },592 },
593 .domain, .search => {593 .domain, .search => {
594 const rest = line_it.rest();594 const rest = line_it.rest();
...@@ -602,13 +602,13 @@ pub const ResolvConf = struct {...@@ -602,13 +602,13 @@ pub const ResolvConf = struct {
602 }602 }
603603
604 if (rc.nameservers_len == 0) {604 if (rc.nameservers_len == 0) {
605 try addNumeric(rc, "127.0.0.1", 53);605 try addNumeric(rc, io, "127.0.0.1", 53);
606 }606 }
607 }607 }
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 {
610 assert(rc.nameservers_len < rc.nameservers_buffer.len);610 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);
612 rc.nameservers_len += 1;612 rc.nameservers_len += 1;
613 }613 }
614614