Skip to content

Commit a9bff09

Browse files
Refactor DriverqueryCommand for better process handling
Refactor DriverqueryCommand to use ProcessBuilder for command execution and add error handling with a dedicated thread for error stream.
1 parent b160eb0 commit a9bff09

1 file changed

Lines changed: 59 additions & 11 deletions

File tree

src/main/java/com/mycmd/commands/DriverqueryCommand.java

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import java.io.BufferedReader;
66
import java.io.IOException;
77
import java.io.InputStreamReader;
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.List;
11+
import java.util.concurrent.TimeUnit;
812

913
/**
1014
* Displays a list of all installed device drivers.
@@ -23,22 +27,66 @@ public void execute(String[] args, ShellContext context) throws IOException {
2327
}
2428

2529
try {
26-
StringBuilder cmdBuilder = new StringBuilder("driverquery");
27-
for (String arg : args) {
28-
cmdBuilder.append(" ").append(arg);
30+
31+
List<String> command = new ArrayList<>();
32+
command.add("cmd.exe");
33+
command.add("/c");
34+
command.add("driverquery");
35+
if (args != null && args.length > 0) {
36+
command.addAll(Arrays.asList(args));
37+
}
38+
39+
ProcessBuilder pb = new ProcessBuilder(command);
40+
Process process = pb.start();
41+
42+
Thread errorGobbler =
43+
new Thread(
44+
() -> {
45+
try (BufferedReader errReader =
46+
new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
47+
String errLine;
48+
while ((errLine = errReader.readLine()) != null) {
49+
System.err.println(errLine);
50+
}
51+
} catch (IOException e) {
52+
System.err.println("Error reading process error stream: " + e.getMessage());
53+
}
54+
},
55+
"driverquery-error-gobbler");
56+
errorGobbler.setDaemon(true);
57+
errorGobbler.start();
58+
59+
try (BufferedReader reader =
60+
new BufferedReader(new InputStreamReader(process.getInputStream()))) {
61+
String line;
62+
while ((line = reader.readLine()) != null) {
63+
System.out.println(line);
64+
}
2965
}
3066

31-
Process process = Runtime.getRuntime().exec(cmdBuilder.toString());
32-
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
67+
boolean finished;
68+
try {
69+
finished = process.waitFor(30, TimeUnit.SECONDS);
70+
} catch (InterruptedException ie) {
71+
Thread.currentThread().interrupt();
72+
process.destroyForcibly();
73+
throw new IOException("Interrupted while waiting for driverquery process", ie);
74+
}
3375

34-
String line;
35-
while ((line = reader.readLine()) != null) {
36-
System.out.println(line);
76+
if (!finished) {
77+
process.destroyForcibly();
78+
System.out.println("Command timed out.");
79+
} else {
80+
int exitCode = process.exitValue();
81+
if (exitCode != 0) {
82+
System.out.println("Command exited with code: " + exitCode);
83+
}
3784
}
3885

39-
int exitCode = process.waitFor();
40-
if (exitCode != 0) {
41-
System.out.println("Command exited with code: " + exitCode);
86+
try {
87+
errorGobbler.join(1000);
88+
} catch (InterruptedException ie) {
89+
Thread.currentThread().interrupt();
4290
}
4391

4492
} catch (Exception e) {

0 commit comments

Comments
 (0)