From e2841044a0eba0da363b06b37ee5265a48ef9238 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Fri, 18 Jan 2019 11:11:57 -0800 Subject: [PATCH] base: support optional flags in android::base::Pipe. Bug: none Test: build and use it manually. Test: run libbase_tests. Change-Id: I50b5251e8da23ddce94711807859612bf890406b --- base/include/android-base/unique_fd.h | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/base/include/android-base/unique_fd.h b/base/include/android-base/unique_fd.h index c8d12cf89..2c890b42d 100644 --- a/base/include/android-base/unique_fd.h +++ b/base/include/android-base/unique_fd.h @@ -161,22 +161,35 @@ using unique_fd = unique_fd_impl; // Inline functions, so that they can be used header-only. template -inline bool Pipe(unique_fd_impl* read, unique_fd_impl* write) { +inline bool Pipe(unique_fd_impl* read, unique_fd_impl* write, + int flags = O_CLOEXEC) { int pipefd[2]; #if defined(__linux__) - if (pipe2(pipefd, O_CLOEXEC) != 0) { + if (pipe2(pipefd, flags) != 0) { return false; } #else // defined(__APPLE__) + if (flags & ~(O_CLOEXEC | O_NONBLOCK)) { + return false; + } if (pipe(pipefd) != 0) { return false; } - if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) != 0 || fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) != 0) { - close(pipefd[0]); - close(pipefd[1]); - return false; + if (flags & O_CLOEXEC) { + if (fcntl(pipefd[0], F_SETFD, FD_CLOEXEC) != 0 || fcntl(pipefd[1], F_SETFD, FD_CLOEXEC) != 0) { + close(pipefd[0]); + 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) { + close(pipefd[0]); + close(pipefd[1]); + return false; + } } #endif