mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-25 01:29:27 +08:00
5c14415811
* win32.cc: fixed tab, indentation and whitespace inconsistencies removed jvm.h include added includes java/lang/UnsupportedOperationException.h, java/io/IOException.h, java/net/SocketException.h (WSAEventWrapper): class implementation (_Jv_WinStrError): implemented both overloads (_Jv_ThrowIOException): implemented both overloads (_Jv_ThrowSocketException): implemented both overloads (_Jv_select): implemented * include/win32.h: fixed tab, indentation and whitespace inconsistencies wrapped <windows.h> include with #define WIN32_LEAN_AND_MEAN added jvm.h include (WSAEventWrapper): added class declaration (_Jv_WinStrError): added both overload declarations (_Jv_ThrowIOException): added both overload declarations (_Jv_ThrowSocketException): added both overload declarations removed ENOTCONN, ECONNRESET and ENOPROTOOPT defines (_Jv_select): added declaration (_Jv_socket): removed (_Jv_connect): removed (_Jv_close): removed (_Jv_bind): removed (_Jv_accept): removed (_Jv_listen): removed (_Jv_write): removed (_Jv_read): removed * java/io/natFileDescriptorWin32.cc: fixed tab, indentation and whitespace inconsistencies replaced <windows.h> #include with <platform.h> removed jvm.h include (testCanUseGetHandleInfo): new function which tests whether Win32 GetHandleInformation() call can be used with console buffer handles (only supported on >=WinNT 5.0) (winerr): removed (superseded by _Jv_WinStrError in include/win32.h) (valid): rewrote implementation using GetHandleInformation() (sync): changed exception throwing to use error string and exception helper methods declared in include/win32.h (open): likewise (write): likewise (setLength): likewise (close): likewise (seek): likewise (getFilePointer): likewise (read): likewise * java/io/natFileWin32.cc: fixed tab, indentation and whitespace inconsistencies replaced <windows.h> #include with <platform.h> removed jvm.h include (_access): use JV_TEMP_UTF_STRING (_stat): likewise (performMkDir): use JV_TEMP_UTF_STRING (performRenameTo): likewise (performDelete): likewise (performCreate): likewise (performSetReadOnly): likewise (performSetLastModified): likewise * java/lang/natWin32Process.cc: fixed tab, indentation and whitespace inconsistencies replaced <windows.h> #include with <platform.h> removed includes gcj/cni.h, jvm.h (new_string): removed (startProcess): use JV_TEMP_UTF_STRING, changed exception throwing to use error string and exception helper methods declared in include/win32.h * java/net/natInetAddressWin32.cc: fixed tab, indentation and whitespace inconsistencies replaced <windows.h> #include with <platform.h> removed jvm.h include removed DISABLE_JAVA_NET conditional code removed POSIX conditional code not relevant to Win32 (aton): use JV_TEMP_UTF_STRING removed POSIX conditional code not relevant to Win32 (lookup): likewise (getLocalHostName): likewise * java/net/natNetworkInterfaceWin32.cc: fixed tab, indentation and whitespace inconsistencies removed unnecessary windows.h, winsock.h and gcj/cni.h includes removed DISABLE_JAVA_NET conditional code removed POSIX conditional code not relevant to Win32 (winsock2GetRealNetworkInterfaces): new function to compute network interfaces via Winsock2 API (determineGetRealNetworkInterfacesFN): new function for returning a function pointer to the function used to compute network interfaces. (getRealNetworkInterfaces): implemented * java/net/natPlainDatagramSocketImplWin32.cc: fixed tab, indentation and whitespace inconsistencies removed gcj/cni.h include removed DISABLE_JAVA_NET conditional code removed POSIX conditional code not relevant to Win32 changed net POSIXisms to Win32isms replaced _Jv socket-related calls with their real Win32 equivalents changed exception throwing to use error string and exception helper methods declared in include/win32.h (peekData): implemented timeout support (receive): likewise * java/net/natPlainSocketImplWin32.cc: fixed tab, indentation and whitespace inconsistencies removed gcj/cni.h and gcj/javaprims.h includes removed DISABLE_JAVA_NET conditional code removed POSIX conditional code not relevant to Win32 changed net POSIXisms to Win32isms replaced _Jv socket-related calls with their real Win32 equivalents changed exception throwing to use error string and exception helper methods declared in include/win32.h (throwConnectException): helper function for connect() (connect): implemented timeout support (accept): likewise (doRead): new helper function common to both read() method overloads, includes timeout support (read): implemented both overloads in terms of doRead() (available): implemented using ioctlsocket() From-SVN: r70904
268 lines
6.6 KiB
C++
268 lines
6.6 KiB
C++
// natWin32Process.cc - Native side of Win32 process code.
|
|
|
|
/* Copyright (C) 2003 Free Software Foundation
|
|
|
|
This file is part of libgcj.
|
|
|
|
This software is copyrighted work licensed under the terms of the
|
|
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|
details. */
|
|
|
|
#include <config.h>
|
|
#include <platform.h>
|
|
|
|
// Conflicts with the definition in "java/lang/reflect/Modifier.h"
|
|
#undef STRICT
|
|
|
|
#include <java/lang/ConcreteProcess.h>
|
|
#include <java/lang/IllegalThreadStateException.h>
|
|
#include <java/lang/InterruptedException.h>
|
|
#include <java/lang/NullPointerException.h>
|
|
#include <java/lang/Thread.h>
|
|
#include <java/io/File.h>
|
|
#include <java/io/FileDescriptor.h>
|
|
#include <java/io/FileInputStream.h>
|
|
#include <java/io/FileOutputStream.h>
|
|
#include <java/io/IOException.h>
|
|
#include <java/lang/OutOfMemoryError.h>
|
|
|
|
void
|
|
java::lang::ConcreteProcess::cleanup (void)
|
|
{
|
|
if (inputStream != NULL)
|
|
{
|
|
inputStream->close ();
|
|
inputStream = NULL;
|
|
}
|
|
|
|
if (outputStream != NULL)
|
|
{
|
|
outputStream->close ();
|
|
outputStream = NULL;
|
|
}
|
|
|
|
if (errorStream != NULL)
|
|
{
|
|
errorStream->close ();
|
|
errorStream = NULL;
|
|
}
|
|
}
|
|
|
|
void
|
|
java::lang::ConcreteProcess::destroy (void)
|
|
{
|
|
if (! hasExited ())
|
|
{
|
|
// Kill it forcibly and assign an (arbitrary) exit code of 0.
|
|
TerminateProcess ((HANDLE) procHandle, 0);
|
|
exitCode = 0;
|
|
|
|
cleanup ();
|
|
}
|
|
}
|
|
|
|
jboolean
|
|
java::lang::ConcreteProcess::hasExited (void)
|
|
{
|
|
DWORD exitStatus;
|
|
|
|
if (GetExitCodeProcess ((HANDLE) procHandle, &exitStatus) != 0)
|
|
{
|
|
// NOTE: STILL_ACTIVE is defined as "259" by Win32 - if the
|
|
// child actually exits with this return code, we have a
|
|
// problem here. See MSDN documentation on GetExitCodeProcess( ).
|
|
|
|
if (exitStatus == STILL_ACTIVE)
|
|
return false;
|
|
else
|
|
{
|
|
cleanup ();
|
|
exitCode = exitStatus;
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
return true;
|
|
}
|
|
|
|
jint
|
|
java::lang::ConcreteProcess::waitFor (void)
|
|
{
|
|
if (! hasExited ())
|
|
{
|
|
DWORD exitStatus = 0UL;
|
|
|
|
// FIXME: The wait should be interruptible.
|
|
WaitForSingleObject ((HANDLE) procHandle, INFINITE);
|
|
|
|
GetExitCodeProcess ((HANDLE) procHandle, &exitStatus);
|
|
exitCode = exitStatus;
|
|
|
|
cleanup ();
|
|
}
|
|
|
|
return exitCode;
|
|
}
|
|
|
|
void
|
|
java::lang::ConcreteProcess::startProcess (jstringArray progarray,
|
|
jstringArray envp,
|
|
java::io::File *dir)
|
|
{
|
|
using namespace java::io;
|
|
|
|
procHandle = (jint) INVALID_HANDLE_VALUE;
|
|
|
|
// Reconstruct the command line.
|
|
jstring *elts = elements (progarray);
|
|
|
|
int cmdLineLen = 0;
|
|
|
|
for (int i = 0; i < progarray->length; ++i)
|
|
cmdLineLen += (_Jv_GetStringUTFLength (elts[i]) + 1);
|
|
|
|
char *cmdLine = (char *) _Jv_Malloc (cmdLineLen + 1);
|
|
char *cmdLineCurPos = cmdLine;
|
|
|
|
for (int i = 0; i < progarray->length; ++i)
|
|
{
|
|
if (i > 0)
|
|
*cmdLineCurPos++ = ' ';
|
|
jsize s = _Jv_GetStringUTFLength (elts[i]);
|
|
_Jv_GetStringUTFRegion (elts[i], 0, s, cmdLineCurPos);
|
|
cmdLineCurPos += s;
|
|
}
|
|
*cmdLineCurPos = '\0';
|
|
|
|
// Get the environment, if any.
|
|
char *env = NULL;
|
|
if (envp)
|
|
{
|
|
elts = elements (envp);
|
|
|
|
int envLen = 0;
|
|
for (int i = 0; i < envp->length; ++i)
|
|
envLen += (_Jv_GetStringUTFLength (elts[i]) + 1);
|
|
|
|
env = (char *) _Jv_Malloc (envLen + 1);
|
|
|
|
int j = 0;
|
|
for (int i = 0; i < envp->length; ++i)
|
|
{
|
|
jsize s = _Jv_GetStringUTFLength (elts[i]);
|
|
_Jv_GetStringUTFRegion (elts[i], 0, s, (env + j));
|
|
|
|
j += s;
|
|
*(env + j) = '\0';
|
|
j++;
|
|
}
|
|
*(env + j) = '\0';
|
|
}
|
|
|
|
// Get the working directory path, if specified.
|
|
JV_TEMP_UTF_STRING (wdir, dir ? dir->getPath () : 0);
|
|
|
|
errorStream = NULL;
|
|
inputStream = NULL;
|
|
outputStream = NULL;
|
|
|
|
java::lang::Throwable *exc = NULL;
|
|
|
|
try
|
|
{
|
|
// We create anonymous pipes to communicate with the child
|
|
// on each of standard streams.
|
|
|
|
HANDLE cldStdInRd, cldStdInWr;
|
|
HANDLE cldStdOutRd, cldStdOutWr;
|
|
HANDLE cldStdErrRd, cldStdErrWr;
|
|
|
|
SECURITY_ATTRIBUTES sAttrs;
|
|
|
|
// Explicitly allow the handles to the pipes to be inherited.
|
|
sAttrs.nLength = sizeof (SECURITY_ATTRIBUTES);
|
|
sAttrs.bInheritHandle = 1;
|
|
sAttrs.lpSecurityDescriptor = NULL;
|
|
|
|
|
|
if (CreatePipe (&cldStdInRd, &cldStdInWr, &sAttrs, 0) == 0)
|
|
{
|
|
DWORD dwErrorCode = GetLastError ();
|
|
throw new IOException (_Jv_WinStrError ("Error creating stdin pipe",
|
|
dwErrorCode));
|
|
}
|
|
|
|
if (CreatePipe (&cldStdOutRd, &cldStdOutWr, &sAttrs, 0) == 0)
|
|
{
|
|
DWORD dwErrorCode = GetLastError ();
|
|
throw new IOException (_Jv_WinStrError ("Error creating stdout pipe",
|
|
dwErrorCode));
|
|
}
|
|
|
|
if (CreatePipe (&cldStdErrRd, &cldStdErrWr, &sAttrs, 0) == 0)
|
|
{
|
|
DWORD dwErrorCode = GetLastError ();
|
|
throw new IOException (_Jv_WinStrError ("Error creating stderr pipe",
|
|
dwErrorCode));
|
|
}
|
|
|
|
outputStream = new FileOutputStream
|
|
(new FileDescriptor ((jint) cldStdInWr));
|
|
inputStream = new FileInputStream
|
|
(new FileDescriptor ((jint) cldStdOutRd));
|
|
errorStream = new FileInputStream
|
|
(new FileDescriptor ((jint) cldStdErrRd));
|
|
|
|
// Now create the child process.
|
|
PROCESS_INFORMATION pi;
|
|
STARTUPINFO si;
|
|
|
|
ZeroMemory (&pi, sizeof (PROCESS_INFORMATION));
|
|
|
|
ZeroMemory (&si, sizeof (STARTUPINFO));
|
|
si.cb = sizeof (STARTUPINFO);
|
|
|
|
// Explicitly specify the handles to the standard streams.
|
|
si.dwFlags |= STARTF_USESTDHANDLES;
|
|
|
|
si.hStdInput = cldStdInRd;
|
|
si.hStdOutput = cldStdOutWr;
|
|
si.hStdError = cldStdErrWr;
|
|
|
|
if (CreateProcess (NULL,
|
|
cmdLine,
|
|
NULL,
|
|
NULL,
|
|
1,
|
|
0,
|
|
env,
|
|
wdir,
|
|
&si,
|
|
&pi) == 0)
|
|
{
|
|
DWORD dwErrorCode = GetLastError ();
|
|
throw new IOException (
|
|
_Jv_WinStrError ("Error creating child process", dwErrorCode));
|
|
}
|
|
|
|
procHandle = (jint ) pi.hProcess;
|
|
|
|
// Close the wrong ends (for the parent) of the pipes.
|
|
CloseHandle (cldStdInRd);
|
|
CloseHandle (cldStdOutWr);
|
|
CloseHandle (cldStdErrWr);
|
|
|
|
_Jv_Free (cmdLine);
|
|
if (env != NULL)
|
|
_Jv_Free (env);
|
|
}
|
|
catch (java::lang::Throwable *thrown)
|
|
{
|
|
cleanup ();
|
|
exc = thrown;
|
|
}
|
|
|
|
if (exc != NULL)
|
|
throw exc;
|
|
}
|