aboutsummaryrefslogtreecommitdiffstats
path: root/devel
diff options
context:
space:
mode:
authorjbeich <jbeich@FreeBSD.org>2016-09-29 11:44:05 +0800
committerjbeich <jbeich@FreeBSD.org>2016-09-29 11:44:05 +0800
commited8ace4ff5012af208d3b869cfa61a9cbb206b20 (patch)
treeb96ac17f4ec6a977031d1dcf40e70ad8aecbcbd2 /devel
parentc2a20b30287fccbcf12c8d1397e5c2074fd8ad51 (diff)
downloadfreebsd-ports-gnome-ed8ace4ff5012af208d3b869cfa61a9cbb206b20.tar.gz
freebsd-ports-gnome-ed8ace4ff5012af208d3b869cfa61a9cbb206b20.tar.zst
freebsd-ports-gnome-ed8ace4ff5012af208d3b869cfa61a9cbb206b20.zip
devel/android-tools-{adb,fastboot}-devel: update to n.p.5.3582
Changes: https://android.googlesource.com/platform/system/core/+log/2f21b7cecda2..dfd30c4a169e/adb Changes: https://android.googlesource.com/platform/system/core/+log/2f21b7cecda2..dfd30c4a169e/fastboot
Diffstat (limited to 'devel')
-rw-r--r--devel/android-tools-adb-devel/Makefile9
-rw-r--r--devel/android-tools-adb-devel/distinfo10
-rw-r--r--devel/android-tools-adb-devel/files/Makefile8
-rw-r--r--devel/android-tools-adb-devel/files/get_my_path_freebsd.cpp35
-rw-r--r--devel/android-tools-adb-devel/files/patch-adb_adb__auth__host.cpp6
-rw-r--r--devel/android-tools-adb-devel/files/patch-adb_bugreport__test.cpp18
-rw-r--r--devel/android-tools-adb-devel/files/patch-adb_commandline.h11
-rw-r--r--devel/android-tools-adb-devel/files/patch-adb_mutex995
-rw-r--r--devel/android-tools-adb-devel/files/patch-base_file.cpp40
-rw-r--r--devel/android-tools-adb/Makefile7
-rw-r--r--devel/android-tools-adb/files/extra-patch-adb_sysdeps_mutex.h (renamed from devel/android-tools-adb/files/patch-adb_sysdeps_mutex.h)0
-rw-r--r--devel/android-tools-adb/files/extra-patch-base_file.cpp (renamed from devel/android-tools-adb/files/patch-base_file.cpp)0
-rw-r--r--devel/android-tools-fastboot-devel/Makefile8
-rw-r--r--devel/android-tools-fastboot-devel/distinfo18
-rw-r--r--devel/android-tools-fastboot-devel/files/patch-base_file.cpp40
-rw-r--r--devel/android-tools-fastboot/Makefile4
-rw-r--r--devel/android-tools-fastboot/files/extra-patch-base_file.cpp (renamed from devel/android-tools-fastboot/files/patch-base_file.cpp)0
17 files changed, 1148 insertions, 61 deletions
diff --git a/devel/android-tools-adb-devel/Makefile b/devel/android-tools-adb-devel/Makefile
index 4706fe003561..c37905b8eeb1 100644
--- a/devel/android-tools-adb-devel/Makefile
+++ b/devel/android-tools-adb-devel/Makefile
@@ -1,9 +1,9 @@
# $FreeBSD$
# Hint: git describe --abbrev=12 --match android-n-preview-5
-DISTVERSION= n-preview-5-126
-DISTVERSIONSUFFIX= -g2f21b7cecda2
-PORTREVISION= 1
+DISTVERSION= n-preview-5-3582
+DISTVERSIONSUFFIX= -gdfd30c4a169e
+PORTREVISION= 0
PKGNAMESUFFIX= -devel
CONFLICTS_INSTALL= ${PORTNAME}-[0-9]*
@@ -15,8 +15,11 @@ EXTRA_PATCHES= ${.CURDIR}/files/patch-*
GH_MYTAG= ${DISTVERSIONPREFIX}${DISTVERSION:C/-[0-9]*$//}
+CPPFLAGS+= -D_GLIBCXX_USE_C99 # XXX ports/193528
+
OPTIONS_DEFINE= TEST_PYTHON
+TEST_BUILD_DEPENDS= googlemock>=1.6.0:devel/googlemock
TEST_BROKEN= logging.* tests always fail after 4e5fd111d84d
TEST_PYTHON_DESC= ${TEST_DESC:S/tests/python &/}
diff --git a/devel/android-tools-adb-devel/distinfo b/devel/android-tools-adb-devel/distinfo
index 3fe918f460a9..b2a8f3366ae0 100644
--- a/devel/android-tools-adb-devel/distinfo
+++ b/devel/android-tools-adb-devel/distinfo
@@ -1,7 +1,7 @@
-TIMESTAMP = 1470755379
-SHA256 (android-platform_system_core-android-n-preview-5-126-g2f21b7cecda2_GH0.tar.gz) = 61256486af01cfefeee6779f9926ba32334b9fb1a5aacfa2cd4a682d66f01a2a
-SIZE (android-platform_system_core-android-n-preview-5-126-g2f21b7cecda2_GH0.tar.gz) = 1561372
-SHA256 (mbrubeck-android-completion-3b0fabe_GH0.tar.gz) = dc774f101acd9514baf3e7a0ac610068116f2c093b94987ba59203a39a6439dc
-SIZE (mbrubeck-android-completion-3b0fabe_GH0.tar.gz) = 5948
+TIMESTAMP = 1474960220
+SHA256 (android-platform_system_core-android-n-preview-5-3582-gdfd30c4a169e_GH0.tar.gz) = 2a4530432d51797fcc426b737d66b411d7ba4635afabe32b0c89cb581b19bc34
+SIZE (android-platform_system_core-android-n-preview-5-3582-gdfd30c4a169e_GH0.tar.gz) = 1464524
+SHA256 (mbrubeck-android-completion-c1b0656_GH0.tar.gz) = ca3311ba47a5edd56c929ac9aae57c02c2c3f1636519c5f67abb00b6e3ecd75c
+SIZE (mbrubeck-android-completion-c1b0656_GH0.tar.gz) = 5967
SHA256 (android-platform_development-android-n-preview-5-14-g735aab1_GH0.tar.gz) = e3559503f88e0dc3f0fa3e04cd11b0666538c64a24275fc39af951b74e50f32c
SIZE (android-platform_development-android-n-preview-5-14-g735aab1_GH0.tar.gz) = 149193336
diff --git a/devel/android-tools-adb-devel/files/Makefile b/devel/android-tools-adb-devel/files/Makefile
index c00c9a7cca46..89f027958189 100644
--- a/devel/android-tools-adb-devel/files/Makefile
+++ b/devel/android-tools-adb-devel/files/Makefile
@@ -15,6 +15,7 @@ SRCS+= adb_io.cpp
SRCS+= adb_listeners.cpp
SRCS+= adb_trace.cpp
SRCS+= adb_utils.cpp
+SRCS+= bugreport.cpp
SRCS+= commandline.cpp
SRCS+= console.cpp
SRCS+= diagnose_usb.cpp
@@ -23,6 +24,7 @@ SRCS+= file_sync_client.cpp
SRCS+= line_printer.cpp
SRCS+= services.cpp
SRCS+= shell_service_protocol.cpp
+SRCS+= socket_spec.cpp
SRCS+= ../adb/sockets.cpp
SRCS+= sysdeps_unix.cpp
SRCS+= transport.cpp
@@ -32,8 +34,10 @@ SRCS+= transport_usb.cpp
TEST_SRCS+= adb_io_test.cpp
TEST_SRCS+= adb_listeners_test.cpp
TEST_SRCS+= adb_utils_test.cpp
+TEST_SRCS+= bugreport_test.cpp
TEST_SRCS+= fdevent_test.cpp
TEST_SRCS+= shell_service_protocol_test.cpp
+TEST_SRCS+= socket_spec_test.cpp
TEST_SRCS+= socket_test.cpp
TEST_SRCS+= sysdeps_test.cpp
TEST_SRCS+= transport_test.cpp
@@ -45,7 +49,6 @@ SRCS+= main.cpp
TEST_SRCS+= stat_test.cpp
.PATH: ${EXTRADIR}
-SRCS+= get_my_path_freebsd.cpp
SRCS+= usb_libusb.cpp
.PATH: ${.CURDIR}/../base
@@ -115,6 +118,7 @@ CXXFLAGS+= ${CPPFLAGS}
.endif
TEST_CPPFLAGS+= $$(${GTEST_CONFIG} --cppflags)
+TEST_CPPFLAGS+= $$(${GMOCK_CONFIG} --cppflags)
.for f in ${TEST_SRCS}
CPPFLAGS.${f}+= ${TEST_CPPFLAGS}
.endfor
@@ -124,12 +128,14 @@ LDADD+= $$(${PKG_CONFIG} libusb-1.0 --libs 2>/dev/null || echo -lusb)
LDADD+= -lz \-lpthread
DPADD+= ${LIBCRYPTO} ${LIBPTHREAD} ${LIBUSB} ${LIBZ}
TEST_LDADD+= $$(${GTEST_CONFIG} --libs --ldflags)
+TEST_LDADD+= $$(${GMOCK_CONFIG} --libs --ldflags)
TEST_OBJS+= ${TEST_SRCS:R:S/$/.o/}
CLEANFILES+= ${PROG}_test ${TEST_OBJS}
GIT?= git
GTEST_CONFIG?= gtest-config
+GMOCK_CONFIG?= gmock-config
PKG_CONFIG?= pkg-config
beforeinstall:
diff --git a/devel/android-tools-adb-devel/files/get_my_path_freebsd.cpp b/devel/android-tools-adb-devel/files/get_my_path_freebsd.cpp
deleted file mode 100644
index c935adf1292a..000000000000
--- a/devel/android-tools-adb-devel/files/get_my_path_freebsd.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2009 bsdroid project
- * Alexey Tarasov <tarasov@dodologics.com>
- *
- * Copyright (C) 2007 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 <sys/types.h>
-#include <sys/sysctl.h>
-#include <unistd.h>
-
-void
-get_my_path(char *exe, size_t maxLen)
-{
- int mib[4] = {
- CTL_KERN,
- KERN_PROC,
- KERN_PROC_PATHNAME,
- getpid()
- };
-
- sysctl(mib, 4, exe, &maxLen, NULL, 0);
-}
diff --git a/devel/android-tools-adb-devel/files/patch-adb_adb__auth__host.cpp b/devel/android-tools-adb-devel/files/patch-adb_adb__auth__host.cpp
index 0b9d8ee7ec5d..2fb3e5335c76 100644
--- a/devel/android-tools-adb-devel/files/patch-adb_adb__auth__host.cpp
+++ b/devel/android-tools-adb-devel/files/patch-adb_adb__auth__host.cpp
@@ -1,9 +1,9 @@
--- adb/adb_auth_host.cpp.orig 2016-06-29 23:43:15 UTC
+++ adb/adb_auth_host.cpp
-@@ -33,7 +33,9 @@
+@@ -34,7 +34,9 @@
+ #include <android-base/stringprintf.h>
+ #include <android-base/strings.h>
#include <crypto_utils/android_pubkey.h>
- #include <cutils/list.h>
-
+#if defined(OPENSSL_IS_BORINGSSL)
#include <openssl/base64.h>
+#endif
diff --git a/devel/android-tools-adb-devel/files/patch-adb_bugreport__test.cpp b/devel/android-tools-adb-devel/files/patch-adb_bugreport__test.cpp
new file mode 100644
index 000000000000..c201a86849dc
--- /dev/null
+++ b/devel/android-tools-adb-devel/files/patch-adb_bugreport__test.cpp
@@ -0,0 +1,18 @@
+--- adb/bugreport_test.cpp.orig 2016-09-28 18:07:09 UTC
++++ adb/bugreport_test.cpp
+@@ -40,6 +40,7 @@ using ::testing::internal::CaptureStdout
+ using ::testing::internal::GetCapturedStderr;
+ using ::testing::internal::GetCapturedStdout;
+
++#ifdef __linux__
+ // Empty function so tests don't need to be linked against file_sync_service.cpp, which requires
+ // SELinux and its transitive dependencies...
+ bool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool copy_attrs,
+@@ -47,6 +48,7 @@ bool do_sync_pull(const std::vector<cons
+ ADD_FAILURE() << "do_sync_pull() should have been mocked";
+ return false;
+ }
++#endif
+
+ // Empty functions so tests don't need to be linked against commandline.cpp
+ DefaultStandardStreamsCallback DEFAULT_STANDARD_STREAMS_CALLBACK(nullptr, nullptr);
diff --git a/devel/android-tools-adb-devel/files/patch-adb_commandline.h b/devel/android-tools-adb-devel/files/patch-adb_commandline.h
new file mode 100644
index 000000000000..a957ad260f33
--- /dev/null
+++ b/devel/android-tools-adb-devel/files/patch-adb_commandline.h
@@ -0,0 +1,11 @@
+--- adb/commandline.h.orig 2016-09-28 18:07:09 UTC
++++ adb/commandline.h
+@@ -17,6 +17,8 @@
+ #ifndef COMMANDLINE_H
+ #define COMMANDLINE_H
+
++#include <stdio.h>
++
+ #include "adb.h"
+
+ // Callback used to handle the standard streams (stdout and stderr) sent by the
diff --git a/devel/android-tools-adb-devel/files/patch-adb_mutex b/devel/android-tools-adb-devel/files/patch-adb_mutex
new file mode 100644
index 000000000000..d3c935a3ef1c
--- /dev/null
+++ b/devel/android-tools-adb-devel/files/patch-adb_mutex
@@ -0,0 +1,995 @@
+Revert 0cd3ae1c281f until usb_libusb.cpp adopts 812f030477bc.
+
+diff --git adb/adb_utils.cpp adb/adb_utils.cpp
+index db39ef4..5a3b401 100644
+--- adb/adb_utils.cpp
++++ adb/adb_utils.cpp
+@@ -26,7 +26,6 @@
+ #include <unistd.h>
+
+ #include <algorithm>
+-#include <mutex>
+ #include <vector>
+
+ #include <android-base/logging.h>
+@@ -48,6 +47,8 @@
+ #include <pwd.h>
+ #endif
+
++ADB_MUTEX_DEFINE(basename_lock);
++ADB_MUTEX_DEFINE(dirname_lock);
+
+ #if defined(_WIN32)
+ constexpr char kNullFileName[] = "NUL";
+@@ -101,15 +102,13 @@
+ }
+
+ std::string adb_basename(const std::string& path) {
+- static std::mutex& basename_lock = *new std::mutex();
+-
+ // Copy path because basename may modify the string passed in.
+ std::string result(path);
+
+ // Use lock because basename() may write to a process global and return a
+ // pointer to that. Note that this locking strategy only works if all other
+- // callers to basename in the process also grab this same lock.
+- std::lock_guard<std::mutex> lock(basename_lock);
++ // callers to dirname in the process also grab this same lock.
++ adb_mutex_lock(&basename_lock);
+
+ // Note that if std::string uses copy-on-write strings, &str[0] will cause
+ // the copy to be made, so there is no chance of us accidentally writing to
+@@ -120,19 +119,19 @@
+ // before leaving the lock.
+ result.assign(name);
+
++ adb_mutex_unlock(&basename_lock);
++
+ return result;
+ }
+
+ std::string adb_dirname(const std::string& path) {
+- static std::mutex& dirname_lock = *new std::mutex();
+-
+ // Copy path because dirname may modify the string passed in.
+ std::string result(path);
+
+ // Use lock because dirname() may write to a process global and return a
+ // pointer to that. Note that this locking strategy only works if all other
+ // callers to dirname in the process also grab this same lock.
+- std::lock_guard<std::mutex> lock(dirname_lock);
++ adb_mutex_lock(&dirname_lock);
+
+ // Note that if std::string uses copy-on-write strings, &str[0] will cause
+ // the copy to be made, so there is no chance of us accidentally writing to
+@@ -143,6 +142,8 @@
+ // before leaving the lock.
+ result.assign(parent);
+
++ adb_mutex_unlock(&dirname_lock);
++
+ return result;
+ }
+
+diff --git adb/client/main.cpp adb/client/main.cpp
+index 571c227..279bb70 100644
+--- adb/client/main.cpp
++++ adb/client/main.cpp
+@@ -170,6 +170,7 @@
+ }
+
+ int main(int argc, char** argv) {
++ adb_sysdeps_init();
+ adb_trace_init(argv);
+ return adb_commandline(argc - 1, const_cast<const char**>(argv + 1));
+ }
+diff --git adb/mutex_list.h adb/mutex_list.h
+deleted file mode 100644
+index 4a188ee..0000000
+--- /dev/null
++++ adb/mutex_list.h
+@@ -0,0 +1,17 @@
++/* the list of mutexes used by adb */
++/* #ifndef __MUTEX_LIST_H
++ * Do not use an include-guard. This file is included once to declare the locks
++ * and once in win32 to actually do the runtime initialization.
++ */
++#ifndef ADB_MUTEX
++#error ADB_MUTEX not defined when including this file
++#endif
++ADB_MUTEX(basename_lock)
++ADB_MUTEX(dirname_lock)
++ADB_MUTEX(transport_lock)
++#if ADB_HOST
++ADB_MUTEX(local_transports_lock)
++#endif
++ADB_MUTEX(usb_lock)
++
++#undef ADB_MUTEX
+diff --git adb/sysdeps.h adb/sysdeps.h
+index 8d99722..3ed589c 100644
+--- adb/sysdeps.h
++++ adb/sysdeps.h
+@@ -97,6 +97,27 @@
+ return c == '\\' || c == '/';
+ }
+
++typedef CRITICAL_SECTION adb_mutex_t;
++
++#define ADB_MUTEX_DEFINE(x) adb_mutex_t x
++
++/* declare all mutexes */
++/* For win32, adb_sysdeps_init() will do the mutex runtime initialization. */
++#define ADB_MUTEX(x) extern adb_mutex_t x;
++#include "mutex_list.h"
++
++extern void adb_sysdeps_init(void);
++
++static __inline__ void adb_mutex_lock( adb_mutex_t* lock )
++{
++ EnterCriticalSection( lock );
++}
++
++static __inline__ void adb_mutex_unlock( adb_mutex_t* lock )
++{
++ LeaveCriticalSection( lock );
++}
++
+ typedef void (*adb_thread_func_t)(void* arg);
+ typedef HANDLE adb_thread_t;
+
+@@ -455,6 +476,27 @@
+ return c == '/';
+ }
+
++typedef pthread_mutex_t adb_mutex_t;
++
++#define ADB_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
++#define adb_mutex_init pthread_mutex_init
++#define adb_mutex_lock pthread_mutex_lock
++#define adb_mutex_unlock pthread_mutex_unlock
++#define adb_mutex_destroy pthread_mutex_destroy
++
++#define ADB_MUTEX_DEFINE(m) adb_mutex_t m = PTHREAD_MUTEX_INITIALIZER
++
++#define adb_cond_t pthread_cond_t
++#define adb_cond_init pthread_cond_init
++#define adb_cond_wait pthread_cond_wait
++#define adb_cond_broadcast pthread_cond_broadcast
++#define adb_cond_signal pthread_cond_signal
++#define adb_cond_destroy pthread_cond_destroy
++
++/* declare all mutexes */
++#define ADB_MUTEX(x) extern adb_mutex_t x;
++#include "mutex_list.h"
++
+ static __inline__ void close_on_exec(int fd)
+ {
+ fcntl( fd, F_SETFD, FD_CLOEXEC );
+@@ -776,6 +818,10 @@
+ #undef mkdir
+ #define mkdir ___xxx_mkdir
+
++static __inline__ void adb_sysdeps_init(void)
++{
++}
++
+ static __inline__ int adb_is_absolute_host_path(const char* path) {
+ return path[0] == '/';
+ }
+diff --git adb/sysdeps_test.cpp adb/sysdeps_test.cpp
+index f871675..9f77942 100644
+--- adb/sysdeps_test.cpp
++++ adb/sysdeps_test.cpp
+@@ -269,6 +269,17 @@
+ m.unlock();
+ }
+
++// Our implementation on Windows aborts on double lock.
++#if defined(_WIN32)
++TEST(sysdeps_mutex, mutex_reentrant_lock) {
++ std::mutex &m = *new std::mutex();
++
++ m.lock();
++ ASSERT_FALSE(m.try_lock());
++ EXPECT_DEATH(m.lock(), "non-recursive mutex locked reentrantly");
++}
++#endif
++
+ TEST(sysdeps_mutex, recursive_mutex_smoke) {
+ static std::recursive_mutex &m = *new std::recursive_mutex();
+
+diff --git adb/sysdeps_win32.cpp adb/sysdeps_win32.cpp
+index 5fda27b..4dd549d 100644
+--- adb/sysdeps_win32.cpp
++++ adb/sysdeps_win32.cpp
+@@ -27,7 +27,6 @@
+
+ #include <algorithm>
+ #include <memory>
+-#include <mutex>
+ #include <string>
+ #include <unordered_map>
+ #include <vector>
+@@ -138,7 +137,7 @@
+ #define WIN32_FH_BASE 2048
+ #define WIN32_MAX_FHS 2048
+
+-static std::mutex& _win32_lock = *new std::mutex();
++static adb_mutex_t _win32_lock;
+ static FHRec _win32_fhs[ WIN32_MAX_FHS ];
+ static int _win32_fh_next; // where to start search for free FHRec
+
+@@ -183,24 +182,27 @@
+ {
+ FH f = NULL;
+
+- std::lock_guard<std::mutex> lock(_win32_lock);
++ adb_mutex_lock( &_win32_lock );
+
+ for (int i = _win32_fh_next; i < WIN32_MAX_FHS; ++i) {
+ if (_win32_fhs[i].clazz == NULL) {
+ f = &_win32_fhs[i];
+ _win32_fh_next = i + 1;
+- f->clazz = clazz;
+- f->used = 1;
+- f->eof = 0;
+- f->name[0] = '\0';
+- clazz->_fh_init(f);
+- return f;
++ goto Exit;
+ }
+ }
+-
+- D("_fh_alloc: no more free file descriptors");
+- errno = EMFILE; // Too many open files
+- return nullptr;
++ D( "_fh_alloc: no more free file descriptors" );
++ errno = EMFILE; // Too many open files
++Exit:
++ if (f) {
++ f->clazz = clazz;
++ f->used = 1;
++ f->eof = 0;
++ f->name[0] = '\0';
++ clazz->_fh_init(f);
++ }
++ adb_mutex_unlock( &_win32_lock );
++ return f;
+ }
+
+
+@@ -209,7 +211,7 @@
+ {
+ // Use lock so that closing only happens once and so that _fh_alloc can't
+ // allocate a FH that we're in the middle of closing.
+- std::lock_guard<std::mutex> lock(_win32_lock);
++ adb_mutex_lock(&_win32_lock);
+
+ int offset = f - _win32_fhs;
+ if (_win32_fh_next > offset) {
+@@ -223,6 +225,7 @@
+ f->used = 0;
+ f->clazz = NULL;
+ }
++ adb_mutex_unlock(&_win32_lock);
+ return 0;
+ }
+
+@@ -1231,6 +1234,17 @@
+ return true;
+ }
+
++static adb_mutex_t g_console_output_buffer_lock;
++
++void
++adb_sysdeps_init( void )
++{
++#define ADB_MUTEX(x) InitializeCriticalSection( & x );
++#include "mutex_list.h"
++ InitializeCriticalSection( &_win32_lock );
++ InitializeCriticalSection( &g_console_output_buffer_lock );
++}
++
+ /**************************************************************************/
+ /**************************************************************************/
+ /***** *****/
+@@ -2423,13 +2437,12 @@
+ // Bytes that have not yet been output to the console because they are incomplete UTF-8 sequences.
+ // Note that we use only one buffer even though stderr and stdout are logically separate streams.
+ // This matches the behavior of Linux.
++// Protected by g_console_output_buffer_lock.
++static auto& g_console_output_buffer = *new std::vector<char>();
+
+ // Internal helper function to write UTF-8 bytes to a console. Returns -1 on error.
+ static int _console_write_utf8(const char* const buf, const size_t buf_size, FILE* stream,
+ HANDLE console) {
+- static std::mutex& console_output_buffer_lock = *new std::mutex();
+- static auto& console_output_buffer = *new std::vector<char>();
+-
+ const int saved_errno = errno;
+ std::vector<char> combined_buffer;
+
+@@ -2437,25 +2450,24 @@
+ const char* utf8;
+ size_t utf8_size;
+
+- {
+- std::lock_guard<std::mutex> lock(console_output_buffer_lock);
+- if (console_output_buffer.empty()) {
+- // If console_output_buffer doesn't have a buffered up incomplete UTF-8 sequence (the
+- // common case with plain ASCII), parse buf directly.
+- utf8 = buf;
+- utf8_size = internal::ParseCompleteUTF8(buf, buf + buf_size, &console_output_buffer);
+- } else {
+- // If console_output_buffer has a buffered up incomplete UTF-8 sequence, move it to
+- // combined_buffer (and effectively clear console_output_buffer) and append buf to
+- // combined_buffer, then parse it all together.
+- combined_buffer.swap(console_output_buffer);
+- combined_buffer.insert(combined_buffer.end(), buf, buf + buf_size);
+-
+- utf8 = combined_buffer.data();
+- utf8_size = internal::ParseCompleteUTF8(utf8, utf8 + combined_buffer.size(),
+- &console_output_buffer);
+- }
++ adb_mutex_lock(&g_console_output_buffer_lock);
++ if (g_console_output_buffer.empty()) {
++ // If g_console_output_buffer doesn't have a buffered up incomplete UTF-8 sequence (the
++ // common case with plain ASCII), parse buf directly.
++ utf8 = buf;
++ utf8_size = internal::ParseCompleteUTF8(buf, buf + buf_size, &g_console_output_buffer);
++ } else {
++ // If g_console_output_buffer has a buffered up incomplete UTF-8 sequence, move it to
++ // combined_buffer (and effectively clear g_console_output_buffer) and append buf to
++ // combined_buffer, then parse it all together.
++ combined_buffer.swap(g_console_output_buffer);
++ combined_buffer.insert(combined_buffer.end(), buf, buf + buf_size);
++
++ utf8 = combined_buffer.data();
++ utf8_size = internal::ParseCompleteUTF8(utf8, utf8 + combined_buffer.size(),
++ &g_console_output_buffer);
+ }
++ adb_mutex_unlock(&g_console_output_buffer_lock);
+
+ std::wstring utf16;
+
+diff --git adb/transport.cpp adb/transport.cpp
+index 3eaeb06..87712fc 100644
+--- adb/transport.cpp
++++ adb/transport.cpp
+@@ -28,7 +28,6 @@
+
+ #include <algorithm>
+ #include <list>
+-#include <mutex>
+
+ #include <android-base/logging.h>
+ #include <android-base/parsenetaddress.h>
+@@ -45,7 +44,7 @@
+ static auto& transport_list = *new std::list<atransport*>();
+ static auto& pending_list = *new std::list<atransport*>();
+
+-static std::mutex& transport_lock = *new std::mutex();
++ADB_MUTEX_DEFINE( transport_lock );
+
+ const char* const kFeatureShell2 = "shell_v2";
+ const char* const kFeatureCmd = "cmd";
+@@ -298,12 +297,13 @@
+ }
+
+ void kick_transport(atransport* t) {
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ // As kick_transport() can be called from threads without guarantee that t is valid,
+ // check if the transport is in transport_list first.
+ if (std::find(transport_list.begin(), transport_list.end(), t) != transport_list.end()) {
+ t->Kick();
+ }
++ adb_mutex_unlock(&transport_lock);
+ }
+
+ static int transport_registration_send = -1;
+@@ -333,7 +333,7 @@
+ device_tracker** pnode = &device_tracker_list;
+ device_tracker* node = *pnode;
+
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock( &transport_lock );
+ while (node) {
+ if (node == tracker) {
+ *pnode = node->next;
+@@ -342,6 +342,7 @@
+ pnode = &node->next;
+ node = *pnode;
+ }
++ adb_mutex_unlock( &transport_lock );
+ }
+
+ static void
+@@ -503,10 +504,9 @@
+ fdevent_remove(&(t->transport_fde));
+ adb_close(t->fd);
+
+- {
+- std::lock_guard<std::mutex> lock(transport_lock);
+- transport_list.remove(t);
+- }
++ adb_mutex_lock(&transport_lock);
++ transport_list.remove(t);
++ adb_mutex_unlock(&transport_lock);
+
+ if (t->product)
+ free(t->product);
+@@ -555,11 +555,10 @@
+ }
+ }
+
+- {
+- std::lock_guard<std::mutex> lock(transport_lock);
+- pending_list.remove(t);
+- transport_list.push_front(t);
+- }
++ adb_mutex_lock(&transport_lock);
++ pending_list.remove(t);
++ transport_list.push_front(t);
++ adb_mutex_unlock(&transport_lock);
+
+ update_transports();
+ }
+@@ -610,8 +609,7 @@
+
+ static void transport_unref(atransport* t) {
+ CHECK(t != nullptr);
+-
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ CHECK_GT(t->ref_count, 0u);
+ t->ref_count--;
+ if (t->ref_count == 0) {
+@@ -621,6 +619,7 @@
+ } else {
+ D("transport: %s unref (count=%zu)", t->serial, t->ref_count);
+ }
++ adb_mutex_unlock(&transport_lock);
+ }
+
+ static int qual_match(const char *to_test,
+@@ -666,7 +665,7 @@
+ *error_out = "no devices found";
+ }
+
+- std::unique_lock<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (const auto& t : transport_list) {
+ if (t->connection_state == kCsNoPerm) {
+ #if ADB_HOST
+@@ -714,7 +713,7 @@
+ }
+ }
+ }
+- lock.unlock();
++ adb_mutex_unlock(&transport_lock);
+
+ // Don't return unauthorized devices; the caller can't do anything with them.
+ if (result && result->connection_state == kCsUnauthorized) {
+@@ -915,20 +914,21 @@
+
+ std::string list_transports(bool long_listing) {
+ std::string result;
+-
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (const auto& t : transport_list) {
+ append_transport(t, &result, long_listing);
+ }
++ adb_mutex_unlock(&transport_lock);
+ return result;
+ }
+
+ /* hack for osx */
+ void close_usb_devices() {
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (const auto& t : transport_list) {
+ t->Kick();
+ }
++ adb_mutex_unlock(&transport_lock);
+ }
+ #endif // ADB_HOST
+
+@@ -947,9 +947,10 @@
+ return -1;
+ }
+
+- std::unique_lock<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (const auto& transport : pending_list) {
+ if (transport->serial && strcmp(serial, transport->serial) == 0) {
++ adb_mutex_unlock(&transport_lock);
+ VLOG(TRANSPORT) << "socket transport " << transport->serial
+ << " is already in pending_list and fails to register";
+ delete t;
+@@ -959,6 +960,7 @@
+
+ for (const auto& transport : transport_list) {
+ if (transport->serial && strcmp(serial, transport->serial) == 0) {
++ adb_mutex_unlock(&transport_lock);
+ VLOG(TRANSPORT) << "socket transport " << transport->serial
+ << " is already in transport_list and fails to register";
+ delete t;
+@@ -968,8 +970,7 @@
+
+ pending_list.push_front(t);
+ t->serial = strdup(serial);
+-
+- lock.unlock();
++ adb_mutex_unlock(&transport_lock);
+
+ register_transport(t);
+ return 0;
+@@ -979,19 +980,20 @@
+ atransport *find_transport(const char *serial) {
+ atransport* result = nullptr;
+
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (auto& t : transport_list) {
+ if (t->serial && strcmp(serial, t->serial) == 0) {
+ result = t;
+ break;
+ }
+ }
++ adb_mutex_unlock(&transport_lock);
+
+ return result;
+ }
+
+ void kick_all_tcp_devices() {
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ for (auto& t : transport_list) {
+ if (t->IsTcpDevice()) {
+ // Kicking breaks the read_transport thread of this transport out of any read, then
+@@ -1001,6 +1003,7 @@
+ t->Kick();
+ }
+ }
++ adb_mutex_unlock(&transport_lock);
+ }
+
+ #endif
+@@ -1020,20 +1023,20 @@
+ t->devpath = strdup(devpath);
+ }
+
+- {
+- std::lock_guard<std::mutex> lock(transport_lock);
+- pending_list.push_front(t);
+- }
++ adb_mutex_lock(&transport_lock);
++ pending_list.push_front(t);
++ adb_mutex_unlock(&transport_lock);
+
+ register_transport(t);
+ }
+
+ // This should only be used for transports with connection_state == kCsNoPerm.
+ void unregister_usb_transport(usb_handle *usb) {
+- std::lock_guard<std::mutex> lock(transport_lock);
++ adb_mutex_lock(&transport_lock);
+ transport_list.remove_if([usb](atransport* t) {
+ return t->usb == usb && t->connection_state == kCsNoPerm;
+ });
++ adb_mutex_unlock(&transport_lock);
+ }
+
+ int check_header(apacket *p, atransport *t)
+diff --git adb/transport_local.cpp adb/transport_local.cpp
+index 89e950d..f895943 100644
+--- adb/transport_local.cpp
++++ adb/transport_local.cpp
+@@ -26,7 +26,6 @@
+ #include <sys/types.h>
+
+ #include <condition_variable>
+-#include <mutex>
+ #include <vector>
+
+ #include <android-base/stringprintf.h>
+@@ -48,7 +47,7 @@
+ // connected.
+ #define ADB_LOCAL_TRANSPORT_MAX 16
+
+-static std::mutex& local_transports_lock = *new std::mutex();
++ADB_MUTEX_DEFINE(local_transports_lock);
+
+ /* we keep a list of opened transports. The atransport struct knows to which
+ * local transport it is connected. The list is used to detect when we're
+@@ -385,13 +384,14 @@
+
+ #if ADB_HOST
+ int nn;
+- std::lock_guard<std::mutex> lock(local_transports_lock);
++ adb_mutex_lock( &local_transports_lock );
+ for (nn = 0; nn < ADB_LOCAL_TRANSPORT_MAX; nn++) {
+ if (local_transports[nn] == t) {
+ local_transports[nn] = NULL;
+ break;
+ }
+ }
++ adb_mutex_unlock( &local_transports_lock );
+ #endif
+ }
+
+@@ -435,8 +435,9 @@
+
+ atransport* find_emulator_transport_by_adb_port(int adb_port)
+ {
+- std::lock_guard<std::mutex> lock(local_transports_lock);
++ adb_mutex_lock( &local_transports_lock );
+ atransport* result = find_emulator_transport_by_adb_port_locked(adb_port);
++ adb_mutex_unlock( &local_transports_lock );
+ return result;
+ }
+
+@@ -454,8 +455,9 @@
+
+ int get_available_local_transport_index()
+ {
+- std::lock_guard<std::mutex> lock(local_transports_lock);
++ adb_mutex_lock( &local_transports_lock );
+ int result = get_available_local_transport_index_locked();
++ adb_mutex_unlock( &local_transports_lock );
+ return result;
+ }
+ #endif
+@@ -475,20 +477,26 @@
+
+ #if ADB_HOST
+ if (local) {
+- std::lock_guard<std::mutex> lock(local_transports_lock);
+- t->SetLocalPortForEmulator(adb_port);
+- atransport* existing_transport = find_emulator_transport_by_adb_port_locked(adb_port);
+- int index = get_available_local_transport_index_locked();
+- if (existing_transport != NULL) {
+- D("local transport for port %d already registered (%p)?", adb_port, existing_transport);
+- fail = -1;
+- } else if (index < 0) {
+- // Too many emulators.
+- D("cannot register more emulators. Maximum is %d", ADB_LOCAL_TRANSPORT_MAX);
+- fail = -1;
+- } else {
+- local_transports[index] = t;
+- }
++ adb_mutex_lock( &local_transports_lock );
++ {
++ t->SetLocalPortForEmulator(adb_port);
++ atransport* existing_transport =
++ find_emulator_transport_by_adb_port_locked(adb_port);
++ int index = get_available_local_transport_index_locked();
++ if (existing_transport != NULL) {
++ D("local transport for port %d already registered (%p)?",
++ adb_port, existing_transport);
++ fail = -1;
++ } else if (index < 0) {
++ // Too many emulators.
++ D("cannot register more emulators. Maximum is %d",
++ ADB_LOCAL_TRANSPORT_MAX);
++ fail = -1;
++ } else {
++ local_transports[index] = t;
++ }
++ }
++ adb_mutex_unlock( &local_transports_lock );
+ }
+ #endif
+ return fail;
+diff --git adb/transport_test.cpp adb/transport_test.cpp
+index a6db07a..8b38e03 100644
+--- adb/transport_test.cpp
++++ adb/transport_test.cpp
+@@ -20,6 +20,27 @@
+
+ #include "adb.h"
+
++class TransportSetup {
++public:
++ TransportSetup() {
++#ifdef _WIN32
++ // Use extern instead of including sysdeps.h which brings in various macros
++ // that conflict with APIs used in this file.
++ extern void adb_sysdeps_init(void);
++ adb_sysdeps_init();
++#else
++ // adb_sysdeps_init() is an inline function that we cannot link against.
++#endif
++ }
++};
++
++// Static initializer will call adb_sysdeps_init() before main() to initialize
++// the transport mutex before it is used in the tests. Alternatives would be to
++// use __attribute__((constructor)) here or to use that or a static initializer
++// for adb_sysdeps_init() itself in sysdeps_win32.cpp (caveats of unclear
++// init order), or to use a test fixture whose SetUp() could do the init once.
++static TransportSetup g_TransportSetup;
++
+ TEST(transport, kick_transport) {
+ atransport t;
+ static size_t kick_count;
+diff --git adb/usb_linux_client.cpp adb/usb_linux_client.cpp
+index 0ba6b4b..1b05439 100644
+--- adb/usb_linux_client.cpp
++++ adb/usb_linux_client.cpp
+@@ -32,8 +32,6 @@
+
+ #include <algorithm>
+ #include <atomic>
+-#include <condition_variable>
+-#include <mutex>
+
+ #include <android-base/logging.h>
+
+@@ -56,14 +54,12 @@
+
+ static int dummy_fd = -1;
+
+-struct usb_handle {
+- usb_handle() : kicked(false) {
+- }
+-
+- std::condition_variable notify;
+- std::mutex lock;
++struct usb_handle
++{
++ adb_cond_t notify;
++ adb_mutex_t lock;
++ bool open_new_connection;
+ std::atomic<bool> kicked;
+- bool open_new_connection = true;
+
+ int (*write)(usb_handle *h, const void *data, int len);
+ int (*read)(usb_handle *h, void *data, int len);
+@@ -71,12 +67,12 @@
+ void (*close)(usb_handle *h);
+
+ // Legacy f_adb
+- int fd = -1;
++ int fd;
+
+ // FunctionFS
+- int control = -1;
+- int bulk_out = -1; /* "out" from the host's perspective => source for adbd */
+- int bulk_in = -1; /* "in" from the host's perspective => sink for adbd */
++ int control;
++ int bulk_out; /* "out" from the host's perspective => source for adbd */
++ int bulk_in; /* "in" from the host's perspective => sink for adbd */
+ };
+
+ struct func_desc {
+@@ -252,12 +248,12 @@
+
+ while (true) {
+ // wait until the USB device needs opening
+- std::unique_lock<std::mutex> lock(usb->lock);
++ adb_mutex_lock(&usb->lock);
+ while (!usb->open_new_connection) {
+- usb->notify.wait(lock);
++ adb_cond_wait(&usb->notify, &usb->lock);
+ }
+ usb->open_new_connection = false;
+- lock.unlock();
++ adb_mutex_unlock(&usb->lock);
+
+ D("[ usb_thread - opening device ]");
+ do {
+@@ -343,20 +339,27 @@
+ h->kicked = false;
+ adb_close(h->fd);
+ // Notify usb_adb_open_thread to open a new connection.
+- h->lock.lock();
++ adb_mutex_lock(&h->lock);
+ h->open_new_connection = true;
+- h->lock.unlock();
+- h->notify.notify_one();
++ adb_cond_signal(&h->notify);
++ adb_mutex_unlock(&h->lock);
+ }
+
+ static void usb_adb_init()
+ {
+- usb_handle* h = new usb_handle();
++ usb_handle* h = reinterpret_cast<usb_handle*>(calloc(1, sizeof(usb_handle)));
++ if (h == nullptr) fatal("couldn't allocate usb_handle");
+
+ h->write = usb_adb_write;
+ h->read = usb_adb_read;
+ h->kick = usb_adb_kick;
+ h->close = usb_adb_close;
++ h->kicked = false;
++ h->fd = -1;
++
++ h->open_new_connection = true;
++ adb_cond_init(&h->notify, 0);
++ adb_mutex_init(&h->lock, 0);
+
+ // Open the file /dev/android_adb_enable to trigger
+ // the enabling of the adb USB function in the kernel.
+@@ -465,12 +468,12 @@
+
+ while (true) {
+ // wait until the USB device needs opening
+- std::unique_lock<std::mutex> lock(usb->lock);
++ adb_mutex_lock(&usb->lock);
+ while (!usb->open_new_connection) {
+- usb->notify.wait(lock);
++ adb_cond_wait(&usb->notify, &usb->lock);
+ }
+ usb->open_new_connection = false;
+- lock.unlock();
++ adb_mutex_unlock(&usb->lock);
+
+ while (true) {
+ if (init_functionfs(usb)) {
+@@ -554,22 +557,31 @@
+ adb_close(h->bulk_out);
+ adb_close(h->bulk_in);
+ // Notify usb_adb_open_thread to open a new connection.
+- h->lock.lock();
++ adb_mutex_lock(&h->lock);
+ h->open_new_connection = true;
+- h->lock.unlock();
+- h->notify.notify_one();
++ adb_cond_signal(&h->notify);
++ adb_mutex_unlock(&h->lock);
+ }
+
+ static void usb_ffs_init()
+ {
+ D("[ usb_init - using FunctionFS ]");
+
+- usb_handle* h = new usb_handle();
++ usb_handle* h = reinterpret_cast<usb_handle*>(calloc(1, sizeof(usb_handle)));
++ if (h == nullptr) fatal("couldn't allocate usb_handle");
+
+ h->write = usb_ffs_write;
+ h->read = usb_ffs_read;
+ h->kick = usb_ffs_kick;
+ h->close = usb_ffs_close;
++ h->kicked = false;
++ h->control = -1;
++ h->bulk_out = -1;
++ h->bulk_out = -1;
++
++ h->open_new_connection = true;
++ adb_cond_init(&h->notify, 0);
++ adb_mutex_init(&h->lock, 0);
+
+ D("[ usb_init - starting thread ]");
+ if (!adb_thread_create(usb_ffs_open_thread, h)) {
+@@ -596,7 +608,6 @@
+ {
+ return h->read(h, data, len);
+ }
+-
+ int usb_close(usb_handle *h)
+ {
+ h->close(h);
+diff --git adb/usb_windows.cpp adb/usb_windows.cpp
+index 8ecca37..4649454 100644
+--- adb/usb_windows.cpp
++++ adb/usb_windows.cpp
+@@ -19,17 +19,13 @@
+ #include "sysdeps.h"
+
+ #include <winsock2.h> // winsock.h *must* be included before windows.h.
+-#include <windows.h>
+-#include <usb100.h>
+-#include <winerror.h>
+-
++#include <adb_api.h>
+ #include <errno.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-
+-#include <mutex>
+-
+-#include <adb_api.h>
++#include <usb100.h>
++#include <windows.h>
++#include <winerror.h>
+
+ #include <android-base/errors.h>
+
+@@ -77,7 +73,7 @@
+ };
+
+ /// Locker for the list of opened usb handles
+-static std::mutex& usb_lock = *new std::mutex();
++ADB_MUTEX_DEFINE( usb_lock );
+
+ /// Checks if there is opened usb handle in handle_list for this device.
+ int known_device(const wchar_t* dev_name);
+@@ -145,8 +141,9 @@
+ int ret = 0;
+
+ if (NULL != dev_name) {
+- std::lock_guard<std::mutex> lock(usb_lock);
++ adb_mutex_lock(&usb_lock);
+ ret = known_device_locked(dev_name);
++ adb_mutex_unlock(&usb_lock);
+ }
+
+ return ret;
+@@ -156,10 +153,11 @@
+ if (NULL == handle)
+ return 0;
+
+- std::lock_guard<std::mutex> lock(usb_lock);
++ adb_mutex_lock(&usb_lock);
+
+ // Check if device is already in the list
+ if (known_device_locked(handle->interface_name)) {
++ adb_mutex_unlock(&usb_lock);
+ return 0;
+ }
+
+@@ -169,6 +167,8 @@
+ handle->prev->next = handle;
+ handle->next->prev = handle;
+
++ adb_mutex_unlock(&usb_lock);
++
+ return 1;
+ }
+
+@@ -493,8 +493,11 @@
+ void usb_kick(usb_handle* handle) {
+ D("usb_kick");
+ if (NULL != handle) {
+- std::lock_guard<std::mutex> lock(usb_lock);
++ adb_mutex_lock(&usb_lock);
++
+ usb_kick_locked(handle);
++
++ adb_mutex_unlock(&usb_lock);
+ } else {
+ errno = EINVAL;
+ }
+@@ -505,17 +508,17 @@
+
+ if (NULL != handle) {
+ // Remove handle from the list
+- {
+- std::lock_guard<std::mutex> lock(usb_lock);
+-
+- if ((handle->next != handle) && (handle->prev != handle)) {
+- handle->next->prev = handle->prev;
+- handle->prev->next = handle->next;
+- handle->prev = handle;
+- handle->next = handle;
+- }
++ adb_mutex_lock(&usb_lock);
++
++ if ((handle->next != handle) && (handle->prev != handle)) {
++ handle->next->prev = handle->prev;
++ handle->prev->next = handle->next;
++ handle->prev = handle;
++ handle->next = handle;
+ }
+
++ adb_mutex_unlock(&usb_lock);
++
+ // Cleanup handle
+ usb_cleanup_handle(handle);
+ free(handle);
+@@ -648,8 +651,9 @@
+ static void kick_devices() {
+ // Need to acquire lock to safely walk the list which might be modified
+ // by another thread.
+- std::lock_guard<std::mutex> lock(usb_lock);
++ adb_mutex_lock(&usb_lock);
+ for (usb_handle* usb = handle_list.next; usb != &handle_list; usb = usb->next) {
+ usb_kick_locked(usb);
+ }
++ adb_mutex_unlock(&usb_lock);
+ }
diff --git a/devel/android-tools-adb-devel/files/patch-base_file.cpp b/devel/android-tools-adb-devel/files/patch-base_file.cpp
new file mode 100644
index 000000000000..199da0b95aca
--- /dev/null
+++ b/devel/android-tools-adb-devel/files/patch-base_file.cpp
@@ -0,0 +1,40 @@
+--- base/file.cpp.orig 2016-09-28 18:07:09 UTC
++++ base/file.cpp
+@@ -18,6 +18,9 @@
+
+ #include <errno.h>
+ #include <fcntl.h>
++#include <limits.h> // PATH_MAX
++#include <stdio.h> // BUFSIZ
++#include <string.h> // strerror
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -34,6 +37,9 @@
+ #if defined(__APPLE__)
+ #include <mach-o/dyld.h>
+ #endif
++#if defined(__DragonFly__) || defined(__FreeBSD__)
++#include <sys/sysctl.h>
++#endif
+ #if defined(_WIN32)
+ #include <windows.h>
+ #endif
+@@ -231,6 +237,17 @@ std::string GetExecutablePath() {
+ if (result == 0 || result == sizeof(path) - 1) return "";
+ path[PATH_MAX - 1] = 0;
+ return path;
++#elif defined(KERN_PROC_PATHNAME)
++ char path[PATH_MAX + 1];
++ size_t path_len = sizeof(path);
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PATHNAME,
++ getpid()
++ };
++ int rc = sysctl(mib, arraysize(mib), path, &path_len, NULL, 0);
++ return rc ? "" : path;
+ #else
+ #error unknown OS
+ #endif
diff --git a/devel/android-tools-adb/Makefile b/devel/android-tools-adb/Makefile
index c28df87d9faa..e6cd47c814fb 100644
--- a/devel/android-tools-adb/Makefile
+++ b/devel/android-tools-adb/Makefile
@@ -28,6 +28,11 @@ GH_REVISION= 88f64719d756 # generated by: make update-revision
CONFLICTS_INSTALL?= ${PORTNAME}-devel-*
+.ifndef EXTRA_PATCHES
+EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-adb_sysdeps_mutex.h
+EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-base_file.cpp
+.endif
+
USES= compiler:c++11-lib pkgconfig ssl uidfix
BUILD_WRKSRC= ${WRKSRC}/adb
INSTALL_WRKSRC= ${BUILD_WRKSRC}
@@ -56,7 +61,7 @@ BASH_VARS= LICENSE+=MIT LICENSE_COMB=multi
DOCS_MAKE_ARGS_OFF= FILES="" FILESDIR=""
-TEST_BUILD_DEPENDS= googletest>=1.6.0:devel/googletest
+TEST_BUILD_DEPENDS+= googletest>=1.6.0:devel/googletest
TEST_ALL_TARGET= adb_test
pre-install-TEST-on: do-test
diff --git a/devel/android-tools-adb/files/patch-adb_sysdeps_mutex.h b/devel/android-tools-adb/files/extra-patch-adb_sysdeps_mutex.h
index 792d29f7f738..792d29f7f738 100644
--- a/devel/android-tools-adb/files/patch-adb_sysdeps_mutex.h
+++ b/devel/android-tools-adb/files/extra-patch-adb_sysdeps_mutex.h
diff --git a/devel/android-tools-adb/files/patch-base_file.cpp b/devel/android-tools-adb/files/extra-patch-base_file.cpp
index 754b02594d0c..754b02594d0c 100644
--- a/devel/android-tools-adb/files/patch-base_file.cpp
+++ b/devel/android-tools-adb/files/extra-patch-base_file.cpp
diff --git a/devel/android-tools-fastboot-devel/Makefile b/devel/android-tools-fastboot-devel/Makefile
index bbb12f041fe6..1b2c1ba43ec9 100644
--- a/devel/android-tools-fastboot-devel/Makefile
+++ b/devel/android-tools-fastboot-devel/Makefile
@@ -1,14 +1,14 @@
# $FreeBSD$
# Hint: git describe --abbrev=12 --match android-n-preview-5
-DISTVERSION= n-preview-5-126
-DISTVERSIONSUFFIX= -g2f21b7cecda2
+DISTVERSION= n-preview-5-3582
+DISTVERSIONSUFFIX= -gdfd30c4a169e
PORTREVISION= 0
PKGNAMESUFFIX= -devel
GH_MYTAG= ${DISTVERSIONPREFIX}${DISTVERSION:C/-[0-9]*$//}
-GH_TAGNAME= ${GH_MYTAG}-64-g8cd939bd7af7:extras \
- ${GH_MYTAG}-1-g1fdb726:libselinux
+GH_TAGNAME= ${GH_MYTAG}-907-g1a35848b34d6:extras \
+ ${GH_MYTAG}-43-ga63b41e:libselinux
CONFLICTS_INSTALL= ${PORTNAME}-[0-9]*
diff --git a/devel/android-tools-fastboot-devel/distinfo b/devel/android-tools-fastboot-devel/distinfo
index dcdd48c37b8e..d57fa1c069f9 100644
--- a/devel/android-tools-fastboot-devel/distinfo
+++ b/devel/android-tools-fastboot-devel/distinfo
@@ -1,11 +1,11 @@
-TIMESTAMP = 1470755379
+TIMESTAMP = 1474960220
SHA256 (fastboot.1?id=706e754) = 2af01b064440952a82f1602691a0fecc030302722a71444946fb70d9c423d283
SIZE (fastboot.1?id=706e754) = 5906
-SHA256 (android-platform_system_core-android-n-preview-5-126-g2f21b7cecda2_GH0.tar.gz) = 61256486af01cfefeee6779f9926ba32334b9fb1a5aacfa2cd4a682d66f01a2a
-SIZE (android-platform_system_core-android-n-preview-5-126-g2f21b7cecda2_GH0.tar.gz) = 1561372
-SHA256 (jbeich-platform_system_extras-android-n-preview-5-64-g8cd939bd7af7_GH0.tar.gz) = 8506118d4606458f098d2e7b089c3304fee935c8e50ae9bb1e1ae8caab654be7
-SIZE (jbeich-platform_system_extras-android-n-preview-5-64-g8cd939bd7af7_GH0.tar.gz) = 82049260
-SHA256 (jbeich-platform_external_libselinux-android-n-preview-5-1-g1fdb726_GH0.tar.gz) = a898cb59e585de2ec51c6c13759069e62480efe785fb808d991043a469649624
-SIZE (jbeich-platform_external_libselinux-android-n-preview-5-1-g1fdb726_GH0.tar.gz) = 63005
-SHA256 (mbrubeck-android-completion-3b0fabe_GH0.tar.gz) = dc774f101acd9514baf3e7a0ac610068116f2c093b94987ba59203a39a6439dc
-SIZE (mbrubeck-android-completion-3b0fabe_GH0.tar.gz) = 5948
+SHA256 (android-platform_system_core-android-n-preview-5-3582-gdfd30c4a169e_GH0.tar.gz) = 2a4530432d51797fcc426b737d66b411d7ba4635afabe32b0c89cb581b19bc34
+SIZE (android-platform_system_core-android-n-preview-5-3582-gdfd30c4a169e_GH0.tar.gz) = 1464524
+SHA256 (jbeich-platform_system_extras-android-n-preview-5-907-g1a35848b34d6_GH0.tar.gz) = 76c5b258753e6168796a5eeff64b44376439aa793d34786d27a9a1ba3759e174
+SIZE (jbeich-platform_system_extras-android-n-preview-5-907-g1a35848b34d6_GH0.tar.gz) = 95573256
+SHA256 (jbeich-platform_external_libselinux-android-n-preview-5-43-ga63b41e_GH0.tar.gz) = eb85e6ea45fedb123a14a2326ba3e4a9a6ef2577b2ecd258be4097a4445f8f36
+SIZE (jbeich-platform_external_libselinux-android-n-preview-5-43-ga63b41e_GH0.tar.gz) = 63141
+SHA256 (mbrubeck-android-completion-c1b0656_GH0.tar.gz) = ca3311ba47a5edd56c929ac9aae57c02c2c3f1636519c5f67abb00b6e3ecd75c
+SIZE (mbrubeck-android-completion-c1b0656_GH0.tar.gz) = 5967
diff --git a/devel/android-tools-fastboot-devel/files/patch-base_file.cpp b/devel/android-tools-fastboot-devel/files/patch-base_file.cpp
new file mode 100644
index 000000000000..199da0b95aca
--- /dev/null
+++ b/devel/android-tools-fastboot-devel/files/patch-base_file.cpp
@@ -0,0 +1,40 @@
+--- base/file.cpp.orig 2016-09-28 18:07:09 UTC
++++ base/file.cpp
+@@ -18,6 +18,9 @@
+
+ #include <errno.h>
+ #include <fcntl.h>
++#include <limits.h> // PATH_MAX
++#include <stdio.h> // BUFSIZ
++#include <string.h> // strerror
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+@@ -34,6 +37,9 @@
+ #if defined(__APPLE__)
+ #include <mach-o/dyld.h>
+ #endif
++#if defined(__DragonFly__) || defined(__FreeBSD__)
++#include <sys/sysctl.h>
++#endif
+ #if defined(_WIN32)
+ #include <windows.h>
+ #endif
+@@ -231,6 +237,17 @@ std::string GetExecutablePath() {
+ if (result == 0 || result == sizeof(path) - 1) return "";
+ path[PATH_MAX - 1] = 0;
+ return path;
++#elif defined(KERN_PROC_PATHNAME)
++ char path[PATH_MAX + 1];
++ size_t path_len = sizeof(path);
++ int mib[] = {
++ CTL_KERN,
++ KERN_PROC,
++ KERN_PROC_PATHNAME,
++ getpid()
++ };
++ int rc = sysctl(mib, arraysize(mib), path, &path_len, NULL, 0);
++ return rc ? "" : path;
+ #else
+ #error unknown OS
+ #endif
diff --git a/devel/android-tools-fastboot/Makefile b/devel/android-tools-fastboot/Makefile
index 76c53ad144b4..e211622180f6 100644
--- a/devel/android-tools-fastboot/Makefile
+++ b/devel/android-tools-fastboot/Makefile
@@ -33,6 +33,10 @@ GH_REVISION= 88f64719d756 # generated by: make update-revision
CONFLICTS_INSTALL?= ${PORTNAME}-devel-*
+.ifndef EXTRA_PATCHES
+EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-base_file.cpp
+.endif
+
USES= compiler:c++11-lib pkgconfig uidfix
BUILD_WRKSRC= ${WRKSRC}/fastboot
INSTALL_WRKSRC= ${BUILD_WRKSRC}
diff --git a/devel/android-tools-fastboot/files/patch-base_file.cpp b/devel/android-tools-fastboot/files/extra-patch-base_file.cpp
index 754b02594d0c..754b02594d0c 100644
--- a/devel/android-tools-fastboot/files/patch-base_file.cpp
+++ b/devel/android-tools-fastboot/files/extra-patch-base_file.cpp