root/usr/src/cmd/getconf/getconf.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright 1985, 1993 by Mortice Kern Systems Inc.  All rights reserved.
 *
 */

/*
 * Copyright (c) 2018, Joyent, Inc.
 */

/*
 * getconf -- POSIX.2 compatible utility to query configuration specific
 *            parameters.
 *         -- XPG4 support added June/93
 *
 *         -- XPG5 support added Dec/97
 *
 *         -- XPG6 support added May/2003
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
#include <locale.h>
#include <libintl.h>
#include <assert.h>

extern size_t confstr(int, char *, size_t);

static int aflag = 0;

#define INVAL_ARG       "getconf: Invalid argument (%s)\n"
#define INVAL_PATHARG   "getconf: Invalid argument (%s or %s)\n"

/*
 *  Notes:
 *  The sctab.value field is defined to be a long.
 *  There are some values that are "unsigned long"; these values
 *  can be stored in a "long" field but when output, must be printed
 *  as an unsigned value. Thus, these values must have UNSIGNED_VALUE bit
 *  set in sctab.flag field.
 *
 *  There are 2 different ways to indicate a symbol is undefined:
 *     1) sctab.flag = UNDEFINED
 *     2) or sctab.value = -1 (and if !UNDEFINED and !UNSIGNED_VALUE)
 *
 *  There are a group of symbols (e.g CHAR_MIN, INT_MAX, INT_MIN, LONG_BIT ...)
 *  which we may set to -1 if they are not pre-defined in a system header file.
 *  This is used to indicate that these symbols are "undefined".
 *  We are assuming that these symbols cannot reasonably have a value of -1
 *  if they were defined in a system header file.
 *  (Unless of course -1 can be used to indicate "undefined" for that symbol)
 */

