aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/natPosixProcess.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/natPosixProcess.cc')
-rw-r--r--libjava/java/lang/natPosixProcess.cc19
1 files changed, 17 insertions, 2 deletions
diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc
index b480afb..a6c049b 100644
--- a/libjava/java/lang/natPosixProcess.cc
+++ b/libjava/java/lang/natPosixProcess.cc
@@ -30,6 +30,7 @@ details. */
#include <java/lang/InterruptedException.h>
#include <java/lang/NullPointerException.h>
#include <java/lang/Thread.h>
+#include <java/io/File.h>
#include <java/io/FileDescriptor.h>
#include <java/io/FileInputStream.h>
#include <java/io/FileOutputStream.h>
@@ -116,7 +117,8 @@ myclose (int &fd)
void
java::lang::ConcreteProcess::startProcess (jstringArray progarray,
- jstringArray envp)
+ jstringArray envp,
+ java::io::File *dir)
{
using namespace java::io;
@@ -188,7 +190,7 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
if (pid == 0)
{
- // Child process, so remap descriptors and exec.
+ // Child process, so remap descriptors, chdir and exec.
if (envp)
{
@@ -229,6 +231,19 @@ java::lang::ConcreteProcess::startProcess (jstringArray progarray,
close (outp[0]);
close (outp[1]);
close (msgp[0]);
+
+ // Change directory.
+ if (dir != NULL)
+ {
+ // We don't care about leaking memory here; this process
+ // is about to terminate one way or another.
+ if (chdir (new_string (dir->getPath ())) != 0)
+ {
+ char c = errno;
+ write (msgp[1], &c, 1);
+ _exit (127);
+ }
+ }
execvp (args[0], args);