diff options
| author | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-06-09 17:42:26 +0000 |
|---|---|---|
| committer | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-06-09 17:42:26 +0000 |
| commit | b05ff674e18d58060e4a787690c02125d76d015b (patch) | |
| tree | cfcc17dc0b0ed3f23921fd3008f2b30835bad356 /libjava/java/lang/natPosixProcess.cc | |
| parent | 38794c372c362667b5640b0d48ce0b6cd82f1261 (diff) | |
| download | gcc-b05ff674e18d58060e4a787690c02125d76d015b.tar.gz | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27458 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang/natPosixProcess.cc')
| -rw-r--r-- | libjava/java/lang/natPosixProcess.cc | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc index 30fa9d58229..5c6d9a7644d 100644 --- a/libjava/java/lang/natPosixProcess.cc +++ b/libjava/java/lang/natPosixProcess.cc @@ -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); } |
