Commit bc19f9ee by Tom Tromey Committed by Tom Tromey

re PR libgcj/28576 (PlainDatagramSocketImpl::connect: not implemented yet)

	PR libgcj/28576:
	* gnu/java/net/natPlainDatagramSocketImplPosix.cc (connect):
	Implemented.
	(disconnect): Likewise.
	(send): Handle already-connected case.

From-SVN: r115976
parent 01b2459c
2006-08-06 Tom Tromey <tromey@redhat.com>
PR libgcj/28576:
* gnu/java/net/natPlainDatagramSocketImplPosix.cc (connect):
Implemented.
(disconnect): Likewise.
(send): Handle already-connected case.
2006-08-04 Mark Wielaard <mark@klomp.org> 2006-08-04 Mark Wielaard <mark@klomp.org>
* jvmti.cc: Include gcj/method.h. * jvmti.cc: Include gcj/method.h.
......
...@@ -39,6 +39,8 @@ details. */ ...@@ -39,6 +39,8 @@ details. */
#include <java/lang/Boolean.h> #include <java/lang/Boolean.h>
#include <java/lang/Integer.h> #include <java/lang/Integer.h>
#include <java/net/UnknownHostException.h> #include <java/net/UnknownHostException.h>
#include <java/net/ConnectException.h>
#include <java/lang/NullPointerException.h>
union SockAddr union SockAddr
{ {
...@@ -149,17 +151,49 @@ gnu::java::net::PlainDatagramSocketImpl::bind (jint lport, ...@@ -149,17 +151,49 @@ gnu::java::net::PlainDatagramSocketImpl::bind (jint lport,
} }
void void
gnu::java::net::PlainDatagramSocketImpl::connect (::java::net::InetAddress *, jint) gnu::java::net::PlainDatagramSocketImpl::connect (::java::net::InetAddress *host,
jint rport)
{ {
throw new ::java::lang::InternalError (JvNewStringLatin1 ( if (! host)
"PlainDatagramSocketImpl::connect: not implemented yet")); throw new ::java::lang::NullPointerException;
union SockAddr u;
jbyteArray haddress = host->addr;
jbyte *bytes = elements (haddress);
int len = haddress->length;
struct sockaddr *ptr = (struct sockaddr *) &u.address;
if (len == 4)
{
u.address.sin_family = AF_INET;
memcpy (&u.address.sin_addr, bytes, len);
len = sizeof (struct sockaddr_in);
u.address.sin_port = htons (rport);
}
#ifdef HAVE_INET6
else if (len == 16)
{
u.address6.sin6_family = AF_INET6;
memcpy (&u.address6.sin6_addr, bytes, len);
len = sizeof (struct sockaddr_in6);
u.address6.sin6_port = htons (rport);
}
#endif
else
throw new ::java::net::SocketException (JvNewStringUTF ("invalid length"));
if (_Jv_connect (native_fd, ptr, len) == 0)
return;
char* strerr = strerror (errno);
throw new ::java::net::ConnectException (JvNewStringUTF (strerr));
} }
void void
gnu::java::net::PlainDatagramSocketImpl::disconnect () gnu::java::net::PlainDatagramSocketImpl::disconnect ()
{ {
throw new ::java::lang::InternalError (JvNewStringLatin1 ( struct sockaddr addr;
"PlainDatagramSocketImpl::disconnect: not implemented yet")); addr.sa_family = AF_UNSPEC;
// Ignore errors. This is lame but apparently required.
_Jv_connect (native_fd, &addr, sizeof (addr));
} }
jint jint
...@@ -289,39 +323,50 @@ gnu::java::net::PlainDatagramSocketImpl::send (::java::net::DatagramPacket *p) ...@@ -289,39 +323,50 @@ gnu::java::net::PlainDatagramSocketImpl::send (::java::net::DatagramPacket *p)
{ {
JvSynchronize lock (SEND_LOCK); JvSynchronize lock (SEND_LOCK);
// FIXME: Deal with Multicast and if the socket is connected. // FIXME: Deal with Multicast.
jint rport = p->getPort();
union SockAddr u;
::java::net::InetAddress *host = p->getAddress();
if (! host)
throw new ::java::net::UnknownHostException(p->toString());
jbyteArray haddress = host->addr; ::java::net::InetAddress *host = p->getAddress();
jbyte *bytes = elements (haddress); if (host == NULL)
int len = haddress->length;
struct sockaddr *ptr = (struct sockaddr *) &u.address;
jbyte *dbytes = elements (p->getData()) + p->getOffset();
if (len == 4)
{ {
u.address.sin_family = AF_INET; // If there is no host, maybe this socket was connected, in
memcpy (&u.address.sin_addr, bytes, len); // which case we try a plain send().
len = sizeof (struct sockaddr_in); jbyte *dbytes = elements (p->getData()) + p->getOffset();
u.address.sin_port = htons (rport); if (::send (native_fd, (char *) dbytes, p->getLength(), 0) >= 0)
return;
} }
#ifdef HAVE_INET6 else
else if (len == 16)
{ {
u.address6.sin6_family = AF_INET6; jint rport = p->getPort();
memcpy (&u.address6.sin6_addr, bytes, len); union SockAddr u;
len = sizeof (struct sockaddr_in6);
u.address6.sin6_port = htons (rport); jbyteArray haddress = host->addr;
} jbyte *bytes = elements (haddress);
int len = haddress->length;
struct sockaddr *ptr = (struct sockaddr *) &u.address;
jbyte *dbytes = elements (p->getData()) + p->getOffset();
if (len == 4)
{
u.address.sin_family = AF_INET;
memcpy (&u.address.sin_addr, bytes, len);
len = sizeof (struct sockaddr_in);
u.address.sin_port = htons (rport);
}
#ifdef HAVE_INET6
else if (len == 16)
{
u.address6.sin6_family = AF_INET6;
memcpy (&u.address6.sin6_addr, bytes, len);
len = sizeof (struct sockaddr_in6);
u.address6.sin6_port = htons (rport);
}
#endif #endif
else else
throw new ::java::net::SocketException (JvNewStringUTF ("invalid length")); throw new ::java::net::SocketException (JvNewStringUTF ("invalid length"));
if (::sendto (native_fd, (char *) dbytes, p->getLength(), 0, ptr, len) >= 0) if (::sendto (native_fd, (char *) dbytes, p->getLength(), 0, ptr, len)
return; >= 0)
return;
}
char* strerr = strerror (errno); char* strerr = strerror (errno);
......
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