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

* Re: Patch: re-merge NetworkInterface
  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
  1 sibling, 1 reply; 13+ messages in thread
From: David Daney @ 2007-02-14  2:37 UTC (permalink / raw)
  To: tromey; +Cc: GCJ-patches

Tom Tromey wrote:
> 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.
> 

How is the Mauve test coverage for these two classes?

Is there any way to know if they still work?

David Daney

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

* Re: Patch: re-merge NetworkInterface
  2007-02-14  2:23 Patch: re-merge NetworkInterface Tom Tromey
  2007-02-14  2:37 ` David Daney
@ 2007-02-14 13:22 ` Marco Trudel
  2007-02-14 20:15   ` Tom Tromey
  1 sibling, 1 reply; 13+ messages in thread
From: Marco Trudel @ 2007-02-14 13:22 UTC (permalink / raw)
  To: tromey; +Cc: GCJ-patches

Tom Tromey wrote:
> 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,

Thanks!

> 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.

When patching the source and running make in my previous finished build, 
I get this:

Adding generated files in builddir '..'.
/home/Marco/Desktop/compile-lin-win/gcc-build/gcc/gcj 
-B/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libjava/ 
-B/home/Marco/Desktop/compile-lin-win/gcc-build/gcc/ -C -g -w 
--encoding=UTF-8 -bootclasspath '' --classpath 
/usr/local/src/gcc/libjava:/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libjava:/usr/local/src/gcc/libjava/classpath:/usr/local/src/gcc/libjava/classpath/external/w3c_dom:/usr/local/src/gcc/libjava/classpath/external/sax:/usr/local/src/gcc/libjava/classpath/external/relaxngDatatype:/usr/local/src/gcc/libjava/classpath/external/jsr166:.:: 
-d /usr/local/src/gcc/libjava/classpath/lib @classes
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:93: 
error: NetworkInterface cannot be resolved to a type
	private transient NetworkInterface nif;
	                  ^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:114: 
error: nif cannot be resolved
	nif = null;
	^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:273: 
error: NetworkInterface cannot be resolved to a type
	NetworkInterface nif)
	^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:280: 
error: ip.nif cannot be resolved or is not a field
	ip.nif = nif;
	^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:294: 
error: NetworkInterface cannot be resolved to a type
	public NetworkInterface getScopedInterface()
	       ^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:296: 
error: nif cannot be resolved
	return nif;
	       ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:331: 
error: nif cannot be resolved
	if( nif != null )
	    ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:332: 
error: nif cannot be resolved
	sbuf.append( "%" + nif.getName() );
	                   ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:364: 
error: ip.nif cannot be resolved or is not a field
	if( ip.nif != null && nif != null )
	    ^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:364: 
error: nif cannot be resolved
	if( ip.nif != null && nif != null )
	                      ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:365: 
error: nif cannot be resolved
	return nif.equals( ip.nif );
	       ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:365: 
error: ip.nif cannot be resolved or is not a field
	return nif.equals( ip.nif );
	                   ^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:366: 
error: ip.nif cannot be resolved or is not a field
	if( ip.nif != nif )
	    ^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:366: 
error: nif cannot be resolved
	if( ip.nif != nif )
	              ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:405: 
error: nif cannot be resolved
	nif = NetworkInterface.getByName( ifname );
	^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:405: 
error: NetworkInterface cannot be resolved
	nif = NetworkInterface.getByName( ifname );
	      ^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:420: 
error: nif cannot be resolved
	if( nif != null )
	    ^^^
/usr/local/src/gcc/libjava/classpath/java/net/Inet6Address.java:422: 
error: nif cannot be resolved
	ifname = nif.getName();
	         ^^^
/usr/local/src/gcc/libjava/classpath/java/net/DatagramSocketImpl.java:260: 
error: NetworkInterface cannot be resolved to a type
	NetworkInterface netIf)
	^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/classpath/java/net/DatagramSocketImpl.java:274: 
error: NetworkInterface cannot be resolved to a type
	NetworkInterface netIf)
	^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:48: 
error: The import java.net.NetworkInterface cannot be resolved
	import java.net.NetworkInterface;
	       ^^^^^^^^^^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:238: 
error: NetworkInterface cannot be resolved to a type
	private native void mcastGrp(InetAddress inetAddr, NetworkInterface netIf,
	                                                   ^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:284: 
error: The method mcastGrp(InetAddress, null, boolean) is undefined for 
the type PlainDatagramSocketImpl
	mcastGrp(addr, null, true);
	^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:296: 
error: The method mcastGrp(InetAddress, null, boolean) is undefined for 
the type PlainDatagramSocketImpl
	mcastGrp(addr, null, false);
	^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:299: 
error: NetworkInterface cannot be resolved to a type
	protected void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
	                                                  ^^^^^^^^^^^^^^^^
/usr/local/src/gcc/libjava/gnu/java/net/PlainDatagramSocketImpl.java:305: 
error: NetworkInterface cannot be resolved to a type
	protected void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
	                                                   ^^^^^^^^^^^^^^^^
26 problems (26 errors)
make[4]: *** [compile-classes] Error 1


Marco


> 
> 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

* Re: Patch: re-merge NetworkInterface
  2007-02-14  2:37 ` David Daney
