aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/net/natPlainDatagramSocketImpl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/net/natPlainDatagramSocketImpl.cc')
-rw-r--r--libjava/java/net/natPlainDatagramSocketImpl.cc39
1 files changed, 35 insertions, 4 deletions
diff --git a/libjava/java/net/natPlainDatagramSocketImpl.cc b/libjava/java/net/natPlainDatagramSocketImpl.cc
index 628ac620f9a..3c318d7667c 100644
--- a/libjava/java/net/natPlainDatagramSocketImpl.cc
+++ b/libjava/java/net/natPlainDatagramSocketImpl.cc
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation
This file is part of libgcj.
@@ -8,7 +8,7 @@ details. */
#include <config.h>
-#include<platform.h>
+#include <platform.h>
#ifdef WIN32
#include <errno.h>
@@ -16,6 +16,13 @@ details. */
#ifndef ENOPROTOOPT
#define ENOPROTOOPT 109
#endif
+
+static inline int
+close(int s)
+{
+ return closesocket(s);
+}
+
#else /* WIN32 */
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
@@ -51,7 +58,6 @@ _Jv_bind (int fd, struct sockaddr *addr, int addrlen)
#include <gcj/cni.h>
#include <java/io/IOException.h>
-#include <java/io/FileDescriptor.h>
#include <java/io/InterruptedIOException.h>
#include <java/net/BindException.h>
#include <java/net/SocketException.h>
@@ -91,6 +97,13 @@ java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *)
}
void
+java::net::PlainDatagramSocketImpl::close ()
+{
+ throw new java::io::IOException (
+ JvNewStringLatin1 ("DatagramSocketImpl.close: unimplemented"));
+}
+
+void
java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *)
{
throw new java::io::IOException (
@@ -185,8 +198,12 @@ java::net::PlainDatagramSocketImpl::create ()
char* strerr = strerror (errno);
throw new java::net::SocketException (JvNewStringUTF (strerr));
}
+
+ _Jv_platform_close_on_exec (sock);
+
+ // We use fnum in place of fd here. From leaving fd null we avoid
+ // the double close problem in FileDescriptor.finalize.
fnum = sock;
- fd = new java::io::FileDescriptor (sock);
}
void
@@ -281,6 +298,20 @@ java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i)
throw new java::io::IOException (JvNewStringUTF (strerr));
}
+// Close(shutdown) the socket.
+void
+java::net::PlainDatagramSocketImpl::close ()
+{
+ // Avoid races from asynchronous finalization.
+ JvSynchronize sync (this);
+
+ // The method isn't declared to throw anything, so we disregard
+ // the return value.
+ ::close (fnum);
+ fnum = -1;
+ timeout = 0;
+}
+
void
java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *p)
{