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