@ 2007-02-14 20:14   ` Tom Tromey
  0 siblings, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2007-02-14 20:14 UTC (permalink / raw)
  To: David Daney; +Cc: GCJ-patches

>>>>> "David" == David Daney <ddaney@avtrex.com> writes:

David> How is the Mauve test coverage for these two classes?
David> Is there any way to know if they still work?

There are a few mauve tests.
These caught the fact that I'd forgotten to actually call condense().
I've fixed that in my tree.

Tom

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

* Re: Patch: re-merge NetworkInterface
  2007-02-14 13:22 ` Marco Trudel
@ 2007-02-14 20:15   ` Tom Tromey
  2007-02-15  8:43     ` Marco Trudel
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2007-02-14 20:15 UTC (permalink / raw)
  To: Marco Trudel; +Cc: GCJ-patches

>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:

Marco> When patching the source and running make in my previous finished
Marco> build, I get this:
[...]

First, make sure you really removed the two .java files that the patch
deletes.

Second, if you did that and it still fails, try a clean build.

Tom

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

* Re: Patch: re-merge NetworkInterface
  2007-02-14 20:15   ` Tom Tromey
@ 2007-02-15  8:43     ` Marco Trudel
  2007-02-15 16:15       ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: Marco Trudel @ 2007-02-15  8:43 UTC (permalink / raw)
  To: tromey; +Cc: GCJ-patches

Tom Tromey wrote:
>>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:
> 
> Marco> When patching the source and running make in my previous finished
> Marco> build, I get this:
> [...]
> 
> First, make sure you really removed the two .java files that the patch
> deletes.

java/net/MulticastSocket.java and java/net/NetworkInterface.java are 
still there but empty. Deleting them manually leads to:

No rule to make target 
`/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', needed by 
`compile-classes'. Stop.


> Second, if you did that and it still fails, try a clean build.

A clean build still fails. So I took a closer look. The problem is that
- classpath/java/net/Inet6Address.java
- classpath/java/net/DatagramSocketImpl.java
- gnu/java/net/PlainDatagramSocketImpl.java
still references NetworkInterface instead of VMNetworkInterface.

Maybe the problem is that I'm working with the old revision 121693? 
Otherwise I couldn't imagine how you're able to compile...


Marco

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

* Re: Patch: re-merge NetworkInterface
  2007-02-15  8:43     ` Marco Trudel
@ 2007-02-15 16:15       ` Tom Tromey
  2007-02-18 11:46         ` Marco Trudel
  0 siblings, 1 reply; 13+ messages in thread
From: Tom Tromey @ 2007-02-15 16:15 UTC (permalink / raw)
  To: Marco Trudel; +Cc: GCJ-patches

>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:

Marco> No rule to make target
Marco> `/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', needed by
Marco> `compile-classes'. Stop.

Would you mind filing a bug for this build problem?

To fix, rm <build>/.../libjava/classpath/classes*
Then make.

Marco> - gnu/java/net/PlainDatagramSocketImpl.java
Marco> still references NetworkInterface instead of VMNetworkInterface.

NetworkInterface still exists, in classpath.  I only got rid of
libgcj's divergence.  In our build system, if a file
libjava/pkg/pkg/Class.java exists, then it overrides a corresponding
libjava/classpath/pkg/pkg/Class.java.  However over time we like to
remove these divergences, as they usually cost us more than they are
worth.

Tom

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

* Re: Patch: re-merge NetworkInterface
  2007-02-15 16:15       ` Tom Tromey
