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