diff --git a/adb/adb.cpp b/adb/adb.cpp index 38c6f62c9..a8fe73651 100644 --- a/adb/adb.cpp +++ b/adb/adb.cpp @@ -891,6 +891,10 @@ int launch_server(const std::string& socket_spec) { // child side of the fork pipe_read.reset(); + // android::base::Pipe unconditionally opens the pipe with O_CLOEXEC. + // Undo this manually. + fcntl(pipe_write.get(), F_SETFD, 0); + char reply_fd[30]; snprintf(reply_fd, sizeof(reply_fd), "%d", pipe_write.get()); // child process diff --git a/adb/adb_unique_fd.cpp b/adb/adb_unique_fd.cpp index 58e768e13..dec73bc2e 100644 --- a/adb/adb_unique_fd.cpp +++ b/adb/adb_unique_fd.cpp @@ -21,49 +21,8 @@ #include "sysdeps.h" +#if defined(_WIN32) void AdbCloser::Close(int fd) { adb_close(fd); } - -#if !defined(_WIN32) -bool Pipe(unique_fd* read, unique_fd* write, int flags) { - int pipefd[2]; -#if !defined(__APPLE__) - if (pipe2(pipefd, flags) != 0) { - return false; - } -#else - // Darwin doesn't have pipe2. Implement it ourselves. - if (flags != 0 && (flags & ~(O_CLOEXEC | O_NONBLOCK)) != 0) { - errno = EINVAL; - return false; - } - - if (pipe(pipefd) != 0) { - return false; - } - - if (flags & O_CLOEXEC) { - if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) != 0 || - fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) != 0) { - adb_close(pipefd[0]); - adb_close(pipefd[1]); - return false; - } - } - - if (flags & O_NONBLOCK) { - if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0 || - fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) { - adb_close(pipefd[0]); - adb_close(pipefd[1]); - return false; - } - } -#endif - - read->reset(pipefd[0]); - write->reset(pipefd[1]); - return true; -} #endif diff --git a/adb/adb_unique_fd.h b/adb/adb_unique_fd.h index bad501abb..d47213d75 100644 --- a/adb/adb_unique_fd.h +++ b/adb/adb_unique_fd.h @@ -21,15 +21,15 @@ #include +#if defined(_WIN32) // Helper to automatically close an FD when it goes out of scope. struct AdbCloser { static void Close(int fd); }; using unique_fd = android::base::unique_fd_impl; - -#if !defined(_WIN32) -bool Pipe(unique_fd* read, unique_fd* write, int flags = 0); +#else +using unique_fd = android::base::unique_fd; #endif template