@ 2007-02-18 11:46         ` Marco Trudel
  2007-02-18 18:21           ` David Daney
  2007-02-20  1:48           ` Tom Tromey
  0 siblings, 2 replies; 13+ messages in thread
From: Marco Trudel @ 2007-02-18 11:46 UTC (permalink / raw)
  To: tromey; +Cc: GCJ-patches

Tom Tromey wrote:
>>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:
> 
> Marco> No rule to make target
> Marco> `/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', needed by
> Marco> `compile-classes'. Stop.
> 
> Would you mind filing a bug for this build problem?

I don't really understand the problem, so I can't fill a bug report that 
makes sense. Is the problem that MulticastSocket.java and 
NetworkInterface.java are empty instead of being deleted? So they will 
be used instead the classpath ones but of course they do not contain a 
class.
How can a patch delete a file anyway?
How can this work on Linux? This doesn't seem to be a mingw only problem 
(but then again, I don't understand the real problem)


> To fix, rm <build>/.../libjava/classpath/classes*

I assume you mean "rm 
<build>/i686-pc-mingw32/libjava/classpath/classes*". I have no files and 
no folders named classes* in that directory.


> Then make.
> 
> Marco> - gnu/java/net/PlainDatagramSocketImpl.java
> Marco> still references NetworkInterface instead of VMNetworkInterface.
> 
> NetworkInterface still exists, in classpath.  I only got rid of
> libgcj's divergence.  In our build system, if a file
> libjava/pkg/pkg/Class.java exists, then it overrides a corresponding
> libjava/classpath/pkg/pkg/Class.java.  However over time we like to
> remove these divergences, as they usually cost us more than they are
> worth.

Ok thanks. Makes sense :-) What happens when libjava/pkg/pkg/Class.h 
exists but no libjava/pkg/pkg/Class.java? I noticed that the patch 
leaves the .h files unchanged.


Marco

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

* Re: Patch: re-merge NetworkInterface
  2007-02-18 11:46         ` Marco Trudel
@ 2007-02-18 18:21           ` David Daney
  2007-02-19  7:39             ` Marco Trudel
  2007-02-20  1:48           ` Tom Tromey
  1 sibling, 1 reply; 13+ messages in thread
From: David Daney @ 2007-02-18 18:21 UTC (permalink / raw)
  To: Marco Trudel; +Cc: tromey, GCJ-patches

Marco Trudel wrote:
> Tom Tromey wrote:
>>>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:
>>
>> Marco> No rule to make target
>> Marco> `/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', 
>> needed by
>> Marco> `compile-classes'. Stop.
>>
>> Would you mind filing a bug for this build problem?
>
> I don't really understand the problem, so I can't fill a bug report 
> that makes sense. Is the problem that MulticastSocket.java and 
> NetworkInterface.java are empty instead of being deleted? So they will 
> be used instead the classpath ones but of course they do not contain a 
> class.
> How can a patch delete a file anyway?
> How can this work on Linux? This doesn't seem to be a mingw only 
> problem (but then again, I don't understand the real problem)
>
>
>> To fix, rm <build>/.../libjava/classpath/classes*
>
> I assume you mean "rm 
> <build>/i686-pc-mingw32/libjava/classpath/classes*". I have no files 
> and no folders named classes* in that directory.
>
Apply the patch.

configure ... --java-maintainer-mode

find libjava/classpath/lib -name \*.class -print | xargs rm

make


>
>> Then make.
>>
>> Marco> - gnu/java/net/PlainDatagramSocketImpl.java
>> Marco> still references NetworkInterface instead of VMNetworkInterface.
>>
>> NetworkInterface still exists, in classpath.  I only got rid of
>> libgcj's divergence.  In our build system, if a file
>> libjava/pkg/pkg/Class.java exists, then it overrides a corresponding
>> libjava/classpath/pkg/pkg/Class.java.  However over time we like to
>> remove these divergences, as they usually cost us more than they are
>> worth.
>
> Ok thanks. Makes sense :-) What happens when libjava/pkg/pkg/Class.h 
> exists but no libjava/pkg/pkg/Class.java? I noticed that the patch 
> leaves the .h files unchanged.
>
>
> Marco


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

* Re: Patch: re-merge NetworkInterface
  2007-02-18 18:21           ` David Daney
