Commit 1920afb3 by Bryce McKinlay

natPlainSocketImpl.cc (bind): Bind to any/all network interfaces if host==NULL.

        * java/net/natPlainSocketImpl.cc (bind): Bind to any/all network
        interfaces if host==NULL.
        (accept): Throw message with InterruptedIOException.
        (getOption): Cache localAddress.
        * java/net/natPlainDatagramSocketImpl.cc (bind): Don't need
        'address' for DatagramSocket.
        (setTimeToLive): Fix compiler warnings.
        (getOption): Cache localAddress.
        * java/net/Socket.java (getLocalAddress): Don't need local
        InetAddress object. Add FIXME comment about calling checkConnect().
        * java/net/ServerSocket.java (ServerSocket(int)): Initialize
        connection queue to 50 as per JDK 1.2 docs.
        (ServerSocket(int,int)): Listen on all network interfaces by
        default, per JDK 1.2 docs.
        * java/net/PlainDatagramSocketImpl.java: Don't need 'address'.
        Add localAddress caching.

From-SVN: r27559
parent 06c8baef
1999-06-17 Bryce McKinlay <bryce@albatross.co.nz>
* java/net/natPlainSocketImpl.cc (bind): Bind to any/all network
interfaces if host==NULL.
(accept): Throw message with InterruptedIOException.
(getOption): Cache localAddress.
* java/net/natPlainDatagramSocketImpl.cc (bind): Don't need
'address' for DatagramSocket.
(setTimeToLive): Fix compiler warnings.
(getOption): Cache localAddress.
* java/net/Socket.java (getLocalAddress): Don't need local
InetAddress object. Add FIXME comment about calling checkConnect().
* java/net/ServerSocket.java (ServerSocket(int)): Initialize
connection queue to 50 as per JDK 1.2 docs.
(ServerSocket(int,int)): Listen on all network interfaces by
default, per JDK 1.2 docs.
* java/net/PlainDatagramSocketImpl.java: Don't need 'address'.
Add localAddress caching.
1999-06-15 Bryce McKinlay <bryce@albatross.co.nz> 1999-06-15 Bryce McKinlay <bryce@albatross.co.nz>
* java/io/FilterOutputStream.java (write(byte[])): Rewrite according * java/io/FilterOutputStream.java (write(byte[])): Rewrite according
...@@ -56,7 +75,7 @@ ...@@ -56,7 +75,7 @@
1999-05-30 Anthony Green <green@cygnus.com> 1999-05-30 Anthony Green <green@cygnus.com>
* java/net/URLStreamHandler.java (parseURL): Parse relative URLs * java/net/URLStreamHandler.java (parseURL): Parse relative URLs
correctly. Clean up "/../" and "/./" path fragments. correctly. Clean up "/../" and "/./" path fragments.
1999-05-28 Warren Levy <warrenl@cygnus.com> 1999-05-28 Warren Levy <warrenl@cygnus.com>
......
...@@ -38,11 +38,14 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl ...@@ -38,11 +38,14 @@ class PlainDatagramSocketImpl extends DatagramSocketImpl
int fnum = -1; int fnum = -1;
// FIXME: Is this necessary? Could it help w/ DatagramSocket.getLocalAddress? // FIXME: Is this necessary? Could it help w/ DatagramSocket.getLocalAddress?
InetAddress address; // InetAddress address;
// localAddress cache
InetAddress localAddress;
// These values are set/read by setOption/getOption. // These values are set/read by setOption/getOption.
int timeout = 0; int timeout = 0;
InetAddress iface = null; /* InetAddress iface = null; */
int ttl = -1; int ttl = -1;
// FIXME: Probably should have bind (and create?) calls from DatagramSocket // FIXME: Probably should have bind (and create?) calls from DatagramSocket
......
...@@ -39,6 +39,9 @@ class PlainSocketImpl extends SocketImpl ...@@ -39,6 +39,9 @@ class PlainSocketImpl extends SocketImpl
// This value is set/read by setOption/getOption. // This value is set/read by setOption/getOption.
int timeout = 0; int timeout = 0;
// localAddress cache
InetAddress localAddress;
public native void setOption(int optID, Object value) throws SocketException; public native void setOption(int optID, Object value) throws SocketException;
......
...@@ -28,15 +28,13 @@ public class ServerSocket ...@@ -28,15 +28,13 @@ public class ServerSocket
public ServerSocket (int port) public ServerSocket (int port)
throws java.io.IOException throws java.io.IOException
{ {
// FIXME: JCL p. 1526 says backlog defaults to 50; is 5 to save space this(port, 50);
// or a typo?
this(port, 5);
} }
public ServerSocket (int port, int backlog) public ServerSocket (int port, int backlog)
throws java.io.IOException throws java.io.IOException
{ {
this(port, backlog, InetAddress.getLocalHost()); this(port, backlog, null);
} }
public ServerSocket (int port, int backlog, InetAddress bindAddr) public ServerSocket (int port, int backlog, InetAddress bindAddr)
......
...@@ -129,10 +129,10 @@ public class Socket ...@@ -129,10 +129,10 @@ public class Socket
public InetAddress getLocalAddress () public InetAddress getLocalAddress ()
{ {
InetAddress localAddress; // FIXME: see note in DatagramSocket.java about checkConnect() and security
try try
{ {
localAddress = (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR); return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR);
} }
catch (SocketException x) catch (SocketException x)
{ {
...@@ -140,7 +140,6 @@ public class Socket ...@@ -140,7 +140,6 @@ public class Socket
System.err.println(x); System.err.println(x);
throw new java.lang.InternalError("Error in PlainSocketImpl.getOption"); throw new java.lang.InternalError("Error in PlainSocketImpl.getOption");
} }
return localAddress;
} }
public int getPort () public int getPort ()
......
...@@ -111,8 +111,6 @@ java::net::PlainDatagramSocketImpl::bind (jint lport, ...@@ -111,8 +111,6 @@ java::net::PlainDatagramSocketImpl::bind (jint lport,
goto error; goto error;
if (::bind (fnum, ptr, len) == 0) if (::bind (fnum, ptr, len) == 0)
{ {
// FIXME: Is address really necessary to set?
address = host;
socklen_t addrlen = sizeof(u); socklen_t addrlen = sizeof(u);
if (lport != 0) if (lport != 0)
localport = lport; localport = lport;
...@@ -270,6 +268,7 @@ java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p) ...@@ -270,6 +268,7 @@ java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p)
void void
java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl) java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl)
{ {
this->ttl = ttl;
// throws IOException; // throws IOException;
// FIXME: TODO - PlainDatagramSocketImpl::setTimeToLive // FIXME: TODO - PlainDatagramSocketImpl::setTimeToLive
} }
...@@ -279,7 +278,7 @@ java::net::PlainDatagramSocketImpl::getTimeToLive () ...@@ -279,7 +278,7 @@ java::net::PlainDatagramSocketImpl::getTimeToLive ()
{ {
// throws IOException; // throws IOException;
// FIXME: TODO - PlainDatagramSocketImpl::getTimeToLive // FIXME: TODO - PlainDatagramSocketImpl::getTimeToLive
return 0; return ttl;
} }
void void
...@@ -438,25 +437,29 @@ java::net::PlainDatagramSocketImpl::getOption (jint optID) ...@@ -438,25 +437,29 @@ java::net::PlainDatagramSocketImpl::getOption (jint optID)
#endif #endif
break; break;
case _Jv_SO_BINDADDR_: case _Jv_SO_BINDADDR_:
// FIXME: Should cache the laddr as an optimization. // cache the local address
jbyteArray laddr; if (localAddress == NULL)
if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0) {
goto error; jbyteArray laddr;
if (u.address.sin_family == AF_INET) if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
{ goto error;
laddr = JvNewByteArray (4); if (u.address.sin_family == AF_INET)
memcpy (elements (laddr), &u.address.sin_addr, 4); {
} laddr = JvNewByteArray (4);
memcpy (elements (laddr), &u.address.sin_addr, 4);
}
#ifdef HAVE_INET6 #ifdef HAVE_INET6
else if (u.address.sin_family == AF_INET6) else if (u.address.sin_family == AF_INET6)
{ {
laddr = JvNewByteArray (16); laddr = JvNewByteArray (16);
memcpy (elements (laddr), &u.address6.sin6_addr, 16); memcpy (elements (laddr), &u.address6.sin6_addr, 16);
} }
#endif #endif
else else
goto error; goto error;
return new java::net::InetAddress (laddr, NULL); localAddress = new java::net::InetAddress (laddr, NULL);
}
return localAddress;
break; break;
case _Jv_SO_REUSEADDR_ : case _Jv_SO_REUSEADDR_ :
#if defined(SO_REUSEADDR) #if defined(SO_REUSEADDR)
......
...@@ -65,14 +65,25 @@ void ...@@ -65,14 +65,25 @@ void
java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport) java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport)
{ {
union SockAddr u; union SockAddr u;
jbyteArray haddress = host->address;
jbyte *bytes = elements (haddress);
int len = haddress->length;
struct sockaddr *ptr = (struct sockaddr *) &u.address; struct sockaddr *ptr = (struct sockaddr *) &u.address;
jbyte *bytes = NULL;
// FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4.
int len = 4; // Initialize for INADDR_ANY in case host is NULL.
if (host != NULL)
{
jbyteArray haddress = host->address;
bytes = elements (haddress);
len = haddress->length;
}
if (len == 4) if (len == 4)
{ {
u.address.sin_family = AF_INET; u.address.sin_family = AF_INET;
memcpy (&u.address.sin_addr, bytes, len); if (host != NULL)
memcpy (&u.address.sin_addr, bytes, len);
else
u.address.sin_addr.s_addr = htonl (INADDR_ANY);
len = sizeof (struct sockaddr_in); len = sizeof (struct sockaddr_in);
u.address.sin_port = htons (lport); u.address.sin_port = htons (lport);
} }
...@@ -183,7 +194,8 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s) ...@@ -183,7 +194,8 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s)
if ((retval = select (fnum + 1, &rset, NULL, NULL, &tv)) < 0) if ((retval = select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
goto error; goto error;
else if (retval == 0) else if (retval == 0)
JvThrow (new java::io::InterruptedIOException ()); JvThrow (new java::io::InterruptedIOException (
JvNewStringUTF("Accept timed out")));
} }
new_socket = ::accept (fnum, (sockaddr*) &u, &addrlen); new_socket = ::accept (fnum, (sockaddr*) &u, &addrlen);
...@@ -365,25 +377,29 @@ java::net::PlainSocketImpl::getOption (jint optID) ...@@ -365,25 +377,29 @@ java::net::PlainSocketImpl::getOption (jint optID)
#endif #endif
break; break;
case _Jv_SO_BINDADDR_: case _Jv_SO_BINDADDR_:
// FIXME: Should cache the laddr as an optimization. // cache the local address
jbyteArray laddr; if (localAddress == NULL)
if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
goto error;
if (u.address.sin_family == AF_INET)
{ {
laddr = JvNewByteArray (4); jbyteArray laddr;
memcpy (elements (laddr), &u.address.sin_addr, 4); if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
} goto error;
if (u.address.sin_family == AF_INET)
{
laddr = JvNewByteArray (4);
memcpy (elements (laddr), &u.address.sin_addr, 4);
}
#ifdef HAVE_INET6 #ifdef HAVE_INET6
else if (u.address.sin_family == AF_INET6) else if (u.address.sin_family == AF_INET6)
{ {
laddr = JvNewByteArray (16); laddr = JvNewByteArray (16);
memcpy (elements (laddr), &u.address6.sin6_addr, 16); memcpy (elements (laddr), &u.address6.sin6_addr, 16);
} }
#endif #endif
else else
goto error; goto error;
return new java::net::InetAddress (laddr, NULL); localAddress = new java::net::InetAddress (laddr, NULL);
}
return localAddress;
break; break;
case _Jv_IP_MULTICAST_IF_ : case _Jv_IP_MULTICAST_IF_ :
JvThrow (new java::net::SocketException ( JvThrow (new java::net::SocketException (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment