Skip to content

Commit 95c7cf3

Browse files
author
bwelling
committed
- Add support for binding clients to local addresses when using
a SimpleResolver. Also add the -b option to the dig program to test this. (based on a patch by Bruno Dillenseger) git-svn-id: http://svn.code.sf.net/p/dnsjava/code/trunk@1472 c76caeb1-94fd-44dd-870f-0c9d92034fc1
1 parent 70b5ac8 commit 95c7cf3

5 files changed

Lines changed: 103 additions & 28 deletions

File tree

Changelog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
7/19/2005
2+
- Add support for binding clients to local addresses when using
3+
a SimpleResolver. Also add the -b option to the dig program
4+
to test this. (based on a patch by Bruno Dillenseger)
5+
16
7/5/2005
27
- Add support to ResolverConfig for using the undocumented
38
sun.net.dns.ResolverConfiguration class to determine the list

dig.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
22

33
import java.io.*;
4+
import java.net.*;
45
import org.xbill.DNS.*;
56

67
/** @author Brian Wellington <bwelling@xbill.org> */
@@ -58,7 +59,7 @@ public class dig {
5859
Message query, response;
5960
Record rec;
6061
Record opt = null;
61-
Resolver res = null;
62+
SimpleResolver res = null;
6263
boolean printQuery = false;
6364
long startTime, endTime;
6465

@@ -94,14 +95,12 @@ public class dig {
9495

9596
if (server != null)
9697
res = new SimpleResolver(server);
97-
else if (type == Type.AXFR)
98-
res = new SimpleResolver();
9998
else
100-
res = new ExtendedResolver();
99+
res = new SimpleResolver();
101100

102101
while (argv[arg].startsWith("-") && argv[arg].length() > 1) {
103102
switch (argv[arg].charAt(1)) {
104-
case 'p':
103+
case 'p':
105104
String portStr;
106105
int port;
107106
if (argv[arg].length() > 2)
@@ -116,7 +115,24 @@ else if (type == Type.AXFR)
116115
res.setPort(port);
117116
break;
118117

119-
case 'k':
118+
case 'b':
119+
String addrStr;
120+
if (argv[arg].length() > 2)
121+
addrStr = argv[arg].substring(2);
122+
else
123+
addrStr = argv[++arg];
124+
InetAddress addr;
125+
try {
126+
addr = InetAddress.getByName(addrStr);
127+
}
128+
catch (Exception e) {
129+
System.out.println("Invalid address");
130+
return;
131+
}
132+
res.setLocalAddress(addr);
133+
break;
134+
135+
case 'k':
120136
String key;
121137
if (argv[arg].length() > 2)
122138
key = argv[arg].substring(2);
@@ -125,15 +141,15 @@ else if (type == Type.AXFR)
125141
res.setTSIGKey(TSIG.fromString(key));
126142
break;
127143

128-
case 't':
144+
case 't':
129145
res.setTCP(true);
130146
break;
131147

132-
case 'i':
148+
case 'i':
133149
res.setIgnoreTruncation(true);
134150
break;
135151

136-
case 'e':
152+
case 'e':
137153
String ednsStr;
138154
int edns;
139155
if (argv[arg].length() > 2)
@@ -150,16 +166,16 @@ else if (type == Type.AXFR)
150166
res.setEDNS(edns);
151167
break;
152168

153-
case 'd':
169+
case 'd':
154170
opt = new OPTRecord((short)1280, (byte)0,
155171
(byte)0, ExtendedFlags.DO);
156172
break;
157173

158-
case 'q':
174+
case 'q':
159175
printQuery = true;
160176
break;
161177

162-
default:
178+
default:
163179
System.out.print("Invalid option: ");
164180
System.out.println(argv[arg]);
165181
}
@@ -172,7 +188,7 @@ else if (type == Type.AXFR)
172188
usage();
173189
}
174190
if (res == null)
175-
res = new ExtendedResolver();
191+
res = new SimpleResolver();
176192

177193
rec = Record.newRecord(name, type, dclass);
178194
query = Message.newQuery(rec);

org/xbill/DNS/SimpleResolver.java

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public class SimpleResolver implements Resolver {
2323
/** The default port to send queries to */
2424
public static final int DEFAULT_PORT = 53;
2525

26-
private InetAddress addr;
27-
private int port = DEFAULT_PORT;
26+
private InetSocketAddress address;
27+
private InetSocketAddress localAddress;
2828
private boolean useTCP, ignoreTruncation;
2929
private byte EDNSlevel = -1;
3030
private TSIG tsig;
@@ -48,10 +48,12 @@ public class SimpleResolver implements Resolver {
4848
if (hostname == null)
4949
hostname = defaultResolver;
5050
}
51+
InetAddress addr;
5152
if (hostname.equals("0"))
5253
addr = InetAddress.getLocalHost();
5354
else
5455
addr = InetAddress.getByName(hostname);
56+
address = new InetSocketAddress(addr, DEFAULT_PORT);
5557
}
5658

5759
/**
@@ -67,7 +69,7 @@ public class SimpleResolver implements Resolver {
6769

6870
InetSocketAddress
6971
getAddress() {
70-
return new InetSocketAddress(addr, port);
72+
return address;
7173
}
7274

7375
/** Sets the default host (initially localhost) to query */
@@ -78,7 +80,27 @@ public class SimpleResolver implements Resolver {
7880

7981
public void
8082
setPort(int port) {
81-
this.port = port;
83+
address = new InetSocketAddress(address.getAddress(), port);
84+
}
85+
86+
public void
87+
setAddress(InetAddress addr) {
88+
address = new InetSocketAddress(addr, address.getPort());
89+
}
90+
91+
public void
92+
setAddress(InetSocketAddress addr) {
93+
address = addr;
94+
}
95+
96+
public void
97+
setLocalAddress(InetSocketAddress addr) {
98+
localAddress = addr;
99+
}
100+
101+
public void
102+
setLocalAddress(InetAddress addr) {
103+
localAddress = new InetSocketAddress(addr, 0);
82104
}
83105

84106
public void
@@ -183,8 +205,9 @@ public class SimpleResolver implements Resolver {
183205
public Message
184206
send(Message query) throws IOException {
185207
if (Options.check("verbose"))
186-
System.err.println("Sending to " + addr.getHostAddress() +
187-
":" + port);
208+
System.err.println("Sending to " +
209+
address.getAddress().getHostAddress() +
210+
":" + address.getPort());
188211

189212
if (query.getHeader().getOpcode() == Opcode.QUERY) {
190213
Record question = query.getQuestion();
@@ -200,17 +223,18 @@ public class SimpleResolver implements Resolver {
200223
byte [] out = query.toWire(Message.MAXLENGTH);
201224
int udpSize = maxUDPSize(query);
202225
boolean tcp = false;
203-
SocketAddress sa = new InetSocketAddress(addr, port);
204226
long endTime = System.currentTimeMillis() + timeoutValue;
205227
do {
206228
byte [] in;
207229

208230
if (useTCP || out.length > udpSize)
209231
tcp = true;
210232
if (tcp)
211-
in = TCPClient.sendrecv(sa, out, endTime);
233+
in = TCPClient.sendrecv(localAddress, address, out,
234+
endTime);
212235
else
213-
in = UDPClient.sendrecv(sa, out, udpSize, endTime);
236+
in = UDPClient.sendrecv(localAddress, address, out,
237+
udpSize, endTime);
214238

215239
/*
216240
* Check that the response is long enough.
@@ -283,8 +307,7 @@ public class SimpleResolver implements Resolver {
283307
private Message
284308
sendAXFR(Message query) throws IOException {
285309
Name qname = query.getQuestion().getName();
286-
SocketAddress sockaddr = new InetSocketAddress(addr, port);
287-
ZoneTransferIn xfrin = ZoneTransferIn.newAXFR(qname, sockaddr, tsig);
310+
ZoneTransferIn xfrin = ZoneTransferIn.newAXFR(qname, address, tsig);
288311
xfrin.setTimeout(getTimeout());
289312
try {
290313
xfrin.run();

org/xbill/DNS/TCPClient.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ final class TCPClient extends Client {
1414
super(SocketChannel.open(), endTime);
1515
}
1616

17+
void
18+
bind(SocketAddress addr) throws IOException {
19+
SocketChannel channel = (SocketChannel) key.channel();
20+
channel.socket().bind(addr);
21+
}
22+
1723
void
1824
connect(SocketAddress addr) throws IOException {
1925
SocketChannel channel = (SocketChannel) key.channel();
@@ -96,10 +102,14 @@ final class TCPClient extends Client {
96102
}
97103

98104
static byte []
99-
sendrecv(SocketAddress addr, byte [] data, long endTime) throws IOException {
105+
sendrecv(SocketAddress local, SocketAddress remote, byte [] data, long endTime)
106+
throws IOException
107+
{
100108
TCPClient client = new TCPClient(endTime);
101109
try {
102-
client.connect(addr);
110+
if (local != null)
111+
client.bind(local);
112+
client.connect(remote);
103113
client.send(data);
104114
return client.recv();
105115
}
@@ -108,4 +118,9 @@ final class TCPClient extends Client {
108118
}
109119
}
110120

121+
static byte []
122+
sendrecv(SocketAddress addr, byte [] data, long endTime) throws IOException {
123+
return sendrecv(null, addr, data, endTime);
124+
}
125+
111126
}

org/xbill/DNS/UDPClient.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ final class UDPClient extends Client {
1414
super(DatagramChannel.open(), endTime);
1515
}
1616

17+
void
18+
bind(SocketAddress addr) throws IOException {
19+
DatagramChannel channel = (DatagramChannel) key.channel();
20+
channel.socket().bind(addr);
21+
}
22+
1723
void
1824
connect(SocketAddress addr) throws IOException {
1925
DatagramChannel channel = (DatagramChannel) key.channel();
@@ -51,12 +57,15 @@ final class UDPClient extends Client {
5157
}
5258

5359
static byte []
54-
sendrecv(SocketAddress addr, byte [] data, int max, long endTime)
60+
sendrecv(SocketAddress local, SocketAddress remote, byte [] data, int max,
61+
long endTime)
5562
throws IOException
5663
{
5764
UDPClient client = new UDPClient(endTime);
5865
try {
59-
client.connect(addr);
66+
if (local != null)
67+
client.bind(local);
68+
client.connect(remote);
6069
client.send(data);
6170
return client.recv(max);
6271
}
@@ -65,4 +74,11 @@ final class UDPClient extends Client {
6574
}
6675
}
6776

77+
static byte []
78+
sendrecv(SocketAddress addr, byte [] data, int max, long endTime)
79+
throws IOException
80+
{
81+
return sendrecv(null, addr, data, max, endTime);
82+
}
83+
6884
}

0 commit comments

Comments
 (0)