@ 2007-02-19  7:39             ` Marco Trudel
  2007-02-19 15:39               ` David Daney
  0 siblings, 1 reply; 13+ messages in thread
From: Marco Trudel @ 2007-02-19  7:39 UTC (permalink / raw)
  To: David Daney; +Cc: tromey, GCJ-patches

David Daney wrote:
> Marco Trudel wrote:
>> Tom Tromey wrote:
>>>>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:
>>>
>>> Marco> No rule to make target
>>> Marco> `/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', 
>>> needed by
>>> Marco> `compile-classes'. Stop.
>>>
>>> Would you mind filing a bug for this build problem?
>>
>> I don't really understand the problem, so I can't fill a bug report 
>> that makes sense. Is the problem that MulticastSocket.java and 
>> NetworkInterface.java are empty instead of being deleted? So they will 
>> be used instead the classpath ones but of course they do not contain a 
>> class.
>> How can a patch delete a file anyway?
>> How can this work on Linux? This doesn't seem to be a mingw only 
>> problem (but then again, I don't understand the real problem)
>>
>>
>>> To fix, rm <build>/.../libjava/classpath/classes*
>>
>> I assume you mean "rm 
>> <build>/i686-pc-mingw32/libjava/classpath/classes*". I have no files 
>> and no folders named classes* in that directory.
>>
> Apply the patch.
> 
> configure ... --java-maintainer-mode
> 
> find libjava/classpath/lib -name \*.class -print | xargs rm

I now:
- apply the patch
- manually delete java/net/MulticastSocket.java and 
java/net/NetworkInterface.java
- delete all classes in $GCC_SRC/libjava/classpath/lib 
($BUILD/libjava/classpath/lib contains no classes)

I get:

/home/Marco/Desktop/compile-lin-win/gcc-build/./gcc/xgcc -shared-libgcc 
-B/home/Marco/Desktop/compile-lin-win/gcc-build/./gcc -nostdinc++ 
-L/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libstdc++-v3/src 
-L/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libstdc++-v3/src/.libs 
-L/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/winsup/mingw 
-L/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/winsup/w32api/lib 
-isystem /usr/local/src/gcc/winsup/mingw/include -isystem 
/usr/local/src/gcc/winsup/w32api/include 
-B/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/bin/ 
-B/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/lib/ 
-isystem 
/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/include 
-isystem 
/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/sys-include 
-DHAVE_CONFIG_H -I. -I/usr/local/src/gcc/libjava -I./include -I./gcj 
-I/usr/local/src/gcc/libjava -Iinclude 
-I/usr/local/src/gcc/libjava/include 
-I/usr/local/src/gcc/libjava/classpath/include -Iclasspath/include 
-I/usr/local/src/gcc/libjava/classpath/native/fdlibm 
-I/usr/local/src/gcc/libjava/../boehm-gc/include -I../boehm-gc/include 
-I/usr/local/src/gcc/libjava/libltdl 
-I/usr/local/src/gcc/libjava/libltdl 
-I/usr/local/src/gcc/libjava/.././libjava/../gcc 
-I/usr/local/src/gcc/libjava/../zlib 
-I/usr/local/src/gcc/libjava/../libffi/include -I../libffi/include 
-fno-rtti -fnon-call-exceptions -mthreads -fdollars-in-identifiers 
-Wswitch-enum -D_FILE_OFFSET_BITS=64 -ffloat-store -fomit-frame-pointer 
-fno-omit-frame-pointer -Wextra -Wall -D_GNU_SOURCE 
-DPREFIX=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win\" 
-DTOOLEXECLIBDIR=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/lib\" 
-DJAVA_HOME=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win\" 
-DBOOT_CLASS_PATH=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/libgcj-4.3.0.jar\" 
-DJAVA_EXT_DIRS=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/ext\" 
-DGCJ_ENDORSED_DIRS=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/gcj-endorsed\" 
-DGCJ_VERSIONED_LIBDIR=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/lib/gcj-4.3.0\" 
-DPATH_SEPARATOR=\":\" 
-DLIBGCJ_DEFAULT_DATABASE=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/lib/gcj-4.3.0/classmap.db\" 
-DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL=\"gcj-4.3.0/classmap.db\" 
--sysroot=/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/sys-root 
-MT java/net/natVMNetworkInterface.lo -MD -MP -MF 
java/net/.deps/natVMNetworkInterface.Tpo -c 
java/net/natVMNetworkInterface.cc -o java/net/natVMNetworkInterface.o
java/net/natVMNetworkInterface.cc: In static member function 'static 
java::util::Vector* java::net::VMNetworkInterface::getInterfaces()':
java/net/natVMNetworkInterface.cc:140: error: no matching function for 
call to 
'java::net::VMNetworkInterface::VMNetworkInterface(java::lang::String*&, 
java::net::InetAddress*&)'
/usr/local/src/gcc/libjava/java/net/VMNetworkInterface.h:25: note: 
candidates are: java::net::VMNetworkInterface::VMNetworkInterface()
make[1]: *** [java/net/natVMNetworkInterface.lo] Error 1
make[1]: Leaving directory 
`/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libjava'


When I also delete java/net/MulticastSocket.h and 
java/net/NetworkInterface.h, I get:

/gcc/libjava/../zlib -I/usr/local/src/gcc/libjava/../libffi/include 
-I../libffi/include -fno-rtti -fnon-call-exceptions -mthreads 
-fdollars-in-identifiers -Wswitch-enum -D_FILE_OFFSET_BITS=64 
-ffloat-store -fomit-frame-pointer -fno-omit-frame-pointer -Wextra -Wall 
-D_GNU_SOURCE 
-DPREFIX=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win\" 
-DTOOLEXECLIBDIR=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/i686-pc-mingw32/lib\" 
-DJAVA_HOME=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win\" 
-DBOOT_CLASS_PATH=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/libgcj-4.3.0.jar\" 
-DJAVA_EXT_DIRS=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/ext\" 
-DGCJ_ENDORSED_DIRS=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/share/java/gcj-endorsed\" 
-DGCJ_VERSIONED_LIBDIR=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/lib/gcj-4.3.0\" 
-DPATH_SEPARATOR=\":\" 
-DLIBGCJ_DEFAULT_DATABASE=\"/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/lib/gcj-4.3.0/classmap.db\" 
-DLIBGCJ_DEFAULT_DATABASE_PATH_TAIL=\"gcj-4.3.0/classmap.db\" 
--sysroot=/home/Marco/Desktop/compile-lin-win/gcc-XYZXYZ-win/sys-root 
-MT gnu/java/net/natPlainDatagramSocketImpl.lo -MD -MP -MF 
gnu/java/net/.deps/natPlainDatagramSocketImpl.Tpo -c 
gnu/java/net/natPlainDatagramSocketImpl.cc -o 
gnu/java/net/natPlainDatagramSocketImpl.o
gnu/java/net/natPlainDatagramSocketImpl.cc:23:39: error: 
java/net/NetworkInterface.h: No such file or directory
gnu/java/net/natPlainDatagramSocketImpl.cc:410: warning: unused 
parameter 'join'
make[1]: *** [gnu/java/net/natPlainDatagramSocketImpl.lo] Error 1
make[1]: Leaving directory 
`/home/Marco/Desktop/compile-lin-win/gcc-build/i686-pc-mingw32/libjava'


