Exemplo n.º 1
0
        public static ResourceRecord FromByteArray(byte[] data, int payloadBase, int offset, out int size)
        {
            int origOffset = offset;

            ResourceRecord rr = new ResourceRecord();

            int nameDataSize;

            rr.name = DnsName.FromByteArray(data, payloadBase, offset, out nameDataSize);
            offset += nameDataSize;

            rr.meta = Serialization.Deserialize <Meta>(data, offset, Marshal.SizeOf <Meta>());
            offset += Marshal.SizeOf <Meta>();

            //the use of pointer complicates things
            int recordDataReadSize = 0;

            switch ((RecordType)rr.meta.rType)
            {
            case RecordType.A:
                rr.data            = ResourceData.Address.FromByteArray(data, offset);
                recordDataReadSize = rr.data.Size;
                break;

            case RecordType.NS:
            case RecordType.PTR:
            case RecordType.CNAME:
                rr.data = ResourceData.NameEntry.FromByteArray((RecordType)rr.meta.rType, data, payloadBase, offset, out recordDataReadSize);
                break;

            case RecordType.MX:
                rr.data = ResourceData.MailExchange.FromByteArray(data, payloadBase, offset, out recordDataReadSize);
                break;

            case RecordType.SOA:
                rr.data = ResourceData.SOA.FromByteArray(data, payloadBase, offset, out recordDataReadSize);
                break;

            case RecordType.TXT:
                rr.data            = ResourceData.Text.FromByteArray(data, offset, rr.meta.rdLength);
                recordDataReadSize = rr.data.Size;
                break;

            default:
                rr.data            = ResourceData.Unknown.FromByteArray((UInt16)rr.meta.rType, data, offset, rr.meta.rdLength);
                recordDataReadSize = rr.data.Size;
                break;
            }
            offset += recordDataReadSize;

            size = offset - origOffset;
            return(rr);
        }
Exemplo n.º 2
0
        public static Question FromByteArray(byte[] arr, int payloadBase, int offset, out int size)
        {
            Question ret = new Question();

            int nameDataSize;

            ret.name = DnsName.FromByteArray(arr, payloadBase, offset, out nameDataSize);
            offset  += nameDataSize;

            ret.meta = Serialization.Deserialize <Meta>(arr, offset, 4);

            size = 4 + nameDataSize;
            return(ret);
        }
Exemplo n.º 3
0
        public static DnsName FromByteArray(byte[] arr, int payloadBase, int offset, out int size)
        {
            //these variables are used for size calculation
            int  origIncOffset   = offset;
            int  origOffset      = offset;
            bool pointerFollowed = false;

            DnsName       ret = new DnsName();
            int           cmpLen;
            List <String> components = new List <string>();

            while (true)
            {
                cmpLen = arr[offset++];
                if (cmpLen >= 192)
                {
                    //this is a pointer entry
                    int newOffset = ((cmpLen & 63) << 8) | arr[offset++];
                    if (!pointerFollowed)
                    {
                        origIncOffset   = offset;
                        pointerFollowed = true;
                    }
                    offset = newOffset + payloadBase;
                }
                else
                {
                    components.Add(Encoding.ASCII.GetString(arr, offset, cmpLen));
                    offset += cmpLen;
                }
                if (cmpLen == 0)
                {
                    break;
                }
            }
            ret.domainComponents = components.ToArray();

            ret.CalculateSize();

            size = (pointerFollowed ? origIncOffset : offset) - origOffset;
            return(ret);
        }
Exemplo n.º 4
0
 public Question()
 {
     meta.qClass = 1; //fixed to "IN"
     name        = new DnsName();
 }