public Resolution(ExtendedResolver eres, Message query) { List l = eres.resolvers; resolvers = (Resolver[]) l.toArray(new Resolver[l.size()]); if (eres.loadBalance) { int nresolvers = resolvers.length; /* * Note: this is not synchronized, since the * worst thing that can happen is a random * ordering, which is ok. */ int start = eres.lbStart++ % nresolvers; if (eres.lbStart > nresolvers) eres.lbStart %= nresolvers; if (start > 0) { Resolver[] shuffle = new Resolver[nresolvers]; for (int i = 0; i < nresolvers; i++) { int pos = (i + start) % nresolvers; shuffle[i] = resolvers[pos]; } resolvers = shuffle; } } sent = new int[resolvers.length]; inprogress = new Object[resolvers.length]; retries = eres.retries; this.query = query; }
public static Record[] getRecords(String namestr, short type, short dclass, byte cred) { Message query; Message response; Record question; Record[] answers; int answerCount = 0, i = 0; Enumeration e; Name name = new Name(namestr); /*System.out.println("lookup of " + name + " " + Type.string(type));*/ if (!Type.isRR(type) && type != Type.ANY) return null; if (res == null) { try { eres = new ExtendedResolver(); } catch (UnknownHostException uhe) { System.out.println("Failed to initialize resolver"); System.exit(-1); } } if (cache == null) cache = new Cache(); CacheResponse cached = cache.lookupRecords(name, type, dclass, cred); /*System.out.println(cached);*/ if (cached.isSuccessful()) { RRset rrset = cached.answer(); answerCount = rrset.size(); e = rrset.rrs(); } else if (cached.isNegative()) { answerCount = 0; e = null; } else { question = Record.newRecord(name, type, dclass); query = Message.newQuery(question); if (res != null) response = res.send(query); else response = eres.send(query); short rcode = response.getHeader().getRcode(); if (rcode == Rcode.NOERROR || rcode == Rcode.NXDOMAIN) cache.addMessage(response); if (rcode != Rcode.NOERROR) return null; e = response.getSection(Section.ANSWER); while (e.hasMoreElements()) { Record r = (Record) e.nextElement(); if (matchType(r.getType(), type)) answerCount++; } e = response.getSection(Section.ANSWER); } if (answerCount == 0) return null; answers = new Record[answerCount]; while (e.hasMoreElements()) { Record r = (Record) e.nextElement(); if (matchType(r.getType(), type)) answers[i++] = r; } return answers; }