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:
Bryce McKinlay 1999-06-09 17:42:26 +00:00 committed by Bryce McKinlay
parent 8d30c4ee01
commit 1e45a14105
4 changed files with 87 additions and 33 deletions

View file

@ -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);
}