From 6bae056e3a7750bc0d76499da78f6e75ea0abe00 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 3 Sep 2014 23:33:25 -0700 Subject: [PATCH] Fix a bug where an error change any permissions would cause the operation to fail and other files to not be changed --- .../binding/input/evdev/EvdevReader.java | 8 +++--- .../binding/input/evdev/EvdevWatcher.java | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/com/limelight/binding/input/evdev/EvdevReader.java b/src/com/limelight/binding/input/evdev/EvdevReader.java index 2398ce52..c55212de 100644 --- a/src/com/limelight/binding/input/evdev/EvdevReader.java +++ b/src/com/limelight/binding/input/evdev/EvdevReader.java @@ -12,16 +12,16 @@ public class EvdevReader { } // Requires root to chmod /dev/input/eventX - public static boolean setPermissions(int octalPermissions) { - String chmodString = String.format("chmod %o /dev/input/*\n", octalPermissions); - + public static boolean setPermissions(String[] files, int octalPermissions) { ProcessBuilder builder = new ProcessBuilder("su"); try { Process p = builder.start(); OutputStream stdin = p.getOutputStream(); - stdin.write(chmodString.getBytes("UTF-8")); + for (String file : files) { + stdin.write(String.format("chmod %o %s\n", octalPermissions, file).getBytes("UTF-8")); + } stdin.write("exit\n".getBytes("UTF-8")); stdin.flush(); diff --git a/src/com/limelight/binding/input/evdev/EvdevWatcher.java b/src/com/limelight/binding/input/evdev/EvdevWatcher.java index ea5ef701..806901ec 100644 --- a/src/com/limelight/binding/input/evdev/EvdevWatcher.java +++ b/src/com/limelight/binding/input/evdev/EvdevWatcher.java @@ -38,7 +38,7 @@ public class EvdevWatcher { if (!init) { // If this a real new device, update permissions again so we can read it - EvdevReader.setPermissions(0666); + EvdevReader.setPermissions(new String[]{PATH + "/" + fileName}, 0666); } EvdevHandler handler = new EvdevHandler(PATH + "/" + fileName, listener); @@ -63,17 +63,29 @@ public class EvdevWatcher { this.listener = listener; } + private File[] rundownWithPermissionsChange(int newPermissions) { + // Rundown existing files + File devInputDir = new File(PATH); + File[] files = devInputDir.listFiles(); + + // Set desired permissions + String[] filePaths = new String[files.length]; + for (int i = 0; i < files.length; i++) { + filePaths[i] = files[i].getAbsolutePath(); + } + EvdevReader.setPermissions(filePaths, newPermissions); + + return files; + } + public void start() { startThread = new Thread() { @Override public void run() { - // Get permissions to read the eventX files - EvdevReader.setPermissions(0666); - init = true; + // List all files and allow us access + File[] files = rundownWithPermissionsChange(0666); - // Rundown existing files and generate synthetic events - File devInputDir = new File(PATH); - File[] files = devInputDir.listFiles(); + init = true; for (File f : files) { observer.onEvent(FileObserver.CREATE, f.getName()); } @@ -92,7 +104,7 @@ public class EvdevWatcher { } // Giveup eventX permissions - EvdevReader.setPermissions(0066); + rundownWithPermissionsChange(066); } }; startThread.start();