linuxLookupNameFromDns
Function parameters
Parameters
- addrs:*ArrayList(LookupAddr)
- canon:*ArrayList(u8)
- name:[]const u8
- family:posix.sa_family_t
- port:u16
Type definitions in this namespace
Types
Functions in this namespace
Functions
- tcpConnectToHost
- All memory allocated with `allocator` will be freed before this function returns.
- getAddressList
- Call `AddressList.deinit` on the result.
Error sets in this namespace
Error Sets
= switch (native_os) { .windows => builtin.os.version_range.windows.isAtLeast(.win10_rs4) orelse false, .wasi => false, else => true, }
Values
- has_unix_sockets
- = switch (native_os) { .windows => builtin.os.version_range.windows.isAtLeast(.win10_rs4) orelse false, .wasi => false, else => true, }
Source
Implementation
fn linuxLookupNameFromDns(
gpa: Allocator,
addrs: *ArrayList(LookupAddr),
canon: *ArrayList(u8),
name: []const u8,
family: posix.sa_family_t,
rc: ResolvConf,
port: u16,
) !void {
const ctx: dpc_ctx = .{
.gpa = gpa,
.addrs = addrs,
.canon = canon,
.port = port,
};
const AfRr = struct {
af: posix.sa_family_t,
rr: u8,
};
const afrrs = [_]AfRr{
.{ .af = posix.AF.INET6, .rr = posix.RR.A },
.{ .af = posix.AF.INET, .rr = posix.RR.AAAA },
};
var qbuf: [2][280]u8 = undefined;
var abuf: [2][512]u8 = undefined;
var qp: [2][]const u8 = undefined;
const apbuf = [2][]u8{ &abuf[0], &abuf[1] };
var nq: usize = 0;
for (afrrs) |afrr| {
if (family != afrr.af) {
const len = posix.res_mkquery(0, name, 1, afrr.rr, &[_]u8{}, null, &qbuf[nq]);
qp[nq] = qbuf[nq][0..len];
nq += 1;
}
}
var ap = [2][]u8{ apbuf[0], apbuf[1] };
ap[0].len = 0;
ap[1].len = 0;
try rc.resMSendRc(qp[0..nq], ap[0..nq], apbuf[0..nq]);
var i: usize = 0;
while (i < nq) : (i += 1) {
dnsParse(ap[i], ctx, dnsParseCallback) catch {};
}
if (addrs.items.len != 0) return;
if (ap[0].len < 4 or (ap[0][3] & 15) == 2) return error.TemporaryNameServerFailure;
if ((ap[0][3] & 15) == 0) return error.UnknownHostName;
if ((ap[0][3] & 15) == 3) return;
return error.NameServerFailure;
}