| ... | ... | @@ -13481,10 +13481,14 @@ fn netLookupFallible( |
| 13481 | 13481 | if (is_windows) { |
| 13482 | 13482 | if (options.family == null) { |
| 13483 | 13483 | if (IpAddress.parseIp4(name, options.port)) |addr| { |
| 13484 | | try resolved.putAll(t_io, &.{ |
| 13485 | | .{ .address = addr }, |
| 13486 | | .{ .canonical_name = copyCanon(options.canonical_name_buffer, name) }, |
| 13487 | | }); |
| 13484 | if (copyCanon(options.canonical_name_buffer, name)) |canon| { |
| 13485 | try resolved.putAll(t_io, &.{ |
| 13486 | .{ .address = addr }, |
| 13487 | .{ .canonical_name = canon }, |
| 13488 | }); |
| 13489 | } else { |
| 13490 | try resolved.putOne(t_io, .{ .address = addr }); |
| 13491 | } |
| 13488 | 13492 | return; |
| 13489 | 13493 | } else |_| {} |
| 13490 | 13494 | } |
| ... | ... | @@ -13608,20 +13612,28 @@ fn netLookupFallible( |
| 13608 | 13612 | if (native_os == .linux) { |
| 13609 | 13613 | if (options.family != .ip4) { |
| 13610 | 13614 | if (IpAddress.parseIp6(name, options.port)) |addr| { |
| 13611 | | try resolved.putAll(t_io, &.{ |
| 13612 | | .{ .address = addr }, |
| 13613 | | .{ .canonical_name = copyCanon(options.canonical_name_buffer, name) }, |
| 13614 | | }); |
| 13615 | if (copyCanon(options.canonical_name_buffer, name)) |canon| { |
| 13616 | try resolved.putAll(t_io, &.{ |
| 13617 | .{ .address = addr }, |
| 13618 | .{ .canonical_name = canon }, |
| 13619 | }); |
| 13620 | } else { |
| 13621 | try resolved.putOne(t_io, .{ .address = addr }); |
| 13622 | } |
| 13615 | 13623 | return; |
| 13616 | 13624 | } else |_| {} |
| 13617 | 13625 | } |
| 13618 | 13626 | |
| 13619 | 13627 | if (options.family != .ip6) { |
| 13620 | 13628 | if (IpAddress.parseIp4(name, options.port)) |addr| { |
| 13621 | | try resolved.putAll(t_io, &.{ |
| 13622 | | .{ .address = addr }, |
| 13623 | | .{ .canonical_name = copyCanon(options.canonical_name_buffer, name) }, |
| 13624 | | }); |
| 13629 | if (copyCanon(options.canonical_name_buffer, name)) |canon| { |
| 13630 | try resolved.putAll(t_io, &.{ |
| 13631 | .{ .address = addr }, |
| 13632 | .{ .canonical_name = canon }, |
| 13633 | }); |
| 13634 | } else { |
| 13635 | try resolved.putOne(t_io, .{ .address = addr }); |
| 13636 | } |
| 13625 | 13637 | return; |
| 13626 | 13638 | } else |_| {} |
| 13627 | 13639 | } |
| ... | ... | @@ -13652,11 +13664,13 @@ fn netLookupFallible( |
| 13652 | 13664 | results_buffer[results_index] = .{ .address = .{ .ip4 = .loopback(options.port) } }; |
| 13653 | 13665 | results_index += 1; |
| 13654 | 13666 | } |
| 13655 | | const canon_name = "localhost"; |
| 13656 | | const canon_name_dest = options.canonical_name_buffer[0..canon_name.len]; |
| 13657 | | canon_name_dest.* = canon_name.*; |
| 13658 | | results_buffer[results_index] = .{ .canonical_name = .{ .bytes = canon_name_dest } }; |
| 13659 | | results_index += 1; |
| 13667 | if (options.canonical_name_buffer) |buf| { |
| 13668 | const canon_name = "localhost"; |
| 13669 | const canon_name_dest = buf[0..canon_name.len]; |
| 13670 | canon_name_dest.* = canon_name.*; |
| 13671 | results_buffer[results_index] = .{ .canonical_name = .{ .bytes = canon_name_dest } }; |
| 13672 | results_index += 1; |
| 13673 | } |
| 13660 | 13674 | try resolved.putAll(t_io, results_buffer[0..results_index]); |
| 13661 | 13675 | return; |
| 13662 | 13676 | } |
| ... | ... | @@ -13688,7 +13702,7 @@ fn netLookupFallible( |
| 13688 | 13702 | const port_c = std.fmt.bufPrintZ(&port_buffer, "{d}", .{options.port}) catch unreachable; |
| 13689 | 13703 | |
| 13690 | 13704 | const hints: posix.addrinfo = .{ |
| 13691 | | .flags = .{ .CANONNAME = options.request_canonical_name, .NUMERICSERV = true }, |
| 13705 | .flags = .{ .CANONNAME = options.canonical_name_buffer != null, .NUMERICSERV = true }, |
| 13692 | 13706 | .family = posix.AF.UNSPEC, |
| 13693 | 13707 | .socktype = posix.SOCK.STREAM, |
| 13694 | 13708 | .protocol = posix.IPPROTO.TCP, |
| ... | ... | @@ -13745,9 +13759,9 @@ fn netLookupFallible( |
| 13745 | 13759 | } |
| 13746 | 13760 | } |
| 13747 | 13761 | if (canon_name) |n| { |
| 13748 | | try resolved.putOne(t_io, .{ |
| 13749 | | .canonical_name = copyCanon(options.canonical_name_buffer, std.mem.sliceTo(n, 0)), |
| 13750 | | }); |
| 13762 | if (copyCanon(options.canonical_name_buffer, std.mem.sliceTo(n, 0))) |canon| { |
| 13763 | try resolved.putOne(t_io, .{ .canonical_name = canon }); |
| 13764 | } |
| 13751 | 13765 | } |
| 13752 | 13766 | return; |
| 13753 | 13767 | } |
| ... | ... | @@ -14268,12 +14282,14 @@ fn lookupDnsSearch( |
| 14268 | 14282 | // both provides the desired default canonical name (if the requested |
| 14269 | 14283 | // name is not a CNAME record) and serves as a buffer for passing the |
| 14270 | 14284 | // full requested name to `lookupDns`. |
| 14271 | | @memcpy(options.canonical_name_buffer[0..canon_name.len], canon_name); |
| 14272 | | options.canonical_name_buffer[canon_name.len] = '.'; |
| 14285 | var local_buf: [HostName.max_len]u8 = undefined; |
| 14286 | const canon_buf = options.canonical_name_buffer orelse &local_buf; |
| 14287 | @memcpy(canon_buf[0..canon_name.len], canon_name); |
| 14288 | canon_buf[canon_name.len] = '.'; |
| 14273 | 14289 | var it = std.mem.tokenizeAny(u8, search, " \t"); |
| 14274 | 14290 | while (it.next()) |token| { |
| 14275 | | @memcpy(options.canonical_name_buffer[canon_name.len + 1 ..][0..token.len], token); |
| 14276 | | const lookup_canon_name = options.canonical_name_buffer[0 .. canon_name.len + 1 + token.len]; |
| 14291 | @memcpy(canon_buf[canon_name.len + 1 ..][0..token.len], token); |
| 14292 | const lookup_canon_name = canon_buf[0 .. canon_name.len + 1 + token.len]; |
| 14277 | 14293 | if (t.lookupDns(lookup_canon_name, &rc, resolved, options)) |result| { |
| 14278 | 14294 | return result; |
| 14279 | 14295 | } else |err| switch (err) { |
| ... | ... | @@ -14282,7 +14298,7 @@ fn lookupDnsSearch( |
| 14282 | 14298 | } |
| 14283 | 14299 | } |
| 14284 | 14300 | |
| 14285 | | const lookup_canon_name = options.canonical_name_buffer[0..canon_name.len]; |
| 14301 | const lookup_canon_name = canon_buf[0..canon_name.len]; |
| 14286 | 14302 | return t.lookupDns(lookup_canon_name, &rc, resolved, options); |
| 14287 | 14303 | } |
| 14288 | 14304 | |
| ... | ... | @@ -14464,14 +14480,23 @@ fn lookupDns( |
| 14464 | 14480 | addresses_len += 1; |
| 14465 | 14481 | }, |
| 14466 | 14482 | .CNAME => { |
| 14467 | | _, canonical_name = HostName.expand(record.packet, record.data_off, options.canonical_name_buffer) catch |
| 14468 | | return error.InvalidDnsCnameRecord; |
| 14483 | if (options.canonical_name_buffer) |buf| { |
| 14484 | _, canonical_name = HostName.expand( |
| 14485 | record.packet, |
| 14486 | record.data_off, |
| 14487 | buf, |
| 14488 | ) catch return error.InvalidDnsCnameRecord; |
| 14489 | } |
| 14469 | 14490 | }, |
| 14470 | 14491 | _ => continue, |
| 14471 | 14492 | }; |
| 14472 | 14493 | } |
| 14473 | 14494 | |
| 14474 | | try resolved.putOne(t_io, .{ .canonical_name = canonical_name orelse .{ .bytes = lookup_canon_name } }); |
| 14495 | if (options.canonical_name_buffer != null) { |
| 14496 | try resolved.putOne(t_io, .{ |
| 14497 | .canonical_name = canonical_name orelse .{ .bytes = lookup_canon_name }, |
| 14498 | }); |
| 14499 | } |
| 14475 | 14500 | if (addresses_len == 0) return error.NoAddressReturned; |
| 14476 | 14501 | } |
| 14477 | 14502 | |
| ... | ... | @@ -14552,13 +14577,15 @@ fn lookupHostsReader( |
| 14552 | 14577 | } else continue; |
| 14553 | 14578 | |
| 14554 | 14579 | if (canonical_name == null) { |
| 14555 | | if (HostName.init(first_name_text.?)) |name_text| { |
| 14556 | | if (name_text.bytes.len <= options.canonical_name_buffer.len) { |
| 14557 | | const canonical_name_dest = options.canonical_name_buffer[0..name_text.bytes.len]; |
| 14558 | | @memcpy(canonical_name_dest, name_text.bytes); |
| 14559 | | canonical_name = .{ .bytes = canonical_name_dest }; |
| 14560 | | } |
| 14561 | | } else |_| {} |
| 14580 | if (options.canonical_name_buffer) |buf| { |
| 14581 | if (HostName.init(first_name_text.?)) |name_text| { |
| 14582 | if (name_text.bytes.len <= buf.len) { |
| 14583 | const canonical_name_dest = buf[0..name_text.bytes.len]; |
| 14584 | @memcpy(canonical_name_dest, name_text.bytes); |
| 14585 | canonical_name = .{ .bytes = canonical_name_dest }; |
| 14586 | } |
| 14587 | } else |_| {} |
| 14588 | } |
| 14562 | 14589 | } |
| 14563 | 14590 | |
| 14564 | 14591 | if (options.family != .ip6) { |
| ... | ... | @@ -14652,17 +14679,23 @@ const LookupDnsWindows = struct { |
| 14652 | 14679 | }); |
| 14653 | 14680 | }, |
| 14654 | 14681 | }; |
| 14655 | | if (lookup_dns.results.pQueryRecords) |record| try lookup_dns.resolved.putOne(t_io, .{ |
| 14656 | | .canonical_name = .{ .bytes = lookup_dns.options.canonical_name_buffer[0..std.unicode.wtf16LeToWtf8( |
| 14657 | | lookup_dns.options.canonical_name_buffer, |
| 14658 | | std.mem.span(@as([*:0]const windows.WCHAR, @ptrCast(@alignCast(record.pName)))), |
| 14659 | | )] }, |
| 14660 | | }); |
| 14682 | if (lookup_dns.results.pQueryRecords) |record| { |
| 14683 | if (lookup_dns.options.canonical_name_buffer) |buf| { |
| 14684 | const name_wtf16 = std.mem.span( |
| 14685 | @as([*:0]const windows.WCHAR, @ptrCast(@alignCast(record.pName))), |
| 14686 | ); |
| 14687 | const len = std.unicode.wtf16LeToWtf8(buf, name_wtf16); |
| 14688 | try lookup_dns.resolved.putOne(t_io, .{ |
| 14689 | .canonical_name = .{ .bytes = buf[0..len] }, |
| 14690 | }); |
| 14691 | } |
| 14692 | } |
| 14661 | 14693 | } |
| 14662 | 14694 | }; |
| 14663 | 14695 | |
| 14664 | | fn copyCanon(canonical_name_buffer: *[HostName.max_len]u8, name: []const u8) HostName { |
| 14665 | | const dest = canonical_name_buffer[0..name.len]; |
| 14696 | fn copyCanon(canonical_name_buffer: ?*[HostName.max_len]u8, name: []const u8) ?HostName { |
| 14697 | const buf = canonical_name_buffer orelse return null; |
| 14698 | const dest = buf[0..name.len]; |
| 14666 | 14699 | @memcpy(dest, name); |
| 14667 | 14700 | return .{ .bytes = dest }; |
| 14668 | 14701 | } |