package me.omico.util.root;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* Created by yuwen on 17-1-20.
*/
public class SU {
private Process process;
private BufferedWriter mOutputWriter;
private BufferedReader mInputReader;
private boolean closed;
private boolean denied;
private boolean firstTry;
private static SU su;
private SU() {
try {
firstTry = true;
process = Runtime.getRuntime().exec("su");
mOutputWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
mInputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
} catch (IOException ignored) {
denied = true;
closed = true;
}
}
public synchronized String runCommand(final String command) {
synchronized (this) {
try {
StringBuilder mStringBuilder = new StringBuilder();
String callback = "/shellCallback/";
mOutputWriter.write(command + "\necho " + callback + "\n");
mOutputWriter.flush();
String line;
while ((line = mInputReader.readLine()) != null) {
if (line.equals(callback)) {
break;
}
mStringBuilder.append(line).append("\n");
}
firstTry = false;
return mStringBuilder.toString().trim();
} catch (IOException e) {
closed = true;
e.printStackTrace();
if (firstTry) denied = true;
} catch (ArrayIndexOutOfBoundsException e) {
denied = true;
} catch (Exception e) {
e.printStackTrace();
denied = true;
}
return null;
}
}
private void close() {
try {
mOutputWriter.write("exit\n");
mOutputWriter.flush();
process.waitFor();
mOutputWriter.close();
mInputReader.close();
process.destroy();
closed = true;
} catch (Exception e) {
e.printStackTrace();
}
}
public static SU getSU() {
if (su == null || su.closed || su.denied) {
if (su != null && !su.closed) {
su.close();
}
su = new SU();
}
return su;
}
public static boolean isRoot() {
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream dataOutputStream = new DataOutputStream(process.getOutputStream());
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
return process.exitValue() != 1;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}