diff options
Diffstat (limited to 'libjava/classpath/java/net/NetworkInterface.java')
-rw-r--r-- | libjava/classpath/java/net/NetworkInterface.java | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/libjava/classpath/java/net/NetworkInterface.java b/libjava/classpath/java/net/NetworkInterface.java index eccd2dac9fb..47b1c67cae7 100644 --- a/libjava/classpath/java/net/NetworkInterface.java +++ b/libjava/classpath/java/net/NetworkInterface.java @@ -38,7 +38,12 @@ exception statement from your version. */ package java.net; +import java.util.Collection; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import java.util.Vector; /** @@ -143,9 +148,7 @@ public final class NetworkInterface public static NetworkInterface getByName(String name) throws SocketException { - Vector networkInterfaces = VMNetworkInterface.getInterfaces(); - - for (Enumeration e = networkInterfaces.elements(); e.hasMoreElements();) + for (Enumeration e = getNetworkInterfaces(); e.hasMoreElements();) { NetworkInterface tmp = (NetworkInterface) e.nextElement(); @@ -170,9 +173,7 @@ public final class NetworkInterface public static NetworkInterface getByInetAddress(InetAddress addr) throws SocketException { - Vector networkInterfaces = VMNetworkInterface.getInterfaces(); - - for (Enumeration interfaces = networkInterfaces.elements(); + for (Enumeration interfaces = getNetworkInterfaces(); interfaces.hasMoreElements();) { NetworkInterface tmp = (NetworkInterface) interfaces.nextElement(); @@ -188,6 +189,41 @@ public final class NetworkInterface throw new SocketException("no network interface is bound to such an IP address"); } + static private Collection condense(Collection interfaces) + { + final Map condensed = new HashMap(); + + final Iterator interfs = interfaces.iterator(); + while (interfs.hasNext()) { + + final NetworkInterface face = (NetworkInterface) interfs.next(); + final String name = face.getName(); + + if (condensed.containsKey(name)) + { + final NetworkInterface conface = (NetworkInterface) condensed.get(name); + if (!conface.inetAddresses.containsAll(face.inetAddresses)) + { + final Iterator faceAddresses = face.inetAddresses.iterator(); + while (faceAddresses.hasNext()) + { + final InetAddress faceAddress = (InetAddress) faceAddresses.next(); + if (!conface.inetAddresses.contains(faceAddress)) + { + conface.inetAddresses.add(faceAddress); + } + } + } + } + else + { + condensed.put(name, face); + } + } + + return condensed.values(); + } + /** * Return an <code>Enumeration</code> of all available network interfaces * @@ -202,7 +238,9 @@ public final class NetworkInterface if (networkInterfaces.isEmpty()) return null; - return networkInterfaces.elements(); + Collection condensed = condense(networkInterfaces); + + return Collections.enumeration(condensed); } /** |