Move libportable from ndk.git to development.git.

libportable should be in development.git instead of ndk.git.

Change-Id: Ic369ca6a0e4ffbd2741777c8d9ec578e8ce5abbd
diff --git a/ndk/Android.mk b/ndk/Android.mk
index 0c7e190..e7d9fe9 100644
--- a/ndk/Android.mk
+++ b/ndk/Android.mk
@@ -1 +1,3 @@
 # Please this file empty. It is used to make the Android build system happy.
+
+include development/ndk/sources/android/libportable/Android.mk
diff --git a/ndk/sources/android/libportable/Android.mk b/ndk/sources/android/libportable/Android.mk
new file mode 100644
index 0000000..ea32b2d
--- /dev/null
+++ b/ndk/sources/android/libportable/Android.mk
@@ -0,0 +1,65 @@
+#
+# Copyright (C) 2012 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+#=====================================================================
+# Device Shared Library libportable
+#=====================================================================
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libportable
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+
+LOCAL_CFLAGS := -I $(LOCAL_PATH)/common/include
+
+ifeq ($(TARGET_ARCH),mips)
+libportable_arch_src_files += \
+			arch-mips/ioctl.c \
+			arch-mips/mmap.c \
+			arch-mips/stat.c \
+			arch-mips/open.c \
+			arch-mips/socket.c \
+			arch-mips/sockopt.c \
+			arch-mips/epoll.c
+endif
+
+ifeq ($(TARGET_ARCH),arm)
+libportable_arch_src_files += \
+			arch-arm/stat.c \
+			arch-arm/socket.c \
+			arch-arm/sockopt.c \
+			arch-arm/epoll.c
+endif
+
+ifeq ($(TARGET_ARCH),x86)
+libportable_arch_src_files += \
+			arch-x86/ioctl.c \
+			arch-x86/stat.c \
+			arch-x86/open.c \
+			arch-x86/socket.c \
+			arch-x86/sockopt.c \
+			arch-x86/fcntl.c \
+			arch-x86/epoll.c
+endif
+
+LOCAL_SRC_FILES := \
+        $(libportable_common_src_files) \
+        $(libportable_arch_src_files)
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/ndk/sources/android/libportable/arch-arm/epoll.c b/ndk/sources/android/libportable/arch-arm/epoll.c
new file mode 100644
index 0000000..f703ba1
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-arm/epoll.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012, 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/epoll.h>
+
+int epoll_ctl_portable(int epfd, int op, int fd, struct epoll_event *event)
+{
+    return epoll_ctl(epfd, op, fd, event);
+}
+
+int epoll_wait_portable(int epfd, struct epoll_event *events, int max, int timeout)
+{
+    return epoll_wait(epfd, events, max, timeout);
+}
+
diff --git a/ndk/sources/android/libportable/arch-arm/socket.c b/ndk/sources/android/libportable/arch-arm/socket.c
new file mode 100644
index 0000000..7e7ca9b
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-arm/socket.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <sys/socket.h>
+#include <sys/linux-syscalls.h>
+
+int socket_portable(int domain, int type, int protocol) {
+    return socket(domain, type, protocol);
+}
diff --git a/ndk/sources/android/libportable/arch-arm/sockopt.c b/ndk/sources/android/libportable/arch-arm/sockopt.c
new file mode 100644
index 0000000..c86ded3
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-arm/sockopt.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2012, 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/socket.h>
+
+extern int setsockopt(int, int, int, const void *, socklen_t);
+int setsockopt_portable(int s, int level, int optname, const void *optval, socklen_t optlen)
+{
+    return setsockopt(s, level, optname, optval, optlen);
+}
+
+extern int getsockopt (int, int, int, void *, socklen_t *);
+int getsockopt_portable(int s, int level, int optname, void *optval, socklen_t *optlen)
+{
+    return getsockopt(s, level, optname, optval, optlen);
+}
diff --git a/ndk/sources/android/libportable/arch-arm/stat.c b/ndk/sources/android/libportable/arch-arm/stat.c
new file mode 100644
index 0000000..20a34ad
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-arm/stat.c
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012, 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 <stat_portable.h>
+
+/* Note: The Portable Header will define stat to stat_portable */
+int stat_portable(const char *path, struct stat_portable *s)
+{
+   return stat(path, s);
+}
+
+int fstat_portable(int fd, struct stat_portable *s)
+{
+    return fstat(fd, s);
+}   
+
+int lstat_portable(const char *path, struct stat_portable *s)
+{
+    return lstat(path, s);
+}
+
+int fstatat_portable(int dirfd, const char *path, struct stat_portable *s, int flags)
+{
+    return fstatat(dirfd, path, s, flags);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/epoll.c b/ndk/sources/android/libportable/arch-mips/epoll.c
new file mode 100644
index 0000000..f703ba1
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/epoll.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2012, 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/epoll.h>
+
+int epoll_ctl_portable(int epfd, int op, int fd, struct epoll_event *event)
+{
+    return epoll_ctl(epfd, op, fd, event);
+}
+
+int epoll_wait_portable(int epfd, struct epoll_event *events, int max, int timeout)
+{
+    return epoll_wait(epfd, events, max, timeout);
+}
+
diff --git a/ndk/sources/android/libportable/arch-mips/ioctl.c b/ndk/sources/android/libportable/arch-mips/ioctl.c
new file mode 100644
index 0000000..6ab5836
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/ioctl.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2012, 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 <stdarg.h>
+#include <sys/ioctl.h>
+#include <ioctls_portable.h>
+
+#if FIONREAD_PORTABLE==FIONREAD
+#error Bad build environment
+#endif
+
+static inline int mips_change_request(int request)
+{
+    /* Only handles FIO* for now */
+    switch(request) {
+    case FIONREAD_PORTABLE:
+	return FIONREAD;
+    case FIONBIO_PORTABLE:
+	return FIONBIO;
+    case FIONCLEX_PORTABLE:
+	return FIONCLEX;
+    case FIOCLEX_PORTABLE:
+	return FIOCLEX;
+    case FIOASYNC_PORTABLE:
+	return FIOASYNC;
+    case FIOQSIZE_PORTABLE:
+	return FIOQSIZE;
+    }
+    return request;
+}
+
+extern int __ioctl(int, int, void *);
+int ioctl_portable(int fd, int request, ...)
+{
+    va_list ap;
+    void * arg;
+
+    va_start(ap, request);
+    arg = va_arg(ap, void *);
+    va_end(ap);
+
+    return __ioctl(fd, mips_change_request(request), arg);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/mmap.c b/ndk/sources/android/libportable/arch-mips/mmap.c
new file mode 100644
index 0000000..58536b8
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/mmap.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <mman_portable.h>
+
+#if MAP_ANONYMOUS_PORTABLE==MAP_ANONYMOUS
+#error Bad build environment
+#endif
+
+static inline int mips_change_prot(int prot)
+{
+    /* Only PROT_SEM is different */
+    if (prot & PROT_SEM_PORTABLE) {
+        prot &= ~PROT_SEM_PORTABLE;
+        prot |= PROT_SEM;
+    }
+
+    return prot;
+}
+
+static inline int mips_change_flags(int flags)
+{
+    int mipsflags = 0;
+    /* These are the documented flags for mmap */
+    if (flags & MAP_SHARED_PORTABLE)
+       mipsflags |= MAP_SHARED;
+    if (flags & MAP_PRIVATE_PORTABLE)
+       mipsflags |= MAP_PRIVATE;
+#if defined(MAP_32BIT_PORTABLE) && defined(MAP_32BIT)
+    if (flags & MAP_32BIT_PORTABLE)
+       mipsflags |= MAP_32BIT;
+#endif
+    if (flags & MAP_ANONYMOUS_PORTABLE)
+       mipsflags |= MAP_ANONYMOUS;
+    if (flags & MAP_FIXED_PORTABLE)
+       mipsflags |= MAP_FIXED;
+    if (flags & MAP_GROWSDOWN_PORTABLE)
+       mipsflags |= MAP_GROWSDOWN;
+#if defined(MAP_HUGETLB_PORTABLE) && defined(MAP_HUGETLB)
+    if (flags & MAP_HUGETLB_PORTABLE)
+       mipsflags |= MAP_HUGETLB;
+#endif
+    if (flags & MAP_LOCKED_PORTABLE)
+       mipsflags |= MAP_LOCKED;
+    if (flags & MAP_NONBLOCK_PORTABLE)
+       mipsflags |= MAP_NONBLOCK;
+    if (flags & MAP_NORESERVE_PORTABLE)
+       mipsflags |= MAP_NORESERVE;
+    if (flags & MAP_POPULATE_PORTABLE)
+       mipsflags |= MAP_POPULATE;
+#if defined(MAP_STACK_PORTABLE) && defined(MAP_STACK)
+    if (flags & MAP_STACK_PORTABLE)
+       mipsflags |= MAP_STACK;
+#endif
+
+    return mipsflags;
+}
+
+#define  MMAP2_SHIFT  12
+extern void *__mmap2(void *, size_t, int, int, int, size_t);
+void *mmap_portable(void *addr, size_t size, int prot, int flags, int fd, long offset)
+{
+    if ( offset & ((1UL << MMAP2_SHIFT)-1) ) {
+        errno = EINVAL;
+        return MAP_FAILED;
+    }
+
+    return __mmap2(addr, size, mips_change_prot(prot), mips_change_flags(flags),
+                   fd, (size_t)offset >> MMAP2_SHIFT);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/open.c b/ndk/sources/android/libportable/arch-mips/open.c
new file mode 100644
index 0000000..384b894
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/open.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <fcntl_portable.h>
+
+
+#if O_CREAT_PORTABLE==O_CREAT
+#error Bad build environment
+#endif
+
+static inline int mips_change_flags(int flags)
+{
+    int mipsflags = flags & O_ACCMODE_PORTABLE;
+    if (flags & O_CREAT_PORTABLE)
+	mipsflags |= O_CREAT;
+    if (flags & O_EXCL_PORTABLE)
+	mipsflags |= O_EXCL;
+    if (flags & O_NOCTTY_PORTABLE)
+	mipsflags |= O_NOCTTY;
+    if (flags & O_TRUNC_PORTABLE)
+	mipsflags |= O_TRUNC;
+    if (flags & O_APPEND_PORTABLE)
+	mipsflags |= O_APPEND;
+    if (flags & O_NONBLOCK_PORTABLE)
+	mipsflags |= O_NONBLOCK;
+    if (flags & O_SYNC_PORTABLE)
+	mipsflags |= O_SYNC;
+    if (flags & FASYNC_PORTABLE)
+	mipsflags |= FASYNC;
+    if (flags & O_DIRECT_PORTABLE)
+	mipsflags |= O_DIRECT;
+    if (flags & O_LARGEFILE_PORTABLE)
+	mipsflags |= O_LARGEFILE;
+    if (flags & O_DIRECTORY_PORTABLE)
+	mipsflags |= O_DIRECTORY;
+    if (flags & O_NOFOLLOW_PORTABLE)
+	mipsflags |= O_NOFOLLOW;
+    if (flags & O_NOATIME_PORTABLE)
+	mipsflags |= O_NOATIME;
+    if (flags & O_NDELAY_PORTABLE)
+	mipsflags |= O_NDELAY;
+
+    return mipsflags;
+}
+
+extern int  __open(const char*, int, int);
+int open_portable(const char *pathname, int flags, ...)
+{
+    mode_t  mode = 0;
+    flags |= O_LARGEFILE;
+
+    if (flags & O_CREAT)
+    {
+        va_list  args;
+
+        va_start(args, flags);
+        mode = (mode_t) va_arg(args, int);
+        va_end(args);
+    }
+
+    return __open(pathname, mips_change_flags(flags), mode);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/socket.c b/ndk/sources/android/libportable/arch-mips/socket.c
new file mode 100644
index 0000000..51b8db0
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/socket.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <sys/socket.h>
+#include <sys/linux-syscalls.h>
+#include <socket_portable.h>
+
+
+#if SOCK_STREAM==SOCK_STREAM_PORTABLE
+#error Bad build environment
+#endif
+
+static inline int mips_change_type(int type)
+{
+    switch (type) {
+      case SOCK_STREAM_PORTABLE: return SOCK_STREAM;
+      case SOCK_DGRAM_PORTABLE: return SOCK_DGRAM;
+      case SOCK_RAW_PORTABLE: return SOCK_RAW;
+      case SOCK_RDM_PORTABLE: return SOCK_RDM;
+      case SOCK_SEQPACKET_PORTABLE: return SOCK_SEQPACKET;
+      case SOCK_PACKET_PORTABLE: return SOCK_PACKET;
+    }
+    return type;
+}
+
+extern int socket(int, int, int);
+
+int socket_portable(int domain, int type, int protocol) {
+    return socket(domain, mips_change_type(type), protocol);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/sockopt.c b/ndk/sources/android/libportable/arch-mips/sockopt.c
new file mode 100644
index 0000000..fda4049
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/sockopt.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2012, 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/socket.h>
+#include <socket_portable.h>
+
+
+#if SOL_SOCKET_PORTABLE==SOL_SOCKET
+#error Build environment
+#endif
+
+static inline int mips_change_level(int level)
+{
+    switch (level) {
+    case SOL_SOCKET_PORTABLE:
+	level = SOL_SOCKET;
+	break;
+    }
+    return level;
+}
+
+
+static inline int mips_change_optname(int optname)
+{
+    switch (optname) {
+    case SO_DEBUG_PORTABLE:
+	return SO_DEBUG;
+    case SO_REUSEADDR_PORTABLE:
+	return SO_REUSEADDR;
+    case SO_TYPE_PORTABLE:
+	return SO_TYPE;
+    case SO_ERROR_PORTABLE:
+	return SO_ERROR;
+    case SO_DONTROUTE_PORTABLE:
+	return SO_DONTROUTE;
+    case SO_BROADCAST_PORTABLE:
+	return SO_BROADCAST;
+    case SO_SNDBUF_PORTABLE:
+	return SO_SNDBUF;
+    case SO_RCVBUF_PORTABLE:
+	return SO_RCVBUF;
+    case SO_SNDBUFFORCE_PORTABLE:
+	return SO_SNDBUFFORCE;
+    case SO_RCVBUFFORCE_PORTABLE:
+	return SO_RCVBUFFORCE;
+    case SO_KEEPALIVE_PORTABLE:
+	return SO_KEEPALIVE;
+    case SO_OOBINLINE_PORTABLE:
+	return SO_OOBINLINE;
+    case SO_NO_CHECK_PORTABLE:
+	return SO_NO_CHECK;
+    case SO_PRIORITY_PORTABLE:
+	return SO_PRIORITY;
+    case SO_LINGER_PORTABLE:
+	return SO_LINGER;
+    case SO_BSDCOMPAT_PORTABLE:
+	return SO_BSDCOMPAT;
+    case SO_PASSCRED_PORTABLE:
+	return SO_PASSCRED;
+    case SO_PEERCRED_PORTABLE:
+	return SO_PEERCRED;
+    case SO_RCVLOWAT_PORTABLE:
+	return SO_RCVLOWAT;
+    case SO_SNDLOWAT_PORTABLE:
+	return SO_SNDLOWAT;
+    case SO_RCVTIMEO_PORTABLE:
+	return SO_RCVTIMEO;
+    case SO_SNDTIMEO_PORTABLE:
+	return SO_SNDTIMEO;
+    case SO_SECURITY_AUTHENTICATION_PORTABLE:
+	return SO_SECURITY_AUTHENTICATION;
+    case SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE:
+	return SO_SECURITY_ENCRYPTION_TRANSPORT;
+    case SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE:
+	return SO_SECURITY_ENCRYPTION_NETWORK;
+    case SO_BINDTODEVICE_PORTABLE:
+	return SO_BINDTODEVICE;
+    case SO_ATTACH_FILTER_PORTABLE:
+	return SO_ATTACH_FILTER;
+    case SO_DETACH_FILTER_PORTABLE:
+	return SO_DETACH_FILTER;
+    case SO_PEERNAME_PORTABLE:
+	return SO_PEERNAME;
+    case SO_TIMESTAMP_PORTABLE:
+	return SO_TIMESTAMP;
+    case SO_ACCEPTCONN_PORTABLE:
+	return SO_ACCEPTCONN;
+    case SO_PEERSEC_PORTABLE:
+	return SO_PEERSEC;
+    case SO_PASSSEC_PORTABLE:
+	return SO_PASSSEC;
+    }
+    return optname;
+}
+
+extern int setsockopt(int, int, int, const void *, socklen_t);
+int setsockopt_portable(int s, int level, int optname, const void *optval, socklen_t optlen)
+{
+    return setsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
+}
+
+extern int getsockopt (int, int, int, void *, socklen_t *);
+int getsockopt_portable(int s, int level, int optname, void *optval, socklen_t *optlen)
+{
+    return getsockopt(s, mips_change_level(level), mips_change_optname(optname), optval, optlen);
+}
diff --git a/ndk/sources/android/libportable/arch-mips/stat.c b/ndk/sources/android/libportable/arch-mips/stat.c
new file mode 100644
index 0000000..6af5eee
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-mips/stat.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, 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 <stat_portable.h>
+
+/* Note: The Portable Header will define stat to stat_portable */
+int stat_portable(const char *path, struct stat_portable *s)
+{
+    struct stat mips_stat;
+    int ret = stat(path, &mips_stat);
+    stat_ntop(&mips_stat, s);
+    return ret;
+}
+
+int fstat_portable(int fd, struct stat_portable *s)
+{
+    struct stat mips_stat;
+    int ret = fstat(fd, &mips_stat);
+    stat_ntop(&mips_stat, s);
+    return ret;
+}   
+
+int lstat_portable(const char *path, struct stat_portable *s)
+{
+    struct stat mips_stat;
+    int ret = lstat(path, &mips_stat);
+    stat_ntop(&mips_stat, s);
+    return ret;
+}
+
+int fstatat_portable(int dirfd, const char *path, struct stat_portable *s, int flags)
+{
+    struct stat mips_stat;
+    int ret = fstatat(dirfd, path, &mips_stat, flags);
+    stat_ntop(&mips_stat, s);
+    return ret;
+}
diff --git a/ndk/sources/android/libportable/arch-x86/epoll.c b/ndk/sources/android/libportable/arch-x86/epoll.c
new file mode 100644
index 0000000..e2f91f2
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/epoll.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012, 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/epoll.h>
+#include <epoll_portable.h>
+
+int epoll_ctl_portable(int epfd, int op, int fd, struct epoll_event_portable *event)
+{
+    struct epoll_event x86_epoll_event;
+
+    x86_epoll_event.events = event->events;
+    x86_epoll_event.data = event->data;
+
+    return epoll_ctl(epfd, op, fd, &x86_epoll_event);
+}
+
+int epoll_wait_portable(int epfd, struct epoll_event_portable *events, int max, int timeout)
+{
+    struct epoll_event x86_epoll_event;
+    int ret = epoll_wait(epfd, &x86_epoll_event, max, timeout);
+
+    events->events = x86_epoll_event.events;
+    events->data = x86_epoll_event.data;
+
+    return ret;
+}
+
diff --git a/ndk/sources/android/libportable/arch-x86/fcntl.c b/ndk/sources/android/libportable/arch-x86/fcntl.c
new file mode 100644
index 0000000..7561f85
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/fcntl.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2012, 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 <fcntl.h>
+#include <stdarg.h>
+#include <fcntl_portable.h>
+
+extern int __fcntl64(int, int, void *);
+
+int fcntl_portable(int fd, int cmd, ...)
+{
+    va_list ap;
+    void * arg;
+
+    va_start(ap, cmd);
+    arg = va_arg(ap, void *);
+    va_end(ap);
+
+    if (cmd == F_GETLK64 || 
+        cmd == F_SETLK64 ||
+        cmd == F_SETLKW64) {
+        struct flock64 x86_flock64;
+        int result = __fcntl64(fd, cmd, (void *) &x86_flock64);
+
+        struct flock64_portable * flock64 = (struct flock64_portable *) arg;
+
+        flock64->l_type = x86_flock64.l_type;
+        flock64->l_whence = x86_flock64.l_whence;
+        flock64->l_start = x86_flock64.l_start;
+        flock64->l_len = x86_flock64.l_len;
+        flock64->l_pid = x86_flock64.l_pid;
+
+        return result;
+    }
+    else {
+        return __fcntl64(fd, cmd, arg);
+    }
+}
+
diff --git a/ndk/sources/android/libportable/arch-x86/ioctl.c b/ndk/sources/android/libportable/arch-x86/ioctl.c
new file mode 100644
index 0000000..ea88c30
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/ioctl.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012, 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 <stdarg.h>
+#include <sys/ioctl.h>
+#include <ioctls_portable.h>
+
+#if FIOQSIZE_PORTABLE == FIOQSIZE
+#error Bad build environment
+#endif
+
+static inline int x86_change_request(int request)
+{
+    if (request == FIOQSIZE_PORTABLE)
+        return FIOQSIZE;
+
+    return request;
+}
+
+extern int __ioctl(int, int, void *);
+int ioctl_portable(int fd, int request, ...)
+{
+    va_list ap;
+    void * arg;
+
+    va_start(ap, request);
+    arg = va_arg(ap, void *);
+    va_end(ap);
+
+    return __ioctl(fd, x86_change_request(request), arg);
+}
diff --git a/ndk/sources/android/libportable/arch-x86/open.c b/ndk/sources/android/libportable/arch-x86/open.c
new file mode 100644
index 0000000..a38f38c
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/open.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <fcntl_portable.h>
+
+
+static inline int x86_change_flags(int flags)
+{
+    int x86flags = flags & O_ACCMODE_PORTABLE;
+    if (flags & O_CREAT_PORTABLE)
+        x86flags |= O_CREAT;
+    if (flags & O_EXCL_PORTABLE)
+        x86flags |= O_EXCL;
+    if (flags & O_NOCTTY_PORTABLE)
+        x86flags |= O_NOCTTY;
+    if (flags & O_TRUNC_PORTABLE)
+        x86flags |= O_TRUNC;
+    if (flags & O_APPEND_PORTABLE)
+        x86flags |= O_APPEND;
+    if (flags & O_NONBLOCK_PORTABLE)
+        x86flags |= O_NONBLOCK;
+    if (flags & O_SYNC_PORTABLE)
+        x86flags |= O_SYNC;
+    if (flags & FASYNC_PORTABLE)
+        x86flags |= FASYNC;
+    if (flags & O_DIRECT_PORTABLE)
+        x86flags |= O_DIRECT;
+    if (flags & O_LARGEFILE_PORTABLE)
+        x86flags |= O_LARGEFILE;
+    if (flags & O_DIRECTORY_PORTABLE)
+        x86flags |= O_DIRECTORY;
+    if (flags & O_NOFOLLOW_PORTABLE)
+        x86flags |= O_NOFOLLOW;
+    if (flags & O_NOATIME_PORTABLE)
+        x86flags |= O_NOATIME;
+    if (flags & O_NDELAY_PORTABLE)
+        x86flags |= O_NDELAY;
+
+    return x86flags;
+}
+
+extern int  __open(const char*, int, int);
+int open_portable(const char *pathname, int flags, ...)
+{
+    mode_t  mode = 0;
+    flags |= O_LARGEFILE;
+
+    if (flags & O_CREAT)
+    {
+        va_list  args;
+
+        va_start(args, flags);
+        mode = (mode_t) va_arg(args, int);
+        va_end(args);
+    }
+
+    return __open(pathname, x86_change_flags(flags), mode);
+}
diff --git a/ndk/sources/android/libportable/arch-x86/socket.c b/ndk/sources/android/libportable/arch-x86/socket.c
new file mode 100644
index 0000000..7e7ca9b
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/socket.c
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2012, 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 <unistd.h>
+#include <sys/socket.h>
+#include <sys/linux-syscalls.h>
+
+int socket_portable(int domain, int type, int protocol) {
+    return socket(domain, type, protocol);
+}
diff --git a/ndk/sources/android/libportable/arch-x86/sockopt.c b/ndk/sources/android/libportable/arch-x86/sockopt.c
new file mode 100644
index 0000000..c86ded3
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/sockopt.c
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2012, 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/socket.h>
+
+extern int setsockopt(int, int, int, const void *, socklen_t);
+int setsockopt_portable(int s, int level, int optname, const void *optval, socklen_t optlen)
+{
+    return setsockopt(s, level, optname, optval, optlen);
+}
+
+extern int getsockopt (int, int, int, void *, socklen_t *);
+int getsockopt_portable(int s, int level, int optname, void *optval, socklen_t *optlen)
+{
+    return getsockopt(s, level, optname, optval, optlen);
+}
diff --git a/ndk/sources/android/libportable/arch-x86/stat.c b/ndk/sources/android/libportable/arch-x86/stat.c
new file mode 100644
index 0000000..6b368c8
--- /dev/null
+++ b/ndk/sources/android/libportable/arch-x86/stat.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012, 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 <stat_portable.h>
+
+/* Note: The Portable Header will define stat to stat_portable */
+int stat_portable(const char *path, struct stat_portable *s)
+{
+    struct stat x86_stat;
+    int ret = stat(path, &x86_stat);
+    stat_ntop(&x86_stat, s);
+    return ret;
+}
+
+int fstat_portable(int fd, struct stat_portable *s)
+{
+    struct stat x86_stat;
+    int ret = fstat(fd, &x86_stat);
+    stat_ntop(&x86_stat, s);
+    return ret;
+}   
+
+int lstat_portable(const char *path, struct stat_portable *s)
+{
+    struct stat x86_stat;
+    int ret = lstat(path, &x86_stat);
+    stat_ntop(&x86_stat, s);
+    return ret;
+}
+
+int fstatat_portable(int dirfd, const char *path, struct stat_portable *s, int flags)
+{
+    struct stat x86_stat;
+    int ret = fstatat(dirfd, path, &x86_stat, flags);
+    stat_ntop(&x86_stat, s);
+    return ret;
+}
diff --git a/ndk/sources/android/libportable/common/include/epoll_portable.h b/ndk/sources/android/libportable/common/include/epoll_portable.h
new file mode 100644
index 0000000..9007ba6
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/epoll_portable.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012, 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.
+ */
+
+#ifndef _EPOLL_PORTABLE_H_
+#define _EPOLL_PORTABLE_H_
+
+/*
+ * GDK's compiler generates paddings to guarantee 8-byte alignment on
+ * struct and 64bit POD types. If compilers on your platform have no such
+ * alignment rule, please use the following struct and convert it into your
+ * native struct form.
+ */
+struct epoll_event_portable
+{
+  unsigned int events;
+  unsigned char __padding[4];
+  epoll_data_t data;
+};
+
+#endif /* _EPOLL_PORTABLE_H */
diff --git a/ndk/sources/android/libportable/common/include/fcntl_portable.h b/ndk/sources/android/libportable/common/include/fcntl_portable.h
new file mode 100644
index 0000000..d7bdb9f
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/fcntl_portable.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2012, 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.
+ */
+
+#ifndef _FCNTL_PORTABLE_H_
+#define _FCNTL_PORTABLE_H_
+
+/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/fcntl.h */
+/* NB x86 does not have these and only uses the generic definitions */
+#define O_DIRECTORY_PORTABLE    040000
+#define O_NOFOLLOW_PORTABLE     0100000
+#define O_DIRECT_PORTABLE       0200000
+#define O_LARGEFILE_PORTABLE    0400000
+
+/* Derived from development/ndk/platforms/android-3/include/asm-generic/fcntl.h */
+#define O_ACCMODE_PORTABLE  00000003
+#define O_RDONLY_PORTABLE   00000000
+#define O_WRONLY_PORTABLE   00000001
+#define O_RDWR_PORTABLE     00000002
+#ifndef O_CREAT_PORTABLE
+#define O_CREAT_PORTABLE    00000100
+#endif
+#ifndef O_EXCL_PORTABLE
+#define O_EXCL_PORTABLE     00000200
+#endif
+#ifndef O_NOCTTY_PORTABLE
+#define O_NOCTTY_PORTABLE   00000400
+#endif
+#ifndef O_TRUNC_PORTABLE
+#define O_TRUNC_PORTABLE    00001000
+#endif
+#ifndef O_APPEND_PORTABLE
+#define O_APPEND_PORTABLE   00002000
+#endif
+#ifndef O_NONBLOCK_PORTABLE
+#define O_NONBLOCK_PORTABLE 00004000
+#endif
+#ifndef O_SYNC_PORTABLE
+#define O_SYNC_PORTABLE     00010000
+#endif
+#ifndef FASYNC_PORTABLE
+#define FASYNC_PORTABLE     00020000
+#endif
+#ifndef O_DIRECT_PORTABLE
+#define O_DIRECT_PORTABLE   00040000
+#endif
+#ifndef O_LARGEFILE_PORTABLE
+#define O_LARGEFILE_PORTABLE    00100000
+#endif
+#ifndef O_DIRECTORY_PORTABLE
+#define O_DIRECTORY_PORTABLE    00200000
+#endif
+#ifndef O_NOFOLLOW_PORTABLE
+#define O_NOFOLLOW_PORTABLE 00400000
+#endif
+#ifndef O_NOATIME_PORTABLE
+#define O_NOATIME_PORTABLE  01000000
+#endif
+#ifndef O_NDELAY_PORTABLE
+#define O_NDELAY_PORTABLE   O_NONBLOCK_PORTABLE
+#endif
+
+struct flock64_portable {
+   short l_type;
+   short l_whence;
+   unsigned char __padding[4];
+   loff_t l_start;
+   loff_t l_len;
+   pid_t l_pid;
+   __ARCH_FLOCK64_PAD
+};
+
+/*
+The X86 Version is
+
+struct flock64 {
+   short l_type;
+   short l_whence;
+   loff_t l_start;
+   loff_t l_len;
+   pid_t l_pid;
+   __ARCH_FLOCK64_PAD
+};
+*/
+
+#endif /* _FCNTL_PORTABLE_H */
diff --git a/ndk/sources/android/libportable/common/include/ioctls_portable.h b/ndk/sources/android/libportable/common/include/ioctls_portable.h
new file mode 100644
index 0000000..16fef80
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/ioctls_portable.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2012, 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.
+*/
+
+#ifndef _IOCTLS_PORTABLE_H_
+#define _IOCTLS_PORTABLE_H_
+
+/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/ioctls.h */
+
+#define TCGETS_PORTABLE     0x5401
+#define TCSETS_PORTABLE     0x5402
+#define TCSETSW_PORTABLE    0x5403
+#define TCSETSF_PORTABLE    0x5404
+#define TCGETA_PORTABLE     0x5405
+#define TCSETA_PORTABLE     0x5406
+#define TCSETAW_PORTABLE    0x5407
+#define TCSETAF_PORTABLE    0x5408
+#define TCSBRK_PORTABLE     0x5409
+#define TCXONC_PORTABLE     0x540A
+#define TCFLSH_PORTABLE     0x540B
+#define TIOCEXCL_PORTABLE   0x540C
+#define TIOCNXCL_PORTABLE   0x540D
+#define TIOCSCTTY_PORTABLE  0x540E
+#define TIOCGPGRP_PORTABLE  0x540F
+#define TIOCSPGRP_PORTABLE  0x5410
+#define TIOCOUTQ_PORTABLE   0x5411
+#define TIOCSTI_PORTABLE    0x5412
+#define TIOCGWINSZ_PORTABLE 0x5413
+#define TIOCSWINSZ_PORTABLE 0x5414
+#define TIOCMGET_PORTABLE   0x5415
+#define TIOCMBIS_PORTABLE   0x5416
+#define TIOCMBIC_PORTABLE   0x5417
+#define TIOCMSET_PORTABLE   0x5418
+#define TIOCGSOFTCAR_PORTABLE   0x5419
+#define TIOCSSOFTCAR_PORTABLE   0x541A
+#define FIONREAD_PORTABLE   0x541B
+#define TIOCINQ_PORTABLE    FIONREAD_PORTABLE
+#define TIOCLINUX_PORTABLE  0x541C
+#define TIOCCONS_PORTABLE   0x541D
+#define TIOCGSERIAL_PORTABLE    0x541E
+#define TIOCSSERIAL_PORTABLE    0x541F
+#define TIOCPKT_PORTABLE    0x5420
+#define FIONBIO_PORTABLE    0x5421
+#define TIOCNOTTY_PORTABLE  0x5422
+#define TIOCSETD_PORTABLE   0x5423
+#define TIOCGETD_PORTABLE   0x5424
+#define TCSBRKP_PORTABLE    0x5425
+#define TIOCSBRK_PORTABLE   0x5427
+#define TIOCCBRK_PORTABLE   0x5428
+#define TIOCGSID_PORTABLE   0x5429
+//#define TIOCGPTN _IOR('T',0x30, unsigned int)
+//#define TIOCSPTLCK _IOW('T',0x31, int)
+
+#define FIONCLEX_PORTABLE   0x5450
+#define FIOCLEX_PORTABLE    0x5451
+#define FIOASYNC_PORTABLE   0x5452
+#define TIOCSERCONFIG_PORTABLE  0x5453
+#define TIOCSERGWILD_PORTABLE   0x5454
+#define TIOCSERSWILD_PORTABLE   0x5455
+#define TIOCGLCKTRMIOS_PORTABLE 0x5456
+#define TIOCSLCKTRMIOS_PORTABLE 0x5457
+#define TIOCSERGSTRUCT_PORTABLE 0x5458
+#define TIOCSERGETLSR_PORTABLE  0x5459
+#define TIOCSERGETMULTI_PORTABLE 0x545A
+#define TIOCSERSETMULTI_PORTABLE 0x545B
+
+#define TIOCMIWAIT_PORTABLE     0x545C
+#define TIOCGICOUNT_PORTABLE    0x545D
+#define FIOQSIZE_PORTABLE       0x545E /* x86 differs here */
+
+#define TIOCPKT_DATA_PORTABLE       0
+#define TIOCPKT_FLUSHREAD_PORTABLE  1
+#define TIOCPKT_FLUSHWRITE_PORTABLE 2
+#define TIOCPKT_STOP_PORTABLE       4
+#define TIOCPKT_START_PORTABLE      8
+#define TIOCPKT_NOSTOP_PORTABLE     16
+#define TIOCPKT_DOSTOP_PORTABLE     32
+
+#define TIOCSER_TEMT_PORTABLE   0x01
+
+#endif /* _IOCTLS_PORTABLE_H */
diff --git a/ndk/sources/android/libportable/common/include/mman_portable.h b/ndk/sources/android/libportable/common/include/mman_portable.h
new file mode 100644
index 0000000..a655cba
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/mman_portable.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2012, 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.
+ */
+
+#ifndef _MMAN_PORTABLE_H_
+#define _MMAN_PORTABLE_H_
+
+/* Derived from development/ndk/platforms/android-3/include/asm-generic/mman.h */
+#define PROT_READ_PORTABLE     0x1
+#define PROT_WRITE_PORTABLE    0x2
+#define PROT_EXEC_PORTABLE     0x4
+#define PROT_SEM_PORTABLE      0x8
+#define PROT_NONE_PORTABLE     0x0
+#define PROT_GROWSDOWN_PORTABLE 0x01000000
+#define PROT_GROWSUP_PORTABLE   0x02000000
+
+#define MAP_SHARED_PORTABLE    0x01
+#define MAP_PRIVATE_PORTABLE   0x02
+#define MAP_TYPE_PORTABLE      0x0f
+#define MAP_FIXED_PORTABLE     0x10
+#define MAP_ANONYMOUS_PORTABLE 0x20
+
+#define MS_ASYNC_PORTABLE      1
+#define MS_INVALIDATE_PORTABLE 2
+#define MS_SYNC_PORTABLE       4
+
+#define MADV_NORMAL_PORTABLE   0
+#define MADV_RANDOM_PORTABLE   1
+#define MADV_SEQUENTIAL_PORTABLE 2
+#define MADV_WILLNEED_PORTABLE 3
+#define MADV_DONTNEED_PORTABLE 4
+
+#define MADV_REMOVE_PORTABLE   9
+#define MADV_DONTFORK_PORTABLE 10
+#define MADV_DOFORK_PORTABLE   11
+
+#define MAP_ANON_PORTABLE      MAP_ANONYMOUS_PORTABLE
+#define MAP_FILE_PORTABLE      0
+
+/* Derived from development/ndk/platforms/android-3/include/asm-generic/mman.h */
+#define MAP_GROWSDOWN_PORTABLE 0x0100
+#define MAP_DENYWRITE_PORTABLE 0x0800
+#define MAP_EXECUTABLE_PORTABLE        0x1000
+#define MAP_LOCKED_PORTABLE    0x2000
+#define MAP_NORESERVE_PORTABLE 0x4000
+#define MAP_POPULATE_PORTABLE  0x8000
+#define MAP_NONBLOCK_PORTABLE  0x10000
+
+#define MCL_CURRENT_PORTABLE   1
+#define MCL_FUTURE_PORTABLE    2
+
+#endif /* _MMAN_PORTABLE_H */
diff --git a/ndk/sources/android/libportable/common/include/socket_portable.h b/ndk/sources/android/libportable/common/include/socket_portable.h
new file mode 100644
index 0000000..57be0a9
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/socket_portable.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2012, 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.
+ */
+
+#ifndef _SOCKET_PORTABLE_H_
+#define _SOCKET_PORTABLE_H_
+
+/* From ndk/platforms/android-3/include/sys/socket.h */
+#define SOCK_STREAM_PORTABLE    1
+#define SOCK_DGRAM_PORTABLE     2
+#define SOCK_RAW_PORTABLE       3
+#define SOCK_RDM_PORTABLE       4
+#define SOCK_SEQPACKET_PORTABLE 5
+#define SOCK_PACKET_PORTABLE    10
+
+
+/* Derived from android-3/arch-arm/include/asm/socket.h */
+
+#define SOL_SOCKET_PORTABLE     1
+
+#define SO_DEBUG_PORTABLE       1
+#define SO_REUSEADDR_PORTABLE   2
+#define SO_TYPE_PORTABLE        3
+#define SO_ERROR_PORTABLE       4
+#define SO_DONTROUTE_PORTABLE   5
+#define SO_BROADCAST_PORTABLE   6
+#define SO_SNDBUF_PORTABLE      7
+#define SO_RCVBUF_PORTABLE      8
+#define SO_SNDBUFFORCE_PORTABLE 32
+#define SO_RCVBUFFORCE_PORTABLE 33
+#define SO_KEEPALIVE_PORTABLE   9
+#define SO_OOBINLINE_PORTABLE   10
+#define SO_NO_CHECK_PORTABLE    11
+#define SO_PRIORITY_PORTABLE    12
+#define SO_LINGER_PORTABLE      13
+#define SO_BSDCOMPAT_PORTABLE   14
+
+#define SO_PASSCRED_PORTABLE    16
+#define SO_PEERCRED_PORTABLE    17
+#define SO_RCVLOWAT_PORTABLE    18
+#define SO_SNDLOWAT_PORTABLE    19
+#define SO_RCVTIMEO_PORTABLE    20
+#define SO_SNDTIMEO_PORTABLE    21
+
+#define SO_SECURITY_AUTHENTICATION_PORTABLE         22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT_PORTABLE   23
+#define SO_SECURITY_ENCRYPTION_NETWORK_PORTABLE     24
+
+#define SO_BINDTODEVICE_PORTABLE    25
+
+#define SO_ATTACH_FILTER_PORTABLE   26
+#define SO_DETACH_FILTER_PORTABLE   27
+
+#define SO_PEERNAME_PORTABLE        28
+#define SO_TIMESTAMP_PORTABLE       29
+#define SCM_TIMESTAMP_PORTABLE SO_TIMESTAMP_PORTABLE
+
+#define SO_ACCEPTCONN_PORTABLE      30
+
+#define SO_PEERSEC_PORTABLE     31
+#define SO_PASSSEC_PORTABLE     34
+
+#endif /* _SOCKET_PORTABLE_H */
diff --git a/ndk/sources/android/libportable/common/include/stat_portable.h b/ndk/sources/android/libportable/common/include/stat_portable.h
new file mode 100644
index 0000000..61c016c
--- /dev/null
+++ b/ndk/sources/android/libportable/common/include/stat_portable.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2012, 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.
+ */
+
+#ifndef _STAT_PORTABLE_H_
+#define _STAT_PORTABLE_H_
+
+#include <sys/stat.h>
+#include <string.h>
+
+/* It's easy to change kernel to support stat */
+struct stat_portable {
+    unsigned long long  st_dev;
+    unsigned char       __pad0[4];
+
+    unsigned long       __st_ino;
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long long  st_rdev;
+    unsigned char       __pad3[4];
+
+    unsigned char       __pad4[4];
+    long long           st_size;
+    unsigned long       st_blksize;
+    unsigned char       __pad5[4];
+    unsigned long long  st_blocks;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long long  st_ino;
+};
+
+/*
+The X86 Version is
+struct stat {
+    unsigned long long  st_dev;
+    unsigned char       __pad0[4];
+
+    unsigned long       __st_ino;
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long long  st_rdev;
+    unsigned char       __pad3[4];
+
+    long long           st_size;
+    unsigned long       st_blksize;
+    unsigned long long  st_blocks;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long long  st_ino;
+};
+*/
+
+/*
+The MIPS Version is
+struct stat {
+    unsigned long       st_dev;
+    unsigned long       __pad0[3];
+
+    unsigned long long  st_ino;
+
+    unsigned int        st_mode;
+    unsigned int        st_nlink;
+
+    unsigned long       st_uid;
+    unsigned long       st_gid;
+
+    unsigned long       st_rdev;
+    unsigned long       __pad1[3];
+
+    long long           st_size;
+
+    unsigned long       st_atime;
+    unsigned long       st_atime_nsec;
+
+    unsigned long       st_mtime;
+    unsigned long       st_mtime_nsec;
+
+    unsigned long       st_ctime;
+    unsigned long       st_ctime_nsec;
+
+    unsigned long       st_blksize;
+    unsigned long       __pad2;
+
+    unsigned long long  st_blocks;
+};
+*/
+
+static inline void stat_ntop(struct stat *n_stat, struct stat_portable *p_stat)
+{
+    memset(p_stat, '\0', sizeof(struct stat_portable));
+    p_stat->st_dev        = n_stat->st_dev;
+    p_stat->__st_ino      = n_stat->__st_ino;
+    p_stat->st_mode       = n_stat->st_mode;
+    p_stat->st_nlink      = n_stat->st_nlink;
+    p_stat->st_uid        = n_stat->st_uid;
+    p_stat->st_gid        = n_stat->st_gid;
+    p_stat->st_rdev       = n_stat->st_rdev;
+    p_stat->st_size       = n_stat->st_size;
+    p_stat->st_blksize    = n_stat->st_blksize;
+    p_stat->st_blocks     = n_stat->st_blocks;
+    p_stat->st_atime      = n_stat->st_atime;
+    p_stat->st_atime_nsec = n_stat->st_atime_nsec;
+    p_stat->st_mtime      = n_stat->st_mtime;
+    p_stat->st_mtime_nsec = n_stat->st_mtime_nsec;
+    p_stat->st_ctime      = n_stat->st_ctime;
+    p_stat->st_ctime_nsec = n_stat->st_ctime_nsec;
+    p_stat->st_ino        = n_stat->st_ino;
+}
+
+#endif /* _STAT_PORTABLE_H */