Marco


> 
> make
> 
> 
>>
>>> Then make.
>>>
>>> Marco> - gnu/java/net/PlainDatagramSocketImpl.java
>>> Marco> still references NetworkInterface instead of VMNetworkInterface.
>>>
>>> NetworkInterface still exists, in classpath.  I only got rid of
>>> libgcj's divergence.  In our build system, if a file
>>> libjava/pkg/pkg/Class.java exists, then it overrides a corresponding
>>> libjava/classpath/pkg/pkg/Class.java.  However over time we like to
>>> remove these divergences, as they usually cost us more than they are
>>> worth.
>>
>> Ok thanks. Makes sense :-) What happens when libjava/pkg/pkg/Class.h 
>> exists but no libjava/pkg/pkg/Class.java? I noticed that the patch 
>> leaves the .h files unchanged.
>>
>>
>> Marco
> 
> 

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

* Re: Patch: re-merge NetworkInterface
  2007-02-19  7:39             ` Marco Trudel
@ 2007-02-19 15:39               ` David Daney
  2007-02-20  1:45                 ` Tom Tromey
  0 siblings, 1 reply; 13+ messages in thread
From: David Daney @ 2007-02-19 15:39 UTC (permalink / raw)
  To: Marco Trudel; +Cc: tromey, GCJ-patches

Marco Trudel wrote:
> David Daney wrote:
>> Marco Trudel wrote:
>>> Tom Tromey wrote:
>>>>>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:
>>>>
>>>> Marco> No rule to make target
>>>> Marco> `/usr/local/src/gcc/libjava/java/net/NetworkInterface.java', 
>>>> needed by
>>>> Marco> `compile-classes'. Stop.
>>>>
>>>> Would you mind filing a bug for this build problem?
>>>
>>> I don't really understand the problem, so I can't fill a bug report 
>>> that makes sense. Is the problem that MulticastSocket.java and 
>>> NetworkInterface.java are empty instead of being deleted? So they 
>>> will be used instead the classpath ones but of course they do not 
>>> contain a class.
>>> How can a patch delete a file anyway?
>>> How can this work on Linux? This doesn't seem to be a mingw only 
>>> problem (but then again, I don't understand the real problem)
>>>
>>>
>>>> To fix, rm <build>/.../libjava/classpath/classes*
>>>
>>> I assume you mean "rm 
>>> <build>/i686-pc-mingw32/libjava/classpath/classes*". I have no files 
>>> and no folders named classes* in that directory.
>>>
>> Apply the patch.
>>
>> configure ... --java-maintainer-mode
>>
>> find libjava/classpath/lib -name \*.class -print | xargs rm
>
> I now:
> - apply the patch
> - manually delete java/net/MulticastSocket.java and 
> java/net/NetworkInterface.java
> - delete all classes in $GCC_SRC/libjava/classpath/lib 
> ($BUILD/libjava/classpath/lib contains no classes)
>
It is difficult to get the headers to rebuild.  Try doing this:

After the failure, from the libgcj build directory: rm gcjh.stamp; make 
gcjh.stamp

It should automatically regenerate the headers on a 
--java-maintainer-mode build from a clean (empty) build directory.

The regeneration of headers seems to be either broken or very difficult 
to do.

David Daney

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

* Re: Patch: re-merge NetworkInterface
  2007-02-19 15:39               ` David Daney
