diff options
author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-11-07 03:13:56 +0000 |
---|---|---|
committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-11-07 03:13:56 +0000 |
commit | 2e2260d6809dee2fdf355328735976ff2b603397 (patch) | |
tree | c9570d50348a6ac911e60fd0d891fb96bfe37fcc /libjava | |
parent | 21aa3ae9aac9eeeaa7470284d0d8ead0e732d65d (diff) | |
download | ppe42-gcc-2e2260d6809dee2fdf355328735976ff2b603397.tar.gz ppe42-gcc-2e2260d6809dee2fdf355328735976ff2b603397.zip |
* include/win32.h (_Jv_platform_close_on_exec): Changed
signature and declared extern.
* win32.cc (_Jv_platform_close_on_exec): Implemented.
* gnu/java/net/natPlainDatagramSocketImplWin32.cc
(create): Use new signature of _Jv_platform_close_on_exec.
* gnu/java/net/natPlainSocketImplWin32.cc
(create): Eliminated a few typecasts
Use new signature of _Jv_platform_close_on_exec.
(accept): Eliminated a few typecasts
Use new signature of _Jv_platform_close_on_exec.
* java/io/natFileDescriptorWin32.cc (open): Use
_Jv_platform_close_on_exec.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73325 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 15 | ||||
-rw-r--r-- | libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc | 7 | ||||
-rw-r--r-- | libjava/gnu/java/net/natPlainSocketImplWin32.cc | 25 | ||||
-rw-r--r-- | libjava/include/win32.h | 7 | ||||
-rw-r--r-- | libjava/java/io/natFileDescriptorWin32.cc | 8 | ||||
-rw-r--r-- | libjava/win32.cc | 8 |
6 files changed, 53 insertions, 17 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6cbae87531d..9b1af441622 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,18 @@ +2003-11-06 Mohan Embar <gnustuff@thisiscool.com> + + * include/win32.h (_Jv_platform_close_on_exec): Changed + signature and declared extern. + * win32.cc (_Jv_platform_close_on_exec): Implemented. + * gnu/java/net/natPlainDatagramSocketImplWin32.cc + (create): Use new signature of _Jv_platform_close_on_exec. + * gnu/java/net/natPlainSocketImplWin32.cc + (create): Eliminated a few typecasts + Use new signature of _Jv_platform_close_on_exec. + (accept): Eliminated a few typecasts + Use new signature of _Jv_platform_close_on_exec. + * java/io/natFileDescriptorWin32.cc (open): Use + _Jv_platform_close_on_exec. + 2003-11-04 Bryce McKinlay <bryce@mckinlay.net.nz> * java/lang/natClass.cc (newInstance): Throw InstantiationException diff --git a/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc b/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc index 1098e6158a8..4a4ec986c61 100644 --- a/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc +++ b/libjava/gnu/java/net/natPlainDatagramSocketImplWin32.cc @@ -69,11 +69,14 @@ gnu::java::net::PlainDatagramSocketImpl::create () _Jv_ThrowSocketException (); } - _Jv_platform_close_on_exec (sock); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + HANDLE hSocket = (HANDLE) sock; + _Jv_platform_close_on_exec (hSocket); // We use native_fd in place of fd here. From leaving fd null we avoid // the double close problem in FileDescriptor.finalize. - native_fd = (int) sock; + native_fd = (jint) hSocket; } void diff --git a/libjava/gnu/java/net/natPlainSocketImplWin32.cc b/libjava/gnu/java/net/natPlainSocketImplWin32.cc index 96373811936..c1c813ec7ad 100644 --- a/libjava/gnu/java/net/natPlainSocketImplWin32.cc +++ b/libjava/gnu/java/net/natPlainSocketImplWin32.cc @@ -45,18 +45,21 @@ union SockAddr void gnu::java::net::PlainSocketImpl::create (jboolean stream) { - int sock = ::socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0); + SOCKET sock = ::socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0); - if (sock == int(INVALID_SOCKET)) + if (sock == INVALID_SOCKET) { _Jv_ThrowIOException (); } - _Jv_platform_close_on_exec (sock); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + HANDLE hSocket = (HANDLE) sock; + _Jv_platform_close_on_exec (hSocket); // We use native_fd in place of fd here. From leaving fd null we avoid // the double close problem in FileDescriptor.finalize. - native_fd = sock; + native_fd = (jint) hSocket; } void @@ -230,7 +233,8 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) { union SockAddr u; socklen_t addrlen = sizeof(u); - int new_socket = 0; + HANDLE hSocket = 0; + SOCKET new_socket = 0; if (timeout > 0) { @@ -245,7 +249,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) { new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); - if (new_socket != int(INVALID_SOCKET)) + if (new_socket != INVALID_SOCKET) { // This new child socket is nonblocking because the parent // socket became nonblocking via the WSAEventSelect() call, @@ -284,10 +288,13 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); } - if (new_socket == int(INVALID_SOCKET)) + if (new_socket == INVALID_SOCKET) goto error; - _Jv_platform_close_on_exec (new_socket); + // Cast this to a HANDLE so we can make + // it non-inheritable via _Jv_platform_close_on_exec. + hSocket = (HANDLE) new_socket; + _Jv_platform_close_on_exec (hSocket); jbyteArray raddr; jint rport; @@ -308,7 +315,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) else throw new ::java::net::SocketException (JvNewStringUTF ("invalid family")); - s->native_fd = new_socket; + s->native_fd = (jint) hSocket; s->localport = localport; s->address = new ::java::net::InetAddress (raddr, NULL); s->port = rport; diff --git a/libjava/include/win32.h b/libjava/include/win32.h index e169adf9b28..479ed53f00e 100644 --- a/libjava/include/win32.h +++ b/libjava/include/win32.h @@ -97,11 +97,8 @@ extern jlong _Jv_platform_gettimeofday (); extern int _Jv_select (int n, fd_set *, fd_set *, fd_set *, struct timeval *); extern int _Jv_pipe (int filedes[2]); -inline void -_Jv_platform_close_on_exec (jint) -{ - // Ignore. -} +extern void +_Jv_platform_close_on_exec (HANDLE h); #ifdef JV_HASH_SYNCHRONIZATION /* Suspends the execution of the current thread for the specified diff --git a/libjava/java/io/natFileDescriptorWin32.cc b/libjava/java/io/natFileDescriptorWin32.cc index 1891bf78e42..465d7557992 100644 --- a/libjava/java/io/natFileDescriptorWin32.cc +++ b/libjava/java/io/natFileDescriptorWin32.cc @@ -133,7 +133,13 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { throw new FileNotFoundException (_Jv_WinStrError (cpath, dwErrorCode)); } } - return (jint)handle; + + // Make this handle non-inheritable so that child + // processes don't inadvertently prevent us from + // closing this file. + _Jv_platform_close_on_exec (handle); + + return (jint) handle; } void diff --git a/libjava/win32.cc b/libjava/win32.cc index 3bf1391016e..dfed8c43660 100644 --- a/libjava/win32.cc +++ b/libjava/win32.cc @@ -363,3 +363,11 @@ _Jv_pipe (int filedes[2]) { return _pipe (filedes, 4096, _O_BINARY); } + +void +_Jv_platform_close_on_exec (HANDLE h) +{ + // Mark the handle as non-inheritable. This has + // no effect under Win9X. + SetHandleInformation (h, HANDLE_FLAG_INHERIT, 0); +} |