This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

libgcj/7568: Runtime.exec ignores directory argument


>Number:         7568
>Category:       libgcj
>Synopsis:       Runtime.exec ignores directory argument
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Aug 10 13:26:00 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Jesse Rosenstock
>Release:        3.3 20020810 (experimental)
>Organization:
>Environment:
System: Linux churchill 2.4.3-12 #1 Fri Jun 8 15:05:56 EDT 2001 i686 unknown
Architecture: i686

	
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: ../gcc/configure --enable-languages=c++,java --enable-threads=posix --enable-shared --prefix=/scratch/app/gcc --enable-hash-synchronization : (reconfigured) 
>Description:
	Runtime.exec ignores the File argument, which specifies the
        directory to run the command in.
>How-To-Repeat:

        ExecDir2.java:

import java.io.File;

public class ExecDir2 {
    private static void runPwdInDir(String dir) throws Exception {
        Process proc =
            Runtime.getRuntime().exec("/bin/pwd", null,
                    dir != null ? new File(dir) : null);
        int status = proc.waitFor();

        byte[] buf = new byte[proc.getInputStream().available()];
        proc.getInputStream().read(buf, 0, buf.length);

        System.out.write(buf, 0, buf.length);
    }

    public static void main(String[] args) throws Exception {
        runPwdInDir("/");
    }
}

; javac ExecDir2.java
; /bin/pwd 
/home/user/jmr/gcj_test/exec_dir
; gij ExecDir2
/home/user/jmr/gcj_test/exec_dir
; java ExecDir2
/

>Fix:

Perhaps I'm missing something.  If it were really this easy, it would
probably have been fixed before.

Index: java/lang/EcosProcess.java
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/EcosProcess.java,v
retrieving revision 1.3
diff -c -r1.3 EcosProcess.java
*** java/lang/EcosProcess.java	7 Mar 2000 19:55:26 -0000	1.3
--- java/lang/EcosProcess.java	10 Aug 2002 20:01:21 -0000
***************
*** 10,15 ****
--- 10,16 ----
  
  package java.lang;
  
+ import java.io.File;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.IOException;
***************
*** 52,58 ****
      return 0;
    }
  
!   public ConcreteProcess (String[] progarray, String[] envp) throws IOException
    {
      throw new IOException ("eCos processes unimplemented");
    }
--- 53,62 ----
      return 0;
    }
  
!   public ConcreteProcess (String[] progarray,
!                           String[] envp,
!                           File dir)
!     throws IOException
    {
      throw new IOException ("eCos processes unimplemented");
    }
Index: java/lang/PosixProcess.java
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/PosixProcess.java,v
retrieving revision 1.4
diff -c -r1.4 PosixProcess.java
*** java/lang/PosixProcess.java	24 Sep 2001 04:51:50 -0000	1.4
--- java/lang/PosixProcess.java	10 Aug 2002 20:01:21 -0000
***************
*** 10,15 ****
--- 10,16 ----
  
  package java.lang;
  
+ import java.io.File;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.IOException;
***************
*** 53,67 ****
  
    // This is used for actual initialization, as we can't write a
    // native constructor.
!   public native void startProcess (String[] progarray, String[] envp)
      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
    {
!     startProcess (progarray, envp);
    }
  
    // The process id.  This is cast to a pid_t on the native side.
--- 54,73 ----
  
    // This is used for actual initialization, as we can't write a
    // native constructor.
!   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,
!                           File dir)
!     throws IOException
    {
!     startProcess (progarray, envp, dir);
    }
  
    // The process id.  This is cast to a pid_t on the native side.
Index: java/lang/Runtime.java
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/Runtime.java,v
retrieving revision 1.11
diff -c -r1.11 Runtime.java
*** java/lang/Runtime.java	24 Jul 2002 23:17:39 -0000	1.11
--- java/lang/Runtime.java	10 Aug 2002 20:01:21 -0000
***************
*** 526,532 ****
     *         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
--- 526,531 ----
***************
*** 536,543 ****
        sm.checkExec(cmd[0]);
      if (env == null)
        env = new String[0];
