aboutsummaryrefslogtreecommitdiff
path: root/src/org/xbill/DNS/NXTRecord.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/xbill/DNS/NXTRecord.java')
-rw-r--r--src/org/xbill/DNS/NXTRecord.java111
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;
+ }
+ }
+}
+
+}