diff --git a/jni/termExec.cpp b/jni/termExec.cpp index d7089e11..f8881eda 100644 --- a/jni/termExec.cpp +++ b/jni/termExec.cpp @@ -99,7 +99,7 @@ static int throwOutOfMemoryError(JNIEnv *env, const char *message) return env->ThrowNew(exClass, message); } -static int create_subprocess(const char *cmd, char *const argv[], +static int create_subprocess(const int rdt, const char *cmd, char *const argv[], char *const envp[], const char* scripts, int* pProcessId) { pid_t pid; @@ -107,7 +107,10 @@ static int create_subprocess(const char *cmd, char *const argv[], int pfds2[2]; pipe(pfds); - pipe(pfds2); + + if (rdt) { + pipe(pfds2); + } pid = fork(); @@ -127,9 +130,13 @@ static int create_subprocess(const char *cmd, char *const argv[], dup2(pfds[0], 0); close(pfds[1]); - dup2(pfds2[1], 1); - dup2(pfds2[1], 2); - close(pfds2[0]); + if (rdt) { + close(1); + close(2); + dup2(pfds2[1], 1); + dup2(pfds2[1], 2); + close(pfds2[0]); + } execv(cmd, argv); @@ -144,15 +151,18 @@ static int create_subprocess(const char *cmd, char *const argv[], close(pfds[0]); write(pfds[1], scripts, strlen(scripts)+1); - - close(pfds2[1]); - return pfds2[0]; + if (rdt) { + close(pfds2[1]); + return pfds2[0]; + } else { + return -1; + } } } static jobject android_os_Exec_createSubProcess(JNIEnv *env, jobject clazz, - jstring cmd, jobjectArray args, jobjectArray envVars, jstring scripts, + jint rdt, jstring cmd, jobjectArray args, jobjectArray envVars, jstring scripts, jintArray processIdArray) { const jchar* str = cmd ? env->GetStringCritical(cmd, 0) : 0; @@ -215,7 +225,7 @@ static jobject android_os_Exec_createSubProcess(JNIEnv *env, jobject clazz, } int procId; - int ptm = create_subprocess(cmd_8.string(), argv, envp, scripts_8.string(), + int ptm = create_subprocess(rdt, cmd_8.string(), argv, envp, scripts_8.string(), &procId); if (argv) { @@ -324,7 +334,7 @@ static int register_FileDescriptor(JNIEnv *env) static const char *classPathName = "com/github/shadowsocks/Exec"; static JNINativeMethod method_table[] = { - { "createSubprocess", "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)Ljava/io/FileDescriptor;", + { "createSubprocess", "(ILjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)Ljava/io/FileDescriptor;", (void*) android_os_Exec_createSubProcess }, { "waitFor", "(I)I", (void*) android_os_Exec_waitFor}, diff --git a/libs/armeabi/libexec.so b/libs/armeabi/libexec.so index a9659fc7..54d9372b 100755 Binary files a/libs/armeabi/libexec.so and b/libs/armeabi/libexec.so differ diff --git a/src/com/github/shadowsocks/Exec.java b/src/com/github/shadowsocks/Exec.java index edc892bd..0c6009dc 100755 --- a/src/com/github/shadowsocks/Exec.java +++ b/src/com/github/shadowsocks/Exec.java @@ -43,6 +43,7 @@ public class Exec { * Callers are responsible for calling Exec.close() on the returned file * descriptor. * + * @param rdt Whether redirect stdout and stderr * @param cmd The command to execute. * @param args An array of arguments to the command. * @param envVars An array of strings of the form "VAR=value" to be added to the @@ -52,7 +53,7 @@ public class Exec { * process will be written. * @return File descriptor */ - public static native FileDescriptor createSubprocess(String cmd, + public static native FileDescriptor createSubprocess(int rdt, String cmd, String[] args, String[] envVars, String scripts, int[] processId); diff --git a/src/com/github/shadowsocks/Utils.java b/src/com/github/shadowsocks/Utils.java index 8fcc11d7..64356b0b 100755 --- a/src/com/github/shadowsocks/Utils.java +++ b/src/com/github/shadowsocks/Utils.java @@ -44,7 +44,7 @@ public class Utils { String arg0 = argList.get(0); String[] args = argList.toArray(new String[1]); - return Exec.createSubprocess(arg0, args, null, + return Exec.createSubprocess(result != null ? 1 : 0, arg0, args, null, scripts + "\nexit\n", processId); } @@ -112,7 +112,7 @@ public class Utils { pipe = createSubprocess(pid, getShell()); } - if (pipe == null) return; + if (result == null || pipe == null) return; if (pid[0] != -1) { exitcode = Exec.waitFor(pid[0]); @@ -125,8 +125,7 @@ public class Utils { // Read stdout while (stdout.available() > 0) { read = stdout.read(buf); - if (result != null) - result.append(new String(buf, 0, read)); + result.append(new String(buf, 0, read)); } } catch (Exception ex) {