aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
diff options
context:
space:
mode:
authorSamuel Holland <samuel@sholland.org>2018-01-08 00:34:55 -0600
committerSamuel Holland <samuel@sholland.org>2018-01-08 00:34:55 -0600
commit08cca563882ff7f743789a99f91afa2e9dbac23d (patch)
treeb448da612fb98151a2fa03a086b7ed065c3f8d74 /app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
parentTunnelManager: Simplify save/resume methods (diff)
downloadwireguard-android-08cca563882ff7f743789a99f91afa2e9dbac23d.tar.xz
wireguard-android-08cca563882ff7f743789a99f91afa2e9dbac23d.zip
ToolsInstaller: Extract to its own classes
Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/util/ToolsInstaller.java')
-rw-r--r--app/src/main/java/com/wireguard/android/util/ToolsInstaller.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
new file mode 100644
index 00000000..8496a310
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/util/ToolsInstaller.java
@@ -0,0 +1,70 @@
+package com.wireguard.android.util;
+
+import android.content.Context;
+import android.system.OsConstants;
+
+import com.wireguard.android.Application.ApplicationContext;
+import com.wireguard.android.Application.ApplicationScope;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Inject;
+
+/**
+ * Helper to install WireGuard tools to the system partition.
+ */
+
+@ApplicationScope
+public final class ToolsInstaller {
+ private static final String[][] EXECUTABLES = {
+ {"libwg.so", "wg"},
+ {"libwg-quick.so", "wg-quick"},
+ };
+ private static final File[] INSTALL_DIRS = {
+ new File("/system/xbin"),
+ new File("/system/bin"),
+ };
+
+ private final String nativeLibraryDir;
+ private final RootShell rootShell;
+
+ @Inject
+ public ToolsInstaller(@ApplicationContext final Context context, final RootShell rootShell) {
+ nativeLibraryDir = context.getApplicationInfo().nativeLibraryDir;
+ this.rootShell = rootShell;
+ }
+
+ private static File getInstallDir() {
+ final String path = System.getenv("PATH");
+ if (path == null)
+ return INSTALL_DIRS[0];
+ final List<String> paths = Arrays.asList(path.split(":"));
+ for (final File dir : INSTALL_DIRS)
+ if (paths.contains(dir.getPath()) && dir.isDirectory())
+ return dir;
+ return null;
+ }
+
+ public int install() {
+ final File installDir = getInstallDir();
+ if (installDir == null)
+ return OsConstants.ENOENT;
+ final StringBuilder script = new StringBuilder("set -ex; ");
+ for (final String[] names : EXECUTABLES) {
+ script.append(String.format("cmp -s '%s' '%s' && ",
+ new File(nativeLibraryDir, names[0]),
+ new File(installDir, names[1])));
+ }
+ script.append("exit ").append(OsConstants.EALREADY).append("; ");
+ script.append("trap 'mount -o ro,remount /system' EXIT; mount -o rw,remount /system; ");
+ for (final String[] names : EXECUTABLES) {
+ script.append(String.format("cp %s %s; chmod 755 %s; ",
+ new File(nativeLibraryDir, names[0]),
+ new File(installDir, names[1]),
+ new File(installDir, names[1])));
+ }
+ return rootShell.run(null, script.toString());
+ }
+}