aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/ChangeLog18
-rw-r--r--libjava/java/lang/EcosProcess.java6
-rw-r--r--libjava/java/lang/PosixProcess.java12
-rw-r--r--libjava/java/lang/Runtime.java10
-rw-r--r--libjava/java/lang/Win32Process.java6
-rw-r--r--libjava/java/lang/natPosixProcess.cc19
-rw-r--r--libjava/java/lang/natRuntime.cc6
7 files changed, 60 insertions, 17 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 8c4208b..e279ce9 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,21 @@
+2002-08-13 Jesse Rosenstock <jmr@ugcs.caltech.edu>
+
+ Fix for PR libgcj/7570 and PR libgcj/7578:
+ * java/lang/natPosixProcess.cc: Include java/io/File.h.
+ (startProcess): Handle new `dir' argument.
+ * java/lang/Win32Process.java (ConcreteProcess): Added `dir'
+ argument.
+ * java/lang/PosixProcess.java (ConcreteProcess): Added `dir'
+ argument.
+ (startProcess): Likewise.
+ * java/lang/EcosProcess.java (ConcreteProcess): Added `dir'
+ argument.
+ * java/lang/Runtime.java (execInternal): Added `dir' argument.
+ (exec): Don't create new environment if ENV==null. Pass DIR to
+ execInternal.
+ * java/lang/natRuntime.cc: Include java/io/File.h.
+ (execInternal): Added `dir' argument.
+
2002-08-13 Jesse Rosenstock <jmr@fulcrummicro.com>
* java/io/RandomAccessFile.java (skipBytes): Return number of
diff --git a/libjava/java/lang/EcosProcess.java b/libjava/java/lang/EcosProcess.java
index 4c200a0..aff534a 100644
--- a/libjava/java/lang/EcosProcess.java
+++ b/libjava/java/lang/EcosProcess.java
@@ -10,6 +10,7 @@ details. */
package java.lang;
+import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
@@ -52,7 +53,10 @@ final class ConcreteProcess extends Process
return 0;
}
- public ConcreteProcess (String[] progarray, String[] envp) throws IOException
+ public ConcreteProcess (String[] progarray,
+ String[] envp,
+ File dir)
+ throws IOException
{
throw new IOException ("eCos processes unimplemented");
}
diff --git a/libjava/java/lang/PosixProcess.java b/libjava/java/lang/PosixProcess.java
index 459f76c..199391b 100644
--- a/libjava/java/lang/PosixProcess.java
+++ b/libjava/java/lang/PosixProcess.java
@@ -10,6 +10,7 @@ details. */
package java.lang;
+import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
@@ -53,15 +54,20 @@ final class ConcreteProcess extends Process
// This is used for actual initialization, as we can't write a
// native constructor.
- public native void startProcess (String[] progarray, String[] envp)
+ public native void startProcess (String[] progarray,
+ String[] envp,
+ File dir)
throws IOException;
// This file is copied to `ConcreteProcess.java' before
// compilation. Hence the constructor name apparently does not
// match the file name.
- public ConcreteProcess (String[] progarray, String[] envp) throws IOException
+ public ConcreteProcess (String[] progarray,
+ String[] envp,
+ File dir)
+ throws IOException
{
- startProcess (progarray, envp);
+ startProcess (progarray, envp, dir);
}
// The process id. This is cast to a pid_t on the native side.
diff --git a/libjava/java/lang/Runtime.java b/libjava/java/lang/Runtime.java
index eb34391..932600b 100644
--- a/libjava/java/lang/Runtime.java
+++ b/libjava/java/lang/Runtime.java
@@ -526,7 +526,6 @@ public class Runtime
* entries
* @throws IndexOutOfBoundsException if cmd is length 0
* @since 1.3
- * @XXX Ignores dir, for now
*/
public Process exec(String[] cmd, String[] env, File dir)
throws IOException
@@ -534,10 +533,7 @@ public class Runtime
SecurityManager sm = securityManager; // Be thread-safe!
if (sm != null)
sm.checkExec(cmd[0]);
- if (env == null)
- env = new String[0];
- //XXX Should be: return execInternal(cmd, env, dir);
- return execInternal(cmd, env);
+ return execInternal(cmd, env, dir);
}
/**
@@ -729,7 +725,6 @@ public class Runtime
* the environment should contain name=value mappings. If directory is null,
* use the current working directory; otherwise start the process in that
* directory.
- * XXX Add directory support.
*
* @param cmd the non-null command tokens
* @param env the non-null environment setup
@@ -737,8 +732,7 @@ public class Runtime
* @return the newly created process
* @throws NullPointerException if cmd or env have null elements
*/
- // native Process execInternal(String[] cmd, String[] env, File dir);
- native Process execInternal(String[] cmd, String[] env);
+ native Process execInternal(String[] cmd, String[] env, File dir);
/**
* Get the system properties. This is done here, instead of in System,
diff --git a/libjava/java/lang/Win32Process.java b/libjava/java/lang/Win32Process.java
index 0af2457..72911d2 100644
--- a/libjava/java/lang/Win32Process.java
+++ b/libjava/java/lang/Win32Process.java
@@ -10,6 +10,7 @@ details. */
package java.lang;
+import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
@@ -60,7 +61,10 @@ final class ConcreteProcess extends Process
throw new Error("not implemented");
}
- public ConcreteProcess (String[] progarray, String[] envp) throws IOException
+ public ConcreteProcess (String[] progarray,
+ String[] envp,
+ File dir)
+ throws IOException
{
throw new IOException("not implemented");
}
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);
diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc
index acd44f1..18ec232 100644
--- a/libjava/java/lang/natRuntime.cc
+++ b/libjava/java/lang/natRuntime.cc
@@ -21,6 +21,7 @@ details. */
#include <java/lang/UnsatisfiedLinkError.h>
#include <gnu/gcj/runtime/FileDeleter.h>
#include <gnu/gcj/runtime/FinalizerThread.h>
+#include <java/io/File.h>
#include <java/util/Properties.h>
#include <java/util/TimeZone.h>
#include <java/lang/StringBuffer.h>
@@ -538,9 +539,10 @@ java::lang::Runtime::insertSystemProperties (java::util::Properties *newprops)
java::lang::Process *
java::lang::Runtime::execInternal (jstringArray cmd,
- jstringArray env)
+ jstringArray env,
+ java::io::File *dir)
{
- return new java::lang::ConcreteProcess (cmd, env);
+ return new java::lang::ConcreteProcess (cmd, env, dir);
}
jint