@ 2007-02-20  1:45                 ` Tom Tromey
  0 siblings, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2007-02-20  1:45 UTC (permalink / raw)
  To: David Daney; +Cc: Marco Trudel, tromey, GCJ-patches

>>>>> "David" == David Daney <ddaney@avtrex.com> writes:

David> The regeneration of headers seems to be either broken or very difficult 
David> to do.

Yeah.  This needs to be fixed.  Could you file a PR?  I will look at
it once I am back.

The other related thing that needs fixing is the mess with -M options.

Tom

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

* Re: Patch: re-merge NetworkInterface
  2007-02-18 11:46         ` Marco Trudel
  2007-02-18 18:21           ` David Daney
@ 2007-02-20  1:48           ` Tom Tromey
  1 sibling, 0 replies; 13+ messages in thread
From: Tom Tromey @ 2007-02-20  1:48 UTC (permalink / raw)
  To: Marco Trudel; +Cc: tromey, GCJ-patches

>>>>> "Marco" == Marco Trudel <mtrudel@gmx.ch> writes:

Marco> I don't really understand the problem, so I can't fill a bug
Marco> report that makes sense. Is the problem that
Marco> MulticastSocket.java and NetworkInterface.java are empty
Marco> instead of being deleted?

The bug is that if we delete a .java file the build will crash.
Instead we ought to adjust properly.

Tom

^ 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).