diff options
| author | Warren Levy <warrenl@gcc.gnu.org> | 1999-05-26 17:00:06 +0000 |
|---|---|---|
| committer | Warren Levy <warrenl@gcc.gnu.org> | 1999-05-26 17:00:06 +0000 |
| commit | f2ed9e9656a375cf80b11dfb3a264a7551654ecd (patch) | |
| tree | a946b25d980c088ac8a79fbfeefceff665041269 /libjava/java/net/natPlainDatagramSocketImpl.cc | |
| parent | de4abb91d1a9f13baceb3e50f73829c0f21b830c (diff) | |
[multiple changes]
1999-05-26 Bryce McKinlay <bryce@albatross.co.nz>
* java/net/DatagramSocket.java (getSoTimeout): Verify class type.
* java/net/DatagramSocketImpl.java (getOption): Made abstract.
(setOption): Made abstract.
* java/net/PlainDatagramSocketImpl.java: Mirror SocketOptions fields
to avoid cpp conflicts in native code.
* java/net/PlainSocketImpl.java: Mirror SocketOptions fields to avoid
cpp conflicts in native code.
* java/net/ServerSocket.java (toString): Prepended "ServerSocket".
* java/net/Socket.java (getLocalAddress): Implemented.
(setTcpNoDelay): Implemented.
(getTcpNoDelay): Implemented.
(setSoLinger): Implemented.
(getSoLinger): Implemented.
(getSoTimeout): Verify class type.
(setSendBufferSize): Implemented.
(getSendBufferSize): Implemented.
(setReceiveBufferSize): Implemented.
(getReceiveBufferSize): Implemented.
(toString): Prepended "Socket".
* java/net/SocketImpl.java (toString): Rewritten.
(getOption): Made abstract.
(setOption): Made abstract.
* java/net/natPlainSocketImpl.cc (connect): Set localport properly.
(setOption): Implemented.
(getOption): Implemented.
1999-05-26 Warren Levy <warrenl@cygnus.com>
* java/net/DatagramSocket.java (DatagramSocket): Get local host
address when null. Set SO_REUSEADDR for multicasts.
(getSoTimeout): Implemented.
(setSoTimeout): Implemented.
* java/net/DatagramSocketImpl.java: Implement SocketOptions interface.
* java/net/MulticastSocket.java (getInterface): Implemented.
(setInterface): Implemented.
(setTimeToLive): Check for invalid ttl.
(joinGroup): Verify multicast address and security.
(leaveGroup): Verify multicast address and security.
(send): Implemented.
* java/net/PlainDatagramSocketImpl.java (timeout): Added.
(iface): Added.
(ttl): Added.
(setOption): Added.
(getOption): Added.
(mcastGrp): Added.
(getTTL): Implemented as non-native.
(setTTL): ditto.
(join): ditto.
(leave): ditto.
* java/net/ServerSocket.java (setSoTimeout): Implemented.
(getSoTimeout): Implemented.
(setSocketFactory): Made synchronized.
* java/net/Socket.java (setSoTimeout): Implemented.
(getSoTimeout): Implemented.
(close): Made synchronized.
(setSocketImplFactory): Made synchronized.
* java/net/SocketImpl.java: Implement SocketOptions interface.
* java/net/natInetAddress.cc: Corrected module name at top of file.
* java/net/natPlainDatagramSocketImpl.cc (McastReq): Added union.
(bind): Added FIXME.
(peek): Implemented.
(setTTL): Removed.
(getTTL): Removed.
(join): Removed.
(leave): Removed.
(mcastGrp): Added.
(setOption): Implemented for SO_REUSEADDR.
(getOption): Implemented for SO_REUSEADDR.
From-SVN: r27184
Diffstat (limited to 'libjava/java/net/natPlainDatagramSocketImpl.cc')
| -rw-r--r-- | libjava/java/net/natPlainDatagramSocketImpl.cc | 147 |
1 files changed, 123 insertions, 24 deletions
diff --git a/libjava/java/net/natPlainDatagramSocketImpl.cc b/libjava/java/net/natPlainDatagramSocketImpl.cc index 1bdcdd59ae0..42abbe135db 100644 --- a/libjava/java/net/natPlainDatagramSocketImpl.cc +++ b/libjava/java/net/natPlainDatagramSocketImpl.cc @@ -23,6 +23,7 @@ details. */ #include <java/net/PlainDatagramSocketImpl.h> #include <java/net/InetAddress.h> #include <java/net/DatagramPacket.h> +#include <java/lang/Boolean.h> #ifndef HAVE_SOCKLEN_T typedef int socklen_t; @@ -36,6 +37,15 @@ union SockAddr #endif }; +union McastReq +{ + struct ip_mreq mreq; +#ifdef HAVE_INET6 + struct ipv6_mreq mreq6; +#endif +}; + + // FIXME: routines here and/or in natPlainSocketImpl.cc could throw // NoRouteToHostException; also consider UnknownHostException, ConnectException. @@ -58,6 +68,7 @@ void java::net::PlainDatagramSocketImpl::bind (jint lport, java::net::InetAddress *host) { + // FIXME: prob. need to do a setsockopt with SO_BROADCAST to allow multicast. union SockAddr u; jbyteArray haddress = host->address; jbyte *bytes = elements (haddress); @@ -97,9 +108,41 @@ java::net::PlainDatagramSocketImpl::bind (jint lport, jint java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i) { - // FIXME: TODO - PlainDatagramSocketImpl::peek - // throws IOException; - return 0; + // FIXME: Deal with Multicast and if the socket is connected. + union SockAddr u; + socklen_t addrlen = sizeof(u); + ssize_t retlen = + ::recvfrom (fnum, (char *) NULL, 0, MSG_PEEK, (sockaddr*) &u, + &addrlen); + if (retlen < 0) + goto error; + // FIXME: Deal with Multicast addressing and if the socket is connected. + jbyteArray raddr; + jint rport; + if (u.address.sin_family == AF_INET) + { + raddr = JvNewByteArray (4); + memcpy (elements (raddr), &u.address.sin_addr, 4); + rport = ntohs (u.address.sin_port); + } +#ifdef HAVE_INET6 + else if (u.address.sin_family == AF_INET6) + { + raddr = JvNewByteArray (16); + memcpy (elements (raddr), &u.address6.sin6_addr, 16); + rport = ntohs (u.address6.sin6_port); + } +#endif + else + goto error; + // FIXME: Multicast: s->address = new InetAddress (raddr, NULL); + i->address = raddr; + return rport; + error: + char msg[100]; + char* strerr = strerror (errno); + sprintf (msg, "DatagramSocketImpl.peek: %.*s", 80, strerr); + JvThrow (new java::io::IOException (JvNewStringUTF (msg))); } void @@ -183,21 +226,6 @@ java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p) } void -java::net::PlainDatagramSocketImpl::setTTL (jbyte ttl) -{ - // FIXME: TODO - :PlainDatagramSocketImpl::setTTL - // throws IOException; -} - -jbyte -java::net::PlainDatagramSocketImpl::getTTL () -{ - // FIXME: TODO - PlainDatagramSocketImpl::getTTL - // throws IOException; - return 0; -} - -void java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl) { // throws IOException; @@ -213,15 +241,86 @@ java::net::PlainDatagramSocketImpl::getTimeToLive () } void -java::net::PlainDatagramSocketImpl::join (java::net::InetAddress *inetaddr) +java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress *inetaddr, + jboolean join) { - // throws IOException; - // FIXME: TODO - PlainDatagramSocketImpl::join + union McastReq u; + jbyteArray haddress = inetaddr->address; + jbyte *bytes = elements (haddress); + int len = haddress->length; + int level, opname; + const char *ptr; + if (len == 4) + { + level = IPPROTO_IP; + opname = join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP; + memcpy (&u.mreq.imr_multiaddr, bytes, len); + // FIXME: If a non-default interface is set, use it; see Stevens p. 501. + u.mreq.imr_interface.s_addr = htonl (INADDR_ANY); + len = sizeof (struct ip_mreq); + ptr = (const char *) &u.mreq; + } +#ifdef HAVE_INET6 + else if (len == 16) + { + level = IPPROTO_IPV6; + opname = join ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP; + memcpy (&u.mreq6.ipv6mr_multiaddr, bytes, len); + // FIXME: If a non-default interface is set, use it; see Stevens p. 501. + u.mreq6.ipv6mr_interface = 0; + len = sizeof (struct ipv6_mreq); + ptr = (const char *) &u.mreq6; + } +#endif + else + goto error; + if (::setsockopt (fnum, level, opname, ptr, len) == 0) + return; + error: + char msg[100]; + char* strerr = strerror (errno); + sprintf (msg, "DatagramSocketImpl.%s: %.*s", join ? "join" : "leave", 80, + strerr); + JvThrow (new java::io::IOException (JvNewStringUTF (msg))); } void -java::net::PlainDatagramSocketImpl::leave (java::net::InetAddress *inetaddr) +java::net::PlainDatagramSocketImpl::setOption (jint optID, + java::lang::Object *value) { - // throws IOException; - // FIXME: TODO - PlainDatagramSocketImpl::leave + if (optID == _Jv_SO_REUSEADDR_) + { + // FIXME: Is it possible that a Boolean wasn't passed in? + const int on = (((java::lang::Boolean *) value)->booleanValue()) ? 1 : 0; + if (::setsockopt (fnum, SOL_SOCKET, SO_REUSEADDR, (char *) &on, + sizeof (int)) == 0) + return; + } + else + errno = ENOPROTOOPT; + + char msg[100]; + char* strerr = strerror (errno); + sprintf (msg, "DatagramSocketImpl.setOption: %.*s", 80, strerr); + JvThrow (new java::net::SocketException (JvNewStringUTF (msg))); +} + +java::lang::Object * +java::net::PlainDatagramSocketImpl::getOption (jint optID) +{ + if (optID == _Jv_SO_REUSEADDR_) + { + int on; + socklen_t len; + if (::getsockopt (fnum, SOL_SOCKET, SO_REUSEADDR, (char *) &on, + (socklen_t *) &len) == 0) + return new java::lang::Boolean (on == 1); + } + else + errno = ENOPROTOOPT; + + char msg[100]; + char* strerr = strerror (errno); + sprintf (msg, "DatagramSocketImpl.getOption: %.*s", 80, strerr); + JvThrow (new java::net::SocketException (JvNewStringUTF (msg))); } |
