/*
 * Copyright 2011 The Emscripten Authors.  All rights reserved.
 * Emscripten is available under two separate licenses, the MIT license and the
 * University of Illinois/NCSA Open Source License.  Both these licenses can be
 * found in the LICENSE file.
 */

#include <assert.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>

int main() {
  int vals[] = {
    _SC_PAGE_SIZE,
    _SC_PAGESIZE,
    _SC_ADVISORY_INFO,
    _SC_BARRIERS,
    _SC_ASYNCHRONOUS_IO,
    _SC_CLOCK_SELECTION,
    _SC_CPUTIME,
    _SC_FSYNC,
    _SC_IPV6,
    _SC_MAPPED_FILES,
    _SC_MEMLOCK,
    _SC_MEMLOCK_RANGE,
    _SC_MEMORY_PROTECTION,
    _SC_MESSAGE_PASSING,
    _SC_MONOTONIC_CLOCK,
    _SC_PRIORITIZED_IO,
    _SC_PRIORITY_SCHEDULING,
    _SC_RAW_SOCKETS,
    _SC_READER_WRITER_LOCKS,
    _SC_REALTIME_SIGNALS,
    _SC_SEMAPHORES,
    _SC_SHARED_MEMORY_OBJECTS,
    _SC_SPAWN,
    _SC_SPIN_LOCKS,
    _SC_SYNCHRONIZED_IO,
    _SC_THREAD_ATTR_STACKADDR,
    _SC_THREAD_ATTR_STACKSIZE,
    _SC_THREAD_CPUTIME,
    _SC_THREAD_PRIO_INHERIT,
    _SC_THREAD_PRIO_PROTECT,
    _SC_THREAD_PRIORITY_SCHEDULING,
    _SC_THREAD_PROCESS_SHARED,
    _SC_THREAD_SAFE_FUNCTIONS,
    _SC_THREADS,
    _SC_TIMEOUTS,
    _SC_TIMERS,
    _SC_VERSION,
    _SC_2_C_BIND,
    _SC_2_C_DEV,
    _SC_2_CHAR_TERM,
    _SC_2_LOCALEDEF,
    _SC_2_SW_DEV,
    _SC_2_VERSION,
    _SC_MQ_OPEN_MAX,
    _SC_XOPEN_STREAMS,
    _SC_XBS5_LP64_OFF64,
    _SC_XBS5_LPBIG_OFFBIG,
    _SC_AIO_LISTIO_MAX,
    _SC_AIO_MAX,
    _SC_SPORADIC_SERVER,
    _SC_THREAD_SPORADIC_SERVER,
    _SC_TRACE,
    _SC_TRACE_EVENT_FILTER,
    _SC_TRACE_EVENT_NAME_MAX,
    _SC_TRACE_INHERIT,
    _SC_TRACE_LOG,
    _SC_TRACE_NAME_MAX,
    _SC_TRACE_SYS_MAX,
    _SC_TRACE_USER_EVENT_MAX,
    _SC_TYPED_MEMORY_OBJECTS,
    _SC_V6_LP64_OFF64,
    _SC_V6_LPBIG_OFFBIG,
    _SC_2_FORT_DEV,
    _SC_2_FORT_RUN,
    _SC_2_PBS,
    _SC_2_PBS_ACCOUNTING,
    _SC_2_PBS_CHECKPOINT,
    _SC_2_PBS_LOCATE,
    _SC_2_PBS_MESSAGE,
    _SC_2_PBS_TRACK,
    _SC_2_UPE,
    _SC_THREAD_THREADS_MAX,
    _SC_SEM_NSEMS_MAX,
    _SC_SYMLOOP_MAX,
    _SC_TIMER_MAX,
    _SC_V6_ILP32_OFF32,
    _SC_V6_ILP32_OFFBIG,
    _SC_JOB_CONTROL,
    _SC_REGEXP,
    _SC_SAVED_IDS,
    _SC_SHELL,
    _SC_XBS5_ILP32_OFF32,
    _SC_XBS5_ILP32_OFFBIG,
    _SC_XOPEN_CRYPT,
    _SC_XOPEN_ENH_I18N,
    _SC_XOPEN_LEGACY,
    _SC_XOPEN_REALTIME,
    _SC_XOPEN_REALTIME_THREADS,
    _SC_XOPEN_SHM,
    _SC_XOPEN_UNIX,
    _SC_THREAD_KEYS_MAX,
    _SC_IOV_MAX,
    _SC_GETGR_R_SIZE_MAX,
    _SC_GETPW_R_SIZE_MAX,
    _SC_OPEN_MAX,
    _SC_RTSIG_MAX,
    _SC_EXPR_NEST_MAX,
    _SC_TTY_NAME_MAX,
    _SC_ATEXIT_MAX,
    _SC_DELAYTIMER_MAX,
    _SC_SEM_VALUE_MAX,
    _SC_SIGQUEUE_MAX,
    _SC_CHILD_MAX,
    _SC_BC_SCALE_MAX,
    _SC_BC_BASE_MAX,
    _SC_LINE_MAX,
    _SC_BC_DIM_MAX,
    _SC_ARG_MAX,
    _SC_NGROUPS_MAX,
    _SC_MQ_PRIO_MAX,
    _SC_RE_DUP_MAX,
    _SC_THREAD_STACK_MIN,
    _SC_BC_STRING_MAX,
    _SC_XOPEN_VERSION,
    _SC_LOGIN_NAME_MAX,
    _SC_COLL_WEIGHTS_MAX,
    _SC_CLK_TCK,
    _SC_HOST_NAME_MAX,
    _SC_AIO_PRIO_DELTA_MAX,
    _SC_STREAM_MAX,
    _SC_TZNAME_MAX,
    _SC_THREAD_DESTRUCTOR_ITERATIONS
  };
  char* names[] = {
    "_SC_PAGE_SIZE",
    "_SC_PAGESIZE",
    "_SC_ADVISORY_INFO",
    "_SC_BARRIERS",
    "_SC_ASYNCHRONOUS_IO",
    "_SC_CLOCK_SELECTION",
    "_SC_CPUTIME",
    "_SC_FSYNC",
    "_SC_IPV6",
    "_SC_MAPPED_FILES",
    "_SC_MEMLOCK",
    "_SC_MEMLOCK_RANGE",
    "_SC_MEMORY_PROTECTION",
    "_SC_MESSAGE_PASSING",
    "_SC_MONOTONIC_CLOCK",
    "_SC_PRIORITIZED_IO",
    "_SC_PRIORITY_SCHEDULING",
    "_SC_RAW_SOCKETS",
    "_SC_READER_WRITER_LOCKS",
    "_SC_REALTIME_SIGNALS",
    "_SC_SEMAPHORES",
    "_SC_SHARED_MEMORY_OBJECTS",
    "_SC_SPAWN",
    "_SC_SPIN_LOCKS",
    "_SC_SYNCHRONIZED_IO",
    "_SC_THREAD_ATTR_STACKADDR",
    "_SC_THREAD_ATTR_STACKSIZE",
    "_SC_THREAD_CPUTIME",
    "_SC_THREAD_PRIO_INHERIT",
    "_SC_THREAD_PRIO_PROTECT",
    "_SC_THREAD_PRIORITY_SCHEDULING",
    "_SC_THREAD_PROCESS_SHARED",
    "_SC_THREAD_SAFE_FUNCTIONS",
    "_SC_THREADS",
    "_SC_TIMEOUTS",
    "_SC_TIMERS",
    "_SC_VERSION",
    "_SC_2_C_BIND",
    "_SC_2_C_DEV",
    "_SC_2_CHAR_TERM",
    "_SC_2_LOCALEDEF",
    "_SC_2_SW_DEV",
    "_SC_2_VERSION",
    "_SC_MQ_OPEN_MAX",
    "_SC_XOPEN_STREAMS",
    "_SC_XBS5_LP64_OFF64",
    "_SC_XBS5_LPBIG_OFFBIG",
    "_SC_AIO_LISTIO_MAX",
    "_SC_AIO_MAX",
    "_SC_SPORADIC_SERVER",
    "_SC_THREAD_SPORADIC_SERVER",
    "_SC_TRACE",
    "_SC_TRACE_EVENT_FILTER",
    "_SC_TRACE_EVENT_NAME_MAX",
    "_SC_TRACE_INHERIT",
    "_SC_TRACE_LOG",
    "_SC_TRACE_NAME_MAX",
    "_SC_TRACE_SYS_MAX",
    "_SC_TRACE_USER_EVENT_MAX",
    "_SC_TYPED_MEMORY_OBJECTS",
    "_SC_V6_LP64_OFF64",
    "_SC_V6_LPBIG_OFFBIG",
    "_SC_2_FORT_DEV",
    "_SC_2_FORT_RUN",
    "_SC_2_PBS",
    "_SC_2_PBS_ACCOUNTING",
    "_SC_2_PBS_CHECKPOINT",
    "_SC_2_PBS_LOCATE",
    "_SC_2_PBS_MESSAGE",
    "_SC_2_PBS_TRACK",
    "_SC_2_UPE",
    "_SC_THREAD_THREADS_MAX",
    "_SC_SEM_NSEMS_MAX",
    "_SC_SYMLOOP_MAX",
    "_SC_TIMER_MAX",
    "_SC_V6_ILP32_OFF32",
    "_SC_V6_ILP32_OFFBIG",
    "_SC_JOB_CONTROL",
    "_SC_REGEXP",
    "_SC_SAVED_IDS",
    "_SC_SHELL",
    "_SC_XBS5_ILP32_OFF32",
    "_SC_XBS5_ILP32_OFFBIG",
    "_SC_XOPEN_CRYPT",
    "_SC_XOPEN_ENH_I18N",
    "_SC_XOPEN_LEGACY",
    "_SC_XOPEN_REALTIME",
    "_SC_XOPEN_REALTIME_THREADS",
    "_SC_XOPEN_SHM",
    "_SC_XOPEN_UNIX",
    "_SC_THREAD_KEYS_MAX",
    "_SC_IOV_MAX",
    "_SC_GETGR_R_SIZE_MAX",
    "_SC_GETPW_R_SIZE_MAX",
    "_SC_OPEN_MAX",
    "_SC_RTSIG_MAX",
    "_SC_EXPR_NEST_MAX",
    "_SC_TTY_NAME_MAX",
    "_SC_ATEXIT_MAX",
    "_SC_DELAYTIMER_MAX",
    "_SC_SEM_VALUE_MAX",
    "_SC_SIGQUEUE_MAX",
    "_SC_CHILD_MAX",
    "_SC_BC_SCALE_MAX",
    "_SC_BC_BASE_MAX",
    "_SC_LINE_MAX",
    "_SC_BC_DIM_MAX",
    "_SC_ARG_MAX",
    "_SC_NGROUPS_MAX",
    "_SC_MQ_PRIO_MAX",
    "_SC_RE_DUP_MAX",
    "_SC_THREAD_STACK_MIN",
    "_SC_BC_STRING_MAX",
    "_SC_XOPEN_VERSION",
    "_SC_LOGIN_NAME_MAX",
    "_SC_COLL_WEIGHTS_MAX",
    "_SC_CLK_TCK",
    "_SC_HOST_NAME_MAX",
    "_SC_AIO_PRIO_DELTA_MAX",
    "_SC_STREAM_MAX",
    "_SC_TZNAME_MAX",
    "_SC_THREAD_DESTRUCTOR_ITERATIONS"
  };
  char buffer[256];

  for (int i = 0; i < sizeof vals / sizeof vals[0]; i++) {
    printf("%s: %ld\n", names[i], sysconf(vals[i]));
    assert(errno == 0);
  }

  printf("(invalid): %ld\n", sysconf(-123));
  printf("errno: %s\n", strerror(errno));

  return 0;
}