static struct sctab {
        long value;
        char *name;
        enum { SELFCONF, SYSCONF, PATHCONF, CONFSTR } type;
        int flag;
/* bit fields for sctab.flag member */
#define NOFLAGS         0       /* no special indicators */
#define UNDEFINED       1       /* value is known undefined at compile time */
#define UNSIGNED_VALUE  2       /* value is an unsigned */
} sctab[] = {
/*
 * Some entries in this structure have both leading _ and non leading _
 * versions for compatibility with various versions of the specifications.
 * It is not expected that both forms will be required for new entries.
 */

        /* POSIX.2-1992 table 2-17 */
        _POSIX2_BC_BASE_MAX,    "POSIX2_BC_BASE_MAX",   SELFCONF,   NOFLAGS,
        _POSIX2_BC_BASE_MAX,    "_POSIX2_BC_BASE_MAX",  SELFCONF,  NOFLAGS,
        _POSIX2_BC_DIM_MAX,     "POSIX2_BC_DIM_MAX",    SELFCONF,   NOFLAGS,
        _POSIX2_BC_DIM_MAX,     "_POSIX2_BC_DIM_MAX",   SELFCONF,  NOFLAGS,
        _POSIX2_BC_SCALE_MAX,   "POSIX2_BC_SCALE_MAX",  SELFCONF,   NOFLAGS,
        _POSIX2_BC_SCALE_MAX,   "_POSIX2_BC_SCALE_MAX", SELFCONF,  NOFLAGS,
        _POSIX2_BC_STRING_MAX,  "POSIX2_BC_STRING_MAX", SELFCONF,   NOFLAGS,
        _POSIX2_BC_STRING_MAX,  "_POSIX2_BC_STRING_MAX", SELFCONF, NOFLAGS,
        _POSIX2_COLL_WEIGHTS_MAX, "POSIX2_COLL_WEIGHTS_MAX", SELFCONF,  NOFLAGS,
        _POSIX2_COLL_WEIGHTS_MAX, "_POSIX2_COLL_WEIGHTS_MAX", SELFCONF, NOFLAGS,
        _POSIX2_EXPR_NEST_MAX,  "POSIX2_EXPR_NEST_MAX", SELFCONF,   NOFLAGS,
        _POSIX2_EXPR_NEST_MAX,  "_POSIX2_EXPR_NEST_MAX", SELFCONF,   NOFLAGS,
        _POSIX2_LINE_MAX,       "POSIX2_LINE_MAX",      SELFCONF,   NOFLAGS,
        _POSIX2_LINE_MAX,       "_POSIX2_LINE_MAX",     SELFCONF,  NOFLAGS,
        _POSIX2_RE_DUP_MAX,     "POSIX2_RE_DUP_MAX",    SELFCONF,   NOFLAGS,
        _POSIX2_RE_DUP_MAX,     "_POSIX2_RE_DUP_MAX",   SELFCONF,   NOFLAGS,
        /* See limits.h section below for _POSIX_RE_DUP_MAX */

        /* UNIX 98 */
        _POSIX_AIO_LISTIO_MAX,  "_POSIX_AIO_LISTIO_MAX", SELFCONF,      NOFLAGS,
        _POSIX_AIO_MAX,         "_POSIX_AIO_MAX",        SELFCONF,      NOFLAGS,
        _POSIX_DELAYTIMER_MAX,  "_POSIX_DELAYTIMER_MAX", SELFCONF,      NOFLAGS,
        _POSIX_LOGIN_NAME_MAX,  "_POSIX_LOGIN_NAME_MAX", SELFCONF,      NOFLAGS,
        _POSIX_MQ_OPEN_MAX,     "_POSIX_MQ_OPEN_MAX",    SELFCONF,      NOFLAGS,
        _POSIX_MQ_PRIO_MAX,     "_POSIX_MQ_PRIO_MAX",    SELFCONF,      NOFLAGS,
        _POSIX_RTSIG_MAX,       "_POSIX_RTSIG_MAX",      SELFCONF,      NOFLAGS,
        _POSIX_SEM_NSEMS_MAX,   "_POSIX_SEM_NSEMS_MAX",  SELFCONF,      NOFLAGS,
        _POSIX_SEM_VALUE_MAX,   "_POSIX_SEM_VALUE_MAX",  SELFCONF,      NOFLAGS,
        _POSIX_SIGQUEUE_MAX,    "_POSIX_SIGQUEUE_MAX",   SELFCONF,      NOFLAGS,
        _POSIX_TTY_NAME_MAX,    "_POSIX_TTY_NAME_MAX",   SELFCONF,      NOFLAGS,

        /* UNIX 03 */
        _POSIX_HOST_NAME_MAX,   "_POSIX_HOST_NAME_MAX",   SELFCONF,   NOFLAGS,
        _POSIX_RE_DUP_MAX,      "_POSIX_RE_DUP_MAX",      SELFCONF,   NOFLAGS,
        _POSIX_CLOCKRES_MIN,    "_POSIX_CLOCKRES_MIN",    SELFCONF,   NOFLAGS,
        _POSIX_SYMLINK_MAX,     "_POSIX_SYMLINK_MAX",     SELFCONF,   NOFLAGS,
        _POSIX_SYMLOOP_MAX,     "_POSIX_SYMLOOP_MAX",     SELFCONF,   NOFLAGS,
        CHARCLASS_NAME_MAX, "_POSIX2_CHARCLASS_NAME_MAX", SELFCONF,   NOFLAGS,

        /* POSIX.2-1992 table 2-17 */
        _SC_2_VERSION,          "POSIX2_VERSION",       SYSCONF,   NOFLAGS,
        _SC_2_VERSION,          "_POSIX2_VERSION",      SYSCONF,   NOFLAGS,

        /* POSIX.2-1992 table 2-18 */
        _SC_BC_BASE_MAX,        "BC_BASE_MAX",          SYSCONF,   NOFLAGS,
        _SC_BC_DIM_MAX,         "BC_DIM_MAX",           SYSCONF,   NOFLAGS,
        _SC_BC_SCALE_MAX,       "BC_SCALE_MAX",         SYSCONF,   NOFLAGS,
        _SC_BC_STRING_MAX,      "BC_STRING_MAX",        SYSCONF,   NOFLAGS,
        _SC_COLL_WEIGHTS_MAX,   "COLL_WEIGHTS_MAX",     SYSCONF,   NOFLAGS,
        _SC_EXPR_NEST_MAX,      "EXPR_NEST_MAX",        SYSCONF,   NOFLAGS,
        _SC_LINE_MAX,           "LINE_MAX",             SYSCONF,   NOFLAGS,
        _SC_RE_DUP_MAX,         "RE_DUP_MAX",           SYSCONF,   NOFLAGS,

        /* POSIX.2-1992 table 2-19 */
        _SC_2_C_BIND,           "POSIX2_C_BIND",        SYSCONF,   NOFLAGS,
        _SC_2_C_BIND,           "_POSIX2_C_BIND",       SYSCONF,   NOFLAGS,
        _SC_2_C_DEV,            "POSIX2_C_DEV",         SYSCONF,   NOFLAGS,
        _SC_2_C_DEV,            "_POSIX2_C_DEV",        SYSCONF,   NOFLAGS,
        _SC_2_CHAR_TERM,        "POSIX2_CHAR_TERM",     SYSCONF,   NOFLAGS,
        _SC_2_CHAR_TERM,        "_POSIX2_CHAR_TERM",    SYSCONF,   NOFLAGS,
        _SC_2_FORT_DEV,         "POSIX2_FORT_DEV",      SYSCONF,   NOFLAGS,
        _SC_2_FORT_DEV,         "_POSIX2_FORT_DEV",     SYSCONF,   NOFLAGS,
        _SC_2_FORT_RUN,         "POSIX2_FORT_RUN",      SYSCONF,   NOFLAGS,
        _SC_2_FORT_RUN,         "_POSIX2_FORT_RUN",     SYSCONF,   NOFLAGS,
        _SC_2_LOCALEDEF,        "POSIX2_LOCALEDEF",     SYSCONF,   NOFLAGS,
        _SC_2_LOCALEDEF,        "_POSIX2_LOCALEDEF",    SYSCONF,   NOFLAGS,
        _SC_2_SW_DEV,           "POSIX2_SW_DEV",        SYSCONF,   NOFLAGS,
        _SC_2_SW_DEV,           "_POSIX2_SW_DEV",       SYSCONF,   NOFLAGS,
        _SC_2_UPE,              "POSIX2_UPE",           SYSCONF,   NOFLAGS,
        _SC_2_UPE,              "_POSIX2_UPE",          SYSCONF,   NOFLAGS,

        /* POSIX.1-1990 table 2-3 */
        _POSIX_ARG_MAX,         "_POSIX_ARG_MAX",       SELFCONF,   NOFLAGS,
        _POSIX_CHILD_MAX,       "_POSIX_CHILD_MAX",     SELFCONF,   NOFLAGS,
        _POSIX_LINK_MAX,        "_POSIX_LINK_MAX",      SELFCONF,   NOFLAGS,
        _POSIX_MAX_CANON,       "_POSIX_MAX_CANON",     SELFCONF,   NOFLAGS,
        _POSIX_MAX_INPUT,       "_POSIX_MAX_INPUT",     SELFCONF,   NOFLAGS,
        _POSIX_NAME_MAX,        "_POSIX_NAME_MAX",      SELFCONF,   NOFLAGS,
        _POSIX_NGROUPS_MAX,     "_POSIX_NGROUPS_MAX",   SELFCONF,   NOFLAGS,
        _POSIX_OPEN_MAX,        "_POSIX_OPEN_MAX",      SELFCONF,   NOFLAGS,
        _POSIX_PATH_MAX,        "_POSIX_PATH_MAX",      SELFCONF,   NOFLAGS,
        _POSIX_PIPE_BUF,        "_POSIX_PIPE_BUF",      SELFCONF,   NOFLAGS,
        _POSIX_SSIZE_MAX,       "_POSIX_SSIZE_MAX",     SELFCONF,   NOFLAGS,
        _POSIX_STREAM_MAX,      "_POSIX_STREAM_MAX",    SELFCONF,   NOFLAGS,
        _POSIX_TIMER_MAX,       "_POSIX_TIMER_MAX",     SELFCONF,   NOFLAGS,
        _POSIX_THREAD_DESTRUCTOR_ITERATIONS,
                "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",  SELFCONF,   NOFLAGS,
        _POSIX_THREAD_KEYS_MAX,
                "_POSIX_THREAD_KEYS_MAX",               SELFCONF,   NOFLAGS,
        _POSIX_THREAD_THREADS_MAX,
                "_POSIX_THREAD_THREADS_MAX",            SELFCONF,   NOFLAGS,
        _POSIX_TZNAME_MAX,      "_POSIX_TZNAME_MAX",    SELFCONF,   NOFLAGS,

        /* POSIX.1-1990 table 4-2 */
        _SC_ARG_MAX,            "ARG_MAX",              SYSCONF,   NOFLAGS,
        _SC_CHILD_MAX,          "CHILD_MAX",            SYSCONF,   NOFLAGS,
        _SC_CLK_TCK,            "CLK_TCK",              SYSCONF,   NOFLAGS,
        _SC_JOB_CONTROL,        "_POSIX_JOB_CONTROL",   SYSCONF,   NOFLAGS,
        _SC_NGROUPS_MAX,        "NGROUPS_MAX",          SYSCONF,   NOFLAGS,
        _SC_OPEN_MAX,           "OPEN_MAX",             SYSCONF,   NOFLAGS,
        _SC_SAVED_IDS,          "_POSIX_SAVED_IDS",     SYSCONF,   NOFLAGS,
        _SC_STREAM_MAX,         "STREAM_MAX",           SYSCONF,   NOFLAGS,
        _SC_TZNAME_MAX,         "TZNAME_MAX",           SYSCONF,   NOFLAGS,
        _SC_VERSION,            "_POSIX_VERSION",       SYSCONF,   NOFLAGS,

        /* pathconf() variables */

        /* POSIX.1-1990 table 5-2 */

        _PC_LINK_MAX,           "LINK_MAX",             PATHCONF,  NOFLAGS,
        _PC_MAX_CANON,          "MAX_CANON",            PATHCONF,  NOFLAGS,
        _PC_MAX_INPUT,          "MAX_INPUT",            PATHCONF,  NOFLAGS,
        _PC_NAME_MAX,           "NAME_MAX",             PATHCONF,  NOFLAGS,
        _PC_PATH_MAX,           "PATH_MAX",             PATHCONF,  NOFLAGS,
        _PC_PIPE_BUF,           "PIPE_BUF",             PATHCONF,  NOFLAGS,
        _PC_CHOWN_RESTRICTED,   "_POSIX_CHOWN_RESTRICTED", PATHCONF,  NOFLAGS,
        _PC_NO_TRUNC,           "_POSIX_NO_TRUNC",      PATHCONF,  NOFLAGS,
        _PC_VDISABLE,           "_POSIX_VDISABLE",      PATHCONF,  NOFLAGS,

        /* UNIX 98 additions */

        _PC_ASYNC_IO,           "_POSIX_ASYNC_IO",      PATHCONF,  NOFLAGS,
        _PC_PRIO_IO,            "_POSIX_PRIO_IO",       PATHCONF,  NOFLAGS,
        _PC_SYNC_IO,            "_POSIX_SYNC_IO",       PATHCONF,  NOFLAGS,

        /* Large File Summit name (UNIX 98) */

        _PC_FILESIZEBITS,       "FILESIZEBITS",         PATHCONF,  NOFLAGS,
        _PC_XATTR_ENABLED,      "XATTR_ENABLED",        PATHCONF,  NOFLAGS,
        _PC_XATTR_EXISTS,       "XATTR_EXISTS",         PATHCONF,  NOFLAGS,

        /* UNIX 03 Additions */

        /* Advisory Information (ADV) */
        _PC_ALLOC_SIZE_MIN,     "POSIX_ALLOC_SIZE_MIN", PATHCONF,  NOFLAGS,
        _PC_REC_INCR_XFER_SIZE, "POSIX_REC_INCR_XFER_SIZE", PATHCONF,  NOFLAGS,
        _PC_REC_MAX_XFER_SIZE,  "POSIX_REC_MAX_XFER_SIZE",  PATHCONF,  NOFLAGS,
        _PC_REC_MIN_XFER_SIZE,  "POSIX_REC_MIN_XFER_SIZE",  PATHCONF,  NOFLAGS,
        _PC_REC_XFER_ALIGN,     "POSIX_REC_XFER_ALIGN", PATHCONF,  NOFLAGS,

        _PC_2_SYMLINKS,         "POSIX2_SYMLINKS",      PATHCONF,  NOFLAGS,
        _PC_SYMLINK_MAX,        "SYMLINK_MAX",          PATHCONF,  NOFLAGS,

        _PC_ACL_ENABLED,        "ACL_ENABLED",          PATHCONF,  NOFLAGS,
        _PC_MIN_HOLE_SIZE,      "MIN_HOLE_SIZE",        PATHCONF,  NOFLAGS,
        _PC_SATTR_ENABLED,      "SATTR_ENABLED",        PATHCONF,  NOFLAGS,
        _PC_SATTR_EXISTS,       "SATTR_EXISTS",         PATHCONF,  NOFLAGS,

        /* UNIX 08 additions */

        _PC_TIMESTAMP_RESOLUTION, "_POSIX_TIMESTAMP_RESOLUTION",
            PATHCONF,   NOFLAGS,

        /* confstr() variables */

        /* POSIX.2-1992 description of getconf utility */
        _CS_PATH,               "PATH",                 CONFSTR,   NOFLAGS,

        /* POSIX.2-1992 table B-18 */
        _CS_PATH,               "CS_PATH",              CONFSTR,   NOFLAGS,
        _CS_PATH,               "_CS_PATH",             CONFSTR,   NOFLAGS,

        /* command names for large file configuration information */
        /* large file compilation environment configuration */

        _CS_LFS_CFLAGS,         "LFS_CFLAGS",           CONFSTR,   NOFLAGS,
        _CS_LFS_LDFLAGS,        "LFS_LDFLAGS",          CONFSTR,   NOFLAGS,
        _CS_LFS_LIBS,           "LFS_LIBS",             CONFSTR,   NOFLAGS,
        _CS_LFS_LINTFLAGS,      "LFS_LINTFLAGS",        CONFSTR,   NOFLAGS,

        /* transitional large file interface configuration */

        _CS_LFS64_CFLAGS,       "LFS64_CFLAGS",         CONFSTR,   NOFLAGS,
        _CS_LFS64_LDFLAGS,      "LFS64_LDFLAGS",        CONFSTR,   NOFLAGS,
        _CS_LFS64_LIBS,         "LFS64_LIBS",           CONFSTR,   NOFLAGS,
        _CS_LFS64_LINTFLAGS,    "LFS64_LINTFLAGS",      CONFSTR,   NOFLAGS,

        /*
         *  UNIX 98:
         *  confstr additions, these support
         *  programming specifications/environments.
         *
         * Unfortunately there is some uncertainty with
         * the standard at this point about the constant
         * name, thus we need to recognize BOTH with and
         * without the initial underscore.
         */
        _CS_XBS5_ILP32_OFF32_CFLAGS,    "XBS5_ILP32_OFF32_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFF32_CFLAGS,    "_XBS5_ILP32_OFF32_CFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFF32_LDFLAGS,   "XBS5_ILP32_OFF32_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFF32_LDFLAGS,   "_XBS5_ILP32_OFF32_LDFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFF32_LIBS,      "XBS5_ILP32_OFF32_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFF32_LIBS,      "_XBS5_ILP32_OFF32_LIBS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFF32_LINTFLAGS, "XBS5_ILP32_OFF32_LINTFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFF32_LINTFLAGS, "_XBS5_ILP32_OFF32_LINTFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "XBS5_ILP32_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "_XBS5_ILP32_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "XBS5_ILP32_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "_XBS5_ILP32_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFFBIG_LIBS,     "XBS5_ILP32_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFFBIG_LIBS,     "_XBS5_ILP32_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "XBS5_ILP32_OFFBIG_LINTFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "_XBS5_ILP32_OFFBIG_LINTFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LP64_OFF64_CFLAGS,     "XBS5_LP64_OFF64_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LP64_OFF64_CFLAGS,     "_XBS5_LP64_OFF64_CFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LP64_OFF64_LDFLAGS,    "XBS5_LP64_OFF64_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LP64_OFF64_LDFLAGS,    "_XBS5_LP64_OFF64_LDFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LP64_OFF64_LIBS,       "XBS5_LP64_OFF64_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LP64_OFF64_LIBS,       "_XBS5_LP64_OFF64_LIBS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LP64_OFF64_LINTFLAGS,  "XBS5_LP64_OFF64_LINTFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LP64_OFF64_LINTFLAGS,  "_XBS5_LP64_OFF64_LINTFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "XBS5_LPBIG_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "_XBS5_LPBIG_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "XBS5_LPBIG_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "_XBS5_LPBIG_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LPBIG_OFFBIG_LIBS,     "XBS5_LPBIG_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LPBIG_OFFBIG_LIBS,     "_XBS5_LPBIG_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,

        _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "XBS5_LPBIG_OFFBIG_LINTFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "_XBS5_LPBIG_OFFBIG_LINTFLAGS",
                CONFSTR,        NOFLAGS,

        /*
         * UNIX 03 confstr() additions for compilation environments
         */
        _CS_POSIX_V6_ILP32_OFF32_CFLAGS, "POSIX_V6_ILP32_OFF32_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, "POSIX_V6_ILP32_OFF32_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_ILP32_OFF32_LIBS, "POSIX_V6_ILP32_OFF32_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, "POSIX_V6_ILP32_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, "POSIX_V6_ILP32_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_ILP32_OFFBIG_LIBS, "POSIX_V6_ILP32_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LP64_OFF64_CFLAGS, "POSIX_V6_LP64_OFF64_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LP64_OFF64_LDFLAGS, "POSIX_V6_LP64_OFF64_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LP64_OFF64_LIBS, "POSIX_V6_LP64_OFF64_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, "POSIX_V6_LPBIG_OFFBIG_CFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, "POSIX_V6_LPBIG_OFFBIG_LDFLAGS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, "POSIX_V6_LPBIG_OFFBIG_LIBS",
                CONFSTR,        NOFLAGS,
        _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS, "POSIX_V6_WIDTH_RESTRICTED_ENVS",
                CONFSTR,        NOFLAGS,
        /* End of UNIX 03 compilation environments */

#ifdef  _SC_2_C_VERSION         /* POSIX.2 table B-4 */
        _SC_2_C_VERSION,        "_POSIX2_C_VERSION",    SYSCONF,   NOFLAGS,
#else
        _POSIX2_C_VERSION,      "_POSIX2_C_VERSION",    SELFCONF,   NOFLAGS,
#endif

/*
 * XPG4 support BEGINS
 */

#ifndef CHARCLASS_NAME_MAX
#define CHARCLASS_NAME_MAX      -1
#endif
#ifndef CHAR_BIT
#define CHAR_BIT        -1
#endif
#ifndef CHAR_MAX
#define CHAR_MAX        -1
#endif
#ifndef CHAR_MIN
#define CHAR_MIN        -1
#endif
#ifndef INT_MAX
#define INT_MAX -1
#endif
#ifndef INT_MIN
#define INT_MIN -1
#endif
#ifndef LONG_BIT
#define LONG_BIT        -1
#endif
#ifndef LONG_MAX
#define LONG_MAX        -1
#endif
#ifndef LONG_MIN
#define LONG_MIN        -1
#endif
#ifndef MB_LEN_MAX
#define MB_LEN_MAX      -1
#endif
#ifndef NL_NMAX
#define NL_NMAX -1
#endif
#ifndef NL_ARGMAX
#define NL_ARGMAX       -1
#endif
#ifndef NL_LANGMAX
#define NL_LANGMAX      -1
#endif
#ifndef NL_MSGMAX
#define NL_MSGMAX       -1
#endif
#ifndef NL_SETMAX
#define NL_SETMAX       -1
#endif
#ifndef NL_TEXTMAX
#define NL_TEXTMAX      -1
#endif
#ifndef NZERO
#define NZERO   -1
#endif
#ifndef SCHAR_MAX
#define SCHAR_MAX       -1
#endif
#ifndef SCHAR_MIN
#define SCHAR_MIN       -1
#endif
#ifndef SHRT_MAX
#define SHRT_MAX        -1
#endif
#ifndef SHRT_MIN
#define SHRT_MIN        -1
#endif
#ifndef TMP_MAX
#define TMP_MAX -1
#endif
#ifndef WORD_BIT
#define WORD_BIT        -1
#endif


#ifndef _XOPEN_XPG2
#define _XOPEN_XPG2     -1
#endif
#ifndef _XOPEN_XPG3
#define _XOPEN_XPG3     -1
#endif
#ifndef _XOPEN_XPG4
#define _XOPEN_XPG4     -1
#endif

        /*
         * the following are values that we should find in <limits.h>
         * so we use SELFCONF here.
         *
         */

        /* POSIX.1-1990 */
        CHARCLASS_NAME_MAX,     "CHARCLASS_NAME_MAX",     SELFCONF,   NOFLAGS,
        SSIZE_MAX,              "SSIZE_MAX",    SELFCONF,   NOFLAGS,

        /* POSIX.1-1988 */
        CHAR_BIT,               "CHAR_BIT",     SELFCONF,   NOFLAGS,
        CHAR_MAX,               "CHAR_MAX",     SELFCONF,   NOFLAGS,
        CHAR_MIN,               "CHAR_MIN",     SELFCONF,   NOFLAGS,
        INT_MAX,                "INT_MAX",      SELFCONF,   NOFLAGS,
        INT_MIN,                "INT_MIN",      SELFCONF,   NOFLAGS,
        LONG_BIT,               "LONG_BIT",     SELFCONF,   NOFLAGS,
        LONG_MAX,               "LONG_MAX",     SELFCONF,   NOFLAGS,
        LONG_MIN,               "LONG_MIN",     SELFCONF,   NOFLAGS,
        MB_LEN_MAX,             "MB_LEN_MAX",   SELFCONF,   NOFLAGS,
        NL_NMAX,                "NL_NMAX",      SELFCONF,   NOFLAGS,
        NL_ARGMAX,              "NL_ARGMAX",    SELFCONF,   NOFLAGS,
        NL_LANGMAX,             "NL_LANGMAX",   SELFCONF,   NOFLAGS,
        NL_MSGMAX,              "NL_MSGMAX",    SELFCONF,   NOFLAGS,
        NL_SETMAX,              "NL_SETMAX",    SELFCONF,   NOFLAGS,
        NL_TEXTMAX,             "NL_TEXTMAX",   SELFCONF,   NOFLAGS,
        NZERO,                  "NZERO",        SELFCONF,   NOFLAGS,
        SCHAR_MAX,              "SCHAR_MAX",    SELFCONF,   NOFLAGS,
        SCHAR_MIN,              "SCHAR_MIN",    SELFCONF,   NOFLAGS,
        SHRT_MAX,               "SHRT_MAX",     SELFCONF,   NOFLAGS,
        SHRT_MIN,               "SHRT_MIN",     SELFCONF,   NOFLAGS,
        TMP_MAX,                "TMP_MAX",      SELFCONF,   NOFLAGS,

        /*
         * for the unsigned maximums, we cannot rely on the value -1
         * to indicate "undefined".
         */
#ifndef UCHAR_MAX
        0,                      "UCHAR_MAX",    SELFCONF,   UNDEFINED,
#else
        (long)UCHAR_MAX,        "UCHAR_MAX",    SELFCONF,   UNSIGNED_VALUE,
#endif /* UCHAR_MAX */
#ifndef UINT_MAX
        0,                      "UINT_MAX",     SELFCONF,   UNDEFINED,
#else
        (long)UINT_MAX,         "UINT_MAX",     SELFCONF,   UNSIGNED_VALUE,
#endif /* UINT_MAX */
#ifndef ULONG_MAX
        0,                      "ULONG_MAX",    SELFCONF,   UNDEFINED,
#else
        (long)ULONG_MAX,        "ULONG_MAX",    SELFCONF,   UNSIGNED_VALUE,
#endif /* ULONG_MAX */
#ifndef USHRT_MAX
        0,                      "USHRT_MAX",    SELFCONF,   UNDEFINED,
#else
        (long)USHRT_MAX,        "USHRT_MAX",    SELFCONF,   UNSIGNED_VALUE,
#endif /* USHRT_MAX */
#ifndef SIZE_MAX
        0,                      "SIZE_MAX",     SELFCONF,   UNDEFINED,
#else
        (long)SIZE_MAX,         "SIZE_MAX",     SELFCONF,   UNSIGNED_VALUE,
#endif /* SIZE_MAX */

        WORD_BIT,               "WORD_BIT",     SELFCONF,   NOFLAGS,

        /* XPG4 Version 2 */
        _XOPEN_IOV_MAX,         "_XOPEN_IOV_MAX",  SELFCONF, NOFLAGS,

        /* UNIX 03 */
        _XOPEN_NAME_MAX,        "_XOPEN_NAME_MAX", SELFCONF, NOFLAGS,
        _XOPEN_PATH_MAX,        "_XOPEN_PATH_MAX", SELFCONF, NOFLAGS,

        /*
         * The following are defined via sysconf().  These are considered
         * an extension to sysconf().
         * The -0 is needed if _XOPEN_XPG? is defined to be an empty string.
         */
        _XOPEN_XPG2-0,          "_XOPEN_XPG2",  SELFCONF,    NOFLAGS,
        _XOPEN_XPG3-0,          "_XOPEN_XPG3",  SELFCONF,    NOFLAGS,
        _XOPEN_XPG4-0,          "_XOPEN_XPG4",  SELFCONF,    NOFLAGS,

        /*
         * The following should be provided by sysconf() (e.g use SYSCONF),
         * so we  look for the appropriate _SC_* symbol in <unistd.h>.
         * If it is not defined, then we use SELFCONF with the value of -1.
         */
        _SC_XOPEN_VERSION,      "_XOPEN_VERSION",       SYSCONF,   NOFLAGS,
        _SC_XOPEN_XCU_VERSION,  "_XOPEN_XCU_VERSION",   SYSCONF,   NOFLAGS,
        _SC_XOPEN_CRYPT,        "_XOPEN_CRYPT",         SYSCONF,   NOFLAGS,
        _SC_XOPEN_ENH_I18N,     "_XOPEN_ENH_I18N",      SYSCONF,   NOFLAGS,
        _SC_XOPEN_SHM,          "_XOPEN_SHM",           SYSCONF,   NOFLAGS,

/*
 * XPG4 support ends
 */

/* XPG4, Version 2 support */

        _SC_ATEXIT_MAX,         "ATEXIT_MAX",           SYSCONF,        NOFLAGS,
        _SC_PAGESIZE,           "PAGESIZE",             SYSCONF,        NOFLAGS,
        _SC_PAGE_SIZE,          "PAGE_SIZE",            SYSCONF,        NOFLAGS,
        _SC_XOPEN_UNIX,         "_XOPEN_UNIX",          SYSCONF,        NOFLAGS,
        _SC_IOV_MAX,            "IOV_MAX",              SYSCONF,        NOFLAGS,

/*
 * UNIX 98 - XPG5 additions
 */
        _SC_XOPEN_LEGACY,       "_XOPEN_LEGACY",        SYSCONF,        NOFLAGS,
        _SC_PASS_MAX,           "PASS_MAX",             SYSCONF,        NOFLAGS,
        _SC_AIO_LISTIO_MAX,     "AIO_LISTIO_MAX",       SYSCONF,        NOFLAGS,
        _SC_AIO_MAX,            "AIO_MAX",              SYSCONF,        NOFLAGS,
        _SC_AIO_PRIO_DELTA_MAX, "AIO_PRIO_DELTA_MAX",   SYSCONF,        NOFLAGS,
        _SC_DELAYTIMER_MAX,     "DELAYTIMER_MAX",       SYSCONF,        NOFLAGS,
        _SC_MQ_OPEN_MAX,        "MQ_OPEN_MAX",          SYSCONF,        NOFLAGS,
        _SC_MQ_PRIO_MAX,        "MQ_PRIO_MAX",          SYSCONF,        NOFLAGS,
        _SC_RTSIG_MAX,          "RTSIG_MAX",            SYSCONF,        NOFLAGS,
        _SC_SEM_NSEMS_MAX,      "SEM_NSEMS_MAX",        SYSCONF,        NOFLAGS,
        _SC_SEM_VALUE_MAX,      "SEM_VALUE_MAX",        SYSCONF,        NOFLAGS,
        _SC_SIGQUEUE_MAX,       "SIGQUEUE_MAX",         SYSCONF,        NOFLAGS,
        _SC_TIMER_MAX,          "TIMER_MAX",            SYSCONF,        NOFLAGS,

        _SC_ASYNCHRONOUS_IO,    "_POSIX_ASYNCHRONOUS_IO", SYSCONF,      NOFLAGS,
        _SC_FSYNC,              "_POSIX_FSYNC",         SYSCONF,        NOFLAGS,
        _SC_MAPPED_FILES,       "_POSIX_MAPPED_FILES",  SYSCONF,        NOFLAGS,
        _SC_MEMLOCK,            "_POSIX_MEMLOCK",       SYSCONF,        NOFLAGS,
        _SC_MEMLOCK_RANGE,      "_POSIX_MEMLOCK_RANGE", SYSCONF,        NOFLAGS,
        _SC_MEMORY_PROTECTION,  "_POSIX_MEMORY_PROTECTION", SYSCONF,    NOFLAGS,
        _SC_MESSAGE_PASSING,    "_POSIX_MESSAGE_PASSING", SYSCONF,      NOFLAGS,
        _SC_PRIORITIZED_IO,     "_POSIX_PRIORITIZED_IO", SYSCONF,       NOFLAGS,
        _SC_PRIORITY_SCHEDULING, "_POSIX_PRIORITY_SCHEDULING", SYSCONF, NOFLAGS,
        _SC_REALTIME_SIGNALS,   "_POSIX_REALTIME_SIGNALS", SYSCONF,     NOFLAGS,
        _SC_SEMAPHORES,         "_POSIX_SEMAPHORES",    SYSCONF,        NOFLAGS,

        _SC_SHARED_MEMORY_OBJECTS, "_POSIX_SHARED_MEMORY_OBJECTS",
            SYSCONF,    NOFLAGS,

        _SC_SYNCHRONIZED_IO,    "_POSIX_SYNCHRONIZED_IO", SYSCONF,      NOFLAGS,
        _SC_TIMERS,             "_POSIX_TIMERS",        SYSCONF,        NOFLAGS,

        _SC_LOGIN_NAME_MAX,     "LOGIN_NAME_MAX",       SYSCONF,        NOFLAGS,

        _SC_THREAD_DESTRUCTOR_ITERATIONS, "PTHREAD_DESTRUCTOR_ITERATIONS",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_KEYS_MAX,    "PTHREAD_KEYS_MAX",     SYSCONF,        NOFLAGS,
        _SC_THREAD_STACK_MIN,   "PTHREAD_STACK_MIN",    SYSCONF,        NOFLAGS,
        _SC_THREAD_THREADS_MAX, "PTHREAD_THREADS_MAX",  SYSCONF,        NOFLAGS,

        _SC_THREADS,            "_POSIX_THREADS",       SYSCONF,        NOFLAGS,

        _SC_THREAD_ATTR_STACKADDR, "POSIX_THREAD_ATTR_STACKADDR",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_ATTR_STACKADDR, "_POSIX_THREAD_ATTR_STACKADDR",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_ATTR_STACKSIZE, "POSIX_THREAD_ATTR_STACKSIZE",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_ATTR_STACKSIZE, "_POSIX_THREAD_ATTR_STACKSIZE",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_PRIORITY_SCHEDULING, "POSIX_THREAD_PRIORITY_SCHEDULING",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_PRIORITY_SCHEDULING, "_POSIX_THREAD_PRIORITY_SCHEDULING",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_PRIO_INHERIT, "POSIX_THREAD_PRIO_INHERIT",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_PRIO_INHERIT, "_POSIX_THREAD_PRIO_INHERIT",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_PRIO_PROTECT, "POSIX_THREAD_PRIO_PROTECT",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_PRIO_PROTECT, "_POSIX_THREAD_PRIO_PROTECT",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_PROCESS_SHARED, "POSIX_THREAD_PROCESS_SHARED",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_PROCESS_SHARED, "_POSIX_THREAD_PROCESS_SHARED",
            SYSCONF,    NOFLAGS,

        _SC_THREAD_SAFE_FUNCTIONS, "POSIX_THREAD_SAFE_FUNCTIONS",
            SYSCONF,    NOFLAGS,
        _SC_THREAD_SAFE_FUNCTIONS, "_POSIX_THREAD_SAFE_FUNCTIONS",
            SYSCONF,    NOFLAGS,

        _SC_TTY_NAME_MAX,       "TTY_NAME_MAX",         SYSCONF,        NOFLAGS,
        _SC_XOPEN_REALTIME,     "_XOPEN_REALTIME",      SYSCONF,        NOFLAGS,
        _SC_XOPEN_REALTIME_THREADS, "_XOPEN_REALTIME_THREADS", SYSCONF, NOFLAGS,

        /*
         * Due to ambiguity in the standard we need
         * to recognize both the underscored name
         * and the non-underscored version in the
         * following variables.
         */
        _SC_XBS5_ILP32_OFF32,   "XBS5_ILP32_OFF32",     SYSCONF,        NOFLAGS,
        _SC_XBS5_ILP32_OFF32,   "_XBS5_ILP32_OFF32",    SYSCONF,        NOFLAGS,

        _SC_XBS5_ILP32_OFFBIG,  "XBS5_ILP32_OFFBIG",    SYSCONF,        NOFLAGS,
        _SC_XBS5_ILP32_OFFBIG,  "_XBS5_ILP32_OFFBIG",   SYSCONF,        NOFLAGS,

        _SC_XBS5_LP64_OFF64,    "XBS5_LP64_OFF64",      SYSCONF,        NOFLAGS,
        _SC_XBS5_LP64_OFF64,    "_XBS5_LP64_OFF64",     SYSCONF,        NOFLAGS,

        _SC_XBS5_LPBIG_OFFBIG,  "XBS5_LPBIG_OFFBIG",    SYSCONF,        NOFLAGS,
        _SC_XBS5_LPBIG_OFFBIG,  "_XBS5_LPBIG_OFFBIG",   SYSCONF,        NOFLAGS,

/*
 * UNIX 03 additions for sysconf() names, and names that are not in interfaces
 */
        _SC_REGEXP,             "_POSIX_REGEXP",          SYSCONF,      NOFLAGS,
        _SC_SHELL,              "_POSIX_SHELL",           SYSCONF,      NOFLAGS,
        _SC_HOST_NAME_MAX,      "HOST_NAME_MAX",          SYSCONF,      NOFLAGS,
        _SC_READER_WRITER_LOCKS, "_POSIX_READER_WRITER_LOCKS", SYSCONF, NOFLAGS,
        _SC_IPV6,               "_POSIX_IPV6",            SYSCONF,      NOFLAGS,
        _SC_RAW_SOCKETS,        "_POSIX_RAW_SOCKETS",     SYSCONF,      NOFLAGS,
        _SC_XOPEN_STREAMS,      "_XOPEN_STREAMS",         SYSCONF,      NOFLAGS,
        _SC_SYMLOOP_MAX,        "SYMLOOP_MAX",            SYSCONF,      NOFLAGS,
        _SC_2_PBS,              "_POSIX2_PBS",            SYSCONF,      NOFLAGS,
        _SC_2_PBS_ACCOUNTING,   "_POSIX2_PBS_ACCOUNTING", SYSCONF,      NOFLAGS,
        _SC_2_PBS_CHECKPOINT,   "_POSIX2_PBS_CHECKPOINT", SYSCONF,      NOFLAGS,
        _SC_2_PBS_LOCATE,       "_POSIX2_PBS_LOCATE",     SYSCONF,      NOFLAGS,
        _SC_2_PBS_MESSAGE,      "_POSIX2_PBS_MESSAGE",    SYSCONF,      NOFLAGS,
        _SC_2_PBS_TRACK,        "_POSIX2_PBS_TRACK",      SYSCONF,      NOFLAGS,

        _SC_ADVISORY_INFO,      "_POSIX_ADVISORY_INFO",   SYSCONF,      NOFLAGS,
        _SC_BARRIERS,           "_POSIX_BARRIERS",        SYSCONF,      NOFLAGS,
        _SC_CLOCK_SELECTION,    "_POSIX_CLOCK_SELECTION", SYSCONF,      NOFLAGS,
        _SC_CPUTIME,            "_POSIX_CPUTIME",         SYSCONF,      NOFLAGS,
        _SC_MONOTONIC_CLOCK,    "_POSIX_MONOTONIC_CLOCK", SYSCONF,      NOFLAGS,
        _SC_SPAWN,              "_POSIX_SPAWN",           SYSCONF,      NOFLAGS,
        _SC_SPIN_LOCKS,         "_POSIX_SPIN_LOCKS",      SYSCONF,      NOFLAGS,
        _SC_SPORADIC_SERVER,    "_POSIX_SPORADIC_SERVER", SYSCONF,      NOFLAGS,
        _SC_SS_REPL_MAX,        "_POSIX_SS_REPL_MAX",     SYSCONF,      NOFLAGS,
        _SC_THREAD_CPUTIME,     "_POSIX_THREAD_CPUTIME",   SYSCONF,     NOFLAGS,
        _SC_THREAD_SPORADIC_SERVER, "_POSIX_THREAD_SPORADIC_SERVER",    SYSCONF,
                NOFLAGS,
        _SC_TIMEOUTS,           "_POSIX_TIMEOUTS",        SYSCONF,      NOFLAGS,
        _SC_TRACE,              "_POSIX_TRACE",           SYSCONF,      NOFLAGS,
        _SC_TRACE_EVENT_FILTER, "_POSIX_TRACE_EVENT_FILTER", SYSCONF,   NOFLAGS,
        _SC_TRACE_EVENT_NAME_MAX, "_POSIX_TRACE_EVENT_NAME_MAX", SYSCONF,
                                                                        NOFLAGS,
        _SC_TRACE_INHERIT,      "_POSIX_TRACE_INHERIT",   SYSCONF,      NOFLAGS,
        _SC_TRACE_LOG,          "_POSIX_TRACE_LOG",       SYSCONF,      NOFLAGS,
        _SC_TRACE_NAME_MAX,     "_POSIX_TRACE_NAME_MAX",  SYSCONF,      NOFLAGS,
        _SC_TRACE_SYS_MAX,      "_POSIX_TRACE_SYS_MAX",   SYSCONF,      NOFLAGS,
        _SC_TRACE_USER_EVENT_MAX, "_POSIX_TRACE_USER_EVENT_MAX", SYSCONF,
                                                                        NOFLAGS,
        _SC_TYPED_MEMORY_OBJECTS, "_POSIX_TYPED_MEMORY_OBJECTS",        SYSCONF,
                NOFLAGS,

        /*
         * Due to an ambiguity in the specification, we need to recognize both
         * the underscored POSIX name and the non-underscored name. In addition,
         * we need to permit the use of the _V6_* environment names specified
         * in unistd.h.
         */
        _SC_V6_ILP32_OFF32,     "_V6_ILP32_OFF32",      SYSCONF,        NOFLAGS,
        _SC_V6_ILP32_OFF32,     "_POSIX_V6_ILP32_OFF32", SYSCONF,       NOFLAGS,
        _SC_V6_ILP32_OFF32,     "POSIX_V6_ILP32_OFF32", SYSCONF,        NOFLAGS,

        _SC_V6_ILP32_OFFBIG,    "_V6_ILP32_OFFBIG",     SYSCONF,        NOFLAGS,
        _SC_V6_ILP32_OFFBIG,    "_POSIX_V6_ILP32_OFFBIG", SYSCONF,      NOFLAGS,
        _SC_V6_ILP32_OFFBIG,    "POSIX_V6_ILP32_OFFBIG", SYSCONF,       NOFLAGS,

        _SC_V6_LP64_OFF64,      "_V6_LP64_OFF64",       SYSCONF,        NOFLAGS,
        _SC_V6_LP64_OFF64,      "_POSIX_V6_LP64_OFF64", SYSCONF,        NOFLAGS,
        _SC_V6_LP64_OFF64,      "POSIX_V6_LP64_OFF64",  SYSCONF,        NOFLAGS,

        _SC_V6_LPBIG_OFFBIG,    "_V6_LPBIG_OFFBIG",     SYSCONF,        NOFLAGS,
        _SC_V6_LPBIG_OFFBIG,    "_POSIX_V6_LPBIG_OFFBIG", SYSCONF,      NOFLAGS,
        _SC_V6_LPBIG_OFFBIG,    "POSIX_V6_LPBIG_OFFBIG",  SYSCONF,      NOFLAGS,
/*
 * System V Interface Definition
 */
        _SC_NPROCESSORS_CONF,   "NPROCESSORS_CONF",     SYSCONF,        NOFLAGS,
        _SC_NPROCESSORS_MAX,    "NPROCESSORS_MAX",      SYSCONF,        NOFLAGS,
        _SC_NPROCESSORS_ONLN,   "NPROCESSORS_ONLN",     SYSCONF,        NOFLAGS,
        0,              NULL,   0,      0               /* end of table */
};


