Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9da1a911 authored by Josh Gao's avatar Josh Gao
Browse files

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

Implement pipe2 ourselves on darwin.

This reverts commit f139ba47.

Test: none!
Change-Id: I42c2a8d07712fe4ac75b5824f754e79a5b9f5cb4
parent 85bd9ca9
Loading
Loading
Loading
Loading
+28 −1
Original line number Original line Diff line number Diff line
@@ -28,11 +28,38 @@ struct AdbCloser {
using unique_fd = android::base::unique_fd_impl<AdbCloser>;
using unique_fd = android::base::unique_fd_impl<AdbCloser>;


#if !defined(_WIN32)
#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];
    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) {
    if (pipe(pipefd) != 0) {
        return false;
        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]);
    read->reset(pipefd[0]);
    write->reset(pipefd[1]);
    write->reset(pipefd[1]);
    return true;
    return true;