1 /*
  2  * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 /* @test
 25    @bug 4033560
 26    @summary 4033560 limited args of exec to 198 on Solaris. We check
 27             that we can actually exec more args than that.
 28    @requires vm.flagless
 29    @author Anand Palaniswamy
 30    @run main/othervm ExecWithLotsOfArgs
 31 */
 32 
 33 import java.io.BufferedReader;
 34 import java.io.InputStreamReader;
 35 import java.io.File;
 36 import java.io.IOException;
 37 
 38 public class ExecWithLotsOfArgs {
 39 
 40     public static class EchoingHelper {
 41         public static void main(String[] args) {
 42             for (int i = 0; i < args.length; i++) {
 43                 System.out.println(args[i]);
 44             }
 45         }
 46     }
 47 
 48     public static void main(String[] args) throws Exception {
 49         String[] command = new String[300];
 50         int n = 0;
 51 
 52         /*
 53          * The Java program to exec. This is slightly fragile. Works
 54          * on Solaris and Win32.
 55          */
 56         command[n++] = System.getProperty("java.home") + File.separator +
 57             "bin" + File.separator + "java";
 58         if (System.getProperty("java.class.path") != null) {
 59             command[n++] = "-classpath";
 60             command[n++] = System.getProperty("java.class.path");
 61         }
 62 
 63         /*
 64          * The class with main() that the exec'd VM will run.
 65          */
 66         command[n++] = "ExecWithLotsOfArgs$EchoingHelper";
 67 
 68         /*
 69          * Make a long set of args n, n + 1, ... , 300.
 70          */
 71         for (int i = n; i < command.length; i++) {
 72             command[i] = new String(new Integer(i).toString());
 73         }
 74 
 75         /*
 76          * Do the exec.
 77          */
 78         Process p = null;
 79         p = Runtime.getRuntime().exec(command);
 80         BufferedReader in = new BufferedReader
 81             (new InputStreamReader(p.getInputStream()));
 82 
 83         /*
 84          * Read back all the strings and that the same were returned.
 85          */
 86         String s;
 87         int count = n;
 88         while ((s = in.readLine()) != null) {
 89             if (count >= command.length) {
 90                 failed("Was expecting " + (command.length - 2) +
 91                        " strings to be echo'ed back, but got " +
 92                        (count - 1) + " instead");
 93             }
 94             if (!s.equals(command[count])) {
 95                 failed("Exec'd process returned \"" +
 96                        s + "\", was expecting \""  +
 97                        command[count] + "\"");
 98             }
 99             count++;
100         }
101 
102         /*
103          * Did we read anything at all?
104          */
105         if (count == n) {
106             /* Try reading the error stream to see if we got any diagnostics */
107             in = new BufferedReader(new InputStreamReader(p.getErrorStream()));
108             while ((s = in.readLine()) != null) {
109                 System.err.println("Error output: " + s);
110             }
111             failed("Exec'd process didn't writing anything to its stdout");
112         }
113     }
114 
115     private static void failed(String s) {
116         throw new RuntimeException("Failed: " + s);
117     }
118 }