From 3dbf7319f6bfc98d7cfc1318538554278e42648a Mon Sep 17 00:00:00 2001 From: tromey Date: Mon, 5 Mar 2007 15:57:13 +0000 Subject: [PATCH] * sources.am, Makefile.in: Rebuilt. * scripts/makemake.tcl (emit_package_rule): Don't omit VMProcess.java. * Makefile.am (nat_source_files): Added natVMProcess.cc. (inner_nat_headers): Added ImmediateEOFInputStream.h. * gcj/javaprims.h: Regenerated. * java/lang/System.java (EnvironmentMap): Now package-private. (EnvironmentMap(Map)): New constructor. (EnvironmentMap.put): New method. * java/lang/natWin32Process.cc (startProcess): Update. * java/lang/Win32Process.java (Win32Process): Added 'redirect' argument. (startProcess): Likewise. * java/lang/EcosProcess.java (EcosProcess): Added 'redirect' argument. * java/lang/natPosixProcess.cc (nativeSpawn): Handle redirection. * java/lang/PosixProcess.java (redirect): New field. (PosixProcess): Added 'redirect' argument. * java/lang/natRuntime.cc (execInternal): Added 'redirect' argument to Process creation. * java/lang/natVMProcess.cc: New file. * java/lang/ProcessBuilder.java: Removed. * java/lang/VMProcess.java: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122553 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 26 ++++++ libjava/Makefile.am | 2 + libjava/Makefile.in | 22 +++-- libjava/classpath/lib/java/lang/EcosProcess.class | Bin 1047 -> 1073 bytes .../java/lang/PosixProcess$EOFInputStream.class | Bin 567 -> 567 bytes libjava/classpath/lib/java/lang/PosixProcess.class | Bin 4143 -> 4197 bytes .../classpath/lib/java/lang/ProcessBuilder.class | Bin 2592 -> 2812 bytes .../lib/java/lang/System$EnvironmentMap.class | Bin 2592 -> 3407 bytes .../lib/java/lang/System$EnvironmentSet.class | Bin 1021 -> 1021 bytes libjava/classpath/lib/java/lang/System.class | Bin 5896 -> 5896 bytes libjava/classpath/lib/java/lang/VMProcess.class | Bin 0 -> 1926 bytes libjava/classpath/lib/java/lang/Win32Process.class | Bin 1711 -> 1739 bytes libjava/gcj/javaprims.h | 3 +- libjava/java/lang/EcosProcess.h | 2 +- libjava/java/lang/EcosProcess.java | 7 +- libjava/java/lang/PosixProcess.h | 3 +- libjava/java/lang/PosixProcess.java | 8 +- libjava/java/lang/System$EnvironmentMap.h | 3 + libjava/java/lang/System.java | 44 +++++++++- libjava/java/lang/VMProcess.h | 24 ++++++ .../lang/{ProcessBuilder.java => VMProcess.java} | 92 +++++---------------- libjava/java/lang/Win32Process.h | 4 +- libjava/java/lang/Win32Process.java | 14 ++-- libjava/java/lang/natPosixProcess.cc | 58 ++++++++----- libjava/java/lang/natRuntime.cc | 4 +- libjava/java/lang/natVMProcess.cc | 34 ++++++++ libjava/java/lang/natWin32Process.cc | 7 +- libjava/scripts/makemake.tcl | 2 +- libjava/sources.am | 5 +- 29 files changed, 235 insertions(+), 129 deletions(-) create mode 100644 libjava/classpath/lib/java/lang/VMProcess.class create mode 100644 libjava/java/lang/VMProcess.h rename libjava/java/lang/{ProcessBuilder.java => VMProcess.java} (53%) create mode 100644 libjava/java/lang/natVMProcess.cc diff --git a/libjava/ChangeLog b/libjava/ChangeLog index c595a229d71..3f940e242ef 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,29 @@ +2007-03-05 Tom Tromey + + * sources.am, Makefile.in: Rebuilt. + * scripts/makemake.tcl (emit_package_rule): Don't omit + VMProcess.java. + * Makefile.am (nat_source_files): Added natVMProcess.cc. + (inner_nat_headers): Added ImmediateEOFInputStream.h. + * gcj/javaprims.h: Regenerated. + * java/lang/System.java (EnvironmentMap): Now package-private. + (EnvironmentMap(Map)): New constructor. + (EnvironmentMap.put): New method. + * java/lang/natWin32Process.cc (startProcess): Update. + * java/lang/Win32Process.java (Win32Process): Added 'redirect' + argument. + (startProcess): Likewise. + * java/lang/EcosProcess.java (EcosProcess): Added 'redirect' + argument. + * java/lang/natPosixProcess.cc (nativeSpawn): Handle redirection. + * java/lang/PosixProcess.java (redirect): New field. + (PosixProcess): Added 'redirect' argument. + * java/lang/natRuntime.cc (execInternal): Added 'redirect' + argument to Process creation. + * java/lang/natVMProcess.cc: New file. + * java/lang/ProcessBuilder.java: Removed. + * java/lang/VMProcess.java: New file. + 2007-03-03 Andrew Haley * java/lang/natClass.cc (parseAnnotationElement): Correct long diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 9b87324e65a..3151444ccdf 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -406,6 +406,7 @@ inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \ java/nio/DirectByteBufferImpl$$ReadWrite.h \ java/nio/channels/Pipe$$SinkChannel.h \ java/nio/channels/Pipe$$SourceChannel.h \ + java/lang/VMProcess$ImmediateEOFInputStream.h \ java/lang/reflect/Proxy$$ProxyData.h \ java/lang/reflect/Proxy$$ProxyType.h \ gnu/java/net/PlainSocketImpl$$SocketInputStream.h \ @@ -883,6 +884,7 @@ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThreadLocal.cc \ java/lang/natVMClassLoader.cc \ +java/lang/natVMProcess.cc \ java/lang/natVMThrowable.cc \ java/lang/ref/natReference.cc \ java/lang/reflect/natArray.cc \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index 99433510638..04d19c327ad 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -331,8 +331,9 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc jvmti.cc exception.cc \ java/lang/natString.cc java/lang/natStringBuffer.cc \ java/lang/natStringBuilder.cc java/lang/natSystem.cc \ java/lang/natThread.cc java/lang/natThreadLocal.cc \ - java/lang/natVMClassLoader.cc java/lang/natVMThrowable.cc \ - java/lang/ref/natReference.cc java/lang/reflect/natArray.cc \ + java/lang/natVMClassLoader.cc java/lang/natVMProcess.cc \ + java/lang/natVMThrowable.cc java/lang/ref/natReference.cc \ + java/lang/reflect/natArray.cc \ java/lang/reflect/natConstructor.cc \ java/lang/reflect/natField.cc java/lang/reflect/natMethod.cc \ java/lang/reflect/natVMProxy.cc java/net/natVMInetAddress.cc \ @@ -393,8 +394,9 @@ am__objects_2 = gnu/classpath/jdwp/natVMFrame.lo \ java/lang/natString.lo java/lang/natStringBuffer.lo \ java/lang/natStringBuilder.lo java/lang/natSystem.lo \ java/lang/natThread.lo java/lang/natThreadLocal.lo \ - java/lang/natVMClassLoader.lo java/lang/natVMThrowable.lo \ - java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \ + java/lang/natVMClassLoader.lo java/lang/natVMProcess.lo \ + java/lang/natVMThrowable.lo java/lang/ref/natReference.lo \ + java/lang/reflect/natArray.lo \ java/lang/reflect/natConstructor.lo \ java/lang/reflect/natField.lo java/lang/reflect/natMethod.lo \ java/lang/reflect/natVMProxy.lo java/net/natVMInetAddress.lo \ @@ -4270,7 +4272,7 @@ classpath/java/lang/Override.java \ classpath/java/lang/Package.java \ java/lang/PosixProcess.java \ classpath/java/lang/Process.java \ -java/lang/ProcessBuilder.java \ +classpath/java/lang/ProcessBuilder.java \ classpath/java/lang/Readable.java \ classpath/java/lang/Runnable.java \ java/lang/Runtime.java \ @@ -4302,6 +4304,7 @@ java/lang/VMClassLoader.java \ java/lang/VMCompiler.java \ java/lang/VMDouble.java \ java/lang/VMFloat.java \ +java/lang/VMProcess.java \ java/lang/VMThrowable.java \ classpath/java/lang/VerifyError.java \ classpath/java/lang/VirtualMachineError.java \ @@ -7777,6 +7780,7 @@ inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \ java/nio/DirectByteBufferImpl$$ReadWrite.h \ java/nio/channels/Pipe$$SinkChannel.h \ java/nio/channels/Pipe$$SourceChannel.h \ + java/lang/VMProcess$ImmediateEOFInputStream.h \ java/lang/reflect/Proxy$$ProxyData.h \ java/lang/reflect/Proxy$$ProxyType.h \ gnu/java/net/PlainSocketImpl$$SocketInputStream.h \ @@ -7992,6 +7996,7 @@ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThreadLocal.cc \ java/lang/natVMClassLoader.cc \ +java/lang/natVMProcess.cc \ java/lang/natVMThrowable.cc \ java/lang/ref/natReference.cc \ java/lang/reflect/natArray.cc \ @@ -8503,6 +8508,8 @@ java/lang/natThreadLocal.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/natVMClassLoader.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) +java/lang/natVMProcess.lo: java/lang/$(am__dirstamp) \ + java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/natVMThrowable.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/ref/$(am__dirstamp): @@ -8950,6 +8957,8 @@ mostlyclean-compile: -rm -f java/lang/natVMDouble.lo -rm -f java/lang/natVMFloat.$(OBJEXT) -rm -f java/lang/natVMFloat.lo + -rm -f java/lang/natVMProcess.$(OBJEXT) + -rm -f java/lang/natVMProcess.lo -rm -f java/lang/natVMThrowable.$(OBJEXT) -rm -f java/lang/natVMThrowable.lo -rm -f java/lang/ref/natReference.$(OBJEXT) @@ -9102,6 +9111,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natVMClassLoader.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natVMDouble.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natVMFloat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natVMProcess.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natVMThrowable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/ref/$(DEPDIR)/natReference.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natArray.Plo@am__quote@ @@ -11057,7 +11067,7 @@ java/io.list: $(java_io_source_files) java/lang.list: $(java_lang_source_files) @$(mkinstalldirs) $(dir $@) - echo $(srcdir)/classpath/lib/java/lang/*.class | tr ' ' '\n' | fgrep -v Object.class | fgrep -v Class.class | grep -v '[^/]Process' > java/lang.list + echo $(srcdir)/classpath/lib/java/lang/*.class | tr ' ' '\n' | fgrep -v Object.class | fgrep -v Class.class | egrep -v '(Ecos|Posix|Win32)Process' > java/lang.list -include java/lang.deps diff --git a/libjava/classpath/lib/java/lang/EcosProcess.class b/libjava/classpath/lib/java/lang/EcosProcess.class index f306e4c87afa5549f507ab8ff018b304899ef23e..84ef1599bf9b4039de79545154321b965e491164 100644 GIT binary patch delta 99 zcmbQvv5|x8)W2Q(7#J7~8MHTY1u-&NXiP3-6b52N#;D1Y7+3Rh6s4wQ7NsVaFfuSk zZMJ4AXJk!bU}j*Qyq#H<(~5x`sMiF@d&;aS%)r3Mpw6Jdz{0@Dpa~RbV$cErADtB3 delta 73 zcmdnUF`a|!)W2Q(7#J7~88kO?1u-(2YfLU=6b53&$&(pZZ}w#>Wn_(FU}j*Me4JU8 Z)0%-Bs8$Qe`^v1z$;hA%;M1& diff --git a/libjava/classpath/lib/java/lang/PosixProcess.class b/libjava/classpath/lib/java/lang/PosixProcess.class index dc237fc1149bd48d930b90333dacbce2a3e88feb..0227add131e85b5fccde4022088939d131d1aafb 100644 GIT binary patch literal 4197 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 diff --git a/libjava/classpath/lib/java/lang/ProcessBuilder.class b/libjava/classpath/lib/java/lang/ProcessBuilder.class index 10bbc8183bda047a8b09f3a098289afbb6a910c7..d83d708d82e3805ae19989fc51e942dc75b43a20 100644 GIT binary patch literal 2812 zcma)8Npl-T6#iP4Jl1${9B+wZl0Xo)7RRy)A%Kjt7zYfpo#3G0gl#N0@;F*dYm|zM zT;NK_bu=B8~yq3FTVkpL)k!t z;rNby*UpyhYAJh7)QY@bztV8ZTU;23G7PqM*EV-}(PfBlIf4c?vBxlwSNl#ad(|oP z9D`A;RVsFMi%xo54c94W^G@BR&G@=gs@iTtaE3(3_PjS&Jl0*|R7<%9I?~UpcO6ly zR(O@5k7$Qh>|NSF-@XzOB|L7Q;GPTyc8j5R-l;n70>f}p3#e$P3Jg=7t06cGIr(IC zv9`rc^kCG&AjTMalBt4$;|!MWR3A<-^fl^S%n%I|PvVq;lWlgd@6}yiv2Yqskqss8 zQg(K^aLM&apN?);s#~XtV>lyeJi{;=cBBvo!?PA*=ru6KaJrRj4?VHea-aN`JX03Z z$dF^ih;qYlH0eXDOv|j8n8aC$JHs%fJ0~|&3Ut;&KP(CVoP_}#k)!7=80eEpcB*`} zQQ73;hP_#)S{cgMigvkR3rEiV#i+aO)EQ1_y4&lQs$;DE;NEU(r`s1J|it1ebbwt+^A&I^H&L zgJE2|PrTR=j=Q&FSM3rP77Dm2yJbTN)!8O=E$z?d`murA28jNE3fOF^7T(2sB#o}3 zq`a(4^DEN82SG7w-NGb_wuMdE8RErlUc9q(j~7jB;Ufcd;XGODKw-r%1`8!@Q-kC5 zB*S87P31fRLALy9km@kk$<9cfGGngS8luSM3xtr{OK(OBrdJh-q*qoH5!tI~6p^ih zR^w`H(wy2!bN&R)sj1LjKdlYoD9ybmhcHa5pQ}i~+4KQM(!b)^#?bg7CJylQJ`yya z+&Dz?0Mq-(rhE1=m(J|t+z)iH2j}Vg6oGp|KE?<>!6@$I3_imYzQ8oT#0#`LMvw%6 z3wV)!<;Wxa5{)HMZ^fk1r$q2&`jy1)`^0AdH?c$Hd~Okq+gB8)liSzG;v0?IY?Iq8 zal1?ms2*{pY1N`)lvV3MEd3MCeNPlUm|j{2zE$BoIWa$+4DxC-$dU?jo#xUGLm8Qt zVLT^g;(!N~)B}x~(PUpvP3U8^i@nT392D2P|E%UxN>b}(WC zp^VC-Z zfj{D{eC8oWGP1sUe#Scy{Eqh@;6pj5PnJFj`pg}o*a9D-<6wFEgStZh7*;XP)-)2q Qt&1WB2R9Xo9i{uuf8I=C#{d8T literal 2592 zcmai0ZC4vb6n-WoELql;^43DER;4sANJNWRLHZ`OXn?lCD4^CQ%%O|PE}h-g>CA&=QZKsfIH;xf4ma`%ZNJh#bRN_|#yTC)%7 ze7@6?5G6V8fZ&P-1KVckUvgY0SY{Z>YXL*pg&M<^ZfioG#gQ47n}BOgX%n7@#=P?W(!B|BV#&vwXgKeyrCSi}qP)z1@u8R?l*z(eh3$cIP zHwmD%{MxvW#ACT4geT~L+s$x>XhtvQw_lny;|I2&>W;hVCXZnRIbSjRmB8w?Yt4_}qnTfzyB)@;|_=fc8$JdiJ4ONj7Q%IRD>?=B8v6Ey#y z(^DA+Y(IwE`b+-P9*S}kN%Igd%pOiAI zUQ5)ue2j@;XJKb00DAT*DLwybq~zSwDkVpktl4mF(w@egK$e$T>q=C}+vN&2_2=$rf?l){y92WfRLP z45C0GRBL|RQw1%gs=~uWL@T(HKxgJh(n~Ml-V2;R>7kR8oqwu^64oI)2QQ!_XHC+% zOT|s$Q%ans-De@89clonQtlV5RZ4$jv?Tkh?>AIa_zPRlu)|JM4U;3_(eEME@i8V4 WXeo11Ez|TL;Tt>%Q$7q?e)}KAIv5B5 diff --git a/libjava/classpath/lib/java/lang/System$EnvironmentMap.class b/libjava/classpath/lib/java/lang/System$EnvironmentMap.class index cb2f72235d93db94f0ed934fd99ee45a8e970003..04ee59d55975de16a42f1ac0dacc64e527a59676 100644 GIT binary patch literal 3407 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 delta 17 YcmeCs>(JZqUyPHBQG$VyQHp^J04@*%ga7~l diff --git a/libjava/classpath/lib/java/lang/VMProcess.class b/libjava/classpath/lib/java/lang/VMProcess.class new file mode 100644 index 0000000000000000000000000000000000000000..5a13c77537810f5dd7bb8ad2ff2653eada860ae8 GIT binary patch literal 1926 zcmah}VN)Ab6g@8_*^q20r9h2ZsTFI0me^`3CJ?1al{P?YYP7Ugm*g29rkl)W!+rjG_rCYn-@pD2;3~c`5D_@LXYE_r zx@Fh0<&C>eqas@^15ts|eqd{7PgY!k_>!`fTM!t^%#;P9tBtBmVhF<~Vu%ZzE-G7Y zwx8@s=f1U5mjYwOM#ZX^Ek|iPa7Nu-)e@K}_A~TS=LM3s<*I$Tb|5PPw=)kz%Sx`J z>{|W=m%m6gvbR)S=C@};n*vc9dF`Mgo33iulsMMa&Q0rEy$EGVFY{`~$7s8%o-L}D zn-AF=Rx>dFC*^QS)u^ZKuo&MRM_dZA45Sr~WjSHVi#PozmlR&Y%LdW{BVOHmx=g%+ zS1G%tz9mVvcHO{h1O4~8X@CnRUdKfN!)>fMj&&%I8EB9{DfyXjhXS90X;wTO2qdR) zNfUcZ;8dR&3#|P!CT1}wkdU_P9F`=9@JuFXt|x%5d*i zI0BOcd)EU$0p7uN1MhNP`wY5K6AQS(^4Ri#*~hyG-ihf+d#^i89x0NaUekmPaO%$W z$J|$Zv#sh?=_HZEa0-hkn0Q~Oh}WchM;>bbiiw+8rORqIrCk-c63k9GZFtBBkn;(w z35aEl^pQsT_!vM?`4^y)bv-4JNE$3%{K6V|(x2K&hPVVoNtzdmpQyQ?_k;ntt`KS-`MOk zB!1>k1WCSi7??+jZ_{7E?FjI= z=LDYPdzBF{1`;Tj59;rXibf1gJ|Yk%Z(M;V{dq6&PD2VOm%VjB;sQu`j^3u2FR=VMG$ y?-VS2$-fw}ALA=pab~!O9aLD870jUu$+~^b-ID=E88w~2%dpD~0*Y1yd;bEM#^1F7 literal 0 HcmV?d00001 diff --git a/libjava/classpath/lib/java/lang/Win32Process.class b/libjava/classpath/lib/java/lang/Win32Process.class index 4ee8415b9172ce6b03aaeecc2c7e7f83bab5f4a5..ef70db741314811d353922ba96c0a78e2ff6b566 100644 GIT binary patch delta 291 zcmXAjJ5R!36o#MgqhHmUYC~uYgNe6^D)CB4V-R5w2QP?<)KM8+iHnm9|A0{!Cr6_u zC1S$nqN~40J*mrko^yYn+%MPp{22^^70#cX8?B1HuHI15>zm$H?r5iddDUrOTq{)c zVhvRD8^efpGww_siw;!F*}W} zQN9U=55FI|U~$Q}dXx6lZHU7r9wipo5)G+Qp-z=q`B?k^%N+BPi39dIKqYi2q!X%3 vJ(W;{V=UR(=7e!^?UCn{CbrUK@Im4pYjR;(<}Fl)bt#=OA*rGzs)_ypNs2GU delta 239 zcmXAiK}!Nr7)8%}zBkdtlnh9?5Yk#X6(nS#I8GT@o6^k6ML(py|6rC1(aL3rFouD< zAoM?FAGW!ik8}C%();k-#qVqmoX{J)uUehOeSJEa=^Hii&8O=AU~$B^ic`v|vKdhc zGNx3qS)1NVI3MB(Z3+#@iTNVz`O%citW9Y6kwikX(>E$(g8BREyBHiE#d&A *, JArray< ::java::lang::String * > *, ::java::io::File *); + EcosProcess(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *, jboolean); static ::java::lang::Class class$; }; diff --git a/libjava/java/lang/EcosProcess.java b/libjava/java/lang/EcosProcess.java index 30c8253e67d..79c2f12a55a 100644 --- a/libjava/java/lang/EcosProcess.java +++ b/libjava/java/lang/EcosProcess.java @@ -1,6 +1,6 @@ // EcosProcess.java - Subclass of Process for eCos systems. -/* Copyright (C) 1998, 1999, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -51,9 +51,8 @@ final class EcosProcess extends Process return 0; } - public EcosProcess (String[] progarray, - String[] envp, - File dir) + public EcosProcess (String[] progarray, String[] envp, File dir, + boolean redirect) throws IOException { throw new IOException ("eCos processes unimplemented"); diff --git a/libjava/java/lang/PosixProcess.h b/libjava/java/lang/PosixProcess.h index 62539ceb2ac..a43fa0739d5 100644 --- a/libjava/java/lang/PosixProcess.h +++ b/libjava/java/lang/PosixProcess.h @@ -31,7 +31,7 @@ public: // actually package-private private: void nativeSpawn(); public: // actually package-private - PosixProcess(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *); + PosixProcess(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *, jboolean); static jlong access$0(::java::lang::PosixProcess *); static ::java::lang::Object * access$1(); static void access$2(::java::lang::PosixProcess$ProcessManager *); @@ -39,6 +39,7 @@ private: JArray< ::java::lang::String * > * __attribute__((aligned(__alignof__( ::java::lang::Process)))) progarray; JArray< ::java::lang::String * > * envp; ::java::io::File * dir; + jboolean redirect; ::java::lang::Throwable * exception; jlong pid; public: // actually package-private diff --git a/libjava/java/lang/PosixProcess.java b/libjava/java/lang/PosixProcess.java index 517e6f33f92..6b1496426dd 100644 --- a/libjava/java/lang/PosixProcess.java +++ b/libjava/java/lang/PosixProcess.java @@ -1,5 +1,5 @@ // PosixProcess.java - Subclass of Process for POSIX systems. -/* Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2004, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -354,8 +354,8 @@ final class PosixProcess extends Process */ private native void nativeSpawn(); - PosixProcess(String[] progarray, String[] envp, File dir) - throws IOException + PosixProcess(String[] progarray, String[] envp, File dir, boolean redirect) + throws IOException { // Check to ensure there is something to run, and avoid // dereferencing null pointers in native code. @@ -365,6 +365,7 @@ final class PosixProcess extends Process this.progarray = progarray; this.envp = envp; this.dir = dir; + this.redirect = redirect; // Start a ProcessManager if there is not one already running. synchronized (queueLock) @@ -419,6 +420,7 @@ final class PosixProcess extends Process private String[] progarray; private String[] envp; private File dir; + private boolean redirect; /** Set by the ProcessManager on problems starting. */ private Throwable exception; diff --git a/libjava/java/lang/System$EnvironmentMap.h b/libjava/java/lang/System$EnvironmentMap.h index ee4582b43fb..1220f57e28f 100644 --- a/libjava/java/lang/System$EnvironmentMap.h +++ b/libjava/java/lang/System$EnvironmentMap.h @@ -13,16 +13,19 @@ class java::lang::System$EnvironmentMap : public ::java::util::HashMap public: // actually package-private System$EnvironmentMap(); + System$EnvironmentMap(::java::util::Map *); public: virtual jboolean containsKey(::java::lang::Object *); virtual jboolean containsValue(::java::lang::Object *); virtual ::java::util::Set * entrySet(); virtual ::java::lang::String * target$get(::java::lang::Object *); virtual ::java::util::Set * keySet(); + virtual ::java::lang::String * target$put(::java::lang::String *, ::java::lang::String *); virtual ::java::lang::String * target$remove(::java::lang::Object *); virtual ::java::util::Collection * values(); virtual ::java::lang::Object * get(::java::lang::Object *); virtual ::java::lang::Object * remove(::java::lang::Object *); + virtual ::java::lang::Object * put(::java::lang::Object *, ::java::lang::Object *); private: ::java::util::Set * __attribute__((aligned(__alignof__( ::java::util::HashMap)))) entries; ::java::util::Set * keys; diff --git a/libjava/java/lang/System.java b/libjava/java/lang/System.java index 76a39f0d3f2..b516a513e75 100644 --- a/libjava/java/lang/System.java +++ b/libjava/java/lang/System.java @@ -828,7 +828,7 @@ public final class System * * @author Andrew John Hughes (gnu_andrew@member.fsf.org) */ - private static class EnvironmentMap + static class EnvironmentMap extends HashMap { @@ -854,7 +854,20 @@ public final class System { super(); } - + + /** + * Constructs a new EnvironmentMap containing + * the contents of the specified map. + * + * @param m the map to be added to this. + * @throws NullPointerException if a key or value is null. + * @throws ClassCastException if a key or value is not a String. + */ + EnvironmentMap(Map m) + { + super(m); + } + /** * Blocks queries containing a null key or one which is not * of type String. All other queries @@ -939,7 +952,32 @@ public final class System keys = new EnvironmentSet(super.keySet()); return keys; } - + + /** + * Associates the given key to the given value. If the + * map already contains the key, its value is replaced. + * The map does not accept null keys or values, or keys + * and values not of type {@link String}. + * + * @param key the key to map. + * @param value the value to be mapped. + * @return the previous value of the key, or null if there was no mapping + * @throws NullPointerException if a key or value is null. + * @throws ClassCastException if a key or value is not a String. + */ + public String put(String key, String value) + { + if (key == null) + throw new NullPointerException("A new key is null."); + if (value == null) + throw new NullPointerException("A new value is null."); + if (!(key instanceof String)) + throw new ClassCastException("A new key is not a String."); + if (!(value instanceof String)) + throw new ClassCastException("A new value is not a String."); + return super.put(key, value); + } + /** * Removes a key-value pair from the map. The queried key may not * be null or of a type other than a String. diff --git a/libjava/java/lang/VMProcess.h b/libjava/java/lang/VMProcess.h new file mode 100644 index 00000000000..c0912e5c21e --- /dev/null +++ b/libjava/java/lang/VMProcess.h @@ -0,0 +1,24 @@ + +// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- + +#ifndef __java_lang_VMProcess__ +#define __java_lang_VMProcess__ + +#pragma interface + +#include +#include + + +class java::lang::VMProcess : public ::java::lang::Object +{ + +public: // actually package-private + VMProcess(); + static ::java::lang::Process * nativeExec(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *, jboolean); + static ::java::lang::Process * exec(::java::util::List *, ::java::util::Map *, ::java::io::File *, jboolean); +public: + static ::java::lang::Class class$; +}; + +#endif // __java_lang_VMProcess__ diff --git a/libjava/java/lang/ProcessBuilder.java b/libjava/java/lang/VMProcess.java similarity index 53% rename from libjava/java/lang/ProcessBuilder.java rename to libjava/java/lang/VMProcess.java index 440e5e0b48d..c0c7bebc10c 100644 --- a/libjava/java/lang/ProcessBuilder.java +++ b/libjava/java/lang/VMProcess.java @@ -1,5 +1,5 @@ -/* ProcessBuilder.java - Represent spawned system process - Copyright (C) 2005, 2006 Free Software Foundation, Inc. +/* java.lang.VMProcess -- VM implementation of java.lang.ProcessBuilder + Copyright (C) 2007 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -35,84 +35,34 @@ this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ - package java.lang; import java.io.File; import java.io.IOException; -import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.Map; -public final class ProcessBuilder +final class VMProcess { - private File directory = new File(System.getProperty("user.dir")); - private List command; - // FIXME: make a copy. - private Map environment = System.getenv(); - private boolean redirect = false; - - public ProcessBuilder(List command) - { - this.command = command; - } - - public ProcessBuilder(String... command) - { - this.command = Arrays.asList(command); - } - - public List command() - { - return command; - } - - public ProcessBuilder command(List command) - { - this.command = command; - return this; - } - - public ProcessBuilder command(String... command) - { - this.command = Arrays.asList(command); - return this; - } - - public File directory() - { - return directory; - } - - public ProcessBuilder directory(File directory) - { - this.directory = directory; - return this; - } - - public Map environment() - { - return environment; - } - - public boolean redirectErrorStream() - { - return redirect; - } - - public ProcessBuilder redirectErrorStream(boolean redirect) - { - this.redirect = redirect; - return this; - } + static native Process nativeExec(String[] cmd, String[] env, + File dir, boolean redirect) + throws IOException; - public Process start() throws IOException + static Process exec(List cmd, Map env, + File dir, boolean redirect) throws IOException { - SecurityManager sm = SecurityManager.current; // Be thread-safe! - if (sm != null) - sm.checkExec(command.get(0)); - // return VMProcess.exec(command, environment, directory, redirect); - // FIXME - return null; + String[] acmd = (String[]) cmd.toArray(new String[cmd.size()]); + String[] aenv = new String[env.size()]; + + int i = 0; + Iterator iter = env.entrySet().iterator(); + while (iter.hasNext()) + { + Map.Entry entry = (Map.Entry) iter.next(); + aenv[i++] = entry.getKey() + "=" + entry.getValue(); + } + + return nativeExec(acmd, aenv, dir, redirect); } } diff --git a/libjava/java/lang/Win32Process.h b/libjava/java/lang/Win32Process.h index 0b49c6e9c33..5e22934a990 100644 --- a/libjava/java/lang/Win32Process.h +++ b/libjava/java/lang/Win32Process.h @@ -20,10 +20,10 @@ public: ::java::io::InputStream * getInputStream(); ::java::io::OutputStream * getOutputStream(); jint waitFor(); - Win32Process(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *); + Win32Process(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *, jboolean); private: jboolean hasExited(); - void startProcess(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *); + void startProcess(JArray< ::java::lang::String * > *, JArray< ::java::lang::String * > *, ::java::io::File *, jboolean); void cleanup(); ::java::io::OutputStream * __attribute__((aligned(__alignof__( ::java::lang::Process)))) outputStream; ::java::io::InputStream * inputStream; diff --git a/libjava/java/lang/Win32Process.java b/libjava/java/lang/Win32Process.java index 7d9e40fce4a..e817a0c9090 100644 --- a/libjava/java/lang/Win32Process.java +++ b/libjava/java/lang/Win32Process.java @@ -1,6 +1,6 @@ // Win32Process.java - Subclass of Process for Win32 systems. -/* Copyright (C) 2002, 2003, 2006 Free Software Foundation +/* Copyright (C) 2002, 2003, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -51,9 +51,8 @@ final class Win32Process extends Process public native int waitFor () throws InterruptedException; - public Win32Process (String[] progarray, - String[] envp, - File dir) + public Win32Process (String[] progarray, String[] envp, File dir, + boolean redirect) throws IOException { for (int i = 0; i < progarray.length; i++) @@ -64,7 +63,7 @@ final class Win32Process extends Process progarray[i] = "\"" + s + "\""; } - startProcess (progarray, envp, dir); + startProcess (progarray, envp, dir, redirect); } // The standard streams (stdin, stdout and stderr, respectively) @@ -81,8 +80,9 @@ final class Win32Process extends Process private native boolean hasExited (); private native void startProcess (String[] progarray, - String[] envp, - File dir) + String[] envp, + File dir, + boolean redirect) throws IOException; private native void cleanup (); } diff --git a/libjava/java/lang/natPosixProcess.cc b/libjava/java/lang/natPosixProcess.cc index 498647036c5..149b5d8ba34 100644 --- a/libjava/java/lang/natPosixProcess.cc +++ b/libjava/java/lang/natPosixProcess.cc @@ -1,6 +1,6 @@ // natPosixProcess.cc - Native side of POSIX process code. -/* Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -41,6 +41,7 @@ details. */ #include #include #include +#include using gnu::java::nio::channels::FileChannelImpl; @@ -231,7 +232,7 @@ java::lang::PosixProcess::nativeSpawn () try { // Transform arrays to native form. - args = (char **) _Jv_Malloc ((progarray->length + 1) * sizeof (char *)); + args = (char **) _Jv_Malloc ((progarray->length + 1) * sizeof (char *)); // Initialize so we can gracefully recover. jstring *elts = elements (progarray); @@ -262,23 +263,30 @@ java::lang::PosixProcess::nativeSpawn () path = new_string (dir->getPath ()); // Create pipes for I/O. MSGP is for communicating exec() - // status. - if (pipe (inp) || pipe (outp) || pipe (errp) || pipe (msgp) + // status. If redirecting stderr to stdout, we don't need to + // create the ERRP pipe. + if (pipe (inp) || pipe (outp) || pipe (msgp) || fcntl (msgp[1], F_SETFD, FD_CLOEXEC)) - throw new IOException (JvNewStringUTF (strerror (errno))); + throw new IOException (JvNewStringUTF (strerror (errno))); + if (! redirect && pipe (errp)) + throw new IOException (JvNewStringUTF (strerror (errno))); // We create the streams before forking. Otherwise if we had an // error while creating the streams we would have run the child // with no way to communicate with it. - errorStream = - new FileInputStream (new - FileChannelImpl (errp[0], FileChannelImpl::READ)); - inputStream = - new FileInputStream (new - FileChannelImpl (inp[0], FileChannelImpl::READ)); - outputStream = - new FileOutputStream (new FileChannelImpl (outp[1], - FileChannelImpl::WRITE)); + if (redirect) + errorStream = PosixProcess$EOFInputStream::instance; + else + errorStream = + new FileInputStream (new + FileChannelImpl (errp[0], + FileChannelImpl::READ)); + inputStream = + new FileInputStream (new + FileChannelImpl (inp[0], FileChannelImpl::READ)); + outputStream = + new FileOutputStream (new FileChannelImpl (outp[1], + FileChannelImpl::WRITE)); // We don't use vfork() because that would cause the local // environment to be set by the child. @@ -319,14 +327,17 @@ java::lang::PosixProcess::nativeSpawn () // We ignore errors from dup2 because they should never occur. dup2 (outp[0], 0); dup2 (inp[1], 1); - dup2 (errp[1], 2); + dup2 (redirect ? inp[1] : errp[1], 2); // Use close and not myclose -- we're in the child, and we // aren't worried about the possible race condition. close (inp[0]); close (inp[1]); - close (errp[0]); - close (errp[1]); + if (! redirect) + { + close (errp[0]); + close (errp[1]); + } close (outp[0]); close (outp[1]); close (msgp[0]); @@ -362,7 +373,8 @@ java::lang::PosixProcess::nativeSpawn () myclose (outp[0]); myclose (inp[1]); - myclose (errp[1]); + if (! redirect) + myclose (errp[1]); myclose (msgp[1]); char c; @@ -406,7 +418,7 @@ java::lang::PosixProcess::nativeSpawn () { if (errorStream != NULL) errorStream->close (); - else + else if (! redirect) myclose (errp[0]); } catch (java::lang::Throwable *ignore) @@ -417,10 +429,11 @@ java::lang::PosixProcess::nativeSpawn () // the use of myclose. myclose (outp[0]); myclose (inp[1]); - myclose (errp[1]); + if (! redirect) + myclose (errp[1]); myclose (msgp[1]); - exception = thrown; + exception = thrown; } myclose (msgp[0]); @@ -430,6 +443,7 @@ java::lang::PosixProcess::nativeSpawn () { fcntl (outp[1], F_SETFD, FD_CLOEXEC); fcntl (inp[0], F_SETFD, FD_CLOEXEC); - fcntl (errp[0], F_SETFD, FD_CLOEXEC); + if (! redirect) + fcntl (errp[0], F_SETFD, FD_CLOEXEC); } } diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc index 64c8fbb3f90..02842b1dfda 100644 --- a/libjava/java/lang/natRuntime.cc +++ b/libjava/java/lang/natRuntime.cc @@ -1,6 +1,6 @@ // natRuntime.cc - Implementation of native side of Runtime class. -/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -297,7 +297,7 @@ java::lang::Runtime::execInternal (jstringArray cmd, jstringArray env, java::io::File *dir) { - return new _Jv_platform_process (cmd, env, dir); + return new _Jv_platform_process (cmd, env, dir, false); } jint diff --git a/libjava/java/lang/natVMProcess.cc b/libjava/java/lang/natVMProcess.cc new file mode 100644 index 00000000000..0a14465c4bb --- /dev/null +++ b/libjava/java/lang/natVMProcess.cc @@ -0,0 +1,34 @@ +// natVMProcess.cc - native code for ProcessBuilder + +/* Copyright (C) 2007 Free Software Foundation + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +#include + +#include +#include + +#include + +#include +#include +#include + +// It is convenient and safe to simply include all of these. +#include +#include +#include + +::java::lang::Process * +java::lang::VMProcess::nativeExec (jstringArray cmd, + jstringArray env, + ::java::io::File *dir, + jboolean redirect) +{ + return new _Jv_platform_process (cmd, env, dir, redirect); +} diff --git a/libjava/java/lang/natWin32Process.cc b/libjava/java/lang/natWin32Process.cc index d07f501366b..c836b5630f5 100644 --- a/libjava/java/lang/natWin32Process.cc +++ b/libjava/java/lang/natWin32Process.cc @@ -1,6 +1,6 @@ // natWin32Process.cc - Native side of Win32 process code. -/* Copyright (C) 2003, 2006 Free Software Foundation +/* Copyright (C) 2003, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -210,8 +210,9 @@ HANDLE ChildProcessPipe::getChildHandle() void java::lang::Win32Process::startProcess (jstringArray progarray, - jstringArray envp, - java::io::File *dir) + jstringArray envp, + java::io::File *dir, + jboolean redirect) { using namespace java::io; diff --git a/libjava/scripts/makemake.tcl b/libjava/scripts/makemake.tcl index 59a5915a5fe..4ac29a5fa30 100755 --- a/libjava/scripts/makemake.tcl +++ b/libjava/scripts/makemake.tcl @@ -304,7 +304,7 @@ proc emit_package_rule {package} { # Object and Class are special cases due to an apparent compiler # bug. Process is a special case because we don't build all # concrete implementations of Process on all platforms. - set omit "| tr ' ' '\\n' | fgrep -v Object.class | fgrep -v Class.class | grep -v '\[^/\]Process' " + set omit "| tr ' ' '\\n' | fgrep -v Object.class | fgrep -v Class.class | egrep -v '\(Ecos\|Posix\|Win32\)Process' " } else { set omit "" } diff --git a/libjava/sources.am b/libjava/sources.am index e9adc2178f7..4bf9956f161 100644 --- a/libjava/sources.am +++ b/libjava/sources.am @@ -4721,7 +4721,7 @@ classpath/java/lang/Override.java \ classpath/java/lang/Package.java \ java/lang/PosixProcess.java \ classpath/java/lang/Process.java \ -java/lang/ProcessBuilder.java \ +classpath/java/lang/ProcessBuilder.java \ classpath/java/lang/Readable.java \ classpath/java/lang/Runnable.java \ java/lang/Runtime.java \ @@ -4753,6 +4753,7 @@ java/lang/VMClassLoader.java \ java/lang/VMCompiler.java \ java/lang/VMDouble.java \ java/lang/VMFloat.java \ +java/lang/VMProcess.java \ java/lang/VMThrowable.java \ classpath/java/lang/VerifyError.java \ classpath/java/lang/VirtualMachineError.java \ @@ -4763,7 +4764,7 @@ java_lang_header_files = $(filter-out java/lang/Object.h java/lang/Class.h,$(pat java/lang.list: $(java_lang_source_files) @$(mkinstalldirs) $(dir $@) - echo $(srcdir)/classpath/lib/java/lang/*.class | tr ' ' '\n' | fgrep -v Object.class | fgrep -v Class.class | grep -v '[^/]Process' > java/lang.list + echo $(srcdir)/classpath/lib/java/lang/*.class | tr ' ' '\n' | fgrep -v Object.class | fgrep -v Class.class | egrep -v '(Ecos|Posix|Win32)Process' > java/lang.list -include java/lang.deps -- 2.11.0