public inbox for java-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Patch: re-merge NetworkInterface
@ 2007-02-14  2:23 Tom Tromey
  2007-02-14  2:37 ` David Daney
  2007-02-14 13:22 ` Marco Trudel
  0 siblings, 2 replies; 13+ messages in thread
From: Tom Tromey @ 2007-02-14  2:23 UTC (permalink / raw)
  To: GCJ-patches

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();
+  }
 }

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2007-02-20  1:48 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-02-14  2:23 Patch: re-merge NetworkInterface Tom Tromey
2007-02-14  2:37 ` David Daney
2007-02-14 20:14   ` Tom Tromey
2007-02-14 13:22 ` Marco Trudel
2007-02-14 20:15   ` Tom Tromey
2007-02-15  8:43     ` Marco Trudel
2007-02-15 16:15       ` Tom Tromey
2007-02-18 11:46         ` Marco Trudel
2007-02-18 18:21           ` David Daney
2007-02-19  7:39             ` Marco Trudel
2007-02-19 15:39               ` David Daney
2007-02-20  1:45                 ` Tom Tromey
2007-02-20  1:48           ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).