This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch: Win32 Process Implementation


Hi People,

Here is a patch to Ranjit's Win32 process implementation which
corrects the fact that both the executable path and its arguments
need to be quoted if they contain embedded spaces. The patch
unconditionally quotes these. In addition, any embedded quotes
present in command line arguments to the executable are stripped -
this behavior seems to be consistent with what I observed in
Sun's JDK (1.4.1_01).

I've attached a test case and the pre- and post-bugfix output
as well as the output when run under Sun's java.

This patch corrects the problem I was observing here:

http://gcc.gnu.org/ml/java/2003-02/msg00306.html

which wasn't due to backslashes, but rather, the fact that
my executable was in "\Program Files\thisiscool-gcc".

With this patch and my _Jv_ThisExecutable() implementation,
(cf. the above post) for which I haven't submitted a formal
patch yet, Ranjit's stack traces work no matter where you launch
the executable from.

I used Ranjit's email format - let me know if this format
is okay.

-- Mohan
http://www.thisiscool.com/
http://www.animalsong.org/


ChangeLog:
2003-02-20  Mohan Embar  <gnustuff at thisiscool dot com>

	* java/lang/natWin32Process.cc
	addArg(): helper function which adds an argument to
	the command line, double-quoting it but removing
	embedded quotes. This is consistent JDK 1.4
	java::lang::ConcreteProcess::startProcess: use addArg()
	for the executable name and its arguments

---------------------------------- 8< ----------------------------------
Index: java/lang/natWin32Process.cc
===================================================================
--- java/lang/natWin32Process.cc	2003-02-20 01:29:08.000000000 -0600
+++ java/lang/natWin32Process.cc	2003-02-20 03:33:12.000000000 -0600
@@ -122,4 +122,19 @@
 }
 
+static void addArg(char*& rpszDst, const char* pcszSrc)
+{
+  // Adds the current argument to the command line,
+  // quoting the argument as well as removing any
+  // quotes from within the argument.
+  *rpszDst++ = '\"';
+  char c;
+  while ((c = *pcszSrc++)) // note = and not ==
+  {
+    if (c != '\"')
+      *rpszDst++ = c;
+  }
+  *rpszDst++ = '\"';
+}
+
 void
 java::lang::ConcreteProcess::startProcess (jstringArray progarray,
@@ -137,19 +152,21 @@
 
   for (int i = 0; i < progarray->length; ++i)
-    cmdLineLen += (_Jv_GetStringUTFLength (elts[i]) + 1);
+    cmdLineLen += (_Jv_GetStringUTFLength (elts[i]) + 3);
 
   char *cmdLine = (char *) _Jv_Malloc (cmdLineLen + 1);
+  char *cmdLineCurPos = cmdLine;
 
-  int j = 0;
   for (int i = 0; i < progarray->length; ++i)
     {
+      if (i>0)
+        *cmdLineCurPos++ = ' ';
       jsize s = _Jv_GetStringUTFLength (elts[i]);
-      _Jv_GetStringUTFRegion (elts[i], 0, s, (cmdLine + j));
-
-      j += s;
-      *(cmdLine + j) = ' ';
-      j++;
+      char* pszThisArg = (char*) _Jv_Malloc(s+1);
+      _Jv_GetStringUTFRegion (elts[i], 0, s, pszThisArg);
+      pszThisArg[s] = '\0';
+      addArg(cmdLineCurPos, pszThisArg);
+      _Jv_Free(pszThisArg);
     }
-  *(cmdLine + j) = '\0';
+  *cmdLineCurPos = '\0';
 
   // Get the environment, if any.
---------------------------------- 8< ----------------------------------

Attachment: PrintArgs.zip
Description: Zip archive


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]