From 6e1246c234bdfc41ff80b6d23599c56284d297ad Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Thu, 24 May 2018 22:54:50 -0700 Subject: [PATCH] adb: really fix the mac build. Test: changed `#if !defined(__APPLE__)` to `#if 0` and ran mma Change-Id: I173cccbfb7bad348ac4796a2d6cebb8490f63479 --- adb/Android.bp | 1 + adb/adb_unique_fd.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++ adb/adb_unique_fd.h | 41 +-------------------------- 3 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 adb/adb_unique_fd.cpp diff --git a/adb/Android.bp b/adb/Android.bp index 1f41e4f3f..cfc350361 100644 --- a/adb/Android.bp +++ b/adb/Android.bp @@ -96,6 +96,7 @@ libadb_srcs = [ "adb_io.cpp", "adb_listeners.cpp", "adb_trace.cpp", + "adb_unique_fd.cpp", "adb_utils.cpp", "fdevent.cpp", "services.cpp", diff --git a/adb/adb_unique_fd.cpp b/adb/adb_unique_fd.cpp new file mode 100644 index 000000000..2079be152 --- /dev/null +++ b/adb/adb_unique_fd.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "adb_unique_fd.h" + +#include +#include + +#include "sysdeps.h" + +#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 d1dc9d10e..be6326255 100644 --- a/adb/adb_unique_fd.h +++ b/adb/adb_unique_fd.h @@ -29,44 +29,5 @@ struct AdbCloser { using unique_fd = android::base::unique_fd_impl; #if !defined(_WIN32) -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) { - 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 - - read->reset(pipefd[0]); - write->reset(pipefd[1]); - return true; -} +bool Pipe(unique_fd* read, unique_fd* write, int flags = 0); #endif