Revert "Revert "adb: add support for O_CLOEXEC to unique_fd pipe wrapper.""

Implement pipe2 ourselves on darwin.

This reverts commit f139ba47a1.

Test: none!
Change-Id: I42c2a8d07712fe4ac75b5824f754e79a5b9f5cb4
This commit is contained in:
Josh Gao 2018-05-23 11:04:58 -07:00
parent 85bd9ca978
commit 9da1a9118b
1 changed files with 28 additions and 1 deletions

View File

@ -28,11 +28,38 @@ struct AdbCloser {
using unique_fd = android::base::unique_fd_impl<AdbCloser>;
#if !defined(_WIN32)
inline bool Pipe(unique_fd* read, unique_fd* write) {
inline bool Pipe(unique_fd* read, unique_fd* write, int flags = 0) {
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) {
PLOG(FATAL) << "failed to set FD_CLOEXEC on newly created pipe";
}
}
if (flags & O_NONBLOCK) {
if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0 ||
fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) {
PLOG(FATAL) << "failed to set O_NONBLOCK on newly created pipe";
}
}
#endif
read->reset(pipefd[0]);
write->reset(pipefd[1]);
return true;