P.java 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package de.tudarmstadt.informatik.hostage.system;
  2. import java.io.FileDescriptor;
  3. import android.net.LocalServerSocket;
  4. import android.net.LocalSocket;
  5. /**
  6. * Receives a file descriptor through a unix domain socket.
  7. *
  8. * @author Mihai Plasoianu
  9. */
  10. public class P implements Runnable {
  11. /**
  12. * Path for UDS in abstract namespace.
  13. */
  14. private final static String NAME = "hostage";
  15. /**
  16. * Port to bind.
  17. */
  18. private int port;
  19. public P(int port) {
  20. this.port = port;
  21. }
  22. /**
  23. * Start p, wait for connection and receive a file descriptor.
  24. */
  25. public FileDescriptor bindAndGetFD() {
  26. FileDescriptor fd = null;
  27. try {
  28. new Thread(this).start();
  29. LocalServerSocket localServer = new LocalServerSocket(NAME);
  30. LocalSocket localSocket = localServer.accept();
  31. while (localSocket.getInputStream().read() != -1)
  32. ;
  33. FileDescriptor[] fdArray;
  34. fdArray = localSocket.getAncillaryFileDescriptors();
  35. if (fdArray != null) {
  36. fd = fdArray[0];
  37. }
  38. localSocket.close();
  39. localServer.close();
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. return fd;
  44. }
  45. /**
  46. * Run p in separate Thread.
  47. */
  48. @Override
  49. public void run() {
  50. Process p;
  51. try {
  52. String command = String.format("/data/local/p %d", port);
  53. p = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
  54. p.waitFor();
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }