ndk_cruft.cpp revision f183f95946c699924d8ce6c0ee723bf7f4fdfe85
13866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian/* 23866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Copyright (C) 2013 The Android Open Source Project 33866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * All rights reserved. 43866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 53866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * Redistribution and use in source and binary forms, with or without 63866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * modification, are permitted provided that the following conditions 73866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * are met: 83866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * * Redistributions of source code must retain the above copyright 93866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * notice, this list of conditions and the following disclaimer. 103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * * Redistributions in binary form must reproduce the above copyright 113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * notice, this list of conditions and the following disclaimer in 123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * the documentation and/or other materials provided with the 133866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * distribution. 143866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * 153866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21f29ed28c7b878ef28058bc730715d0d32445bc57John Reck * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 2560126efd7d905ca24822765c6dafac17fef278abBen Wagner * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2660126efd7d905ca24822765c6dafac17fef278abBen Wagner * SUCH DAMAGE. 2760126efd7d905ca24822765c6dafac17fef278abBen Wagner */ 280449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This file perpetuates the mistakes of the past, but only for 32-bit targets. 303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#if !defined(__LP64__) 313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3260126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <ctype.h> 3360126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <dirent.h> 3460126efd7d905ca24822765c6dafac17fef278abBen Wagner#include <inttypes.h> 353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <pthread.h> 361376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav#include <signal.h> 373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <stdio.h> 383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <stdlib.h> 393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <string.h> 403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <sys/resource.h> 413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <sys/syscall.h> 423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <sys/time.h> 433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <sys/types.h> 443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <sys/wait.h> 453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <unistd.h> 463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#include <wchar.h> 473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// These were accidentally declared in <unistd.h> because we stupidly used to inline 4900101052b5bf99a29acea3525864ed64b709c16cDan Stoza// getpagesize() and __getpageshift(). Needed for backwards compatibility with old NDK apps. 5000101052b5bf99a29acea3525864ed64b709c16cDan Stozaextern "C" { 513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian unsigned int __page_size = PAGE_SIZE; 523866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian unsigned int __page_shift = 12; 533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// TODO: remove this backward compatibility hack (for jb-mr1 strace binaries). 563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" pid_t __wait4(pid_t pid, int* status, int options, struct rusage* rusage) { 573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return wait4(pid, status, options, rusage); 58e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden} 59e8b1aeb51e1e5da64f1d4fd40f2ee1e815886fe5Andy McFadden 60904f485bc6013060e81b627be61314b3d7fe5ef8Dan Stoza// TODO: does anything still need this? 613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int __open() { 623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian abort(); 639890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza} 649890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 659890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza// TODO: does anything still need this? 669890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stozaextern "C" void** __get_tls() { 679890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza#include "private/__get_tls.h" 689890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza return __get_tls(); 699890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza} 7046cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins 7146cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins// This non-standard function was in our <string.h> for some reason. 7246cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scrogginsextern "C" void memswap(void* m1, void* m2, size_t n) { 7346cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins char* p = reinterpret_cast<char*>(m1); 7446cb9bdbf56b27cbf2ab878b41d21e30896a4feaLeon Scroggins char* p_end = p + n; 753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian char* q = reinterpret_cast<char*>(m2); 761376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav while (p < p_end) { 771376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav char tmp = *p; 781376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav *p = *q; 791376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav *q = tmp; 801376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav p++; 811376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav q++; 821376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav } 831376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav} 841376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslav 851376d600d8e0eefdbc0aa11d398cf7517fc77129Svetoslavextern "C" int pthread_attr_setstackaddr(pthread_attr_t*, void*) { 863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // This was removed from POSIX.1-2008, and is not implemented on bionic. 873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // Needed for ABI compatibility with the NDK. 8836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return ENOSYS; 893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int pthread_attr_getstackaddr(const pthread_attr_t* attr, void** stack_addr) { 923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // This was removed from POSIX.1-2008. 933866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // Needed for ABI compatibility with the NDK. 943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian *stack_addr = (char*)attr->stack_base + attr->stack_size; 953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 98b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian// Non-standard cruft that should only ever have been in system/core/toolbox. 9936bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatextern "C" char* strtotimeval(const char* str, struct timeval* ts) { 1003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian char* s; 1013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ts->tv_sec = strtoumax(str, &s, 10); 10236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 1033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian long fractional_seconds = 0; 104b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian if (*s == '.') { 1053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian s++; 1063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int count = 0; 10736bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 1083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // Read up to 6 digits (microseconds). 1093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian while (*s && isdigit(*s)) { 110b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian if (++count < 7) { 1113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian fractional_seconds = fractional_seconds*10 + (*s - '0'); 1123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 11347e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang s++; 11447e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 11547e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang 11647e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang for (; count < 6; count++) { 11747e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang fractional_seconds *= 10; 11847e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 11947e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 1209890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 1219890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza ts->tv_usec = fractional_seconds; 1221d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews return s; 1231d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews} 1243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstatic inline int digitval(int ch) { 1263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian unsigned d; 1273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 1283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian d = (unsigned)(ch - '0'); 1299890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza if (d < 10) return (int)d; 1309890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 1319890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza d = (unsigned)(ch - 'a'); 1329890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza if (d < 6) return (int)(d+10); 1339890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 1349890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza d = (unsigned)(ch - 'A'); 13560126efd7d905ca24822765c6dafac17fef278abBen Wagner if (d < 6) return (int)(d+10); 136b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger 1371d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews return -1; 1381d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews} 1390f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 140b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger// This non-standard function was in our <inttypes.h> for some reason. 1411d13406538b79785d2d0928689b8d5037e851ecfRiley Andrewsextern "C" uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n) { 1421d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews const unsigned char* p = (const unsigned char *)nptr; 1431d13406538b79785d2d0928689b8d5037e851ecfRiley Andrews const unsigned char* end = p + n; 144b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger int minus = 0; 1453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian uintmax_t v = 0; 1463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian int d; 1473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 148f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III while (p < end && isspace(*p)) { 149f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III p++; 150b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger } 151b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger 152f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III if (p < end) { 153f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III char c = p[0]; 154b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger if (c == '-' || c == '+') { 155b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger minus = (c == '-'); 156b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger p++; 157f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III } 158f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III } 159b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger 160b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger if (base == 0) { 161b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger if (p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { 162f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III p += 2; 163f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III base = 16; 164b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger } else if (p+1 < end && p[0] == '0') { 165b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger p += 1; 166b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger base = 8; 167b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger } else { 168b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger base = 10; 1693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 170f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III } else if (base == 16) { 171f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III if (p+2 < end && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { 172f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III p += 2; 1733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 174f29ed28c7b878ef28058bc730715d0d32445bc57John Reck } 175b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger 176b644a3b84521e2155a5af985a4d4ed305474e567Derek Sollenberger while (p < end && (d = digitval(*p)) >= 0 && d < base) { 177f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III v = v*base + d; 178f29ed28c7b878ef28058bc730715d0d32445bc57John Reck p += 1; 1793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 1803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 181f29ed28c7b878ef28058bc730715d0d32445bc57John Reck if (endptr) { 182f29ed28c7b878ef28058bc730715d0d32445bc57John Reck *endptr = (char*) p; 183f29ed28c7b878ef28058bc730715d0d32445bc57John Reck } 18460126efd7d905ca24822765c6dafac17fef278abBen Wagner 185ae2e8b4891491e8e89bed5f2c9626415adee09cbJohn Reck return minus ? -v : v; 186f29ed28c7b878ef28058bc730715d0d32445bc57John Reck} 1871abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik 1881abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik// This non-standard function was in our <inttypes.h> for some reason. 1893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" intmax_t strntoimax(const char* nptr, char** endptr, int base, size_t n) { 1903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return (intmax_t) strntoumax(nptr, endptr, base, n); 1919890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza} 1929890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 1939890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza// POSIX calls this dprintf, but LP32 Android had fdprintf instead. 1940449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopianextern "C" int fdprintf(int fd, const char* fmt, ...) { 1950449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian va_list ap; 1960449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian va_start(ap, fmt); 1970449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian int rc = vdprintf(fd, fmt, ap); 1989890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza va_end(ap); 1999890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza return rc; 2009890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza} 2019890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza 2029890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza// POSIX calls this vdprintf, but LP32 Android had fdprintf instead. 2039890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stozaextern "C" int vfdprintf(int fd, const char* fmt, va_list ap) { 2040449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian return vdprintf(fd, fmt, ap); 2050449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian} 2060449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 2070449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian#define __futex_wake __real_futex_wake 2089890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza#define __futex_wait __real_futex_wait 2099890e341bf9d565309cd7db5e6c4194c66c0a1d8Dan Stoza#include "private/bionic_futex.h" 21016ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza#undef __futex_wake 21116ec12ae77fdd2b09ea0ea0885ac52f11bd32c59Dan Stoza#undef __futex_wait 2120449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian 2130449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian// This used to be in <sys/atomics.h>. 2140449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopianextern "C" int __futex_wake(volatile void* ftx, int count) { 2150449a40586b45ee05f760802020dc2f8a6e0506bMathias Agopian return __real_futex_wake(ftx, count); 2163866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2173866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2183866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This used to be in <sys/atomics.h>. 2193866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) { 2203866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return __real_futex_wait(ftx, value, timeout); 2213866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2223866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// Unity's libmono uses this. 2243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int tkill(pid_t tid, int sig) { 2253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return syscall(__NR_tkill, tid, sig); 2263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 22836bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat// This was removed from POSIX 2008. 2293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" wchar_t* wcswcs(wchar_t* haystack, wchar_t* needle) { 2303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return wcsstr(haystack, needle); 2313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from POSIX 2008. 2343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" sighandler_t bsd_signal(int signum, sighandler_t handler) { 2353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return signal(signum, handler); 23636bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat} 2373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// sysv_signal() was never in POSIX. 2393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern sighandler_t _signal(int signum, sighandler_t handler, int flags); 2403866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" sighandler_t sysv_signal(int signum, sighandler_t handler) { 2413866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return _signal(signum, handler, SA_RESETHAND); 2423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2433866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 24436bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat// This is a system call that was never in POSIX. Use readdir(3) instead. 2453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int __getdents64(unsigned int, dirent*, unsigned int); 2463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int getdents(unsigned int fd, dirent* dirp, unsigned int count) { 2473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return __getdents64(fd, dirp, count); 2483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This is a BSDism that we never implemented correctly. Used by Firefox. 2513866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int issetugid() { 25236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return 0; 2533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2543866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2553866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from POSIX 2004. 2563866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" pid_t wait3(int* status, int options, struct rusage* rusage) { 2573866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return wait4(-1, status, options, rusage); 2583866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2593866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 26036bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat// This was removed from POSIX 2004. 2613866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int getdtablesize() { 2623866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian struct rlimit r; 2633866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (getrlimit(RLIMIT_NOFILE, &r) < 0) { 2653866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return sysconf(_SC_OPEN_MAX); 2663866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian } 2673866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2683866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return r.rlim_cur; 2693866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 2703866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2713866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// Only used by ftime, which was removed from POSIX 2008. 2723866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianstruct timeb { 2733866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian time_t time; 2743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian unsigned short millitm; 2753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian short timezone; 2763866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian short dstflag; 2773866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian}; 2783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2793866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from POSIX 2008. 2803866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" int ftime(struct timeb* tb) { 2813866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian struct timeval tv; 2823866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian struct timezone tz; 2833866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2843866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (gettimeofday(&tv, &tz) < 0) 28536bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat return -1; 2863866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2873866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian tb->time = tv.tv_sec; 2883866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian tb->millitm = (tv.tv_usec + 500) / 1000; 2893866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2903866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian if (tb->millitm == 1000) { 2913866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian ++tb->time; 2923866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian tb->millitm = 0; 29336bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat } 2943866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian tb->timezone = tz.tz_minuteswest; 2963866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian tb->dstflag = tz.tz_dsttime; 2973866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 2983866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return 0; 2993866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3013866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from POSIX 2008. 30236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhatextern "C" char* index(const char* str, int ch) { 3033866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return strchr(str, ch); 3043866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3053866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3063866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from BSD. 3073866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" void arc4random_stir(void) { 3083866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian // The current implementation stirs itself as needed. 3093866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3113866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// This was removed from BSD. 31227982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballosextern "C" void arc4random_addrandom(unsigned char*, int) { 31327982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos // The current implementation adds randomness as needed. 31427982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos} 31527982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos 31627982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos// Old versions of the NDK did not export malloc_usable_size, but did 31727982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos// export dlmalloc_usable_size. We are moving away from dlmalloc in L 31827982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos// so make this call malloc_usable_size. 31927982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballosextern "C" size_t dlmalloc_usable_size(void* ptr) { 32027982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos return malloc_usable_size(ptr); 32127982e65eebdd8c23619e29c4d85a8b208e30200Pablo Ceballos} 32236bef0bf30d6bae48cf3837df351075ca4fce654Ashok Bhat 3233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// In L we added a public pthread_gettid_np, but some apps were using the private API. 3243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" pid_t __pthread_gettid(pthread_t t) { 3253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return pthread_gettid_np(t); 3263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3273866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// Older versions of appportable used dlmalloc directly instead of malloc, 3293866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian// so export this compatibility shim that simply calls malloc. 3303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianextern "C" void* dlmalloc(size_t size) { 3313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian return malloc(size); 3323866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian} 3333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian 3343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian#endif 3353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian