Patch: re-merge NetworkInterface
Tom Tromey
tromey@redhat.com
Wed Feb 14 02:23:00 GMT 2007
I'm not checking this in quite yet.
This re-merges NetworkInterface and MulticastSocket.
For MulticastSocket the only divergence was that we commented out a
call to a method in NetworkInterface that we didn't provide.
I don't really like the new VMNetworkInterface -- I think that in
general if a class refers to specific fields in its VM counterpart,
then probably those fields just belong in the class itself in the
first place. But, never mind, I updated ours to fit anyway.
I also updated the Windows native code for this patch, since the
change is just replacing 'new NetworkInterface' with 'new
VMNetworkInterface'. However, I don't have a way to build this and I
would appreciate it if someone could try it for me.
Tom
Index: ChangeLog
from Tom Tromey <tromey@redhat.com>
* sources.am, Makefile.in: Rebuilt.
* java/net/NetworkInterface.java: Removed override.
* java/net/MulticastSocket.java: Likewise.
* java/net/VMNetworkInterface.java (name, addresses): New fields.
(VMNetworkInterface): New constructors.
(getVMInterfaces): New method.
Removed static initializer.
(getInterfaces): Genericized.
* java/net/natVMNetworkInterfacePosix.cc (getInterfaces): Create a
VMNetworkInterface.
* java/net/natVMNetworkInterfaceWin32.cc (getInterfaces): Create a
VMNetworkInterface.
Index: java/net/natVMNetworkInterfaceWin32.cc
===================================================================
--- java/net/natVMNetworkInterfaceWin32.cc (revision 121886)
+++ java/net/natVMNetworkInterfaceWin32.cc (working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2005 Free Software Foundation
+/* Copyright (C) 2003, 2005, 2007 Free Software Foundation
This file is part of libgcj.
@@ -136,7 +136,7 @@
int nNbInterfaces = (*pfn) (arIFName, arpInetAddress);
for (int i=0; i < nNbInterfaces; ++i)
{
- ht->add (new java::net::NetworkInterface (arIFName[i],
+ ht->add (new java::net::VMNetworkInterface (arIFName[i],
arpInetAddress[i]));
}
Index: java/net/MulticastSocket.java
===================================================================
--- java/net/MulticastSocket.java (revision 121886)
+++ java/net/MulticastSocket.java (working copy)
@@ -1,519 +0,0 @@
-/* MulticastSocket.java -- Class for using multicast sockets
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
- Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-package java.net;
-
-import java.io.IOException;
-import java.util.Enumeration;
-
-
-/**
- * Written using on-line Java Platform 1.2 API Specification, as well
- * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
- * Status: Believed complete and correct.
- */
-/**
- * This class models a multicast UDP socket. A multicast address is a
- * class D internet address (one whose most significant bits are 1110).
- * A multicast group consists of a multicast address and a well known
- * port number. All members of the group listening on that address and
- * port will receive all the broadcasts to the group.
- * <p>
- * Please note that applets are not allowed to use multicast sockets
- *
- * Written using on-line Java Platform 1.2 API Specification, as well
- * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998).
- * Status: Believed complete and correct.
- *
- * @author Warren Levy (warrenl@cygnus.com)
- * @author Aaron M. Renn (arenn@urbanophile.com) (Documentation comments)
- * @since 1.1
- * @date May 18, 1999.
- */
-public class MulticastSocket extends DatagramSocket
-{
- /**
- * Create a MulticastSocket that this not bound to any address
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkListen method doesn't allow the operation
- */
- public MulticastSocket() throws IOException
- {
- this(new InetSocketAddress(0));
- }
-
- /**
- * Create a multicast socket bound to the specified port
- *
- * @param port The port to bind to
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkListen method doesn't allow the operation
- */
- public MulticastSocket(int port) throws IOException
- {
- this(new InetSocketAddress(port));
- }
-
- /**
- * Create a multicast socket bound to the specified SocketAddress.
- *
- * @param address The SocketAddress the multicast socket will be bound to
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkListen method doesn't allow the operation
- *
- * @since 1.4
- */
- public MulticastSocket(SocketAddress address) throws IOException
- {
- super((SocketAddress) null);
- setReuseAddress(true);
- if (address != null)
- bind(address);
- }
-
- /**
- * Returns the interface being used for multicast packets
- *
- * @return The multicast interface
- *
- * @exception SocketException If an error occurs
- */
- public InetAddress getInterface() throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- return (InetAddress) getImpl().getOption(SocketOptions.IP_MULTICAST_IF);
- }
-
- /**
- * Returns the current value of the "Time to Live" option. This is the
- * number of hops a packet can make before it "expires". This method id
- * deprecated. Use <code>getTimeToLive</code> instead.
- *
- * @return The TTL value
- *
- * @exception IOException If an error occurs
- *
- * @deprecated 1.2 Replaced by getTimeToLive()
- *
- * @see MulticastSocket#getTimeToLive()
- */
- public byte getTTL() throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- // Use getTTL here rather than getTimeToLive in case we're using an impl
- // other than the default PlainDatagramSocketImpl and it doesn't have
- // getTimeToLive yet.
- return getImpl().getTTL();
- }
-
- /**
- * Returns the current value of the "Time to Live" option. This is the
- * number of hops a packet can make before it "expires".
- *
- * @return The TTL value
- *
- * @exception IOException If an error occurs
- *
- * @since 1.2
- */
- public int getTimeToLive() throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- return getImpl().getTimeToLive();
- }
-
- /**
- * Sets the interface to use for sending multicast packets.
- *
- * @param addr The new interface to use.
- *
- * @exception SocketException If an error occurs.
- *
- * @since 1.4
- */
- public void setInterface(InetAddress addr) throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- getImpl().setOption(SocketOptions.IP_MULTICAST_IF, addr);
- }
-
- /**
- * Sets the local network interface used to send multicast messages
- *
- * @param netIf The local network interface used to send multicast messages
- *
- * @exception SocketException If an error occurs
- *
- * @see MulticastSocket#getNetworkInterface()
- *
- * @since 1.4
- */
- public void setNetworkInterface(NetworkInterface netIf)
- throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- InetAddress address;
- if (netIf != null)
- out:
- {
- Enumeration e = netIf.getInetAddresses();
- if (getLocalAddress() instanceof Inet4Address)
- {
- // Search for a IPv4 address.
- while (e.hasMoreElements())
- {
- address = (InetAddress) e.nextElement();
- if (address instanceof Inet4Address)
- break out;
- }
- throw new SocketException("interface " + netIf.getName() + " has no IPv6 address");
- }
- else if (getLocalAddress() instanceof Inet6Address)
- {
- // Search for a IPv6 address.
- while (e.hasMoreElements())
- {
- address = (InetAddress) e.nextElement();
- if (address instanceof Inet6Address)
- break out;
- }
- throw new SocketException("interface " + netIf.getName() + " has no IPv6 address");
- }
- else
- throw new SocketException("interface " + netIf.getName() + " has no suitable IP address");
- }
- else
- address = InetAddress.ANY_IF;
-
-
- getImpl().setOption(SocketOptions.IP_MULTICAST_IF, address);
- }
-
- /**
- * Gets the local network interface which is used to send multicast messages
- *
- * @return The local network interface to send multicast messages
- *
- * @exception SocketException If an error occurs
- *
- * @see MulticastSocket#setNetworkInterface(NetworkInterface netIf)
- *
- * @since 1.4
- */
- public NetworkInterface getNetworkInterface() throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- InetAddress address =
- (InetAddress) getImpl().getOption(SocketOptions.IP_MULTICAST_IF);
-
- // FIXME: libgcj doesn't have createAnyInterface.
-// if (address.isAnyLocalAddress())
-// return NetworkInterface.createAnyInterface();
-
- NetworkInterface netIf = NetworkInterface.getByInetAddress(address);
-
- return netIf;
- }
-
- /**
- * Disable/Enable local loopback of multicast packets. The option is used by
- * the platform's networking code as a hint for setting whether multicast
- * data will be looped back to the local socket.
- *
- * Because this option is a hint, applications that want to verify what
- * loopback mode is set to should call #getLoopbackMode
- *
- * @param disable True to disable loopback mode
- *
- * @exception SocketException If an error occurs
- *
- * @since 1.4
- */
- public void setLoopbackMode(boolean disable) throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- getImpl().setOption(SocketOptions.IP_MULTICAST_LOOP,
- Boolean.valueOf(disable));
- }
-
- /**
- * Checks if local loopback mode is enabled
- *
- * @return true if loopback mode is enabled, false otherwise
- *
- * @exception SocketException If an error occurs
- *
- * @since 1.4
- */
- public boolean getLoopbackMode() throws SocketException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- Object buf = getImpl().getOption(SocketOptions.IP_MULTICAST_LOOP);
-
- if (buf instanceof Boolean)
- return ((Boolean) buf).booleanValue();
-
- throw new SocketException("unexpected type");
- }
-
- /**
- * Sets the "Time to Live" value for a socket. The value must be between
- * 1 and 255.
- *
- * @param ttl The new TTL value
- *
- * @exception IOException If an error occurs
- *
- * @deprecated 1.2 Replaced by <code>setTimeToLive</code>
- *
- * @see MulticastSocket#setTimeToLive(int ttl)
- */
- public void setTTL(byte ttl) throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- // Use setTTL here rather than setTimeToLive in case we're using an impl
- // other than the default PlainDatagramSocketImpl and it doesn't have
- // setTimeToLive yet.
- getImpl().setTTL(ttl);
- }
-
- /**
- * Sets the "Time to Live" value for a socket. The value must be between
- * 1 and 255.
- *
- * @param ttl The new TTL value
- *
- * @exception IOException If an error occurs
- *
- * @since 1.2
- */
- public void setTimeToLive(int ttl) throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- if (ttl <= 0 || ttl > 255)
- throw new IllegalArgumentException("Invalid ttl: " + ttl);
-
- getImpl().setTimeToLive(ttl);
- }
-
- /**
- * Joins the specified multicast group.
- *
- * @param mcastaddr The address of the group to join
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkMulticast method doesn't allow the operation
- */
- public void joinGroup(InetAddress mcastaddr) throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- if (! mcastaddr.isMulticastAddress())
- throw new IOException("Not a Multicast address");
-
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- s.checkMulticast(mcastaddr);
-
- getImpl().join(mcastaddr);
- }
-
- /**
- * Leaves the specified multicast group
- *
- * @param mcastaddr The address of the group to leave
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkMulticast method doesn't allow the operation
- */
- public void leaveGroup(InetAddress mcastaddr) throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- if (! mcastaddr.isMulticastAddress())
- throw new IOException("Not a Multicast address");
-
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- s.checkMulticast(mcastaddr);
-
- getImpl().leave(mcastaddr);
- }
-
- /**
- * Joins the specified mulitcast group on a specified interface.
- *
- * @param mcastaddr The multicast address to join
- * @param netIf The local network interface to receive the multicast
- * messages on or null to defer the interface set by #setInterface or
- * #setNetworkInterface
- *
- * @exception IOException If an error occurs
- * @exception IllegalArgumentException If address type is not supported
- * @exception SecurityException If a security manager exists and its
- * checkMulticast method doesn't allow the operation
- *
- * @see MulticastSocket#setInterface(InetAddress addr)
- * @see MulticastSocket#setNetworkInterface(NetworkInterface netIf)
- *
- * @since 1.4
- */
- public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
- throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- if (! (mcastaddr instanceof InetSocketAddress))
- throw new IllegalArgumentException("SocketAddress type not supported");
-
- InetSocketAddress tmp = (InetSocketAddress) mcastaddr;
-
- if (! tmp.getAddress().isMulticastAddress())
- throw new IOException("Not a Multicast address");
-
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- s.checkMulticast(tmp.getAddress());
-
- getImpl().joinGroup(mcastaddr, netIf);
- }
-
- /**
- * Leaves the specified mulitcast group on a specified interface.
- *
- * @param mcastaddr The multicast address to leave
- * @param netIf The local networki interface or null to defer to the
- * interface set by setInterface or setNetworkInterface
- *
- * @exception IOException If an error occurs
- * @exception IllegalArgumentException If address type is not supported
- * @exception SecurityException If a security manager exists and its
- * checkMulticast method doesn't allow the operation
- *
- * @see MulticastSocket#setInterface(InetAddress addr)
- * @see MulticastSocket#setNetworkInterface(NetworkInterface netIf)
- *
- * @since 1.4
- */
- public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
- throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- InetSocketAddress tmp = (InetSocketAddress) mcastaddr;
-
- if (! tmp.getAddress().isMulticastAddress())
- throw new IOException("Not a Multicast address");
-
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- s.checkMulticast(tmp.getAddress());
-
- getImpl().leaveGroup(mcastaddr, netIf);
- }
-
- /**
- * Sends a packet of data to a multicast address with a TTL that is
- * different from the default TTL on this socket. The default TTL for
- * the socket is not changed.
- *
- * @param packet The packet of data to send
- * @param ttl The TTL for this packet
- *
- * @exception IOException If an error occurs
- * @exception SecurityException If a security manager exists and its
- * checkConnect or checkMulticast method doesn't allow the operation
- *
- * @deprecated
- */
- public synchronized void send(DatagramPacket packet, byte ttl)
- throws IOException
- {
- if (isClosed())
- throw new SocketException("socket is closed");
-
- SecurityManager s = System.getSecurityManager();
- if (s != null)
- {
- InetAddress addr = packet.getAddress();
- if (addr.isMulticastAddress())
- s.checkPermission(new SocketPermission(addr.getHostName()
- + packet.getPort(),
- "accept,connect"));
- else
- s.checkConnect(addr.getHostAddress(), packet.getPort());
- }
-
- int oldttl = getImpl().getTimeToLive();
- getImpl().setTimeToLive(((int) ttl) & 0xFF);
- getImpl().send(packet);
- getImpl().setTimeToLive(oldttl);
- }
-}
Index: java/net/NetworkInterface.java
===================================================================
--- java/net/NetworkInterface.java (revision 121886)
+++ java/net/NetworkInterface.java (working copy)
@@ -1,299 +0,0 @@
-/* NetworkInterface.java --
- Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-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;
-
-/**
- * This class models a network interface on the host computer. A network
- * interface contains a name (typically associated with a specific
- * hardware adapter) and a list of addresses that are bound to it.
- * For example, an ethernet interface may be named "eth0" and have the
- * address 192.168.1.101 assigned to it.
- *
- * @author Michael Koch (konqueror@gmx.de)
- * @since 1.4
- */
-public final class NetworkInterface
-{
- private String name;
- private Vector<InetAddress> inetAddresses;
-
- NetworkInterface(String name, InetAddress address)
- {
- this.name = name;
- this.inetAddresses = new Vector(1, 1);
- this.inetAddresses.add(address);
- }
-
- NetworkInterface(String name, InetAddress[] addresses)
- {
- this.name = name;
- this.inetAddresses = new Vector(addresses.length, 1);
-
- for (int i = 0; i < addresses.length; i++)
- this.inetAddresses.add(addresses[i]);
- }
-
- /**
- * Returns the name of the network interface
- *
- * @return The name of the interface.
- */
- public String getName()
- {
- return name;
- }
-
- /**
- * Returns all available addresses of the network interface
- *
- * If a @see SecurityManager is available all addresses are checked
- * with @see SecurityManager::checkConnect() if they are available.
- * Only <code>InetAddresses</code> are returned where the security manager
- * doesn't throw an exception.
- *
- * @return An enumeration of all addresses.
- */
- public Enumeration<InetAddress> getInetAddresses()
- {
- SecurityManager s = System.getSecurityManager();
-
- if (s == null)
- return inetAddresses.elements();
-
- Vector<InetAddress> tmpInetAddresses = new Vector<InetAddress>(1, 1);
-
- for (Enumeration<InetAddress> addresses = inetAddresses.elements();
- addresses.hasMoreElements();)
- {
- InetAddress addr = addresses.nextElement();
- try
- {
- s.checkConnect(addr.getHostAddress(), 58000);
- tmpInetAddresses.add(addr);
- }
- catch (SecurityException e)
- {
- // Ignore.
- }
- }
-
- return tmpInetAddresses.elements();
- }
-
- /**
- * Returns the display name of the interface
- *
- * @return The display name of the interface
- */
- public String getDisplayName()
- {
- return name;
- }
-
- /**
- * Returns an network interface by name
- *
- * @param name The name of the interface to return
- *
- * @return a <code>NetworkInterface</code> object representing the interface,
- * or null if there is no interface with that name.
- *
- * @exception SocketException If an error occurs
- * @exception NullPointerException If the specified name is null
- */
- public static NetworkInterface getByName(String name)
- throws SocketException
- {
- for (Enumeration e = getNetworkInterfaces(); e.hasMoreElements();)
- {
- NetworkInterface tmp = (NetworkInterface) e.nextElement();
-
- if (name.equals(tmp.getName()))
- return tmp;
- }
-
- // No interface with the given name found.
- return null;
- }
-
- /**
- * Return a network interface by its address
- *
- * @param addr The address of the interface to return
- *
- * @return the interface, or <code>null</code> if none found
- *
- * @exception SocketException If an error occurs
- * @exception NullPointerException If the specified addess is null
- */
- public static NetworkInterface getByInetAddress(InetAddress addr)
- throws SocketException
- {
- for (Enumeration interfaces = getNetworkInterfaces();
- interfaces.hasMoreElements();)
- {
- NetworkInterface tmp = (NetworkInterface) interfaces.nextElement();
-
- for (Enumeration addresses = tmp.inetAddresses.elements();
- addresses.hasMoreElements();)
- {
- if (addr.equals((InetAddress) addresses.nextElement()))
- return tmp;
- }
- }
-
- 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
- *
- * @return all interfaces
- *
- * @exception SocketException If an error occurs
- */
- public static Enumeration<NetworkInterface> getNetworkInterfaces()
- throws SocketException
- {
- Vector<NetworkInterface> networkInterfaces =
- VMNetworkInterface.getInterfaces();
-
- if (networkInterfaces.isEmpty())
- return null;
-
- Collection condensed = condense(networkInterfaces);
-
- return Collections.enumeration(condensed);
- }
-
- /**
- * Checks if the current instance is equal to obj
- *
- * @param obj The object to compare with
- *
- * @return <code>true</code> if equal, <code>false</code> otherwise
- */
- public boolean equals(Object obj)
- {
- if (! (obj instanceof NetworkInterface))
- return false;
-
- NetworkInterface tmp = (NetworkInterface) obj;
-
- return (name.equals(tmp.name) && inetAddresses.equals(tmp.inetAddresses));
- }
-
- /**
- * Returns the hashcode of the current instance
- *
- * @return the hashcode
- */
- public int hashCode()
- {
- // FIXME: hash correctly
- return name.hashCode() + inetAddresses.hashCode();
- }
-
- /**
- * Returns a string representation of the interface
- *
- * @return the string
- */
- public String toString()
- {
- // FIXME: check if this is correct
- String result;
- String separator = System.getProperty("line.separator");
-
- result =
- "name: " + getDisplayName() + " (" + getName() + ") addresses:"
- + separator;
-
- for (Enumeration e = inetAddresses.elements(); e.hasMoreElements();)
- {
- InetAddress address = (InetAddress) e.nextElement();
- result += address.toString() + ";" + separator;
- }
-
- return result;
- }
-}
Index: java/net/natVMNetworkInterfacePosix.cc
===================================================================
--- java/net/natVMNetworkInterfacePosix.cc (revision 121886)
+++ java/net/natVMNetworkInterfacePosix.cc (working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2005, 2006 Free Software Foundation
+/* Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation
This file is part of libgcj.
@@ -46,10 +46,10 @@
#include <java/net/VMNetworkInterface.h>
#include <java/util/Vector.h>
-::java::util::Vector*
+::java::util::Vector *
java::net::VMNetworkInterface::getInterfaces ()
{
- ::java::util::Vector* ht = new ::java::util::Vector ();
+ ::java::util::Vector *ht = new ::java::util::Vector ();
#ifdef HAVE_GETIFADDRS
@@ -86,12 +86,11 @@
::java::net::InetAddress *inaddr
= ::java::net::InetAddress::getByAddress(laddr);
- // It is ok to make a new NetworkInterface for each struct; the
- // java code will unify these as necessary; see
- // NetworkInterface.condense().
+ // It is ok to make a new NetworkInterface for each struct,
+ // since we will use 'condense' to collapse them.
jstring name = JvNewStringUTF (work->ifa_name);
- ht->add (new NetworkInterface (name, inaddr));
+ ht->add (new VMNetworkInterface (name, inaddr));
}
freeifaddrs (addrs);
@@ -117,7 +116,7 @@
do
{
num_interfaces += 16;
-
+
if_data.ifc_len = sizeof (struct ifreq) * num_interfaces;
if_data.ifc_buf =
(char*) _Jv_Realloc (if_data.ifc_buf, if_data.ifc_len);
@@ -149,7 +148,7 @@
memcpy (elements (baddr), &(sa.sin_addr), len);
jstring if_name = JvNewStringLatin1 (if_record->ifr_name);
InetAddress* address = java::net::InetAddress::getByAddress (baddr);
- ht->add (new NetworkInterface (if_name, address));
+ ht->add (new VMNetworkInterface (if_name, address));
if_record++;
}
Index: java/net/VMNetworkInterface.java
===================================================================
--- java/net/VMNetworkInterface.java (revision 121886)
+++ java/net/VMNetworkInterface.java (working copy)
@@ -1,5 +1,5 @@
/* VMNetworkInterface.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2007 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,7 +40,11 @@
import gnu.classpath.Configuration;
+import java.util.Collection;
import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
import java.util.Vector;
/**
@@ -55,12 +59,76 @@
*/
final class VMNetworkInterface
{
- static
- {
- if (Configuration.INIT_LOAD_LIBRARY)
- System.loadLibrary("javanet");
- }
+ String name;
+ Set addresses;
- public static native Vector getInterfaces()
+ VMNetworkInterface(String name)
+ {
+ this.name = name;
+ addresses = new HashSet();
+ }
+
+ /**
+ * Creates a dummy instance which represents any network
+ * interface.
+ */
+ public VMNetworkInterface()
+ {
+ addresses = new HashSet();
+ try
+ {
+ addresses.add(InetAddress.getByName("0.0.0.0"));
+ }
+ catch (UnknownHostException _)
+ {
+ // Cannot happen.
+ }
+ }
+
+ public VMNetworkInterface(String name, InetAddress addr)
+ {
+ this.name = name;
+ addresses = new HashSet();
+ addresses.add(addr);
+ }
+
+ /**
+ * Return a list of VM network interface objects.
+ *
+ * @return The list of network interfaces.
+ * @throws SocketException
+ */
+ public static VMNetworkInterface[] getVMInterfaces()
+ throws SocketException
+ {
+ // This is written in a weird way because the API changed, but it
+ // was simpler not to have to change the native code too much.
+ Vector<VMNetworkInterface> vals = getInterfaces();
+ VMNetworkInterface[] result = new VMNetworkInterface[vals.size()];
+ return vals.toArray(result);
+ }
+
+ public static native Vector<VMNetworkInterface> getInterfaces()
throws SocketException;
+
+ static Collection<VMNetworkInterface>
+ condense(Vector<VMNetworkInterface> interfaces)
+ {
+ final HashMap<String, VMNetworkInterface> condensed
+ = new HashMap<String, VMNetworkInterface>();
+
+ for (VMNetworkInterface face : interfaces)
+ {
+ final String name = face.name;
+ if (condensed.containsKey(name))
+ {
+ final VMNetworkInterface conface = condensed.get(name);
+ conface.addresses.addAll(face.addresses);
+ }
+ else
+ condensed.put(name, face);
+ }
+
+ return condensed.values();
+ }
}
More information about the Java-patches
mailing list