Commit bbf76ec0 by Mohan Embar Committed by Mohan Embar

win32.h (_Jv_platform_close_on_exec): Changed signature and declared extern.

	* 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.

From-SVN: r73325
parent eb4ad71a
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> 2003-11-04 Bryce McKinlay <bryce@mckinlay.net.nz>
* java/lang/natClass.cc (newInstance): Throw InstantiationException * java/lang/natClass.cc (newInstance): Throw InstantiationException
......
...@@ -69,11 +69,14 @@ gnu::java::net::PlainDatagramSocketImpl::create () ...@@ -69,11 +69,14 @@ gnu::java::net::PlainDatagramSocketImpl::create ()
_Jv_ThrowSocketException (); _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 // We use native_fd in place of fd here. From leaving fd null we avoid
// the double close problem in FileDescriptor.finalize. // the double close problem in FileDescriptor.finalize.
native_fd = (int) sock; native_fd = (jint) hSocket;
} }
void void
......
...@@ -45,18 +45,21 @@ union SockAddr ...@@ -45,18 +45,21 @@ union SockAddr
void void
gnu::java::net::PlainSocketImpl::create (jboolean stream) 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_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 // We use native_fd in place of fd here. From leaving fd null we avoid
// the double close problem in FileDescriptor.finalize. // the double close problem in FileDescriptor.finalize.
native_fd = sock; native_fd = (jint) hSocket;
} }
void void
...@@ -230,7 +233,8 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) ...@@ -230,7 +233,8 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s)
{ {
union SockAddr u; union SockAddr u;
socklen_t addrlen = sizeof(u); socklen_t addrlen = sizeof(u);
int new_socket = 0; HANDLE hSocket = 0;
SOCKET new_socket = 0;
if (timeout > 0) if (timeout > 0)
{ {
...@@ -245,7 +249,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) ...@@ -245,7 +249,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s)
{ {
new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); 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 // This new child socket is nonblocking because the parent
// socket became nonblocking via the WSAEventSelect() call, // socket became nonblocking via the WSAEventSelect() call,
...@@ -284,10 +288,13 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) ...@@ -284,10 +288,13 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s)
new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen); new_socket = ::accept (native_fd, (sockaddr*) &u, &addrlen);
} }
if (new_socket == int(INVALID_SOCKET)) if (new_socket == INVALID_SOCKET)
goto error; 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; jbyteArray raddr;
jint rport; jint rport;
...@@ -308,7 +315,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s) ...@@ -308,7 +315,7 @@ gnu::java::net::PlainSocketImpl::accept (gnu::java::net::PlainSocketImpl *s)
else else
throw new ::java::net::SocketException (JvNewStringUTF ("invalid family")); throw new ::java::net::SocketException (JvNewStringUTF ("invalid family"));
s->native_fd = new_socket; s->native_fd = (jint) hSocket;
s->localport = localport; s->localport = localport;
s->address = new ::java::net::InetAddress (raddr, NULL); s->address = new ::java::net::InetAddress (raddr, NULL);
s->port = rport; s->port = rport;
......
...@@ -97,11 +97,8 @@ extern jlong _Jv_platform_gettimeofday (); ...@@ -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_select (int n, fd_set *, fd_set *, fd_set *, struct timeval *);
extern int _Jv_pipe (int filedes[2]); extern int _Jv_pipe (int filedes[2]);
inline void extern void
_Jv_platform_close_on_exec (jint) _Jv_platform_close_on_exec (HANDLE h);
{
// Ignore.
}
#ifdef JV_HASH_SYNCHRONIZATION #ifdef JV_HASH_SYNCHRONIZATION
/* Suspends the execution of the current thread for the specified /* Suspends the execution of the current thread for the specified
......
...@@ -133,7 +133,13 @@ java::io::FileDescriptor::open (jstring path, jint jflags) { ...@@ -133,7 +133,13 @@ java::io::FileDescriptor::open (jstring path, jint jflags) {
throw new FileNotFoundException (_Jv_WinStrError (cpath, dwErrorCode)); 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 void
......
...@@ -363,3 +363,11 @@ _Jv_pipe (int filedes[2]) ...@@ -363,3 +363,11 @@ _Jv_pipe (int filedes[2])
{ {
return _pipe (filedes, 4096, _O_BINARY); 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);
}
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