FELIX-1855 - exec command eats first keystroke of subsequent commands
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@833839 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
index c4089b0..3cd0d60 100644
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
+++ b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
@@ -37,11 +37,11 @@
protected Object doExecute() throws Exception {
ProcessBuilder builder = new ProcessBuilder(args);
- log.info("Executing: {}", builder.command());
+ PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
+ log.info("Executing: {}", builder.command());
Process p = builder.start();
- PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
handler.attach(p);
handler.start();
@@ -54,7 +54,7 @@
handler.stop();
- return status;
+ return null;
}
}
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
index 1cb35b7..9d15286 100644
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
+++ b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
@@ -105,13 +105,20 @@
int length;
try {
- while ((length = in.read(buf)) > 0 && !finish) {
- out.write(buf, 0, length);
- if (autoflush) {
- out.flush();
+ do {
+ while (in.available() > 0 && !finish) {
+ length = in.read(buf);
+ if (length < 1 ) {
+ break;
+ }
+ out.write(buf, 0, length);
+ if (autoflush) {
+ out.flush();
+ }
}
- }
- out.flush();
+ out.flush();
+ Thread.sleep(200); // Pause to avoid tight loop if external proc is slow
+ } while (!finish && closeWhenExhausted);
}
catch (Exception e) {
synchronized (this) {