public DnsResourceRecord GetRecord(ResourceRecordInfo info) { if (info == null) { throw new ArgumentNullException(nameof(info)); } var oldIndex = _reader.Index; DnsResourceRecord result; switch (info.RecordType) { case ResourceRecordType.A: result = new ARecord(info, _reader.ReadIPAddress()); break; case ResourceRecordType.NS: result = new NsRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.CNAME: result = new CNameRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.SOA: result = ResolveSoaRecord(info); break; case ResourceRecordType.MB: result = new MbRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MG: result = new MgRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MR: result = new MrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.NULL: result = new NullRecord(info, _reader.ReadBytes(info.RawDataLength).ToArray()); break; case ResourceRecordType.WKS: result = ResolveWksRecord(info); break; case ResourceRecordType.PTR: result = new PtrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.HINFO: result = new HInfoRecord(info, _reader.ReadStringWithLengthPrefix(), _reader.ReadStringWithLengthPrefix()); break; case ResourceRecordType.MINFO: result = new MInfoRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.MX: result = ResolveMXRecord(info); break; case ResourceRecordType.TXT: result = ResolveTXTRecord(info); break; case ResourceRecordType.RP: result = new RpRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.AFSDB: result = new AfsDbRecord(info, (AfsType)_reader.ReadUInt16NetworkOrder(), _reader.ReadDnsName()); break; case ResourceRecordType.AAAA: result = new AaaaRecord(info, _reader.ReadIPv6Address()); break; case ResourceRecordType.SRV: result = ResolveSrvRecord(info); break; case ResourceRecordType.OPT: result = ResolveOptRecord(info); break; case ResourceRecordType.URI: result = ResolveUriRecord(info); break; case ResourceRecordType.CAA: result = ResolveCaaRecord(info); break; case ResourceRecordType.SSHFP: result = ResolveSshfpRecord(info); break; default: result = new UnknownRecord(info, _reader.ReadBytes(info.RawDataLength).ToArray()); break; } // sanity check _reader.SanitizeResult(oldIndex + info.RawDataLength, info.RawDataLength); return(result); }
public DnsResourceRecord GetRecord(ResourceRecordInfo info) { if (info == null) { throw new ArgumentNullException(nameof(info)); } var oldIndex = _reader.Index; DnsResourceRecord result; switch (info.RecordType) { case ResourceRecordType.A: result = new ARecord(info, _reader.ReadIPAddress()); break; case ResourceRecordType.NS: result = new NsRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.CNAME: result = new CNameRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.SOA: result = ResolveSoaRecord(info); break; case ResourceRecordType.MB: result = new MbRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MG: result = new MgRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.MR: result = new MrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.NULL: result = new NullRecord(info, _reader.ReadBytes(info.RawDataLength).ToArray()); break; case ResourceRecordType.WKS: result = ResolveWksRecord(info); break; case ResourceRecordType.PTR: result = new PtrRecord(info, _reader.ReadDnsName()); break; case ResourceRecordType.HINFO: result = new HInfoRecord(info, _reader.ReadString(), _reader.ReadString()); break; case ResourceRecordType.MINFO: result = new MInfoRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.MX: result = ResolveMXRecord(info); break; case ResourceRecordType.TXT: result = ResolveTXTRecord(info); break; case ResourceRecordType.RP: result = new RpRecord(info, _reader.ReadDnsName(), _reader.ReadDnsName()); break; case ResourceRecordType.AFSDB: result = new AfsDbRecord(info, (AfsType)_reader.ReadUInt16NetworkOrder(), _reader.ReadDnsName()); break; case ResourceRecordType.AAAA: result = new AaaaRecord(info, _reader.ReadIPv6Address()); break; case ResourceRecordType.SRV: result = ResolveSrvRecord(info); break; case ResourceRecordType.OPT: result = ResolveOptRecord(info); break; case ResourceRecordType.URI: result = ResolveUriRecord(info); break; case ResourceRecordType.CAA: result = ResolveCaaRecord(info); break; default: // update reader index because we don't read full data for the empty record _reader.Index += info.RawDataLength; result = new EmptyRecord(info); break; } // sanity check if (_reader.Index != oldIndex + info.RawDataLength) { throw new InvalidOperationException("Record reader index out of sync."); } return(result); }
public override int Compare(DnsRecord x, DnsRecord y) { if (x == y) { return(0); } if (x == null) { return(-1); } if (y == null) { return(1); } int res = 0; if ((res = x.Type.ToString().CompareTo(y.Type.ToString())) == 0 && (res = x.Owner.CompareTo(y.Owner)) == 0) { switch (x.Type) { case DnsRecordType.NS: res = ((NSRecord)x).Domain.CompareTo(((NSRecord)y).Domain); break; case DnsRecordType.CName: res = ((CNameRecord)x).Canonical.CompareTo(((CNameRecord)y).Canonical); break; case DnsRecordType.DN: res = ((DNRecord)x).Target.CompareTo(((DNRecord)y).Target); break; case DnsRecordType.Ptr: res = ((PtrRecord)x).Domain.CompareTo(((PtrRecord)y).Domain); break; case DnsRecordType.HInfo: HInfoRecord xHInfo = (HInfoRecord)x; HInfoRecord yHInfo = (HInfoRecord)y; if ((res = xHInfo.Cpu.CompareTo(yHInfo.Cpu)) == 0) { res = xHInfo.Os.CompareTo(yHInfo.Os); } break; case DnsRecordType.MInfo: MInfoRecord xMInfo = (MInfoRecord)x; MInfoRecord yMInfo = (MInfoRecord)y; if ((res = xMInfo.RMbox.CompareTo(yMInfo.RMbox)) == 0) { res = xMInfo.EMbox.CompareTo(yMInfo.EMbox); } break; case DnsRecordType.MX: MXRecord xMx = (MXRecord)x; MXRecord yMx = (MXRecord)y; if ((res = xMx.CompareTo(yMx)) == 0) { res = xMx.Exchange.CompareTo(yMx.Exchange); } break; case DnsRecordType.MB: res = ((MBRecord)x).Mailbox.CompareTo(((MBRecord)y).Mailbox); break; case DnsRecordType.MG: res = ((MGRecord)x).Mailbox.CompareTo(((MGRecord)y).Mailbox); break; case DnsRecordType.MR: res = ((MRRecord)x).NewMailbox.CompareTo(((MRRecord)y).NewMailbox); break; case DnsRecordType.Txt: res = ((TxtRecord)x).Text.CompareTo(((TxtRecord)y).Text); break; case DnsRecordType.Spf: res = ((SpfRecord)x).Specification.CompareTo(((SpfRecord)y).Specification); break; case DnsRecordType.Srv: SrvRecord xSrv = (SrvRecord)x; SrvRecord ySrv = (SrvRecord)y; if ((res = xSrv.CompareTo(ySrv)) == 0) { res = xSrv.Target.CompareTo(ySrv.Target); } break; default: res = 0; break; } } return(res); }