PrivilegedPort.java 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package de.tudarmstadt.informatik.hostage.system;
  2. import java.io.BufferedReader;
  3. import java.io.FileDescriptor;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import android.content.SharedPreferences;
  8. import android.net.LocalServerSocket;
  9. import android.net.LocalSocket;
  10. import android.preference.PreferenceManager;
  11. import android.util.Log;
  12. import de.tudarmstadt.informatik.hostage.Hostage;
  13. public class PrivilegedPort implements Runnable {
  14. public static enum TYPE {
  15. TCP, UDP
  16. }
  17. private final static String UNIX_PATH = "hostage";
  18. private final String LOG_TAG;
  19. private TYPE type;
  20. private int port;
  21. private FileDescriptor fd;
  22. public PrivilegedPort(TYPE type, int port) {
  23. LOG_TAG = String.format("HosTaGe (PortBinder %s %d)", type.toString(), port);
  24. this.type = type;
  25. this.port = port;
  26. try {
  27. new Thread(this).start();
  28. LocalServerSocket localServer = new LocalServerSocket(UNIX_PATH);
  29. LocalSocket localSocket = localServer.accept();
  30. while (localSocket.getInputStream().read() != -1)
  31. ;
  32. FileDescriptor[] fdArray;
  33. fdArray = localSocket.getAncillaryFileDescriptors();
  34. if (fdArray != null) {
  35. this.fd = fdArray[0];
  36. }
  37. localSocket.close();
  38. localServer.close();
  39. } catch (IOException e) {
  40. }
  41. }
  42. public FileDescriptor getFD() {
  43. return fd;
  44. }
  45. @Override
  46. public void run() {
  47. String command = String.format("/data/local/bind %s %d", type.toString(), port);
  48. try {
  49. Process p = new ProcessBuilder("su", "-c", command).start();
  50. if (p.waitFor() != 0) {
  51. logError(p.getErrorStream());
  52. }
  53. logOutput(p.getInputStream());
  54. } catch (IOException e) {
  55. } catch (InterruptedException e) {
  56. }
  57. }
  58. private void logOutput(InputStream stdout) throws IOException {
  59. BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
  60. String line;
  61. while ((line = reader.readLine()) != null) {
  62. Log.d(LOG_TAG, line);
  63. }
  64. }
  65. private void logError(InputStream stderr) throws IOException {
  66. BufferedReader reader = new BufferedReader(new InputStreamReader(stderr));
  67. Log.e(LOG_TAG, reader.readLine());
  68. }
  69. }