Patch: re-merge NetworkInterface

Marco Trudel mtrudel@gmx.ch
Wed Feb 14 13:22:00 GMT 2007


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



More information about the Java-patches mailing list