コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }