#include <errno.h>
-// These functions are called from our assembler syscall stubs.
+// This function is called from our assembler syscall stubs.
// C/C++ code should just assign 'errno' instead.
-// TODO: should be __LIBC_HIDDEN__, but already exported by NDK :-(
-// TODO: this isn't used on ARM.
-extern "C" int __set_errno(int n) {
+// The return type is 'long' because we use the same routine in calls
+// that return an int as in ones that return a ssize_t. On a 32-bit
+// system these are the same size, but on a 64-bit system they're not.
+// 'long' gives us 32-bit on 32-bit systems, 64-bit on 64-bit systems.
+
+// Since __set_errno was mistakenly exposed in <errno.h> in the 32-bit
+// NDK, use a differently named internal function for the system call
+// stubs. This avoids having the stubs .hidden directives accidentally
+// hide __set_errno for old NDK apps.
+
+// This one is for internal use only and used by both LP32 and LP64 assembler.
+extern "C" __LIBC_HIDDEN__ long __set_errno_internal(int n) {
errno = n;
return -1;
}
-
-// TODO: this is only used on ARM, but is exported by NDK on all platforms :-(
-extern "C" __LIBC_HIDDEN__ int __set_syscall_errno(int n) {
- // Some syscalls, mmap() for example, have valid return
- // values that are "negative". Since errno values are not
- // greater than 131 on Linux, we will just consider
- // anything significantly out of range as not-an-error.
- if(n > -256) {
- return __set_errno(-n);
- } else {
- return n;
- }
-}