mirror of
https://github.com/syncthing/syncthing-android.git
synced 2024-12-23 11:21:29 +00:00
* A fix for issue #953 * Cleanup: Moved parts of the run method to sub-methods * Moved code to aux methods * Identation fixed * Rephrased the comment about using exec * Avoid using inline if-statements when possible
This commit is contained in:
parent
328b3ef273
commit
267c2598f8
1 changed files with 53 additions and 23 deletions
|
@ -29,6 +29,7 @@ import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.LineNumberReader;
|
import java.io.LineNumberReader;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import eu.chainfire.libsuperuser.Shell;
|
import eu.chainfire.libsuperuser.Shell;
|
||||||
|
@ -126,31 +127,10 @@ public class SyncthingRunnable implements Runnable {
|
||||||
try {
|
try {
|
||||||
if (wakeLock != null)
|
if (wakeLock != null)
|
||||||
wakeLock.acquire();
|
wakeLock.acquire();
|
||||||
ProcessBuilder pb = (mUseRoot)
|
|
||||||
? new ProcessBuilder("su", "-c", TextUtils.join(" ", mCommand))
|
|
||||||
: new ProcessBuilder(mCommand);
|
|
||||||
|
|
||||||
Map<String, String> env = pb.environment();
|
HashMap<String, String> targetEnv = buildEnvironment(sp);
|
||||||
// Set home directory to data folder for web GUI folder picker.
|
process = setupAndLaunch(targetEnv);
|
||||||
env.put("HOME", Environment.getExternalStorageDirectory().getAbsolutePath());
|
|
||||||
env.put("STTRACE", sp.getString("sttrace", ""));
|
|
||||||
File externalFilesDir = mContext.getExternalFilesDir(null);
|
|
||||||
if (externalFilesDir != null)
|
|
||||||
env.put("STGUIASSETS", externalFilesDir.getAbsolutePath() + "/gui");
|
|
||||||
env.put("STNORESTART", "1");
|
|
||||||
env.put("STNOUPGRADE", "1");
|
|
||||||
// Disable hash benchmark for faster startup.
|
|
||||||
// https://github.com/syncthing/syncthing/issues/4348
|
|
||||||
env.put("STHASHING", "minio");
|
|
||||||
if (sp.getBoolean("use_tor", false)) {
|
|
||||||
env.put("all_proxy", "socks5://localhost:9050");
|
|
||||||
env.put("ALL_PROXY_NO_FALLBACK", "1");
|
|
||||||
}
|
|
||||||
if (sp.getBoolean("use_legacy_hashing", false))
|
|
||||||
env.put("STHASHING", "standard");
|
|
||||||
putCustomEnvironmentVariables(env, sp);
|
|
||||||
|
|
||||||
process = pb.start();
|
|
||||||
mSyncthing.set(process);
|
mSyncthing.set(process);
|
||||||
|
|
||||||
Thread lInfo = log(process.getInputStream(), Log.INFO, true);
|
Thread lInfo = log(process.getInputStream(), Log.INFO, true);
|
||||||
|
@ -399,4 +379,54 @@ public class SyncthingRunnable implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HashMap<String, String> buildEnvironment(SharedPreferences sp) {
|
||||||
|
HashMap<String, String> targetEnv = new HashMap<String, String>();
|
||||||
|
// Set home directory to data folder for web GUI folder picker.
|
||||||
|
targetEnv.put("HOME", Environment.getExternalStorageDirectory().getAbsolutePath());
|
||||||
|
targetEnv.put("STTRACE", sp.getString("sttrace", ""));
|
||||||
|
File externalFilesDir = mContext.getExternalFilesDir(null);
|
||||||
|
if (externalFilesDir != null)
|
||||||
|
targetEnv.put("STGUIASSETS", externalFilesDir.getAbsolutePath() + "/gui");
|
||||||
|
targetEnv.put("STNORESTART", "1");
|
||||||
|
targetEnv.put("STNOUPGRADE", "1");
|
||||||
|
// Disable hash benchmark for faster startup.
|
||||||
|
// https://github.com/syncthing/syncthing/issues/4348
|
||||||
|
targetEnv.put("STHASHING", "minio");
|
||||||
|
if (sp.getBoolean("use_tor", false)) {
|
||||||
|
targetEnv.put("all_proxy", "socks5://localhost:9050");
|
||||||
|
targetEnv.put("ALL_PROXY_NO_FALLBACK", "1");
|
||||||
|
}
|
||||||
|
if (sp.getBoolean("use_legacy_hashing", false))
|
||||||
|
targetEnv.put("STHASHING", "standard");
|
||||||
|
putCustomEnvironmentVariables(targetEnv, sp);
|
||||||
|
return targetEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Process setupAndLaunch(HashMap<String, String> env) throws IOException {
|
||||||
|
Process process = null;
|
||||||
|
|
||||||
|
if (mUseRoot) {
|
||||||
|
ProcessBuilder pb = new ProcessBuilder("su");
|
||||||
|
process = pb.start();
|
||||||
|
// The su binary prohibits the inheritance of environment variables.
|
||||||
|
// Even with --preserve-environment the environment gets messed up.
|
||||||
|
// We therefore start a root shell, and set all the environment variables manually.
|
||||||
|
DataOutputStream suOut = new DataOutputStream(process.getOutputStream());
|
||||||
|
for (Map.Entry<String, String> entry : env.entrySet()) {
|
||||||
|
suOut.writeBytes(String.format("export %s=\"%s\"\n", entry.getKey(), entry.getValue()));
|
||||||
|
}
|
||||||
|
suOut.flush();
|
||||||
|
// Exec will replace the su process image by Syncthing as execlp in C does.
|
||||||
|
// Without using exec, the process will drop to the root shell as soon as Syncthing terminates like a normal shell does.
|
||||||
|
// If we did not use exec, we would wait infinitely for the process to terminate (ret = process.waitFor(); in run()).
|
||||||
|
// With exec the whole process terminates when Syncthing exits.
|
||||||
|
suOut.writeBytes("exec " + TextUtils.join(" ", mCommand) + "\n");
|
||||||
|
suOut = null;
|
||||||
|
} else {
|
||||||
|
ProcessBuilder pb = new ProcessBuilder(mCommand);
|
||||||
|
pb.environment().putAll(env);
|
||||||
|
process = pb.start();
|
||||||
|
}
|
||||||
|
return process;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue