// returns only results applicable to name and resolves CNAME entries func validRecs(r *syscall.DNSRecord, dnstype uint16, name string) []*syscall.DNSRecord { cname := syscall.StringToUTF16Ptr(name) if dnstype != syscall.DNS_TYPE_CNAME { cname = resolveCNAME(cname, r) } rec := make([]*syscall.DNSRecord, 0, 10) for p := r; p != nil; p = p.Next { if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer { continue } if p.Type != dnstype { continue } if !syscall.DnsNameCompare(cname, p.Name) { continue } rec = append(rec, p) } return rec }
// returns the last CNAME in chain func resolveCNAME(name *uint16, r *syscall.DNSRecord) *uint16 { // limit cname resolving to 10 in case of a infinite CNAME loop Cname: for cnameloop := 0; cnameloop < 10; cnameloop++ { for p := r; p != nil; p = p.Next { if p.Dw&dnsSectionMask != syscall.DnsSectionAnswer { continue } if p.Type != syscall.DNS_TYPE_CNAME { continue } if !syscall.DnsNameCompare(name, p.Name) { continue } name = (*syscall.DNSPTRData)(unsafe.Pointer(&r.Data[0])).Host continue Cname } break } return name }