aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu/java
diff options
context:
space:
mode:
authorAnthony Green <green@redhat.com>2005-12-19 02:54:19 +0000
committerAnthony Green <green@gcc.gnu.org>2005-12-19 02:54:19 +0000
commit57b3c68ec5373c02e53753311e06ccd7d578a27a (patch)
tree78939120b04d55c91fb9bf7e42be7c1023a6ae3c /libjava/gnu/java
parentf988a24784b7e921c76fcb39e0416d4ef122b441 (diff)
downloadgcc-57b3c68ec5373c02e53753311e06ccd7d578a27a.zip
gcc-57b3c68ec5373c02e53753311e06ccd7d578a27a.tar.gz
gcc-57b3c68ec5373c02e53753311e06ccd7d578a27a.tar.bz2
natPlainDatagramSocketImplPosix.cc (getLocalAddress): New helper function.
2005-12-18 Anthony Green <green@redhat.com> * gnu/java/net/natPlainDatagramSocketImplPosix.cc (getLocalAddress): New helper function. (setOption): Use getLocalAddress. Don't downcast value to InetAddress. (getOption): Use getLocalAddress. From-SVN: r108779
Diffstat (limited to 'libjava/gnu/java')
-rw-r--r--libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc88
1 files changed, 39 insertions, 49 deletions
diff --git a/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc b/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
index 708f542..ada5fd1 100644
--- a/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
+++ b/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation
+/* Copyright (C) 2003, 2005 Free Software Foundation
This file is part of libgcj.
@@ -485,6 +485,38 @@ gnu::java::net::PlainDatagramSocketImpl::mcastGrp (::java::net::InetAddress *ine
throw new ::java::io::IOException (JvNewStringUTF (strerr));
}
+// Helper function to get the InetAddress for a given socket (file
+// descriptor).
+static ::java::net::InetAddress *
+getLocalAddress (int native_fd)
+{
+ jbyteArray laddr;
+ union SockAddr u;
+ socklen_t addrlen = sizeof(u);
+
+ if (::getsockname (native_fd, (sockaddr*) &u, &addrlen) != 0)
+ {
+ char* strerr = strerror (errno);
+ throw new ::java::net::SocketException (JvNewStringUTF (strerr));
+ }
+ if (u.address.sin_family == AF_INET)
+ {
+ laddr = JvNewByteArray (4);
+ memcpy (elements (laddr), &u.address.sin_addr, 4);
+ }
+#ifdef HAVE_INET6
+ else if (u.address.sin_family == AF_INET6)
+ {
+ laddr = JvNewByteArray (16);
+ memcpy (elements (laddr), &u.address6.sin6_addr, 16);
+ }
+#endif
+ else
+ throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
+
+ return new ::java::net::InetAddress (laddr, NULL);
+}
+
void
gnu::java::net::PlainDatagramSocketImpl::setOption (jint optID,
::java::lang::Object *value)
@@ -605,8 +637,10 @@ gnu::java::net::PlainDatagramSocketImpl::setOption (jint optID,
return;
case _Jv_IP_MULTICAST_LOOP_ :
- haddress = ((::java::net::InetAddress *) value)->addr;
- len = haddress->length;
+ // cache the local address
+ if (localAddress == NULL)
+ localAddress = getLocalAddress (native_fd);
+ len = localAddress->addr->length;
if (len == 4)
{
level = IPPROTO_IP;
@@ -650,8 +684,6 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
{
int val;
socklen_t val_len = sizeof(val);
- union SockAddr u;
- socklen_t addrlen = sizeof(u);
int level, opname;
switch (optID)
@@ -697,27 +729,7 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
case _Jv_SO_BINDADDR_:
// cache the local address
if (localAddress == NULL)
- {
- jbyteArray laddr;
- if (::getsockname (native_fd, (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
- else if (u.address.sin_family == AF_INET6)
- {
- laddr = JvNewByteArray (16);
- memcpy (elements (laddr), &u.address6.sin6_addr, 16);
- }
-#endif
- else
- throw new ::java::net::SocketException (
- JvNewStringUTF ("invalid family"));
- localAddress = new ::java::net::InetAddress (laddr, NULL);
- }
+ localAddress = getLocalAddress (native_fd);
return localAddress;
break;
case _Jv_SO_REUSEADDR_ :
@@ -761,29 +773,7 @@ gnu::java::net::PlainDatagramSocketImpl::getOption (jint optID)
case _Jv_IP_MULTICAST_LOOP_ :
// cache the local address
- if (localAddress == NULL)
- {
- jbyteArray laddr;
- if (::getsockname (native_fd, (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
- else if (u.address.sin_family == AF_INET6)
- {
- laddr = JvNewByteArray (16);
- memcpy (elements (laddr), &u.address6.sin6_addr, 16);
- }
-#endif
- else
- throw new ::java::net::SocketException (
- JvNewStringUTF ("invalid family"));
- localAddress = new ::java::net::InetAddress (laddr, NULL);
-
- }
+ localAddress = getLocalAddress (native_fd);
if (localAddress->addr->length == 4)
{
level = IPPROTO_IP;