equal
deleted
inserted
replaced
23 * questions. |
23 * questions. |
24 */ |
24 */ |
25 |
25 |
26 package jdk.dns.client.internal; |
26 package jdk.dns.client.internal; |
27 |
27 |
28 import jdk.dns.client.AddressFamily; |
|
29 import jdk.dns.client.internal.util.ReloadTracker; |
28 import jdk.dns.client.internal.util.ReloadTracker; |
30 import sun.net.util.IPAddressUtil; |
29 import sun.net.util.IPAddressUtil; |
31 |
30 |
32 import java.net.InetAddress; |
31 import java.net.InetAddress; |
|
32 import java.net.ProtocolFamily; |
33 import java.net.UnknownHostException; |
33 import java.net.UnknownHostException; |
34 import java.nio.charset.StandardCharsets; |
34 import java.nio.charset.StandardCharsets; |
35 import java.nio.file.Files; |
35 import java.nio.file.Files; |
36 import java.nio.file.Path; |
36 import java.nio.file.Path; |
37 import java.nio.file.Paths; |
37 import java.nio.file.Paths; |
64 |
64 |
65 void loadHostsAddresses() { |
65 void loadHostsAddresses() { |
66 LOCK.readLock().lock(); |
66 LOCK.readLock().lock(); |
67 var rsf = HOSTS_FILE_TRACKER.getReloadStatus(); |
67 var rsf = HOSTS_FILE_TRACKER.getReloadStatus(); |
68 try { |
68 try { |
69 if (!HOSTS_FILE_TRACKER.getReloadStatus().isReloadNeeded()) { |
69 if (!rsf.isReloadNeeded()) { |
70 return; |
70 return; |
71 } |
71 } |
72 } finally { |
72 } finally { |
73 LOCK.readLock().unlock(); |
73 LOCK.readLock().unlock(); |
74 } |
74 } |
116 isHostname = false; |
116 isHostname = false; |
117 } |
117 } |
118 |
118 |
119 @Override |
119 @Override |
120 public String toString() { |
120 public String toString() { |
121 return names+"/"+address; |
121 return names + "/" + address; |
122 } |
122 } |
123 |
123 |
124 private HostFileEntry(String name, InetAddress address, boolean isHostname) { |
124 private HostFileEntry(String name, InetAddress address, boolean isHostname) { |
125 this.names = List.of(name); |
125 this.names = List.of(name); |
126 this.address = address; |
126 this.address = address; |
129 } |
129 } |
130 |
130 |
131 boolean isValid() { |
131 boolean isValid() { |
132 return isValid; |
132 return isValid; |
133 } |
133 } |
134 boolean isHostname() {return isHostname;} |
134 |
|
135 boolean isHostname() { |
|
136 return isHostname; |
|
137 } |
135 |
138 |
136 String getHostName() { |
139 String getHostName() { |
137 return names.get(0); |
140 return names.get(0); |
138 } |
141 } |
139 |
142 |
208 } |
211 } |
209 return Collections.emptyMap(); |
212 return Collections.emptyMap(); |
210 } |
213 } |
211 |
214 |
212 public InetAddress getHostAddress(String hostName) throws UnknownHostException { |
215 public InetAddress getHostAddress(String hostName) throws UnknownHostException { |
213 return getHostAddress(hostName, AddressFamily.ANY); |
216 return getHostAddress(hostName, null); |
214 } |
217 } |
215 |
218 |
216 public InetAddress getHostAddress(String hostName, AddressFamily family) throws UnknownHostException { |
219 public InetAddress getHostAddress(String hostName, ProtocolFamily family) throws UnknownHostException { |
217 |
220 var af = AddressFamily.fromProtocolFamily(family); |
218 loadHostsAddresses(); |
221 loadHostsAddresses(); |
219 var map = HOST_ADDRESSES; |
222 var map = HOST_ADDRESSES; |
220 var he = map.get(hostName); |
223 var he = map.get(hostName); |
221 if (he == null) { |
224 if (he == null) { |
222 throw new UnknownHostException(hostName); |
225 throw new UnknownHostException(hostName); |
223 } |
226 } |
224 var addr = he.address; |
227 var addr = he.address; |
225 if (!family.sameFamily(addr)) { |
228 if (!af.sameFamily(addr)) { |
226 throw new UnknownHostException(hostName); |
229 throw new UnknownHostException(hostName); |
227 } |
230 } |
228 return addr; |
231 return addr; |
229 } |
232 } |
230 |
233 |
239 throw new UnknownHostException(ha.toString()); |
242 throw new UnknownHostException(ha.toString()); |
240 } |
243 } |
241 return entry.get().getHostName(); |
244 return entry.get().getHostName(); |
242 } |
245 } |
243 |
246 |
244 private static boolean isAddressBytesTheSame(byte [] addr1, byte [] addr2) { |
247 private static boolean isAddressBytesTheSame(byte[] addr1, byte[] addr2) { |
245 if (addr1 == null || addr2 == null) { |
248 if (addr1 == null || addr2 == null) { |
246 return false; |
249 return false; |
247 } |
250 } |
248 if (addr1.length != addr2.length) { |
251 if (addr1.length != addr2.length) { |
249 return false; |
252 return false; |
250 } |
253 } |
251 for (int i=0; i<addr1.length; i++) { |
254 for (int i = 0; i < addr1.length; i++) { |
252 if (addr1[i] != addr2[i]) |
255 if (addr1[i] != addr2[i]) |
253 return false; |
256 return false; |
254 } |
257 } |
255 return true; |
258 return true; |
256 } |
259 } |