diff options
Diffstat (limited to 'src/org/xbill/DNS/NXTRecord.java')
-rw-r--r-- | src/org/xbill/DNS/NXTRecord.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/NXTRecord.java b/src/org/xbill/DNS/NXTRecord.java new file mode 100644 index 0000000..ad04e01 --- /dev/null +++ b/src/org/xbill/DNS/NXTRecord.java @@ -0,0 +1,111 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS; + +import java.io.*; +import java.util.*; + +/** + * Next name - this record contains the following name in an ordered list + * of names in the zone, and a set of types for which records exist for + * this name. The presence of this record in a response signifies a + * failed query for data in a DNSSEC-signed zone. + * + * @author Brian Wellington + */ + +public class NXTRecord extends Record { + +private static final long serialVersionUID = -8851454400765507520L; + +private Name next; +private BitSet bitmap; + +NXTRecord() {} + +Record +getObject() { + return new NXTRecord(); +} + +/** + * Creates an NXT Record from the given data + * @param next The following name in an ordered list of the zone + * @param bitmap The set of type for which records exist at this name +*/ +public +NXTRecord(Name name, int dclass, long ttl, Name next, BitSet bitmap) { + super(name, Type.NXT, dclass, ttl); + this.next = checkName("next", next); + this.bitmap = bitmap; +} + +void +rrFromWire(DNSInput in) throws IOException { + next = new Name(in); + bitmap = new BitSet(); + int bitmapLength = in.remaining(); + for (int i = 0; i < bitmapLength; i++) { + int t = in.readU8(); + for (int j = 0; j < 8; j++) + if ((t & (1 << (7 - j))) != 0) + bitmap.set(i * 8 + j); + } +} + +void +rdataFromString(Tokenizer st, Name origin) throws IOException { + next = st.getName(origin); + bitmap = new BitSet(); + while (true) { + Tokenizer.Token t = st.get(); + if (!t.isString()) + break; + int typecode = Type.value(t.value, true); + if (typecode <= 0 || typecode > 128) + throw st.exception("Invalid type: " + t.value); + bitmap.set(typecode); + } + st.unget(); +} + +/** Converts rdata to a String */ +String +rrToString() { + StringBuffer sb = new StringBuffer(); + sb.append(next); + int length = bitmap.length(); + for (short i = 0; i < length; i++) + if (bitmap.get(i)) { + sb.append(" "); + sb.append(Type.string(i)); + } + return sb.toString(); +} + +/** Returns the next name */ +public Name +getNext() { + return next; +} + +/** Returns the set of types defined for this name */ +public BitSet +getBitmap() { + return bitmap; +} + +void +rrToWire(DNSOutput out, Compression c, boolean canonical) { + next.toWire(out, null, canonical); + int length = bitmap.length(); + for (int i = 0, t = 0; i < length; i++) { + t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0); + if (i % 8 == 7 || i == length - 1) { + out.writeU8(t); + t = 0; + } + } +} + +} |