2 * Copyright (C) 2001, 2002 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with any library licensed under the Apache Software License,
22 * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23 * (or with modified versions of the above that use the same license as the above),
24 * and distribute linked combinations including the two. You must obey the
25 * GNU General Public License in all respects for all of the code used other than
26 * the above mentioned libraries. If you modify this file, you may extend this
27 * exception to your version of the file, but you are not obligated to do so.
28 * If you do not wish to do so, delete this exception statement from your version.
32 import mir.log.LoggerWrapper;
35 import java.io.IOException;
36 import java.io.InputStreamReader;
37 import java.io.PrintWriter;
38 import java.io.Reader;
41 * Execute system commands. Warning: the current implementation is
44 public class ShellRoutines {
45 protected ShellRoutines() {
49 * Executes a full command (including arguments) in a subshell
50 * and returns the output of the command in a string. Output is
51 * redirected into a temporary fil which is then read into the string
53 public static String execIntoString(String command) throws IOException {
54 return new String(execIntoByteArray(command));
58 * Executes a full command (including arguments) in a subshell
59 * and returns the output of the command in an array of
60 * bytes. Output is redirected into a temporary file which is then
61 * read into an array of bytes
63 public static byte[] execIntoByteArray(String command) throws IOException {
64 File commandOutput = File.createTempFile("mircmd", "");
68 // WARNING: unix specific
70 exitStatus = Runtime.getRuntime().exec(new String[]{
73 ">" + commandOutput.getAbsolutePath()
76 catch (InterruptedException e) {
77 throw new IOException(e.toString());
79 if (exitStatus != 0) {
80 throw new IOException("command exit satus:" + exitStatus);
82 return FileRoutines.readFileIntoByteArray
83 (commandOutput.getAbsoluteFile());
86 commandOutput.delete();
91 * Executes a full command (including arguments) in a subshell.
92 * Standard input and output go to /dev/null
94 public static void simpleExec(String command) throws IOException {
97 // WARNING: unix specific
99 Process process = Runtime.getRuntime().exec(
101 "/bin/sh", "-c", command
103 Reader errorStreamReader = new InputStreamReader(process.getErrorStream());
104 ReaderLogger logger =
105 new ReaderLogger(errorStreamReader, new LoggerWrapper("Utility"));
107 new Thread(logger).start();
109 Reader outputStreamReader = new InputStreamReader(process.getInputStream());
110 logger = new ReaderLogger(outputStreamReader, new LoggerWrapper("Utility"));
111 new Thread(logger).start();
113 exitStatus = process.waitFor();
115 catch (InterruptedException e) {
116 throw new IOException("Interrupted");
119 if (exitStatus != 0) {
120 throw new IOException("command exit satus:" + exitStatus);
124 private static class ReaderLogger implements Runnable {
125 private Reader reader;
126 private PrintWriter writer;
128 ReaderLogger(Reader aReader, LoggerWrapper aLogger) {
130 writer = aLogger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE);
136 char[] buffer = new char[1024];
137 while ((size = reader.read(buffer)) >= 0) {
138 writer.write(buffer,0,size);
141 catch (IOException e) {
148 catch (Exception e) {