views:

20

answers:

1

I try to execute shell commands, this does work as it should. Even the result comes back (as is see on LogCat). The problem ist the last line of the result. Every time a readLine() on the last line occurs (which shouldn't occur, temp should be null), the app hangs forever and doesn't come back from the readLine call. Maybe you find the error. I tried readUTF and standart read(), all the same problem. And yes, the app got su-rights.

try
                {
                    Process process = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(process.getOutputStream());
                    DataInputStream osRes = new DataInputStream(process.getInputStream());
                    for (String single : commands) {
                       os.writeBytes(single + "\n");
                       os.flush();
                       String temp = new String();
                       while(  (temp = osRes.readLine()) != null)
                       {                                      
                           Log.v("NITRO", temp);
                           result2 += temp + "\n";                            
                       }                      
                    }
                    os.writeBytes("exit\n");
                    os.flush();
                    process.waitFor();
                } catch (IOException e)
                {
                    Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                } catch (InterruptedException e)
                {
                    Toast.makeText(Main.this, "Error", Toast.LENGTH_LONG);
                }

That is the StackTrace where it hangs when i stop debugger when hanging:

OSFileSystem.readImpl(int, byte[], int, int) line: not available [native method]    
OSFileSystem.read(int, byte[], int, int) line: 118  
ProcessManager$ProcessInputStream(FileInputStream).read(byte[], int, int) line: 312 
ProcessManager$ProcessInputStream(FileInputStream).read() line: 250 
DataInputStream.readLine() line: 309    
Main$2$1.run() line: 84 
ViewRoot(Handler).handleCallback(Message) line: 587 
ViewRoot(Handler).dispatchMessage(Message) line: 92 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 4627    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 868  
ZygoteInit.main(String[]) line: 626 
NativeStart.main(String[]) line: not available [native method]  
A: 

Try moving the exit before the while loop...You're application never terminates, hence the while loop never ends....Moving the exit should cause the application to terminate which should cause the loop to get a null...

st0le