1a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes/* 2a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * Copyright (C) 2008 The Android Open Source Project 3a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * All rights reserved. 4a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * 5a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * Redistribution and use in source and binary forms, with or without 6a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * modification, are permitted provided that the following conditions 7a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * are met: 8a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * * Redistributions of source code must retain the above copyright 9a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * notice, this list of conditions and the following disclaimer. 10a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * * Redistributions in binary form must reproduce the above copyright 11a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * notice, this list of conditions and the following disclaimer in 12a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * the documentation and/or other materials provided with the 13a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * distribution. 14a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * 15a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * SUCH DAMAGE. 27a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes */ 28a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 29a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <ctype.h> 30a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <dirent.h> 31a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <errno.h> 32a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <fcntl.h> 33a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <limits.h> 34c03e1e74390c1b8a30341399cd85cc869d0842b0Elliott Hughes#include <pthread.h> 35a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <stdio.h> // For FOPEN_MAX. 36a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <string.h> 37a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <sys/sysconf.h> 38a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <time.h> 39a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#include <unistd.h> 40a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 41eb847bc8666842a3cfc9c06e8458ad1abebebaf0Elliott Hughes#include "private/bionic_tls.h" 42701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes#include "private/ScopedReaddir.h" 43701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes 44a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes/* seems to be the default on Linux, per the GLibc sources and my own digging */ 45a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 46a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_CLK_TCK 100 47a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_IOV_MAX 1024 48a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_DELAYTIMER_MAX 2147483647 49a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_MQ_OPEN_MAX 8 50a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_MQ_PRIO_MAX 32768 51a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_SEM_NSEMS_MAX 256 52a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_SEM_VALUE_MAX 0x3fffffff /* see bionic/semaphore.c */ 53a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_SIGQUEUE_MAX 32 54a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_TIMER_MAX 32 55a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_LOGIN_NAME_MAX 256 56a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_TTY_NAME_MAX 32 57a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 58a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes/* the following depends on our implementation */ 59a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_ATEXIT_MAX 65536 /* our implementation is unlimited */ 60a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_THREAD_THREADS_MAX 2048 /* really unlimited */ 61a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 62a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_C_BIND _POSIX_VERSION /* Posix C binding version */ 63a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_C_VER _POSIX2_C_VERSION 64a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_C_DEV -1 /* Posix C development tools unsupported on the device */ 65a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_FORT_DEV -1 /* Fortran development unsupported */ 66a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_FORT_RUN -1 /* Fortran runtime unsupported */ 67a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_SW_DEV -1 /* posix software dev utilities unsupported */ 68a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_LOCALEDEF -1 /* localedef() unimplemented */ 69a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_UPE -1 /* No UPE for you ! (User Portability Utilities) */ 70a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#define SYSTEM_2_VERSION -1 /* No posix command-line tools */ 71a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 72a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic bool __matches_cpuN(const char* s) { 73a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // The %c trick is to ensure that we have the anchored match "^cpu[0-9]+$". 74a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes unsigned cpu; 75a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes char dummy; 76a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return (sscanf(s, "cpu%u%c", &cpu, &dummy) == 1); 77a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 78a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 79a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __sysconf_nprocessors_conf() { 80a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // On x86 kernels you can use /proc/cpuinfo for this, but on ARM kernels offline CPUs disappear 81a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // from there. This method works on both. 82701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes ScopedReaddir reader("/sys/devices/system/cpu"); 83701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes if (reader.IsBad()) { 84a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return 1; 85a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 86a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 87a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes int result = 0; 88701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes dirent* entry; 89701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes while ((entry = reader.ReadEntry()) != NULL) { 90701bec2af33feaa9dddf12ccf8e4c714441b7f2eElliott Hughes if (entry->d_type == DT_DIR && __matches_cpuN(entry->d_name)) { 91a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes ++result; 92a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 93a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 94a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return result; 95a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 96a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 97a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __sysconf_nprocessors_onln() { 98a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes FILE* fp = fopen("/proc/stat", "r"); 99a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes if (fp == NULL) { 100a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return 1; 101a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 102a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 103a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes int result = 0; 104a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes char buf[256]; 105a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes while (fgets(buf, sizeof(buf), fp) != NULL) { 106a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // Extract just the first word from the line. 107a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // 'cpu0 7976751 1364388 3116842 469770388 8629405 0 49047 0 0 0' 108a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes char* p = strchr(buf, ' '); 109a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes if (p != NULL) { 110a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes *p = 0; 111a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 112a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes if (__matches_cpuN(buf)) { 113a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes ++result; 114a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 115a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 116a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes fclose(fp); 117a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return result; 118a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 119a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 120a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __get_meminfo(const char* pattern) { 121a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes FILE* fp = fopen("/proc/meminfo", "r"); 122a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes if (fp == NULL) { 123a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return -1; 124a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 125a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 126a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes int result = -1; 127a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes char buf[256]; 128a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes while (fgets(buf, sizeof(buf), fp) != NULL) { 129a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes long total; 130a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes if (sscanf(buf, pattern, &total) == 1) { 131a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes result = (int) (total / (PAGE_SIZE/1024)); 132a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes break; 133a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 134a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 135a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes fclose(fp); 136a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return result; 137a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 138a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 139a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __sysconf_phys_pages() { 140a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return __get_meminfo("MemTotal: %ld kB"); 141a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 142a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 143a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __sysconf_avphys_pages() { 144a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return __get_meminfo("MemFree: %ld kB"); 145a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 146a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 147a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesstatic int __sysconf_monotonic_clock() { 148a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes timespec t; 149a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes int rc = clock_getres(CLOCK_MONOTONIC, &t); 150a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return (rc == -1) ? -1 : _POSIX_VERSION; 151a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 152a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 153a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughesint sysconf(int name) { 154a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes switch (name) { 155a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_ARG_MAX 156a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_ARG_MAX: return _POSIX_ARG_MAX; 157a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 158a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_BC_BASE_MAX 159a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_BC_BASE_MAX: return _POSIX2_BC_BASE_MAX; 160a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 161a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_BC_DIM_MAX 162a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_BC_DIM_MAX: return _POSIX2_BC_DIM_MAX; 163a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 164a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_BC_SCALE_MAX 165a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_BC_SCALE_MAX: return _POSIX2_BC_SCALE_MAX; 166a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 167a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_BC_STRING_MAX 168a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_BC_STRING_MAX: return _POSIX2_BC_STRING_MAX; 169a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 170a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_CHILD_MAX: return CHILD_MAX; 171a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_CLK_TCK: return SYSTEM_CLK_TCK; 172a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_COLL_WEIGHTS_MASK 173a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_COLL_WEIGHTS_MAX: return _POSIX2_COLL_WEIGHTS_MASK; 174a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 175a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_EXPR_NEST_MAX 176a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_EXPR_NEST_MAX: return _POSIX2_EXPR_NEST_MAX; 177a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 178a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX2_LINE_MAX 179a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_LINE_MAX: return _POSIX2_LINE_MAX; 180a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 181a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_NGROUPS_MAX: return NGROUPS_MAX; 182a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_OPEN_MAX: return OPEN_MAX; 183a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes //case _SC_PASS_MAX: return PASS_MAX; 184a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_C_BIND: return SYSTEM_2_C_BIND; 185a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_C_DEV: return SYSTEM_2_C_DEV; 186a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_C_VERSION: return SYSTEM_2_C_VER; 187a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes //case _SC_2_CHAR_TERM: return ; 188a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_FORT_DEV: return SYSTEM_2_FORT_DEV; 189a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_FORT_RUN: return SYSTEM_2_FORT_RUN; 190a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_LOCALEDEF: return SYSTEM_2_LOCALEDEF; 191a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_SW_DEV: return SYSTEM_2_SW_DEV; 192a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_UPE: return SYSTEM_2_UPE; 193a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_2_VERSION: return SYSTEM_2_VERSION; 194a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_JOB_CONTROL 195a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_JOB_CONTROL: return _POSIX_JOB_CONTROL; 196a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 197a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_SAVED_IDS 198a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SAVED_IDS: return _POSIX_SAVED_IDS; 199a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 200a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_VERSION 201a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_VERSION: return _POSIX_VERSION; 202a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 203a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes //case _SC_RE_DUP_<AX: return ; 204a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_STREAM_MAX: return FOPEN_MAX; 205a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes //case _SC_TZNAME_MAX: return ; 206a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#if _XOPEN_CRYPT 207a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_CRYPT: return _XOPEN_CRYPT; 208a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 209a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_ENH_I18N 210a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_ENH_I18N: return _XOPEN_ENH_I18N; 211a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 212a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_SHM 213a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_SHM: return _XOPEN_SHM; 214a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 215a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_VERSION 216a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_VERSION: return _XOPEN_VERSION; 217a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 218a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_XCU_VERSION 219a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_XCU_VERSION: return _XOPEN_XCU_VERSION; 220a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 221a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_REALTIME 222a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_REALTIME: return _XOPEN_REALTIME; 223a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 224a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_REALTIME_THREADS 225a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_REALTIME_THREADS: return _XOPEN_REALTIME_THREADS; 226a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 227a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_LEGACY 228a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_LEGACY: return _XOPEN_LEGACY; 229a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 230a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_ATEXIT_MAX: return SYSTEM_ATEXIT_MAX; 231a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_IOV_MAX: return SYSTEM_IOV_MAX; 2320e44bc3baeb1677e5fbdda87a737b9c508c95132Elliott Hughes 2330e44bc3baeb1677e5fbdda87a737b9c508c95132Elliott Hughes case _SC_PAGESIZE: 2340e44bc3baeb1677e5fbdda87a737b9c508c95132Elliott Hughes case _SC_PAGE_SIZE: 2350e44bc3baeb1677e5fbdda87a737b9c508c95132Elliott Hughes return PAGE_SIZE; 2360e44bc3baeb1677e5fbdda87a737b9c508c95132Elliott Hughes 237a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _XOPEN_UNIX 238a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_XOPEN_UNIX: return _XOPEN_UNIX; 239a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 240a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 241a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes // XXX: TODO: XBS5 nonsense 242a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 243a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef AIO_LISTIO_MAX 244a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_AIO_LISTIO_MAX: return AIO_LISTIO_MAX; 245a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 246a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef AIO_MAX 247a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_AIO_MAX: return AIO_MAX; 248a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 249a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef AIO_PRIO_DELTA_MAX 250a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_AIO_PRIO_DELTA_MAX: return AIO_PRIO_DELTA_MAX; 251a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 252a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_DELAYTIMER_MAX: return SYSTEM_DELAYTIMER_MAX; 253a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MQ_OPEN_MAX: return SYSTEM_MQ_OPEN_MAX; 254a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MQ_PRIO_MAX: return SYSTEM_MQ_PRIO_MAX; 255a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_RTSIG_MAX: return RTSIG_MAX; 256a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SEM_NSEMS_MAX: return SYSTEM_SEM_NSEMS_MAX; 257a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SEM_VALUE_MAX: return SYSTEM_SEM_VALUE_MAX; 258a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SIGQUEUE_MAX: return SYSTEM_SIGQUEUE_MAX; 259a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_TIMER_MAX: return SYSTEM_TIMER_MAX; 260a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_ASYNCHRONOUS_IO 261a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_ASYNCHRONOUS_IO: return _POSIX_ASYNCHRONOUS_IO; 262a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 263a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_FSYNC 264a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_FSYNC: return _POSIX_FSYNC; 265a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 266a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_MAPPED_FILES 267a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MAPPED_FILES: return _POSIX_MAPPED_FILES; 268a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 269a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_MEMLOCK 270a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MEMLOCK: return _POSIX_MEMLOCK; 271a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 272a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_MEMLOCK_RANGE 273a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MEMLOCK_RANGE: return _POSIX_MEMLOCK_RANGE 274a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 275a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_MEMORY_PROTECTION 276a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MEMORY_PROTECTION: return _POSIX_MEMORY_PROTECTION; 277a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 278a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_MESSAGE_PASSING 279a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MESSAGE_PASSING: return _POSIX_MESSAGE_PASSING; 280a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 281a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_PRIORITIZED_IO 282a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_PRIORITIZED_IO: return _POSIX_PRIORITIZED_IO; 283a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 284a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_PRIORITY_SCHEDULING 285a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_PRIORITY_SCHEDULING: return _POSIX_PRIORITY_SCHEDULING; 286a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 287a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_REALTIME_SIGNALS 288a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_REALTIME_SIGNALS: return _POSIX_REALTIME_SIGNALS; 289a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 290a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_SEMAPHORES 291a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SEMAPHORES: return _POSIX_SEMAPHORES; 292a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 293a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_SHARED_MEMORY_OBJECTS 294a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SHARED_MEMORY_OBJECTS: return _POSIX_SHARED_MEMORY_OBJECTS; 295a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 296a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_SYNCHRONIZED_IO 297a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_SYNCHRONIZED_IO: return _POSIX_SYNCHRONIZED_IO; 298a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 299a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_TIMERS 300a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_TIMERS: return _POSIX_TIMERS; 301a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 302a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 303d35106fd557e054d1ffe388df6a3b3cb51cc5021Elliott Hughes case _SC_GETGR_R_SIZE_MAX: return 1024; 304d35106fd557e054d1ffe388df6a3b3cb51cc5021Elliott Hughes case _SC_GETPW_R_SIZE_MAX: return 1024; 305a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 306a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_LOGIN_NAME_MAX: return SYSTEM_LOGIN_NAME_MAX; 30744b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 30844b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes case _SC_THREAD_DESTRUCTOR_ITERATIONS: 30944b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes return _POSIX_THREAD_DESTRUCTOR_ITERATIONS; 31044b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 31144b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes case _SC_THREAD_KEYS_MAX: 31272bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris return (BIONIC_TLS_SLOTS - TLS_SLOT_FIRST_USER_SLOT - BIONIC_TLS_RESERVED_SLOTS); 31344b53ad6818de344e0b499ad8fdbb21fcb0ff2b6Elliott Hughes 314c03e1e74390c1b8a30341399cd85cc869d0842b0Elliott Hughes case _SC_THREAD_STACK_MIN: return PTHREAD_STACK_MIN; 315a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREAD_THREADS_MAX: return SYSTEM_THREAD_THREADS_MAX; 316a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_TTY_NAME_MAX: return SYSTEM_TTY_NAME_MAX; 317a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_THREADS 318a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREADS: return _POSIX_THREADS; 319a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 320a0ca209ac0deef086c0e69b59168dd75df2a3f52Calin Juravle 321a0ca209ac0deef086c0e69b59168dd75df2a3f52Calin Juravle case _SC_THREAD_ATTR_STACKADDR: return -1; // Removed in POSIX 2008 322a0ca209ac0deef086c0e69b59168dd75df2a3f52Calin Juravle case _SC_THREAD_ATTR_STACKSIZE: return -1; // Removed in POSIX 2008 323a0ca209ac0deef086c0e69b59168dd75df2a3f52Calin Juravle 324a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING 325a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREAD_PRIORITY_SCHEDULING: return _POSIX_THREAD_PRIORITY_SCHEDULING; 326a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 327a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_THREAD_PRIO_INHERIT 328a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREAD_PRIO_INHERIT: return _POSIX_THREAD_PRIO_INHERIT; 329a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 330a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_THREAD_PRIO_PROTECT 331a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREAD_PRIO_PROTECT: return _POSIX_THREAD_PRIO_PROTECT; 332a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 333a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#ifdef _POSIX_THREAD_SAFE_FUNCTIONS 334a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_THREAD_SAFE_FUNCTIONS: return _POSIX_THREAD_SAFE_FUNCTIONS 335a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes#endif 336a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 337a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_MONOTONIC_CLOCK: return __sysconf_monotonic_clock(); 338a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_NPROCESSORS_CONF: return __sysconf_nprocessors_conf(); 339a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_NPROCESSORS_ONLN: return __sysconf_nprocessors_onln(); 340a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_PHYS_PAGES: return __sysconf_phys_pages(); 341a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes case _SC_AVPHYS_PAGES: return __sysconf_avphys_pages(); 342a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes 343a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes default: 344a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes /* Posix says EINVAL is the only error that shall be returned, 345a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes * but GLibc uses ENOSYS */ 346a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes errno = ENOSYS; 347a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes return -1; 348a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes } 349a55f63083fb16b2595f517a3260083e5f8cddd02Elliott Hughes} 350