!     //XXX Should be:    return execInternal(cmd, env, dir);
!     return execInternal(cmd, env);
    }
  
    /**
--- 535,541 ----
        sm.checkExec(cmd[0]);
      if (env == null)
        env = new String[0];
!     return execInternal(cmd, env, dir);
    }
  
    /**
***************
*** 729,735 ****
     * 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
--- 727,732 ----
***************
*** 737,744 ****
     * @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);
  
    /**
     * Get the system properties. This is done here, instead of in System,
--- 734,740 ----
     * @return the newly created process
     * @throws NullPointerException if cmd or env have null elements
     */
!   native Process execInternal(String[] cmd, String[] env, File dir);
  
    /**
     * Get the system properties. This is done here, instead of in System,
Index: java/lang/Win32Process.java
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/Win32Process.java,v
retrieving revision 1.4
diff -c -r1.4 Win32Process.java
*** java/lang/Win32Process.java	10 Mar 2002 17:59:22 -0000	1.4
--- java/lang/Win32Process.java	10 Aug 2002 20:01:21 -0000
***************
*** 10,15 ****
--- 10,16 ----
  
  package java.lang;
  
+ import java.io.File;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.io.IOException;
***************
*** 60,66 ****
      throw new Error("not implemented");
    }
  
!   public ConcreteProcess (String[] progarray, String[] envp) throws IOException
    {
      throw new IOException("not implemented");
    }
--- 61,70 ----
      throw new Error("not implemented");
    }
  
!   public ConcreteProcess (String[] progarray,
!                           String[] envp,
!                           File dir)
!     throws IOException
    {
      throw new IOException("not implemented");
    }
Index: java/lang/natPosixProcess.cc
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/natPosixProcess.cc,v
retrieving revision 1.12
diff -c -r1.12 natPosixProcess.cc
*** java/lang/natPosixProcess.cc	6 Mar 2002 05:13:58 -0000	1.12
--- java/lang/natPosixProcess.cc	10 Aug 2002 20:01:21 -0000
***************
*** 30,35 ****
--- 30,36 ----
  #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,122 ****
  
  void
  java::lang::ConcreteProcess::startProcess (jstringArray progarray,
! 					   jstringArray envp)
  {
    using namespace java::io;
  
--- 117,124 ----
  
  void
  java::lang::ConcreteProcess::startProcess (jstringArray progarray,
! 					   jstringArray envp,
! 					   java::io::File *dir)
  {
    using namespace java::io;
  
***************
*** 188,194 ****
  
        if (pid == 0)
  	{
! 	  // Child process, so remap descriptors and exec.
  
  	  if (envp)
  	    {
--- 190,196 ----
  
        if (pid == 0)
  	{
! 	  // Child process, so remap descriptors, chdir and exec.
  
  	  if (envp)
  	    {
***************
*** 229,234 ****
--- 231,245 ----
  	  close (outp[0]);
  	  close (outp[1]);
  	  close (msgp[0]);
+           
+ 	  // Change directory
+ 	  if (dir != NULL)
+ 	    if (chdir (new_string (dir->getPath ())) != 0)
+ 	      {
+ 		char c = errno;
+ 		write (msgp[1], &c, 1);
+ 		_exit (127);
+ 	      }
  
  	  execvp (args[0], args);
  
Index: java/lang/natRuntime.cc
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/natRuntime.cc,v
retrieving revision 1.24
diff -c -r1.24 natRuntime.cc
*** java/lang/natRuntime.cc	6 Jul 2002 05:11:53 -0000	1.24
--- java/lang/natRuntime.cc	10 Aug 2002 20:01:21 -0000
***************
*** 21,26 ****
--- 21,27 ----
  #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,546 ****
  
  java::lang::Process *
  java::lang::Runtime::execInternal (jstringArray cmd,
! 				   jstringArray env)
  {
!   return new java::lang::ConcreteProcess (cmd, env);
  }
  
  jint
--- 539,548 ----
  
  java::lang::Process *
  java::lang::Runtime::execInternal (jstringArray cmd,
! 				   jstringArray env,
! 				   java::io::File *dir)
  {
!   return new java::lang::ConcreteProcess (cmd, env, dir);
  }
  
  jint
>Release-Note:
>Audit-Trail:
>Unformatted:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]