/*
 * Print usage message.
 */
static int
usage()
{

        (void) fputs(gettext(
            "usage:\tgetconf [-v specification] system_var\n"
            "\tgetconf [-v specification] path_var pathname\n"
            "\tgetconf -a\n"), stderr);
        return (2);
}


static int
namecmp(const void *a, const void *b)
{
        return (strcoll(((const struct sctab *)a)->name,
            ((const struct sctab *)b)->name));
}


static int
getconf(struct sctab *scp, int argc, char *name, char *file)
{
        register size_t len;
        register char *buffer;
        long value;

        switch (scp->type) {
        case SELFCONF:
                if (argc > 2)
                        return (usage());
                if (scp->flag & UNDEFINED ||
                    (!(scp->flag&UNSIGNED_VALUE) && scp->value == -1)) {
                        /* DO NOT TRANSLATE */
                        (void) printf("undefined\n");
                } else
                        if (scp->flag & UNSIGNED_VALUE)
                                (void) printf("%lu\n", scp->value);
                        else
                                (void) printf("%ld\n", scp->value);
                break;

        case SYSCONF:
                if (argc > 2)
                        return (usage());
                errno = 0;
                if (scp->flag & UNDEFINED ||
                    (value = sysconf((int)scp->value)) == -1) {
                        if (errno == EINVAL) {
                                (void) fprintf(stderr,
                                    gettext(INVAL_ARG), name);
                                return (1);
                        } else {
                                /* DO NOT TRANSLATE */
                                (void) printf("undefined\n");
                                return (0);
                        }
                } else
                        (void) printf("%ld\n", value);
                break;

        case CONFSTR:
                if (argc > 2)
                        return (usage());
                errno = 0;
                len = confstr((int)scp->value, NULL, (size_t)0);
                if (len == 0) {
                        if (errno == EINVAL) {
                                (void) fprintf(stderr, gettext(INVAL_ARG),
                                    name);
                                return (1);
                        } else {
                                /* DO NOT TRANSLATE */
                                (void) printf("undefined\n");
                                return (0);
                        }
                }
                /*
                 * allocate space to store result of constr() into
                 */
                if ((buffer = malloc(len)) == NULL) {
                        (void) fprintf(stderr,
                            gettext("insufficient memory available"));
                        return (1);
                }

                assert(confstr((int)scp->value, buffer, len) != 0);

                (void) printf("%s\n", buffer);
                free(buffer);
                break;

        case PATHCONF:
                if (argc != 3)
                        return (usage());
                errno = 0;
                if ((value = pathconf(file, (int)scp->value)) == -1) {
                        if (errno == EINVAL || errno == 0) {
                                /* Does not support the association */
                                /* DO NOT TRANSLATE */
                                (void) printf("undefined\n");
                                return (0);
                        } else {
                                /* Probably problems with the pathname itself */
                                if (aflag) {
                                        (void) printf("%s\n", file);
                                } else {
                                        (void) printf("%s", file);
                                }
                                return (1);
                        }
                }
                (void) printf("%ld\n", value);
                break;
        }
        return (0);
}

