diff options
author | Samuel Holland <samuel@sholland.org> | 2018-01-08 00:34:55 -0600 |
---|---|---|
committer | Samuel Holland <samuel@sholland.org> | 2018-01-08 00:34:55 -0600 |
commit | 08cca563882ff7f743789a99f91afa2e9dbac23d (patch) | |
tree | b448da612fb98151a2fa03a086b7ed065c3f8d74 /app/src/main/java/com/wireguard/android/util/ToolsInstaller.java | |
parent | TunnelManager: Simplify save/resume methods (diff) | |
download | wireguard-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.java | 70 |
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()); + } +} |