Merge "Reimplement reopenStdio in Java."
This commit is contained in:
@@ -17,6 +17,9 @@
|
|||||||
package com.android.internal.os;
|
package com.android.internal.os;
|
||||||
|
|
||||||
import static android.system.OsConstants.O_CLOEXEC;
|
import static android.system.OsConstants.O_CLOEXEC;
|
||||||
|
import static android.system.OsConstants.STDERR_FILENO;
|
||||||
|
import static android.system.OsConstants.STDIN_FILENO;
|
||||||
|
import static android.system.OsConstants.STDOUT_FILENO;
|
||||||
|
|
||||||
import android.net.Credentials;
|
import android.net.Credentials;
|
||||||
import android.net.LocalSocket;
|
import android.net.LocalSocket;
|
||||||
@@ -856,14 +859,15 @@ class ZygoteConnection {
|
|||||||
|
|
||||||
if (descriptors != null) {
|
if (descriptors != null) {
|
||||||
try {
|
try {
|
||||||
ZygoteInit.reopenStdio(descriptors[0],
|
Os.dup2(descriptors[0], STDIN_FILENO);
|
||||||
descriptors[1], descriptors[2]);
|
Os.dup2(descriptors[1], STDOUT_FILENO);
|
||||||
|
Os.dup2(descriptors[2], STDERR_FILENO);
|
||||||
|
|
||||||
for (FileDescriptor fd: descriptors) {
|
for (FileDescriptor fd: descriptors) {
|
||||||
IoUtils.closeQuietly(fd);
|
IoUtils.closeQuietly(fd);
|
||||||
}
|
}
|
||||||
newStderr = System.err;
|
newStderr = System.err;
|
||||||
} catch (IOException ex) {
|
} catch (ErrnoException ex) {
|
||||||
Log.e(TAG, "Error reopening stdio", ex);
|
Log.e(TAG, "Error reopening stdio", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -766,21 +766,6 @@ public class ZygoteInit {
|
|||||||
*/
|
*/
|
||||||
static native int getpgid(int pid) throws IOException;
|
static native int getpgid(int pid) throws IOException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Invokes the syscall dup2() to copy the specified descriptors into
|
|
||||||
* stdin, stdout, and stderr. The existing stdio descriptors will be
|
|
||||||
* closed and errors during close will be ignored. The specified
|
|
||||||
* descriptors will also remain open at their original descriptor numbers,
|
|
||||||
* so the caller may want to close the original descriptors.
|
|
||||||
*
|
|
||||||
* @param in new stdin
|
|
||||||
* @param out new stdout
|
|
||||||
* @param err new stderr
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
static native void reopenStdio(FileDescriptor in,
|
|
||||||
FileDescriptor out, FileDescriptor err) throws IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invokes select() on the provider array of file descriptors (selecting
|
* Invokes select() on the provider array of file descriptors (selecting
|
||||||
* for readability only). Array elements of null are ignored.
|
* for readability only). Array elements of null are ignored.
|
||||||
|
|||||||
@@ -88,43 +88,6 @@ static jint com_android_internal_os_ZygoteInit_getpgid(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void com_android_internal_os_ZygoteInit_reopenStdio(JNIEnv* env,
|
|
||||||
jobject clazz, jobject in, jobject out, jobject errfd)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
fd = jniGetFDFromFileDescriptor(env, in);
|
|
||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
err = dup2(fd, STDIN_FILENO);
|
|
||||||
} while (err < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
fd = jniGetFDFromFileDescriptor(env, out);
|
|
||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
err = dup2(fd, STDOUT_FILENO);
|
|
||||||
} while (err < 0 && errno == EINTR);
|
|
||||||
|
|
||||||
fd = jniGetFDFromFileDescriptor(env, errfd);
|
|
||||||
|
|
||||||
if (env->ExceptionCheck()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
err = dup2(fd, STDERR_FILENO);
|
|
||||||
} while (err < 0 && errno == EINTR);
|
|
||||||
}
|
|
||||||
|
|
||||||
static jint com_android_internal_os_ZygoteInit_selectReadable (
|
static jint com_android_internal_os_ZygoteInit_selectReadable (
|
||||||
JNIEnv *env, jobject clazz, jobjectArray fds)
|
JNIEnv *env, jobject clazz, jobjectArray fds)
|
||||||
{
|
{
|
||||||
@@ -205,10 +168,6 @@ static JNINativeMethod gMethods[] = {
|
|||||||
(void *) com_android_internal_os_ZygoteInit_setpgid },
|
(void *) com_android_internal_os_ZygoteInit_setpgid },
|
||||||
{ "getpgid", "(I)I",
|
{ "getpgid", "(I)I",
|
||||||
(void *) com_android_internal_os_ZygoteInit_getpgid },
|
(void *) com_android_internal_os_ZygoteInit_getpgid },
|
||||||
{ "reopenStdio",
|
|
||||||
"(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;"
|
|
||||||
"Ljava/io/FileDescriptor;)V",
|
|
||||||
(void *) com_android_internal_os_ZygoteInit_reopenStdio},
|
|
||||||
{ "selectReadable", "([Ljava/io/FileDescriptor;)I",
|
{ "selectReadable", "([Ljava/io/FileDescriptor;)I",
|
||||||
(void *) com_android_internal_os_ZygoteInit_selectReadable },
|
(void *) com_android_internal_os_ZygoteInit_selectReadable },
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user