better error-handling when executing commands as root
authorMichael Gernoth <michael@gernoth.net>
Thu, 6 Sep 2012 18:24:05 +0000 (20:24 +0200)
committerMichael Gernoth <michael@gernoth.net>
Thu, 6 Sep 2012 18:24:05 +0000 (20:24 +0200)
MS2Debounce/AndroidManifest.xml
MS2Debounce/src/de/rmdir/ms2debounce/DebounceBootReceiver.java
MS2Debounce/src/de/rmdir/ms2debounce/DebounceModuleHelper.java
MS2Debounce/src/de/rmdir/ms2debounce/MS2Debounce.java
MS2Debounce/src/de/rmdir/ms2debounce/NotRootedException.java [new file with mode: 0644]
MS2Debounce/src/de/rmdir/ms2debounce/ShellException.java [new file with mode: 0644]

index 3d999b1..d4b5fc9 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="de.rmdir.ms2debounce"
-      android:versionCode="4"
-      android:versionName="1.4">
+      android:versionCode="5"
+      android:versionName="1.5">
     <uses-sdk android:minSdkVersion="8" />
     <uses-configuration android:reqKeyboardType="qwerty" />
     <supports-screens android:smallScreens="false"
index b60b558..14e76a9 100644 (file)
@@ -11,7 +11,9 @@ public class DebounceBootReceiver extends BroadcastReceiver{
                        DebounceModuleHelper module = new DebounceModuleHelper(context);
 
                        if (module.get_on_boot() && module.is_safe_to_load()) {
-                               module.loadModule();
+                               try {
+                                       module.loadModule();
+                               } catch (Exception e) {}
                        }
                }
        }
index b5310d6..2ee5501 100644 (file)
@@ -32,7 +32,7 @@ public class DebounceModuleHelper
                setActiveHigh(getSavedActiveHigh());
        }
 
