/**
*
* Shell Command for stream blocked packets information from klogripper (/proc/kmsg)
*
* Copyright (C) 2014 Umakanthan Chandran
*
* Originally copied from NetworkLog (C) 2012 Pragmatic Software (MPL2.0)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Umakanthan Chandran
* @version 1.0
*/
package dev.ukanth.ufirewall.log;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import android.util.Log;
public class ShellCommand {
Runtime rt;
String[] command;
String tag = "";
Process process;
BufferedReader stdout;
public String error;
public int exitval;
public ShellCommand(String[] command, String tag) {
this(command);
this.tag = tag;
}
public ShellCommand(String[] command) {
this.command = command;
rt = Runtime.getRuntime();
}
public void start(boolean waitForExit) {
exitval = -1;
error = null;
try {
process = new ProcessBuilder().command(command).redirectErrorStream(true).start();
stdout = new BufferedReader(new InputStreamReader(process.getInputStream()));
} catch (Exception e) {
error = e.getCause().getMessage();
return;
}
if (waitForExit) {
waitForExit();
}
}
public void waitForExit() {
while (checkForExit() == false) {
if (stdoutAvailable()) {
Log.d("AFWALL", "ShellCommand waitForExit [" + tag
+ "] discarding read: " + readStdout());
} else {
try {
Thread.sleep(100);
} catch (Exception e) {
Log.d("AFWall", "waitForExit", e);
}
}
}
}
public void finish() {
try {
if (stdout != null) {
stdout.close();
}
} catch (Exception e) {
Log.e("AFWall", "Exception finishing [" + tag + "]", e);
}
if(process !=null) {
process.destroy();
}
process = null;
}
public boolean checkForExit() {
try {
if(process != null) {
exitval = process.exitValue();
} else {
finish();
}
} catch (IllegalThreadStateException e) {
return false;
}
finish();
return true;
}
public boolean stdoutAvailable() {
try {
return stdout.ready();
} catch (java.io.IOException e) {
Log.e("AFWall", "stdoutAvailable error", e);
return false;
}
}
public String readStdoutBlocking() {
String line;
if (stdout == null) {
return null;
}
try {
line = stdout.readLine();
} catch (Exception e) {
Log.e("AFWall", "readStdoutBlocking error", e);
return null;
}
if (line == null) {
return null;
} else {
return line + "\n";
}
}
public String readStdout() {
if (stdout == null) {
return null;
}
try {
if (stdout.ready()) {
String line = stdout.readLine();
if (line == null) {
return null;
} else {
return line + "\n";
}
} else {
return "";
}
} catch (Exception e) {
Log.e("AFWall", "readStdout error", e);
return null;
}
}
}