src/jdk.dns.client/share/classes/jdk/dns/client/internal/HostsFileResolver.java
branchaefimov-dns-client-branch
changeset 58971 465a15dd6bed
parent 58870 35c438a6d45c
child 59101 258033faefc9
equal deleted inserted replaced
58970:027e4cb87353 58971:465a15dd6bed
    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     }