diff options
Diffstat (limited to 'src/org/xbill/DNS/A6Record.java')
-rw-r--r-- | src/org/xbill/DNS/A6Record.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/A6Record.java b/src/org/xbill/DNS/A6Record.java new file mode 100644 index 0000000..a1c613a --- /dev/null +++ b/src/org/xbill/DNS/A6Record.java @@ -0,0 +1,127 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS; + +import java.io.*; +import java.net.*; + +/** + * A6 Record - maps a domain name to an IPv6 address (experimental) + * + * @author Brian Wellington + */ + +public class A6Record extends Record { + +private static final long serialVersionUID = -8815026887337346789L; + +private int prefixBits; +private InetAddress suffix; +private Name prefix; + +A6Record() {} + +Record +getObject() { + return new A6Record(); +} + +/** + * Creates an A6 Record from the given data + * @param prefixBits The number of bits in the address prefix + * @param suffix The address suffix + * @param prefix The name of the prefix + */ +public +A6Record(Name name, int dclass, long ttl, int prefixBits, + InetAddress suffix, Name prefix) +{ + super(name, Type.A6, dclass, ttl); + this.prefixBits = checkU8("prefixBits", prefixBits); + if (suffix != null && Address.familyOf(suffix) != Address.IPv6) + throw new IllegalArgumentException("invalid IPv6 address"); + this.suffix = suffix; + if (prefix != null) + this.prefix = checkName("prefix", prefix); +} + +void +rrFromWire(DNSInput in) throws IOException { + prefixBits = in.readU8(); + int suffixbits = 128 - prefixBits; + int suffixbytes = (suffixbits + 7) / 8; + if (prefixBits < 128) { + byte [] bytes = new byte[16]; + in.readByteArray(bytes, 16 - suffixbytes, suffixbytes); + suffix = InetAddress.getByAddress(bytes); + } + if (prefixBits > 0) + prefix = new Name(in); +} + +void +rdataFromString(Tokenizer st, Name origin) throws IOException { + prefixBits = st.getUInt8(); + if (prefixBits > 128) { + throw st.exception("prefix bits must be [0..128]"); + } else if (prefixBits < 128) { + String s = st.getString(); + try { + suffix = Address.getByAddress(s, Address.IPv6); + } + catch (UnknownHostException e) { + throw st.exception("invalid IPv6 address: " + s); + } + } + if (prefixBits > 0) + prefix = st.getName(origin); +} + +/** Converts rdata to a String */ +String +rrToString() { + StringBuffer sb = new StringBuffer(); + sb.append(prefixBits); + if (suffix != null) { + sb.append(" "); + sb.append(suffix.getHostAddress()); + } + if (prefix != null) { + sb.append(" "); + sb.append(prefix); + } + return sb.toString(); +} + +/** Returns the number of bits in the prefix */ +public int +getPrefixBits() { + return prefixBits; +} + +/** Returns the address suffix */ +public InetAddress +getSuffix() { + return suffix; +} + +/** Returns the address prefix */ +public Name +getPrefix() { + return prefix; +} + +void +rrToWire(DNSOutput out, Compression c, boolean canonical) { + out.writeU8(prefixBits); + if (suffix != null) { + int suffixbits = 128 - prefixBits; + int suffixbytes = (suffixbits + 7) / 8; + byte [] data = suffix.getAddress(); + out.writeByteArray(data, 16 - suffixbytes, suffixbytes); + } + if (prefix != null) + prefix.toWire(out, null, canonical); +} + +} |