int
main(int argc, char **argv)
{
        register struct sctab *scp;
        int c;
        int exstat = 0;

        (void) setlocale(LC_ALL, "");
#if     !defined(TEXT_DOMAIN)   /* Should be defined by cc -D */
#define TEXT_DOMAIN "SYS_TEST"
#endif
        (void) textdomain(TEXT_DOMAIN);

        while ((c = getopt(argc, argv, "av:")) != -1)
                switch (c) {
                case 'a':
                        aflag = 1;
                        break;
                case 'v':
                        /*
                         * Unix98 adds the -v option to allow
                         * programming 'specifications' to be
                         * indicated, for present purposes
                         * the specification isn't really
                         * doing anything of value, so for
                         * the moment getopt just processes the
                         * option value and argv[1] is adjusted.
                         *
                         * At some later date we might want to
                         * do specification processing at this
                         * point.
                         */
                        break;
                case '?':
                        return (usage());
                }
        argc -= optind-1;
        argv += optind-1;

        if ((aflag && argc >= 2) || (!aflag && argc < 2))
                return (usage());
        if (aflag) {

#define TabStop         8
#define RightColumn     32
#define DefPathName     "."

                /*
                 * sort the table by the "name" field
                 * so we print it in sorted order
                 */
                qsort(&sctab[0], (sizeof (sctab) /
                    sizeof (struct sctab)) - 1,
                    sizeof (struct sctab), namecmp);

                /*
                 * print all the known symbols and their values
                 */
                for (scp = &sctab[0]; scp->name != NULL; ++scp) {
                        int stat;

                        /*
                         * create 2 columns:
                         *   variable name in the left column,
                         *   value in the right column.
                         * The right column starts at a tab stop.
                         */
                        (void) printf("%s:\t", scp->name);

                        c = strlen(scp->name) + 1;
                        c = (c+TabStop) / TabStop, c *= TabStop;
                        for (; c < RightColumn; c += TabStop)
                                (void) putchar('\t');

                        /*
                         * for pathconf() related variables that require
                         * a pathname, use "."
                         */
                        stat = getconf(scp, scp->type == PATHCONF ? 3 : 2,
                            scp->name, DefPathName);

                        exstat |= stat;

                        /*
                         * if stat != 0, then an error message was already
                         * printed in getconf(),
                         * so don't need to print one here
                         */
                }
        } else {

                /*
                 * find the name of the specified variable (argv[1])
                 * and print its value.
                 */
                for (scp = &sctab[0]; scp->name != NULL; ++scp)
                        if (strcmp(argv[1], scp->name) == 0) {
                                exstat = getconf(scp, argc, argv[1], argv[2]);
                                break;
                        }

                /*
                 * if at last entry in table, then the user specified
                 * variable is invalid
                 */
                if (scp->name == NULL) {
                        errno = EINVAL;
                        (void) fprintf(stderr, gettext(INVAL_ARG), argv[1]);
                        return (1);
                }
        }
        return (exstat);
}