-       public boolean loadModule() {
+       public boolean loadModule() throws NotRootedException,ShellException {
                if (!_loadModule())
                        return false;
 
@@ -41,18 +41,34 @@ public class DebounceModuleHelper
                return true;
        }
 
-       protected void runAsRoot(String command) throws java.io.IOException,java.lang.InterruptedException {
-               Process rootcmd = Runtime.getRuntime().exec(new String[]{"su","-c","sh"});
-               DataOutputStream sh = new DataOutputStream(rootcmd.getOutputStream());
-               sh.writeBytes(command + "\n");
-               sh.writeBytes("exit\n");
-               sh.flush();
-               sh.close();
+       protected void runAsRoot(String command) throws NotRootedException,ShellException {
+               Process rootcmd;
 
-               rootcmd.waitFor();
+               try {
+                       rootcmd = Runtime.getRuntime().exec(new String[]{"su","-c","sh"});
+               } catch (java.io.IOException e) {
+                       throw new NotRootedException();
+               }
+
+               try {
+                       DataOutputStream sh = new DataOutputStream(rootcmd.getOutputStream());
+                       sh.writeBytes(command + "\n");
+                       sh.writeBytes("exit\n");
+                       sh.flush();
+                       sh.close();
+               } catch (java.io.IOException e) {
+                       throw new ShellException();
+               }
+
+               try {
+                       if (rootcmd.waitFor() != 0)
+                               throw new ShellException();
+               } catch (java.lang.InterruptedException e) {
+                       throw new ShellException();
+               }
        }
 
-       public synchronized boolean _loadModule() {
+       public synchronized boolean _loadModule() throws NotRootedException,ShellException {
                File debounce_ko = new File(ctx.getFilesDir() + "/debounce.ko");
 
                extractModule();
@@ -64,11 +80,7 @@ public class DebounceModuleHelper
                        editor.commit();
                }
 
-               try {
-                       runAsRoot("/system/bin/insmod " + debounce_ko + " || /system/xbin/insmod " + debounce_ko);
-               } catch (Exception e) {
-                       return false;
-               }
+               runAsRoot("/system/bin/insmod " + debounce_ko + " || /system/xbin/insmod " + debounce_ko);
 
                if (!isLoaded()) {
                        return false;
@@ -85,14 +97,8 @@ public class DebounceModuleHelper
                return true;
        }
 
-       public synchronized boolean unloadModule() {
-               try {
-                       runAsRoot("/system/bin/rmmod debounce || /system/xbin/rmmod debounce");
-               } catch (Exception e) {
-                       return false;
-               }
-
-               return true;
+       public synchronized void unloadModule() throws NotRootedException,ShellException {
+               runAsRoot("/system/bin/rmmod debounce || /system/xbin/rmmod debounce");
        }
 
        public synchronized boolean isLoaded() {
@@ -148,8 +154,7 @@ public class DebounceModuleHelper
                        fbuf.write((new Integer(value)).toString());
 
                        fbuf.close();
-               } catch (Exception e) {
-               }
+               } catch (Exception e) {}
        }
 
        public synchronized int getDelay() {
index c7ba1b9..5c04206 100644 (file)
@@ -238,8 +238,14 @@ public class MS2Debounce extends Activity
        public void loadModule(View view) {
                disableUI();
                if (!module.isLoaded()) {
-                       if (!module.loadModule())
-                               showDialog(23);
+                       try {
+                               if (!module.loadModule())
+                                       showDialog(22);
+                       } catch (NotRootedException e) {
+                                       showDialog(23);
+                       } catch (ShellException e) {
+                                       showDialog(24);
+                       }
                }
                updateUI();
        }
@@ -247,8 +253,13 @@ public class MS2Debounce extends Activity
        public void unloadModule(View view) {
                disableUI();
                if (module.isLoaded()) {
-                       if (!module.unloadModule())
-                               showDialog(23);
+                       try {
+                               module.unloadModule();
+                       } catch (NotRootedException e) {
+                                       showDialog(23);
+                       } catch (ShellException e) {
+                                       showDialog(24);
+                       }
                }
                updateUI();
        }
@@ -256,8 +267,14 @@ public class MS2Debounce extends Activity
        public void setValues(View view) {
                disableUI();
                if (!module.isLoaded()) {
-                       if (!module.loadModule())
+                       try {
+                               if (!module.loadModule())
+                                       showDialog(22);
+                       } catch (NotRootedException e) {
                                showDialog(23);
+                       } catch (ShellException e) {
+                               showDialog(24);
+                       }
                }
                module.setAllValues();
                updateUI();
@@ -309,9 +326,20 @@ public class MS2Debounce extends Activity
                Dialog dlg = null;
 
                switch(id) {
+                       case 22:
+                               AlertDialog.Builder noload = new AlertDialog.Builder(this);
+                               noload.setMessage("Could not load/unload the module! Do you have a MS2/Droid2 with kernel 2.6.32?")
+                                       .setCancelable(true)
+                                       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                                               public void onClick(DialogInterface dialog, int id) {
+                                                       dialog.cancel();
+                                               }
+                                       });
+                               dlg = noload.create();
+                               break;
                        case 23:
                                AlertDialog.Builder noroot = new AlertDialog.Builder(this);
-                               noroot.setMessage("Could not get root access! Is this device rooted and have you granted SuperUser privileges?")
+                               noroot.setMessage("Could not get root access! Is this device rooted and have you granted Superuser privileges?")
                                        .setCancelable(true)
                                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                                                public void onClick(DialogInterface dialog, int id) {
@@ -320,6 +348,17 @@ public class MS2Debounce extends Activity
                                        });
                                dlg = noroot.create();
                                break;
+                       case 24:
+                               AlertDialog.Builder shellexec = new AlertDialog.Builder(this);
+                               shellexec.setMessage("Problems executing shell commands as root! Is this device rooted and are insmod/rmmod binaries available?")
+                                       .setCancelable(true)
+                                       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                                               public void onClick(DialogInterface dialog, int id) {
+                                                       dialog.cancel();
+                                               }
+                                       });
+                               dlg = shellexec.create();
+                               break;
                        case 42:
                                AlertDialog.Builder about = new AlertDialog.Builder(this);
                                about.setMessage("Milestone 2 Debounce\n\n(C) 2011 Michael Gernoth <michael@gernoth.net>\n\nThis 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 version 2 of the License.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA")
diff --git a/MS2Debounce/src/de/rmdir/ms2debounce/NotRootedException.java b/MS2Debounce/src/de/rmdir/ms2debounce/NotRootedException.java
new file mode 100644 (file)
index 0000000..f07e709
--- /dev/null
@@ -0,0 +1,4 @@
+package de.rmdir.ms2debounce;
+
+class NotRootedException extends Exception {
+}
diff --git a/MS2Debounce/src/de/rmdir/ms2debounce/ShellException.java b/MS2Debounce/src/de/rmdir/ms2debounce/ShellException.java
new file mode 100644 (file)
index 0000000..fcf7526
--- /dev/null
@@ -0,0 +1,4 @@
+package de.rmdir.ms2debounce;
+
+class ShellException extends Exception {
+}
Impressum, Datenschutz