package org.exobel.routerkeygen.utils.dns; /* * Java Network Programming, Second Edition * Merlin Hughes, Michael Shoffner, Derek Hamner * Manning Publications Company; ISBN 188477749X * * http://nitric.com/jnp/ * * Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner; * all rights reserved; see license.txt for details. */ import java.io.*; class DNSInputStream extends ByteArrayInputStream { private final DataInputStream dataIn; public DNSInputStream(byte[] data, int off, int len) { super(data, off, len); dataIn = new DataInputStream(this); } public int readByte() throws IOException { return dataIn.readUnsignedByte(); } public int readShort() throws IOException { return dataIn.readUnsignedShort(); } private long readInt() throws IOException { return dataIn.readInt() & 0xffffffffL; } private String readString() throws IOException { int len; try { len = readByte(); } catch (EOFException e) { len = 0; } if (len == 0) { return ""; } else { byte[] buffer = new byte[len]; dataIn.readFully(buffer); return new String(buffer, "latin1"); } } public String readDomainName() throws IOException { if (pos >= count) throw new EOFException("EOF reading domain name"); if ((buf[pos] & 0xc0) == 0) { String label = readString(); if (label.length() > 0) { String tail = readDomainName(); if (tail.length() > 0) label = label + '.' + tail; } return label; } else { if ((buf[pos] & 0xc0) != 0xc0) throw new IOException("Invalid domain name compression offset"); int offset = readShort() & 0x3fff; DNSInputStream dnsIn = new DNSInputStream(buf, offset, buf.length - offset); return dnsIn.readDomainName(); } } public DNSRR readRR() throws IOException { String rrName = readDomainName(); int rrType = readShort(); int rrClass = readShort(); long rrTTL = readInt(); int rrDataLen = readShort(); DNSInputStream rrDNSIn = new DNSInputStream(buf, pos, rrDataLen); pos += rrDataLen; try { String myName = getClass().getName(); int periodIndex = myName.lastIndexOf('.'); String myPackage = myName.substring(0, 1 + periodIndex); Class<?> theClass = Class.forName (myPackage + DNS.typeName(rrType)); DNSRR rr = (DNSRR) theClass.newInstance(); if (rrType != DNS.TYPE_TXT) rr.init(rrName, rrType, rrClass, rrTTL, rrDNSIn); return rr; } catch (ClassNotFoundException ex) { throw new IOException("Unknown DNSRR (type " + DNS.typeName(rrType) + " (" + rrType + "))"); } catch (IllegalAccessException ex) { throw new IOException("Access error creating DNSRR (type " + DNS.typeName(rrType) + ')'); } catch (InstantiationException ex) { throw new IOException("Instantiation error creating DNSRR (type " + DNS.typeName(rrType) + ')'); } } }