Runtime.java (exec): Convert prog name and arguments to string array.
* java/lang/Runtime.java (exec): Convert prog name and arguments to string array. * java/lang/natPosixProcess.cc (startProcess): Fix typo in environment array conversion. Preserve current environment if envp not passed. Preserve PATH unless explicitly specified. * java/io/DataInputStream.java (readLine): Fix case where '\r' is followed by EOF. Set a flag when a line is terminated by '\r' and ignore following '\n' if set. From-SVN: r27458
This commit is contained in:
committed by
Bryce McKinlay
parent
8d30c4ee01
commit
1e45a14105
@@ -13,6 +13,7 @@ package java.lang;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* @author Tom Tromey <tromey@cygnus.com>
|
||||
@@ -30,15 +31,15 @@ public class Runtime
|
||||
{
|
||||
public Process exec (String prog) throws IOException
|
||||
{
|
||||
String[] a = new String[1];
|
||||
a[0] = prog;
|
||||
return exec (a, null);
|
||||
return exec (prog, null);
|
||||
}
|
||||
|
||||
public Process exec (String prog, String[] envp) throws IOException
|
||||
{
|
||||
String[] a = new String[1];
|
||||
a[0] = prog;
|
||||
StringTokenizer st = new StringTokenizer(prog);
|
||||
String[] a = new String[st.countTokens ()];
|
||||
for (int i = 0; i < a.length; i++)
|
||||
a[i] = st.nextToken ();
|
||||
return exec (a, envp);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ details. */
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <cni.h>
|
||||
#include <jvm.h>
|
||||
@@ -115,15 +116,7 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
|
||||
// thrown we will leak memory.
|
||||
char **args = (char **) _Jv_Malloc ((progarray->length + 1)
|
||||
* sizeof (char *));
|
||||
|
||||
char **env = NULL;
|
||||
if (envp)
|
||||
env = (char **) _Jv_Malloc ((envp->length + 1) * sizeof (char *));
|
||||
|
||||
// for (int i = 0; i < progarray->length; ++i)
|
||||
// args[i] = NULL;
|
||||
// for (int i = 0; i < envp->length; ++i)
|
||||
// env[i] = NULL;
|
||||
|
||||
// FIXME: GC will fail here if _Jv_Malloc throws an exception.
|
||||
// That's because we have to manually free the contents, but we
|
||||
@@ -134,10 +127,11 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
|
||||
|
||||
if (envp)
|
||||
{
|
||||
env = (char **) _Jv_Malloc ((envp->length + 1) * sizeof (char *));
|
||||
elts = elements (envp);
|
||||
for (int i = 0; i < envp->length; ++i)
|
||||
args[i] = new_string (elts[i]);
|
||||
args[envp->length] = NULL;
|
||||
env[i] = new_string (elts[i]);
|
||||
env[envp->length] = NULL;
|
||||
}
|
||||
|
||||
// Create pipes for I/O.
|
||||
@@ -172,8 +166,18 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
|
||||
// Child process, so remap descriptors and exec.
|
||||
|
||||
if (envp)
|
||||
environ = env;
|
||||
|
||||
{
|
||||
// preserve PATH unless specified explicitly
|
||||
char *path_val = getenv("PATH");
|
||||
environ = env;
|
||||
if (getenv("PATH") == NULL)
|
||||
{
|
||||
char *path_env = (char *) _Jv_Malloc (strlen(path_val) + 5 + 1);
|
||||
sprintf (path_env, "PATH=%s", path_val);
|
||||
putenv (path_env);
|
||||
}
|
||||
}
|
||||
|
||||
// We ignore errors from dup2 because they should never occur.
|
||||
dup2 (outp[0], 0);
|
||||
dup2 (inp[1], 1);
|
||||
@@ -186,8 +190,9 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
|
||||
close (outp[0]);
|
||||
close (outp[1]);
|
||||
|
||||
environ = env;
|
||||
execvp (args[0], args);
|
||||
// FIXME: should throw an IOException if execvp() fails. Not trivial,
|
||||
// because _Jv_Throw won't work from child process
|
||||
_exit (127);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user