You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/06/22 18:52:50 UTC
svn commit: r416419 -
/incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c
Author: geirm
Date: Thu Jun 22 09:52:50 2006
New Revision: 416419
URL: http://svn.apache.org/viewvc?rev=416419&view=rev
Log:
windows tweaks to support the inversion of return status
required by the fix in r416412 which was for linux
Modified:
incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c
Modified: incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c?rev=416419&r1=416418&r2=416419&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c (original)
+++ incubator/harmony/enhanced/classlib/trunk/native-src/win.IA32/luni/procimpl.c Thu Jun 22 09:52:50 2006
@@ -41,8 +41,22 @@
return (int) procstat;
}
-/* Create a new process */
-int
+/*
+ * int execProgram()
+ *
+ * does a fork/execvp to launch the program
+ *
+ * returns :
+ * 0 successful
+ * 1001 fork failure errno = ENOMEM
+ * 1002 fork failure errno = EAGAIN
+ * -1 error, unknown
+ *
+ * TODO - fill in windows error codes
+ *
+ * Note - there is one error code 'namespace' for execProgram
+ * please coordinate w/ other platform impls
+ */int
execProgram (JNIEnv * vmthread, jobject recv,
char *command[], int commandLength,
char *env[], int envSize, char *dir,
@@ -50,6 +64,7 @@
IDATA * errHandle)
{
int retVal, envLength = 0;
+ int returnCode = -1;
HANDLE inr = NULL, inw = NULL, outr = NULL, outw = NULL, errr = NULL;
HANDLE errw = NULL, inDup = NULL, outDup = NULL, errDup = NULL;
STARTUPINFO sinfo;
@@ -63,9 +78,10 @@
char *needToBeQuoted;
PORT_ACCESS_FROM_ENV (vmthread);
- if (!commandLength)
+ if (!commandLength) {
return 0;
-
+ }
+
ZeroMemory (&sinfo, sizeof (sinfo));
ZeroMemory (&pinfo, sizeof (pinfo));
ZeroMemory (&sAttrib, sizeof (sAttrib));
@@ -78,15 +94,22 @@
/* Create the pipes to pass to the new process */
retVal = CreatePipe (&outr, &outw, &sAttrib, 512);
- if (!retVal)
- return retVal;
+
+ if (!retVal) {
+ goto failed;
+ }
+
retVal = CreatePipe (&inr, &inw, &sAttrib, 512);
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
retVal = CreatePipe (&errr, &errw, &sAttrib, 512);
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
/* fprintf(stdout,"fd:errw ==> %d\n",errw);fflush(stdout); */
@@ -94,24 +117,33 @@
retVal = DuplicateHandle (GetCurrentProcess (), inw,
GetCurrentProcess (), &inDup, 0,
FALSE, DUPLICATE_SAME_ACCESS);
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
+
CloseHandle (inw);
inw = NULL;
retVal = DuplicateHandle (GetCurrentProcess (), outr,
GetCurrentProcess (), &outDup, 0,
FALSE, DUPLICATE_SAME_ACCESS);
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
+
CloseHandle (outr);
outr = NULL;
retVal = DuplicateHandle (GetCurrentProcess (), errr,
GetCurrentProcess (), &errDup, 0,
FALSE, DUPLICATE_SAME_ACCESS);
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
+
CloseHandle (errr);
errr = NULL;
@@ -128,12 +160,19 @@
int i;
char *envBldr;
envLength = envSize + 1; /*Length of strings + null terminators + final null terminator */
- for (i = 0; i < envSize; i++)
+
+ for (i = 0; i < envSize; i++) {
envLength += strlen (env[i]);
+ }
+
envString = (char *) jclmem_allocate_memory (env, envLength);
- if (!envString)
+
+ if (!envString) {
goto failed;
- envBldr = envString;
+ }
+
+ envBldr = envString;
+
for (i = 0; i < envSize; i++)
{
strcpy (envBldr, env[i]);
@@ -153,8 +192,11 @@
*/
needToBeQuoted = (char *) jclmem_allocate_memory (env, commandLength);
- if (!needToBeQuoted)
+
+ if (!needToBeQuoted) {
goto failed;
+ }
+
memset (needToBeQuoted, '\0', commandLength);
length = commandLength; /*add 1 <blank> between each token + a reserved place for the last NULL */
@@ -177,8 +219,9 @@
length += 2; /* two quotes are added */
if (commandILength > 1
&& commandStart[commandILength - 1] == '\\'
- && commandStart[commandILength - 2] != '\\')
+ && commandStart[commandILength - 2] != '\\') {
length++; /* need to double slash */
+ }
break;
}
}
@@ -203,8 +246,10 @@
ptr += l;
if (needToBeQuoted[i])
{
- if (l > 1 && *(ptr - 1) == '\\' && *(ptr - 2) != '\\')
+ if (l > 1 && *(ptr - 1) == '\\' && *(ptr - 2) != '\\') {
*ptr++ = '\\';
+ }
+
(*ptr) = '"' /*"XXX */ ;
ptr++;
}
@@ -219,11 +264,14 @@
envString, dir, &sinfo, &pinfo);
jclmem_free_memory (env, commandAsString);
/* retVal is non-zero if successful */
- if (!retVal)
+
+ if (!retVal) {
goto failed;
+ }
- if (envSize)
+ if (envSize) {
jclmem_free_memory (env, envString);
+ }
*procHandle = (IDATA) pinfo.hProcess;
/* Close Handles passed to child */
@@ -231,7 +279,8 @@
CloseHandle (outw);
CloseHandle (errw);
CloseHandle (pinfo.hThread); /*implicitly created, a leak otherwise */
- return retVal;
+
+ return 0;
failed:
if (envSize)
@@ -254,8 +303,8 @@
CloseHandle (outDup);
if (errDup)
CloseHandle (errDup);
- return 0;
-
+
+ return returnCode;
}
/* Stream handling support */