Skip to content

Commit

Permalink
Use accept instead of accept4 for Android.
Browse files Browse the repository at this point in the history
Summary:
The accept4 syscall is missing on older ARM Android kernels, and the accept()
call is implemented with the accept4 syscall, so we'll need to call the accept
syscall directly.

Reviewers: vharron, tberghammer, labath

Subscribers: ovyalov, chaoren, labath, tberghammer, aemerson, lldb-commits

Differential Revision: http://reviews.llvm.org/D10887

llvm-svn: 242319
  • Loading branch information
chaoren committed Jul 15, 2015
1 parent f7ee087 commit e271658
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
4 changes: 4 additions & 0 deletions lldb/cmake/platforms/Android.cmake
Expand Up @@ -102,6 +102,10 @@ elseif( ANDROID_ABI STREQUAL "armeabi" )
# 64 bit atomic operations used in c++ libraries require armv7-a instructions
# armv5te and armv6 were tried but do not work.
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a" )
if ( LLVM_BUILD_STATIC )
# Temporary workaround for static linking with the latest API.
set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -DANDROID_ARM_BUILD_STATIC" )
endif()
endif()

# linker flags
Expand Down
21 changes: 19 additions & 2 deletions lldb/source/Host/common/Socket.cpp
Expand Up @@ -24,7 +24,11 @@
#include <asm-generic/errno-base.h>
#include <errno.h>
#include <arpa/inet.h>
#endif
#if defined(ANDROID_ARM_BUILD_STATIC)
#include <unistd.h>
#include <sys/syscall.h>
#endif // ANDROID_ARM_BUILD_STATIC
#endif // __ANDROID_NDK__

#ifndef LLDB_DISABLE_POSIX
#include <arpa/inet.h>
Expand Down Expand Up @@ -70,7 +74,20 @@ NativeSocket CreateSocket(const int domain, const int type, const int protocol,

NativeSocket Accept(NativeSocket sockfd, struct sockaddr *addr, socklen_t *addrlen, bool child_processes_inherit)
{
#ifdef SOCK_CLOEXEC
#if defined(ANDROID_ARM_BUILD_STATIC)
// Temporary workaround for statically linking Android lldb-server with the
// latest API.
int fd = syscall(__NR_accept, sockfd, addr, addrlen);
if (fd >= 0 && !child_processes_inherit)
{
int flags = ::fcntl(fd, F_GETFD);
if (flags == -1)
return -1;
if (::fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1)
return -1;
}
return fd;
#elif defined(SOCK_CLOEXEC)
int flags = 0;
if (!child_processes_inherit) {
flags |= SOCK_CLOEXEC;
Expand Down

0 comments on commit e271658

Please sign in to comment.