1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*
  28  * Copyright 1985, 1993 by Mortice Kern Systems Inc.  All rights reserved.
  29  *
  30  */
  31 
  32 /*
  33  * getconf -- POSIX.2 compatible utility to query configuration specific
  34  *            parameters.
  35  *         -- XPG4 support added June/93
  36  *
  37  *         -- XPG5 support added Dec/97
  38  *
  39  *         -- XPG6 support added May/2003
  40  */
  41 
  42 #include <stdio.h>
  43 #include <stdlib.h>
  44 #include <string.h>
  45 #include <errno.h>
  46 #include <unistd.h>
  47 #include <limits.h>
  48 #include <locale.h>
  49 #include <libintl.h>
  50 #include <assert.h>
  51 
  52 extern size_t confstr(int, char *, size_t);
  53 
  54 static int aflag = 0;
  55 
  56 #define INVAL_ARG       "getconf: Invalid argument (%s)\n"
  57 #define INVAL_PATHARG   "getconf: Invalid argument (%s or %s)\n"
  58 
  59 /*
  60  *  Notes:
  61  *  The sctab.value field is defined to be a long.
  62  *  There are some values that are "unsigned long"; these values
  63  *  can be stored in a "long" field but when output, must be printed
  64  *  as an unsigned value. Thus, these values must have UNSIGNED_VALUE bit
  65  *  set in sctab.flag field.
  66  *
  67  *  There are 2 different ways to indicate a symbol is undefined:
  68  *     1) sctab.flag = UNDEFINED
  69  *     2) or sctab.value = -1 (and if !UNDEFINED and !UNSIGNED_VALUE)
  70  *
  71  *  There are a group of symbols (e.g CHAR_MIN, INT_MAX, INT_MIN, LONG_BIT ...)
  72  *  which we may set to -1 if they are not pre-defined in a system header file.
  73  *  This is used to indicate that these symbols are "undefined".
  74  *  We are assuming that these symbols cannot reasonably have a value of -1
  75  *  if they were defined in a system header file.
  76  *  (Unless of course -1 can be used to indicate "undefined" for that symbol)
  77  */
  78 
  79 static struct sctab {
  80         long value;
  81         char *name;
  82         enum { SELFCONF, SYSCONF, PATHCONF, CONFSTR } type;
  83         int flag;
  84 /* bit fields for sctab.flag member */
  85 #define NOFLAGS         0       /* no special indicators */
  86 #define UNDEFINED       1       /* value is known undefined at compile time */
  87 #define UNSIGNED_VALUE  2       /* value is an unsigned */
  88 } sctab[] = {
  89 /*
  90  * Some entries in this structure have both leading _ and non leading _
  91  * versions for compatibility with various versions of the specifications.
  92  * It is not expected that both forms will be required for new entries.
  93  */
  94 
  95         /* POSIX.2-1992 table 2-17 */
  96         _POSIX2_BC_BASE_MAX,    "POSIX2_BC_BASE_MAX",   SELFCONF,   NOFLAGS,
  97         _POSIX2_BC_BASE_MAX,    "_POSIX2_BC_BASE_MAX",  SELFCONF,  NOFLAGS,
  98         _POSIX2_BC_DIM_MAX,     "POSIX2_BC_DIM_MAX",    SELFCONF,   NOFLAGS,
  99         _POSIX2_BC_DIM_MAX,     "_POSIX2_BC_DIM_MAX",   SELFCONF,  NOFLAGS,
 100         _POSIX2_BC_SCALE_MAX,   "POSIX2_BC_SCALE_MAX",  SELFCONF,   NOFLAGS,
 101         _POSIX2_BC_SCALE_MAX,   "_POSIX2_BC_SCALE_MAX", SELFCONF,  NOFLAGS,
 102         _POSIX2_BC_STRING_MAX,  "POSIX2_BC_STRING_MAX", SELFCONF,   NOFLAGS,
 103         _POSIX2_BC_STRING_MAX,  "_POSIX2_BC_STRING_MAX", SELFCONF, NOFLAGS,
 104         _POSIX2_COLL_WEIGHTS_MAX, "POSIX2_COLL_WEIGHTS_MAX", SELFCONF,  NOFLAGS,
 105         _POSIX2_COLL_WEIGHTS_MAX, "_POSIX2_COLL_WEIGHTS_MAX", SELFCONF, NOFLAGS,
 106         _POSIX2_EXPR_NEST_MAX,  "POSIX2_EXPR_NEST_MAX", SELFCONF,   NOFLAGS,
 107         _POSIX2_EXPR_NEST_MAX,  "_POSIX2_EXPR_NEST_MAX", SELFCONF,   NOFLAGS,
 108         _POSIX2_LINE_MAX,       "POSIX2_LINE_MAX",      SELFCONF,   NOFLAGS,
 109         _POSIX2_LINE_MAX,       "_POSIX2_LINE_MAX",     SELFCONF,  NOFLAGS,
 110         _POSIX2_RE_DUP_MAX,     "POSIX2_RE_DUP_MAX",    SELFCONF,   NOFLAGS,
 111         _POSIX2_RE_DUP_MAX,     "_POSIX2_RE_DUP_MAX",   SELFCONF,   NOFLAGS,
 112         /* See limits.h section below for _POSIX_RE_DUP_MAX */
 113 
 114         /* UNIX 98 */
 115         _POSIX_AIO_LISTIO_MAX,  "_POSIX_AIO_LISTIO_MAX", SELFCONF,      NOFLAGS,
 116         _POSIX_AIO_MAX,         "_POSIX_AIO_MAX",        SELFCONF,      NOFLAGS,
 117         _POSIX_DELAYTIMER_MAX,  "_POSIX_DELAYTIMER_MAX", SELFCONF,      NOFLAGS,
 118         _POSIX_LOGIN_NAME_MAX,  "_POSIX_LOGIN_NAME_MAX", SELFCONF,      NOFLAGS,
 119         _POSIX_MQ_OPEN_MAX,     "_POSIX_MQ_OPEN_MAX",    SELFCONF,      NOFLAGS,
 120         _POSIX_MQ_PRIO_MAX,     "_POSIX_MQ_PRIO_MAX",    SELFCONF,      NOFLAGS,
 121         _POSIX_RTSIG_MAX,       "_POSIX_RTSIG_MAX",      SELFCONF,      NOFLAGS,
 122         _POSIX_SEM_NSEMS_MAX,   "_POSIX_SEM_NSEMS_MAX",  SELFCONF,      NOFLAGS,
 123         _POSIX_SEM_VALUE_MAX,   "_POSIX_SEM_VALUE_MAX",  SELFCONF,      NOFLAGS,
 124         _POSIX_SIGQUEUE_MAX,    "_POSIX_SIGQUEUE_MAX",   SELFCONF,      NOFLAGS,
 125         _POSIX_TTY_NAME_MAX,    "_POSIX_TTY_NAME_MAX",   SELFCONF,      NOFLAGS,
 126 
 127         /* UNIX 03 */
 128         _POSIX_HOST_NAME_MAX,   "_POSIX_HOST_NAME_MAX",   SELFCONF,   NOFLAGS,
 129         _POSIX_RE_DUP_MAX,      "_POSIX_RE_DUP_MAX",      SELFCONF,   NOFLAGS,
 130         _POSIX_CLOCKRES_MIN,    "_POSIX_CLOCKRES_MIN",    SELFCONF,   NOFLAGS,
 131         _POSIX_SYMLINK_MAX,     "_POSIX_SYMLINK_MAX",     SELFCONF,   NOFLAGS,
 132         _POSIX_SYMLOOP_MAX,     "_POSIX_SYMLOOP_MAX",     SELFCONF,   NOFLAGS,
 133         CHARCLASS_NAME_MAX, "_POSIX2_CHARCLASS_NAME_MAX", SELFCONF,   NOFLAGS,
 134 
 135         /* POSIX.2-1992 table 2-17 */
 136         _SC_2_VERSION,          "POSIX2_VERSION",       SYSCONF,   NOFLAGS,
 137         _SC_2_VERSION,          "_POSIX2_VERSION",      SYSCONF,   NOFLAGS,
 138 
 139         /* POSIX.2-1992 table 2-18 */
 140         _SC_BC_BASE_MAX,        "BC_BASE_MAX",          SYSCONF,   NOFLAGS,
 141         _SC_BC_DIM_MAX,         "BC_DIM_MAX",           SYSCONF,   NOFLAGS,
 142         _SC_BC_SCALE_MAX,       "BC_SCALE_MAX",         SYSCONF,   NOFLAGS,
 143         _SC_BC_STRING_MAX,      "BC_STRING_MAX",        SYSCONF,   NOFLAGS,
 144         _SC_COLL_WEIGHTS_MAX,   "COLL_WEIGHTS_MAX",     SYSCONF,   NOFLAGS,
 145         _SC_EXPR_NEST_MAX,      "EXPR_NEST_MAX",        SYSCONF,   NOFLAGS,
 146         _SC_LINE_MAX,           "LINE_MAX",             SYSCONF,   NOFLAGS,
 147         _SC_RE_DUP_MAX,         "RE_DUP_MAX",           SYSCONF,   NOFLAGS,
 148 
 149         /* POSIX.2-1992 table 2-19 */
 150         _SC_2_C_BIND,           "POSIX2_C_BIND",        SYSCONF,   NOFLAGS,
 151         _SC_2_C_BIND,           "_POSIX2_C_BIND",       SYSCONF,   NOFLAGS,
 152         _SC_2_C_DEV,            "POSIX2_C_DEV",         SYSCONF,   NOFLAGS,
 153         _SC_2_C_DEV,            "_POSIX2_C_DEV",        SYSCONF,   NOFLAGS,
 154         _SC_2_CHAR_TERM,        "POSIX2_CHAR_TERM",     SYSCONF,   NOFLAGS,
 155         _SC_2_CHAR_TERM,        "_POSIX2_CHAR_TERM",    SYSCONF,   NOFLAGS,
 156         _SC_2_FORT_DEV,         "POSIX2_FORT_DEV",      SYSCONF,   NOFLAGS,
 157         _SC_2_FORT_DEV,         "_POSIX2_FORT_DEV",     SYSCONF,   NOFLAGS,
 158         _SC_2_FORT_RUN,         "POSIX2_FORT_RUN",      SYSCONF,   NOFLAGS,
 159         _SC_2_FORT_RUN,         "_POSIX2_FORT_RUN",     SYSCONF,   NOFLAGS,
 160         _SC_2_LOCALEDEF,        "POSIX2_LOCALEDEF",     SYSCONF,   NOFLAGS,
 161         _SC_2_LOCALEDEF,        "_POSIX2_LOCALEDEF",    SYSCONF,   NOFLAGS,
 162         _SC_2_SW_DEV,           "POSIX2_SW_DEV",        SYSCONF,   NOFLAGS,
 163         _SC_2_SW_DEV,           "_POSIX2_SW_DEV",       SYSCONF,   NOFLAGS,
 164         _SC_2_UPE,              "POSIX2_UPE",           SYSCONF,   NOFLAGS,
 165         _SC_2_UPE,              "_POSIX2_UPE",          SYSCONF,   NOFLAGS,
 166 
 167         /* POSIX.1-1990 table 2-3 */
 168         _POSIX_ARG_MAX,         "_POSIX_ARG_MAX",       SELFCONF,   NOFLAGS,
 169         _POSIX_CHILD_MAX,       "_POSIX_CHILD_MAX",     SELFCONF,   NOFLAGS,
 170         _POSIX_LINK_MAX,        "_POSIX_LINK_MAX",      SELFCONF,   NOFLAGS,
 171         _POSIX_MAX_CANON,       "_POSIX_MAX_CANON",     SELFCONF,   NOFLAGS,
 172         _POSIX_MAX_INPUT,       "_POSIX_MAX_INPUT",     SELFCONF,   NOFLAGS,
 173         _POSIX_NAME_MAX,        "_POSIX_NAME_MAX",      SELFCONF,   NOFLAGS,
 174         _POSIX_NGROUPS_MAX,     "_POSIX_NGROUPS_MAX",   SELFCONF,   NOFLAGS,
 175         _POSIX_OPEN_MAX,        "_POSIX_OPEN_MAX",      SELFCONF,   NOFLAGS,
 176         _POSIX_PATH_MAX,        "_POSIX_PATH_MAX",      SELFCONF,   NOFLAGS,
 177         _POSIX_PIPE_BUF,        "_POSIX_PIPE_BUF",      SELFCONF,   NOFLAGS,
 178         _POSIX_SSIZE_MAX,       "_POSIX_SSIZE_MAX",     SELFCONF,   NOFLAGS,
 179         _POSIX_STREAM_MAX,      "_POSIX_STREAM_MAX",    SELFCONF,   NOFLAGS,
 180         _POSIX_TIMER_MAX,       "_POSIX_TIMER_MAX",     SELFCONF,   NOFLAGS,
 181         _POSIX_THREAD_DESTRUCTOR_ITERATIONS,
 182                 "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",  SELFCONF,   NOFLAGS,
 183         _POSIX_THREAD_KEYS_MAX,
 184                 "_POSIX_THREAD_KEYS_MAX",               SELFCONF,   NOFLAGS,
 185         _POSIX_THREAD_THREADS_MAX,
 186                 "_POSIX_THREAD_THREADS_MAX",            SELFCONF,   NOFLAGS,
 187         _POSIX_TZNAME_MAX,      "_POSIX_TZNAME_MAX",    SELFCONF,   NOFLAGS,
 188 
 189         /* POSIX.1-1990 table 4-2 */
 190         _SC_ARG_MAX,            "ARG_MAX",              SYSCONF,   NOFLAGS,
 191         _SC_CHILD_MAX,          "CHILD_MAX",            SYSCONF,   NOFLAGS,
 192         _SC_CLK_TCK,            "CLK_TCK",              SYSCONF,   NOFLAGS,
 193         _SC_JOB_CONTROL,        "_POSIX_JOB_CONTROL",   SYSCONF,   NOFLAGS,
 194         _SC_NGROUPS_MAX,        "NGROUPS_MAX",          SYSCONF,   NOFLAGS,
 195         _SC_OPEN_MAX,           "OPEN_MAX",             SYSCONF,   NOFLAGS,
 196         _SC_SAVED_IDS,          "_POSIX_SAVED_IDS",     SYSCONF,   NOFLAGS,
 197         _SC_STREAM_MAX,         "STREAM_MAX",           SYSCONF,   NOFLAGS,
 198         _SC_TZNAME_MAX,         "TZNAME_MAX",           SYSCONF,   NOFLAGS,
 199         _SC_VERSION,            "_POSIX_VERSION",       SYSCONF,   NOFLAGS,
 200 
 201         /* pathconf() variables */
 202 
 203         /* POSIX.1-1990 table 5-2 */
 204 
 205         _PC_LINK_MAX,           "LINK_MAX",             PATHCONF,  NOFLAGS,
 206         _PC_MAX_CANON,          "MAX_CANON",            PATHCONF,  NOFLAGS,
 207         _PC_MAX_INPUT,          "MAX_INPUT",            PATHCONF,  NOFLAGS,
 208         _PC_NAME_MAX,           "NAME_MAX",             PATHCONF,  NOFLAGS,
 209         _PC_PATH_MAX,           "PATH_MAX",             PATHCONF,  NOFLAGS,
 210         _PC_PIPE_BUF,           "PIPE_BUF",             PATHCONF,  NOFLAGS,
 211         _PC_CHOWN_RESTRICTED,   "_POSIX_CHOWN_RESTRICTED", PATHCONF,  NOFLAGS,
 212         _PC_NO_TRUNC,           "_POSIX_NO_TRUNC",      PATHCONF,  NOFLAGS,
 213         _PC_VDISABLE,           "_POSIX_VDISABLE",      PATHCONF,  NOFLAGS,
 214 
 215         /* UNIX 98 additions */
 216 
 217         _PC_ASYNC_IO,           "_POSIX_ASYNC_IO",      PATHCONF,  NOFLAGS,
 218         _PC_PRIO_IO,            "_POSIX_PRIO_IO",       PATHCONF,  NOFLAGS,
 219         _PC_SYNC_IO,            "_POSIX_SYNC_IO",       PATHCONF,  NOFLAGS,
 220 
 221         /* Large File Summit name (UNIX 98) */
 222 
 223         _PC_FILESIZEBITS,       "FILESIZEBITS",         PATHCONF,  NOFLAGS,
 224         _PC_XATTR_ENABLED,      "XATTR_ENABLED",        PATHCONF,  NOFLAGS,
 225         _PC_XATTR_EXISTS,       "XATTR_EXISTS",         PATHCONF,  NOFLAGS,
 226 
 227         /* UNIX 03 Additions */
 228 
 229         /* Advisory Information (ADV) */
 230         _PC_ALLOC_SIZE_MIN,     "POSIX_ALLOC_SIZE_MIN", PATHCONF,  NOFLAGS,
 231         _PC_REC_INCR_XFER_SIZE, "POSIX_REC_INCR_XFER_SIZE", PATHCONF,  NOFLAGS,
 232         _PC_REC_MAX_XFER_SIZE,  "POSIX_REC_MAX_XFER_SIZE",  PATHCONF,  NOFLAGS,
 233         _PC_REC_MIN_XFER_SIZE,  "POSIX_REC_MIN_XFER_SIZE",  PATHCONF,  NOFLAGS,
 234         _PC_REC_XFER_ALIGN,     "POSIX_REC_XFER_ALIGN", PATHCONF,  NOFLAGS,
 235 
 236         _PC_2_SYMLINKS,         "POSIX2_SYMLINKS",      PATHCONF,  NOFLAGS,
 237         _PC_SYMLINK_MAX,        "SYMLINK_MAX",          PATHCONF,  NOFLAGS,
 238 
 239         _PC_SATTR_ENABLED,      "SATTR_ENABLED",        PATHCONF,  NOFLAGS,
 240         _PC_SATTR_EXISTS,       "SATTR_EXISTS",         PATHCONF,  NOFLAGS,
 241 
 242         /* UNIX 08 additions */
 243 
 244         _PC_TIMESTAMP_RESOLUTION, "_POSIX_TIMESTAMP_RESOLUTION",
 245             PATHCONF,   NOFLAGS,
 246 
 247         /* confstr() variables */
 248 
 249         /* POSIX.2-1992 description of getconf utility */
 250         _CS_PATH,               "PATH",                 CONFSTR,   NOFLAGS,
 251 
 252         /* POSIX.2-1992 table B-18 */
 253         _CS_PATH,               "CS_PATH",              CONFSTR,   NOFLAGS,
 254         _CS_PATH,               "_CS_PATH",             CONFSTR,   NOFLAGS,
 255 
 256         /* command names for large file configuration information */
 257         /* large file compilation environment configuration */
 258 
 259         _CS_LFS_CFLAGS,         "LFS_CFLAGS",           CONFSTR,   NOFLAGS,
 260         _CS_LFS_LDFLAGS,        "LFS_LDFLAGS",          CONFSTR,   NOFLAGS,
 261         _CS_LFS_LIBS,           "LFS_LIBS",             CONFSTR,   NOFLAGS,
 262         _CS_LFS_LINTFLAGS,      "LFS_LINTFLAGS",        CONFSTR,   NOFLAGS,
 263 
 264         /* transitional large file interface configuration */
 265 
 266         _CS_LFS64_CFLAGS,       "LFS64_CFLAGS",         CONFSTR,   NOFLAGS,
 267         _CS_LFS64_LDFLAGS,      "LFS64_LDFLAGS",        CONFSTR,   NOFLAGS,
 268         _CS_LFS64_LIBS,         "LFS64_LIBS",           CONFSTR,   NOFLAGS,
 269         _CS_LFS64_LINTFLAGS,    "LFS64_LINTFLAGS",      CONFSTR,   NOFLAGS,
 270 
 271         /*
 272          *  UNIX 98:
 273          *  confstr additions, these support
 274          *  programming specifications/environments.
 275          *
 276          * Unfortunately there is some uncertainty with
 277          * the standard at this point about the constant
 278          * name, thus we need to recognize BOTH with and
 279          * without the initial underscore.
 280          */
 281         _CS_XBS5_ILP32_OFF32_CFLAGS,    "XBS5_ILP32_OFF32_CFLAGS",
 282                 CONFSTR,        NOFLAGS,
 283         _CS_XBS5_ILP32_OFF32_CFLAGS,    "_XBS5_ILP32_OFF32_CFLAGS",
 284                 CONFSTR,        NOFLAGS,
 285 
 286         _CS_XBS5_ILP32_OFF32_LDFLAGS,   "XBS5_ILP32_OFF32_LDFLAGS",
 287                 CONFSTR,        NOFLAGS,
 288         _CS_XBS5_ILP32_OFF32_LDFLAGS,   "_XBS5_ILP32_OFF32_LDFLAGS",
 289                 CONFSTR,        NOFLAGS,
 290 
 291         _CS_XBS5_ILP32_OFF32_LIBS,      "XBS5_ILP32_OFF32_LIBS",
 292                 CONFSTR,        NOFLAGS,
 293         _CS_XBS5_ILP32_OFF32_LIBS,      "_XBS5_ILP32_OFF32_LIBS",
 294                 CONFSTR,        NOFLAGS,
 295 
 296         _CS_XBS5_ILP32_OFF32_LINTFLAGS, "XBS5_ILP32_OFF32_LINTFLAGS",
 297                 CONFSTR,        NOFLAGS,
 298         _CS_XBS5_ILP32_OFF32_LINTFLAGS, "_XBS5_ILP32_OFF32_LINTFLAGS",
 299                 CONFSTR,        NOFLAGS,
 300 
 301         _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "XBS5_ILP32_OFFBIG_CFLAGS",
 302                 CONFSTR,        NOFLAGS,
 303         _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "_XBS5_ILP32_OFFBIG_CFLAGS",
 304                 CONFSTR,        NOFLAGS,
 305 
 306         _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "XBS5_ILP32_OFFBIG_LDFLAGS",
 307                 CONFSTR,        NOFLAGS,
 308         _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "_XBS5_ILP32_OFFBIG_LDFLAGS",
 309                 CONFSTR,        NOFLAGS,
 310 
 311         _CS_XBS5_ILP32_OFFBIG_LIBS,     "XBS5_ILP32_OFFBIG_LIBS",
 312                 CONFSTR,        NOFLAGS,
 313         _CS_XBS5_ILP32_OFFBIG_LIBS,     "_XBS5_ILP32_OFFBIG_LIBS",
 314                 CONFSTR,        NOFLAGS,
 315 
 316         _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "XBS5_ILP32_OFFBIG_LINTFLAGS",
 317                 CONFSTR,        NOFLAGS,
 318         _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "_XBS5_ILP32_OFFBIG_LINTFLAGS",
 319                 CONFSTR,        NOFLAGS,
 320 
 321         _CS_XBS5_LP64_OFF64_CFLAGS,     "XBS5_LP64_OFF64_CFLAGS",
 322                 CONFSTR,        NOFLAGS,
 323         _CS_XBS5_LP64_OFF64_CFLAGS,     "_XBS5_LP64_OFF64_CFLAGS",
 324                 CONFSTR,        NOFLAGS,
 325 
 326         _CS_XBS5_LP64_OFF64_LDFLAGS,    "XBS5_LP64_OFF64_LDFLAGS",
 327                 CONFSTR,        NOFLAGS,
 328         _CS_XBS5_LP64_OFF64_LDFLAGS,    "_XBS5_LP64_OFF64_LDFLAGS",
 329                 CONFSTR,        NOFLAGS,
 330 
 331         _CS_XBS5_LP64_OFF64_LIBS,       "XBS5_LP64_OFF64_LIBS",
 332                 CONFSTR,        NOFLAGS,
 333         _CS_XBS5_LP64_OFF64_LIBS,       "_XBS5_LP64_OFF64_LIBS",
 334                 CONFSTR,        NOFLAGS,
 335 
 336         _CS_XBS5_LP64_OFF64_LINTFLAGS,  "XBS5_LP64_OFF64_LINTFLAGS",
 337                 CONFSTR,        NOFLAGS,
 338         _CS_XBS5_LP64_OFF64_LINTFLAGS,  "_XBS5_LP64_OFF64_LINTFLAGS",
 339                 CONFSTR,        NOFLAGS,
 340 
 341         _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "XBS5_LPBIG_OFFBIG_CFLAGS",
 342                 CONFSTR,        NOFLAGS,
 343         _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "_XBS5_LPBIG_OFFBIG_CFLAGS",
 344                 CONFSTR,        NOFLAGS,
 345 
 346         _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "XBS5_LPBIG_OFFBIG_LDFLAGS",
 347                 CONFSTR,        NOFLAGS,
 348         _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "_XBS5_LPBIG_OFFBIG_LDFLAGS",
 349                 CONFSTR,        NOFLAGS,
 350 
 351         _CS_XBS5_LPBIG_OFFBIG_LIBS,     "XBS5_LPBIG_OFFBIG_LIBS",
 352                 CONFSTR,        NOFLAGS,
 353         _CS_XBS5_LPBIG_OFFBIG_LIBS,     "_XBS5_LPBIG_OFFBIG_LIBS",
 354                 CONFSTR,        NOFLAGS,
 355 
 356         _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "XBS5_LPBIG_OFFBIG_LINTFLAGS",
 357                 CONFSTR,        NOFLAGS,
 358         _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "_XBS5_LPBIG_OFFBIG_LINTFLAGS",
 359                 CONFSTR,        NOFLAGS,
 360 
 361         /*
 362          * UNIX 03 confstr() additions for compilation environments
 363          */
 364         _CS_POSIX_V6_ILP32_OFF32_CFLAGS, "POSIX_V6_ILP32_OFF32_CFLAGS",
 365                 CONFSTR,        NOFLAGS,
 366         _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, "POSIX_V6_ILP32_OFF32_LDFLAGS",
 367                 CONFSTR,        NOFLAGS,
 368         _CS_POSIX_V6_ILP32_OFF32_LIBS, "POSIX_V6_ILP32_OFF32_LIBS",
 369                 CONFSTR,        NOFLAGS,
 370         _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, "POSIX_V6_ILP32_OFFBIG_CFLAGS",
 371                 CONFSTR,        NOFLAGS,
 372         _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, "POSIX_V6_ILP32_OFFBIG_LDFLAGS",
 373                 CONFSTR,        NOFLAGS,
 374         _CS_POSIX_V6_ILP32_OFFBIG_LIBS, "POSIX_V6_ILP32_OFFBIG_LIBS",
 375                 CONFSTR,        NOFLAGS,
 376         _CS_POSIX_V6_LP64_OFF64_CFLAGS, "POSIX_V6_LP64_OFF64_CFLAGS",
 377                 CONFSTR,        NOFLAGS,
 378         _CS_POSIX_V6_LP64_OFF64_LDFLAGS, "POSIX_V6_LP64_OFF64_LDFLAGS",
 379                 CONFSTR,        NOFLAGS,
 380         _CS_POSIX_V6_LP64_OFF64_LIBS, "POSIX_V6_LP64_OFF64_LIBS",
 381                 CONFSTR,        NOFLAGS,
 382         _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, "POSIX_V6_LPBIG_OFFBIG_CFLAGS",
 383                 CONFSTR,        NOFLAGS,
 384         _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, "POSIX_V6_LPBIG_OFFBIG_LDFLAGS",
 385                 CONFSTR,        NOFLAGS,
 386         _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, "POSIX_V6_LPBIG_OFFBIG_LIBS",
 387                 CONFSTR,        NOFLAGS,
 388         _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS, "POSIX_V6_WIDTH_RESTRICTED_ENVS",
 389                 CONFSTR,        NOFLAGS,
 390         /* End of UNIX 03 compilation environments */
 391 
 392 #ifdef  _SC_2_C_VERSION         /* POSIX.2 table B-4 */
 393         _SC_2_C_VERSION,        "_POSIX2_C_VERSION",    SYSCONF,   NOFLAGS,
 394 #else
 395         _POSIX2_C_VERSION,      "_POSIX2_C_VERSION",    SELFCONF,   NOFLAGS,
 396 #endif
 397 
 398 /*
 399  * XPG4 support BEGINS
 400  */
 401 
 402 #ifndef CHARCLASS_NAME_MAX
 403 #define CHARCLASS_NAME_MAX      -1
 404 #endif
 405 #ifndef CHAR_BIT
 406 #define CHAR_BIT        -1
 407 #endif
 408 #ifndef CHAR_MAX
 409 #define CHAR_MAX        -1
 410 #endif
 411 #ifndef CHAR_MIN
 412 #define CHAR_MIN        -1
 413 #endif
 414 #ifndef INT_MAX
 415 #define INT_MAX -1
 416 #endif
 417 #ifndef INT_MIN
 418 #define INT_MIN -1
 419 #endif
 420 #ifndef LONG_BIT
 421 #define LONG_BIT        -1
 422 #endif
 423 #ifndef LONG_MAX
 424 #define LONG_MAX        -1
 425 #endif
 426 #ifndef LONG_MIN
 427 #define LONG_MIN        -1
 428 #endif
 429 #ifndef MB_LEN_MAX
 430 #define MB_LEN_MAX      -1
 431 #endif
 432 #ifndef NL_NMAX
 433 #define NL_NMAX -1
 434 #endif
 435 #ifndef NL_ARGMAX
 436 #define NL_ARGMAX       -1
 437 #endif
 438 #ifndef NL_LANGMAX
 439 #define NL_LANGMAX      -1
 440 #endif
 441 #ifndef NL_MSGMAX
 442 #define NL_MSGMAX       -1
 443 #endif
 444 #ifndef NL_SETMAX
 445 #define NL_SETMAX       -1
 446 #endif
 447 #ifndef NL_TEXTMAX
 448 #define NL_TEXTMAX      -1
 449 #endif
 450 #ifndef NZERO
 451 #define NZERO   -1
 452 #endif
 453 #ifndef SCHAR_MAX
 454 #define SCHAR_MAX       -1
 455 #endif
 456 #ifndef SCHAR_MIN
 457 #define SCHAR_MIN       -1
 458 #endif
 459 #ifndef SHRT_MAX
 460 #define SHRT_MAX        -1
 461 #endif
 462 #ifndef SHRT_MIN
 463 #define SHRT_MIN        -1
 464 #endif
 465 #ifndef TMP_MAX
 466 #define TMP_MAX -1
 467 #endif
 468 #ifndef WORD_BIT
 469 #define WORD_BIT        -1
 470 #endif
 471 
 472 
 473 #ifndef _XOPEN_XPG2
 474 #define _XOPEN_XPG2     -1
 475 #endif
 476 #ifndef _XOPEN_XPG3
 477 #define _XOPEN_XPG3     -1
 478 #endif
 479 #ifndef _XOPEN_XPG4
 480 #define _XOPEN_XPG4     -1
 481 #endif
 482 
 483         /*
 484          * the following are values that we should find in <limits.h>
 485          * so we use SELFCONF here.
 486          *
 487          */
 488 
 489         /* POSIX.1-1990 */
 490         CHARCLASS_NAME_MAX,     "CHARCLASS_NAME_MAX",     SELFCONF,   NOFLAGS,
 491         SSIZE_MAX,              "SSIZE_MAX",    SELFCONF,   NOFLAGS,
 492 
 493         /* POSIX.1-1988 */
 494         CHAR_BIT,               "CHAR_BIT",     SELFCONF,   NOFLAGS,
 495         CHAR_MAX,               "CHAR_MAX",     SELFCONF,   NOFLAGS,
 496         CHAR_MIN,               "CHAR_MIN",     SELFCONF,   NOFLAGS,
 497         INT_MAX,                "INT_MAX",      SELFCONF,   NOFLAGS,
 498         INT_MIN,                "INT_MIN",      SELFCONF,   NOFLAGS,
 499         LONG_BIT,               "LONG_BIT",     SELFCONF,   NOFLAGS,
 500         LONG_MAX,               "LONG_MAX",     SELFCONF,   NOFLAGS,
 501         LONG_MIN,               "LONG_MIN",     SELFCONF,   NOFLAGS,
 502         MB_LEN_MAX,             "MB_LEN_MAX",   SELFCONF,   NOFLAGS,
 503         NL_NMAX,                "NL_NMAX",      SELFCONF,   NOFLAGS,
 504         NL_ARGMAX,              "NL_ARGMAX",    SELFCONF,   NOFLAGS,
 505         NL_LANGMAX,             "NL_LANGMAX",   SELFCONF,   NOFLAGS,
 506         NL_MSGMAX,              "NL_MSGMAX",    SELFCONF,   NOFLAGS,
 507         NL_SETMAX,              "NL_SETMAX",    SELFCONF,   NOFLAGS,
 508         NL_TEXTMAX,             "NL_TEXTMAX",   SELFCONF,   NOFLAGS,
 509         NZERO,                  "NZERO",        SELFCONF,   NOFLAGS,
 510         SCHAR_MAX,              "SCHAR_MAX",    SELFCONF,   NOFLAGS,
 511         SCHAR_MIN,              "SCHAR_MIN",    SELFCONF,   NOFLAGS,
 512         SHRT_MAX,               "SHRT_MAX",     SELFCONF,   NOFLAGS,
 513         SHRT_MIN,               "SHRT_MIN",     SELFCONF,   NOFLAGS,
 514         TMP_MAX,                "TMP_MAX",      SELFCONF,   NOFLAGS,
 515 
 516         /*
 517          * for the unsigned maximums, we cannot rely on the value -1
 518          * to indicate "undefined".
 519          */
 520 #ifndef UCHAR_MAX
 521         0,                      "UCHAR_MAX",    SELFCONF,   UNDEFINED,
 522 #else
 523         (long)UCHAR_MAX,        "UCHAR_MAX",    SELFCONF,   UNSIGNED_VALUE,
 524 #endif /* UCHAR_MAX */
 525 #ifndef UINT_MAX
 526         0,                      "UINT_MAX",     SELFCONF,   UNDEFINED,
 527 #else
 528         (long)UINT_MAX,         "UINT_MAX",     SELFCONF,   UNSIGNED_VALUE,
 529 #endif /* UINT_MAX */
 530 #ifndef ULONG_MAX
 531         0,                      "ULONG_MAX",    SELFCONF,   UNDEFINED,
 532 #else
 533         (long)ULONG_MAX,        "ULONG_MAX",    SELFCONF,   UNSIGNED_VALUE,
 534 #endif /* ULONG_MAX */
 535 #ifndef USHRT_MAX
 536         0,                      "USHRT_MAX",    SELFCONF,   UNDEFINED,
 537 #else
 538         (long)USHRT_MAX,        "USHRT_MAX",    SELFCONF,   UNSIGNED_VALUE,
 539 #endif /* USHRT_MAX */
 540 #ifndef SIZE_MAX
 541         0,                      "SIZE_MAX",     SELFCONF,   UNDEFINED,
 542 #else
 543         (long)SIZE_MAX,         "SIZE_MAX",     SELFCONF,   UNSIGNED_VALUE,
 544 #endif /* SIZE_MAX */
 545 
 546         WORD_BIT,               "WORD_BIT",     SELFCONF,   NOFLAGS,
 547 
 548         /* XPG4 Version 2 */
 549         _XOPEN_IOV_MAX,         "_XOPEN_IOV_MAX",  SELFCONF, NOFLAGS,
 550 
 551         /* UNIX 03 */
 552         _XOPEN_NAME_MAX,        "_XOPEN_NAME_MAX", SELFCONF, NOFLAGS,
 553         _XOPEN_PATH_MAX,        "_XOPEN_PATH_MAX", SELFCONF, NOFLAGS,
 554 
 555         /*
 556          * The following are defined via sysconf().  These are considered
 557          * an extension to sysconf().
 558          * The -0 is needed if _XOPEN_XPG? is defined to be an empty string.
 559          */
 560         _XOPEN_XPG2-0,          "_XOPEN_XPG2",  SELFCONF,    NOFLAGS,
 561         _XOPEN_XPG3-0,          "_XOPEN_XPG3",  SELFCONF,    NOFLAGS,
 562         _XOPEN_XPG4-0,          "_XOPEN_XPG4",  SELFCONF,    NOFLAGS,
 563 
 564         /*
 565          * The following should be provided by sysconf() (e.g use SYSCONF),
 566          * so we  look for the appropriate _SC_* symbol in <unistd.h>.
 567          * If it is not defined, then we use SELFCONF with the value of -1.
 568          */
 569         _SC_XOPEN_VERSION,      "_XOPEN_VERSION",       SYSCONF,   NOFLAGS,
 570         _SC_XOPEN_XCU_VERSION,  "_XOPEN_XCU_VERSION",   SYSCONF,   NOFLAGS,
 571         _SC_XOPEN_CRYPT,        "_XOPEN_CRYPT",         SYSCONF,   NOFLAGS,
 572         _SC_XOPEN_ENH_I18N,     "_XOPEN_ENH_I18N",      SYSCONF,   NOFLAGS,
 573         _SC_XOPEN_SHM,          "_XOPEN_SHM",           SYSCONF,   NOFLAGS,
 574 
 575 /*
 576  * XPG4 support ends
 577  */
 578 
 579 /* XPG4, Version 2 support */
 580 
 581         _SC_ATEXIT_MAX,         "ATEXIT_MAX",           SYSCONF,        NOFLAGS,
 582         _SC_PAGESIZE,           "PAGESIZE",             SYSCONF,        NOFLAGS,
 583         _SC_PAGE_SIZE,          "PAGE_SIZE",            SYSCONF,        NOFLAGS,
 584         _SC_XOPEN_UNIX,         "_XOPEN_UNIX",          SYSCONF,        NOFLAGS,
 585         _SC_IOV_MAX,            "IOV_MAX",              SYSCONF,        NOFLAGS,
 586 
 587 /*
 588  * UNIX 98 - XPG5 additions
 589  */
 590         _SC_XOPEN_LEGACY,       "_XOPEN_LEGACY",        SYSCONF,        NOFLAGS,
 591         _SC_PASS_MAX,           "PASS_MAX",             SYSCONF,        NOFLAGS,
 592         _SC_AIO_LISTIO_MAX,     "AIO_LISTIO_MAX",       SYSCONF,        NOFLAGS,
 593         _SC_AIO_MAX,            "AIO_MAX",              SYSCONF,        NOFLAGS,
 594         _SC_AIO_PRIO_DELTA_MAX, "AIO_PRIO_DELTA_MAX",   SYSCONF,        NOFLAGS,
 595         _SC_DELAYTIMER_MAX,     "DELAYTIMER_MAX",       SYSCONF,        NOFLAGS,
 596         _SC_MQ_OPEN_MAX,        "MQ_OPEN_MAX",          SYSCONF,        NOFLAGS,
 597         _SC_MQ_PRIO_MAX,        "MQ_PRIO_MAX",          SYSCONF,        NOFLAGS,
 598         _SC_RTSIG_MAX,          "RTSIG_MAX",            SYSCONF,        NOFLAGS,
 599         _SC_SEM_NSEMS_MAX,      "SEM_NSEMS_MAX",        SYSCONF,        NOFLAGS,
 600         _SC_SEM_VALUE_MAX,      "SEM_VALUE_MAX",        SYSCONF,        NOFLAGS,
 601         _SC_SIGQUEUE_MAX,       "SIGQUEUE_MAX",         SYSCONF,        NOFLAGS,
 602         _SC_TIMER_MAX,          "TIMER_MAX",            SYSCONF,        NOFLAGS,
 603 
 604         _SC_ASYNCHRONOUS_IO,    "_POSIX_ASYNCHRONOUS_IO", SYSCONF,      NOFLAGS,
 605         _SC_FSYNC,              "_POSIX_FSYNC",         SYSCONF,        NOFLAGS,
 606         _SC_MAPPED_FILES,       "_POSIX_MAPPED_FILES",  SYSCONF,        NOFLAGS,
 607         _SC_MEMLOCK,            "_POSIX_MEMLOCK",       SYSCONF,        NOFLAGS,
 608         _SC_MEMLOCK_RANGE,      "_POSIX_MEMLOCK_RANGE", SYSCONF,        NOFLAGS,
 609         _SC_MEMORY_PROTECTION,  "_POSIX_MEMORY_PROTECTION", SYSCONF,    NOFLAGS,
 610         _SC_MESSAGE_PASSING,    "_POSIX_MESSAGE_PASSING", SYSCONF,      NOFLAGS,
 611         _SC_PRIORITIZED_IO,     "_POSIX_PRIORITIZED_IO", SYSCONF,       NOFLAGS,
 612         _SC_PRIORITY_SCHEDULING, "_POSIX_PRIORITY_SCHEDULING", SYSCONF, NOFLAGS,
 613         _SC_REALTIME_SIGNALS,   "_POSIX_REALTIME_SIGNALS", SYSCONF,     NOFLAGS,
 614         _SC_SEMAPHORES,         "_POSIX_SEMAPHORES",    SYSCONF,        NOFLAGS,
 615 
 616         _SC_SHARED_MEMORY_OBJECTS, "_POSIX_SHARED_MEMORY_OBJECTS",
 617             SYSCONF,    NOFLAGS,
 618 
 619         _SC_SYNCHRONIZED_IO,    "_POSIX_SYNCHRONIZED_IO", SYSCONF,      NOFLAGS,
 620         _SC_TIMERS,             "_POSIX_TIMERS",        SYSCONF,        NOFLAGS,
 621 
 622         _SC_LOGIN_NAME_MAX,     "LOGIN_NAME_MAX",       SYSCONF,        NOFLAGS,
 623 
 624         _SC_THREAD_DESTRUCTOR_ITERATIONS, "PTHREAD_DESTRUCTOR_ITERATIONS",
 625             SYSCONF,    NOFLAGS,
 626 
 627         _SC_THREAD_KEYS_MAX,    "PTHREAD_KEYS_MAX",     SYSCONF,        NOFLAGS,
 628         _SC_THREAD_STACK_MIN,   "PTHREAD_STACK_MIN",    SYSCONF,        NOFLAGS,
 629         _SC_THREAD_THREADS_MAX, "PTHREAD_THREADS_MAX",  SYSCONF,        NOFLAGS,
 630 
 631         _SC_THREADS,            "_POSIX_THREADS",       SYSCONF,        NOFLAGS,
 632 
 633         _SC_THREAD_ATTR_STACKADDR, "POSIX_THREAD_ATTR_STACKADDR",
 634             SYSCONF,    NOFLAGS,
 635         _SC_THREAD_ATTR_STACKADDR, "_POSIX_THREAD_ATTR_STACKADDR",
 636             SYSCONF,    NOFLAGS,
 637 
 638         _SC_THREAD_ATTR_STACKSIZE, "POSIX_THREAD_ATTR_STACKSIZE",
 639             SYSCONF,    NOFLAGS,
 640         _SC_THREAD_ATTR_STACKSIZE, "_POSIX_THREAD_ATTR_STACKSIZE",
 641             SYSCONF,    NOFLAGS,
 642 
 643         _SC_THREAD_PRIORITY_SCHEDULING, "POSIX_THREAD_PRIORITY_SCHEDULING",
 644             SYSCONF,    NOFLAGS,
 645         _SC_THREAD_PRIORITY_SCHEDULING, "_POSIX_THREAD_PRIORITY_SCHEDULING",
 646             SYSCONF,    NOFLAGS,
 647 
 648         _SC_THREAD_PRIO_INHERIT, "POSIX_THREAD_PRIO_INHERIT",
 649             SYSCONF,    NOFLAGS,
 650         _SC_THREAD_PRIO_INHERIT, "_POSIX_THREAD_PRIO_INHERIT",
 651             SYSCONF,    NOFLAGS,
 652 
 653         _SC_THREAD_PRIO_PROTECT, "POSIX_THREAD_PRIO_PROTECT",
 654             SYSCONF,    NOFLAGS,
 655         _SC_THREAD_PRIO_PROTECT, "_POSIX_THREAD_PRIO_PROTECT",
 656             SYSCONF,    NOFLAGS,
 657 
 658         _SC_THREAD_PROCESS_SHARED, "POSIX_THREAD_PROCESS_SHARED",
 659             SYSCONF,    NOFLAGS,
 660         _SC_THREAD_PROCESS_SHARED, "_POSIX_THREAD_PROCESS_SHARED",
 661             SYSCONF,    NOFLAGS,
 662 
 663         _SC_THREAD_SAFE_FUNCTIONS, "POSIX_THREAD_SAFE_FUNCTIONS",
 664             SYSCONF,    NOFLAGS,
 665         _SC_THREAD_SAFE_FUNCTIONS, "_POSIX_THREAD_SAFE_FUNCTIONS",
 666             SYSCONF,    NOFLAGS,
 667 
 668         _SC_TTY_NAME_MAX,       "TTY_NAME_MAX",         SYSCONF,        NOFLAGS,
 669         _SC_XOPEN_REALTIME,     "_XOPEN_REALTIME",      SYSCONF,        NOFLAGS,
 670         _SC_XOPEN_REALTIME_THREADS, "_XOPEN_REALTIME_THREADS", SYSCONF, NOFLAGS,
 671 
 672         /*
 673          * Due to ambiguity in the standard we need
 674          * to recognize both the underscored name
 675          * and the non-underscored version in the
 676          * following variables.
 677          */
 678         _SC_XBS5_ILP32_OFF32,   "XBS5_ILP32_OFF32",     SYSCONF,        NOFLAGS,
 679         _SC_XBS5_ILP32_OFF32,   "_XBS5_ILP32_OFF32",    SYSCONF,        NOFLAGS,
 680 
 681         _SC_XBS5_ILP32_OFFBIG,  "XBS5_ILP32_OFFBIG",    SYSCONF,        NOFLAGS,
 682         _SC_XBS5_ILP32_OFFBIG,  "_XBS5_ILP32_OFFBIG",   SYSCONF,        NOFLAGS,
 683 
 684         _SC_XBS5_LP64_OFF64,    "XBS5_LP64_OFF64",      SYSCONF,        NOFLAGS,
 685         _SC_XBS5_LP64_OFF64,    "_XBS5_LP64_OFF64",     SYSCONF,        NOFLAGS,
 686 
 687         _SC_XBS5_LPBIG_OFFBIG,  "XBS5_LPBIG_OFFBIG",    SYSCONF,        NOFLAGS,
 688         _SC_XBS5_LPBIG_OFFBIG,  "_XBS5_LPBIG_OFFBIG",   SYSCONF,        NOFLAGS,
 689 
 690 /*
 691  * UNIX 03 additions for sysconf() names, and names that are not in interfaces
 692  */
 693         _SC_REGEXP,             "_POSIX_REGEXP",          SYSCONF,      NOFLAGS,
 694         _SC_SHELL,              "_POSIX_SHELL",           SYSCONF,      NOFLAGS,
 695         _SC_HOST_NAME_MAX,      "HOST_NAME_MAX",          SYSCONF,      NOFLAGS,
 696         _SC_READER_WRITER_LOCKS, "_POSIX_READER_WRITER_LOCKS", SYSCONF, NOFLAGS,
 697         _SC_IPV6,               "_POSIX_IPV6",            SYSCONF,      NOFLAGS,
 698         _SC_RAW_SOCKETS,        "_POSIX_RAW_SOCKETS",     SYSCONF,      NOFLAGS,
 699         _SC_XOPEN_STREAMS,      "_XOPEN_STREAMS",         SYSCONF,      NOFLAGS,
 700         _SC_SYMLOOP_MAX,        "SYMLOOP_MAX",            SYSCONF,      NOFLAGS,
 701         _SC_2_PBS,              "_POSIX2_PBS",            SYSCONF,      NOFLAGS,
 702         _SC_2_PBS_ACCOUNTING,   "_POSIX2_PBS_ACCOUNTING", SYSCONF,      NOFLAGS,
 703         _SC_2_PBS_CHECKPOINT,   "_POSIX2_PBS_CHECKPOINT", SYSCONF,      NOFLAGS,
 704         _SC_2_PBS_LOCATE,       "_POSIX2_PBS_LOCATE",     SYSCONF,      NOFLAGS,
 705         _SC_2_PBS_MESSAGE,      "_POSIX2_PBS_MESSAGE",    SYSCONF,      NOFLAGS,
 706         _SC_2_PBS_TRACK,        "_POSIX2_PBS_TRACK",      SYSCONF,      NOFLAGS,
 707 
 708         _SC_ADVISORY_INFO,      "_POSIX_ADVISORY_INFO",   SYSCONF,      NOFLAGS,
 709         _SC_BARRIERS,           "_POSIX_BARRIERS",        SYSCONF,      NOFLAGS,
 710         _SC_CLOCK_SELECTION,    "_POSIX_CLOCK_SELECTION", SYSCONF,      NOFLAGS,
 711         _SC_CPUTIME,            "_POSIX_CPUTIME",         SYSCONF,      NOFLAGS,
 712         _SC_MONOTONIC_CLOCK,    "_POSIX_MONOTONIC_CLOCK", SYSCONF,      NOFLAGS,
 713         _SC_SPAWN,              "_POSIX_SPAWN",           SYSCONF,      NOFLAGS,
 714         _SC_SPIN_LOCKS,         "_POSIX_SPIN_LOCKS",      SYSCONF,      NOFLAGS,
 715         _SC_SPORADIC_SERVER,    "_POSIX_SPORADIC_SERVER", SYSCONF,      NOFLAGS,
 716         _SC_SS_REPL_MAX,        "_POSIX_SS_REPL_MAX",     SYSCONF,      NOFLAGS,
 717         _SC_THREAD_CPUTIME,     "_POSIX_THREAD_CPUTIME",   SYSCONF,     NOFLAGS,
 718         _SC_THREAD_SPORADIC_SERVER, "_POSIX_THREAD_SPORADIC_SERVER",    SYSCONF,
 719                 NOFLAGS,
 720         _SC_TIMEOUTS,           "_POSIX_TIMEOUTS",        SYSCONF,      NOFLAGS,
 721         _SC_TRACE,              "_POSIX_TRACE",           SYSCONF,      NOFLAGS,
 722         _SC_TRACE_EVENT_FILTER, "_POSIX_TRACE_EVENT_FILTER", SYSCONF,   NOFLAGS,
 723         _SC_TRACE_EVENT_NAME_MAX, "_POSIX_TRACE_EVENT_NAME_MAX", SYSCONF,
 724                                                                         NOFLAGS,
 725         _SC_TRACE_INHERIT,      "_POSIX_TRACE_INHERIT",   SYSCONF,      NOFLAGS,
 726         _SC_TRACE_LOG,          "_POSIX_TRACE_LOG",       SYSCONF,      NOFLAGS,
 727         _SC_TRACE_NAME_MAX,     "_POSIX_TRACE_NAME_MAX",  SYSCONF,      NOFLAGS,
 728         _SC_TRACE_SYS_MAX,      "_POSIX_TRACE_SYS_MAX",   SYSCONF,      NOFLAGS,
 729         _SC_TRACE_USER_EVENT_MAX, "_POSIX_TRACE_USER_EVENT_MAX", SYSCONF,
 730                                                                         NOFLAGS,
 731         _SC_TYPED_MEMORY_OBJECTS, "_POSIX_TYPED_MEMORY_OBJECTS",        SYSCONF,
 732                 NOFLAGS,
 733 
 734         /*
 735          * Due to an ambiguity in the specification, we need to recognize both
 736          * the underscored POSIX name and the non-underscored name. In addition,
 737          * we need to permit the use of the _V6_* environment names specified
 738          * in unistd.h.
 739          */
 740         _SC_V6_ILP32_OFF32,     "_V6_ILP32_OFF32",      SYSCONF,        NOFLAGS,
 741         _SC_V6_ILP32_OFF32,     "_POSIX_V6_ILP32_OFF32", SYSCONF,       NOFLAGS,
 742         _SC_V6_ILP32_OFF32,     "POSIX_V6_ILP32_OFF32", SYSCONF,        NOFLAGS,
 743 
 744         _SC_V6_ILP32_OFFBIG,    "_V6_ILP32_OFFBIG",     SYSCONF,        NOFLAGS,
 745         _SC_V6_ILP32_OFFBIG,    "_POSIX_V6_ILP32_OFFBIG", SYSCONF,      NOFLAGS,
 746         _SC_V6_ILP32_OFFBIG,    "POSIX_V6_ILP32_OFFBIG", SYSCONF,       NOFLAGS,
 747 
 748         _SC_V6_LP64_OFF64,      "_V6_LP64_OFF64",       SYSCONF,        NOFLAGS,
 749         _SC_V6_LP64_OFF64,      "_POSIX_V6_LP64_OFF64", SYSCONF,        NOFLAGS,
 750         _SC_V6_LP64_OFF64,      "POSIX_V6_LP64_OFF64",  SYSCONF,        NOFLAGS,
 751 
 752         _SC_V6_LPBIG_OFFBIG,    "_V6_LPBIG_OFFBIG",     SYSCONF,        NOFLAGS,
 753         _SC_V6_LPBIG_OFFBIG,    "_POSIX_V6_LPBIG_OFFBIG", SYSCONF,      NOFLAGS,
 754         _SC_V6_LPBIG_OFFBIG,    "POSIX_V6_LPBIG_OFFBIG",  SYSCONF,      NOFLAGS,
 755 /*
 756  * System V Interface Definition
 757  */
 758         _SC_NPROCESSORS_CONF,   "NPROCESSORS_CONF",     SYSCONF,        NOFLAGS,
 759         _SC_NPROCESSORS_MAX,    "NPROCESSORS_MAX",      SYSCONF,        NOFLAGS,
 760         _SC_NPROCESSORS_ONLN,   "NPROCESSORS_ONLN",     SYSCONF,        NOFLAGS,
 761         0,              NULL,   0,      0               /* end of table */
 762 };
 763 
 764 
 765 /*
 766  * Print usage message.
 767  */
 768 static int
 769 usage()
 770 {
 771 
 772         (void) fputs(gettext(
 773             "usage:\tgetconf [-v specification] system_var\n"
 774             "\tgetconf [-v specification] path_var pathname\n"
 775             "\tgetconf -a\n"), stderr);
 776         return (2);
 777 }
 778 
 779 
 780 static int
 781 namecmp(const void *a, const void *b)
 782 {
 783         return (strcoll(((const struct sctab *)a)->name,
 784             ((const struct sctab *)b)->name));
 785 }
 786 
 787 
 788 static int
 789 getconf(struct sctab *scp, int argc, char *name, char *file)
 790 {
 791         register size_t len;
 792         register char *buffer;
 793         long value;
 794 
 795         switch (scp->type) {
 796         case SELFCONF:
 797                 if (argc > 2)
 798                         return (usage());
 799                 if (scp->flag & UNDEFINED ||
 800                     (!(scp->flag&UNSIGNED_VALUE) && scp->value == -1)) {
 801                         /* DO NOT TRANSLATE */
 802                         (void) printf("undefined\n");
 803                 } else
 804                         if (scp->flag & UNSIGNED_VALUE)
 805                                 (void) printf("%lu\n", scp->value);
 806                         else
 807                                 (void) printf("%ld\n", scp->value);
 808                 break;
 809 
 810         case SYSCONF:
 811                 if (argc > 2)
 812                         return (usage());
 813                 errno = 0;
 814                 if (scp->flag & UNDEFINED ||
 815                     (value = sysconf((int)scp->value)) == -1) {
 816                         if (errno == EINVAL) {
 817                                 (void) fprintf(stderr,
 818                                     gettext(INVAL_ARG), name);
 819                                 return (1);
 820                         } else {
 821                                 /* DO NOT TRANSLATE */
 822                                 (void) printf("undefined\n");
 823                                 return (0);
 824                         }
 825                 } else
 826                         (void) printf("%ld\n", value);
 827                 break;
 828 
 829         case CONFSTR:
 830                 if (argc > 2)
 831                         return (usage());
 832                 errno = 0;
 833                 len = confstr((int)scp->value, NULL, (size_t)0);
 834                 if (len == 0)
 835                         if (errno == EINVAL) {
 836                                 (void) fprintf(stderr, gettext(INVAL_ARG),
 837                                     name);
 838                                 return (1);
 839                         } else {
 840                                 /* DO NOT TRANSLATE */
 841                                 (void) printf("undefined\n");
 842                                 return (0);
 843                         }
 844                 /*
 845                  * allocate space to store result of constr() into
 846                  */
 847                 if ((buffer = malloc(len)) == NULL) {
 848                         (void) fprintf(stderr,
 849                             gettext("insufficient memory available"));
 850                         return (1);
 851                 }
 852 
 853                 assert(confstr((int)scp->value, buffer, len) != 0);
 854 
 855                 (void) printf("%s\n", buffer);
 856                 free(buffer);
 857                 break;
 858 
 859         case PATHCONF:
 860                 if (argc != 3)
 861                         return (usage());
 862                 errno = 0;
 863                 if ((value = pathconf(file, (int)scp->value)) == -1) {
 864                         if (errno == EINVAL || errno == 0) {
 865                                 /* Does not support the association */
 866                                 /* DO NOT TRANSLATE */
 867                                 (void) printf("undefined\n");
 868                                 return (0);
 869                         } else {
 870                                 /* Probably problems with the pathname itself */
 871                                 if (aflag) {
 872                                         (void) printf("%s\n", file);
 873                                 } else {
 874                                         (void) printf("%s", file);
 875                                 }
 876                                 return (1);
 877                         }
 878                 }
 879                 (void) printf("%ld\n", value);
 880                 break;
 881         }
 882         return (0);
 883 }
 884 
 885 int
 886 main(int argc, char **argv)
 887 {
 888         register struct sctab *scp;
 889         int c;
 890         int exstat = 0;
 891 
 892         (void) setlocale(LC_ALL, "");
 893 #if     !defined(TEXT_DOMAIN)   /* Should be defined by cc -D */
 894 #define TEXT_DOMAIN "SYS_TEST"
 895 #endif
 896         (void) textdomain(TEXT_DOMAIN);
 897 
 898         while ((c = getopt(argc, argv, "av:")) != -1)
 899                 switch (c) {
 900                 case 'a':
 901                         aflag = 1;
 902                         break;
 903                 case 'v':
 904                         /*
 905                          * Unix98 adds the -v option to allow
 906                          * programming 'specifications' to be
 907                          * indicated, for present purposes
 908                          * the specification isn't really
 909                          * doing anything of value, so for
 910                          * the moment getopt just processes the
 911                          * option value and argv[1] is adjusted.
 912                          *
 913                          * At some later date we might want to
 914                          * do specification processing at this
 915                          * point.
 916                          */
 917                         break;
 918                 case '?':
 919                         return (usage());
 920                 }
 921         argc -= optind-1;
 922         argv += optind-1;
 923 
 924         if ((aflag && argc >= 2) || (!aflag && argc < 2))
 925                 return (usage());
 926         if (aflag) {
 927 
 928 #define TabStop         8
 929 #define RightColumn     32
 930 #define DefPathName     "."
 931 
 932                 /*
 933                  * sort the table by the "name" field
 934                  * so we print it in sorted order
 935                  */
 936         qsort(&sctab[0], (sizeof (sctab)/sizeof (struct sctab))-1,
 937             sizeof (struct sctab), namecmp);
 938 
 939                 /*
 940                  * print all the known symbols and their values
 941                  */
 942                 for (scp = &sctab[0]; scp->name != NULL; ++scp) {
 943                         int stat;
 944 
 945                         /*
 946                          * create 2 columns:
 947                          *   variable name in the left column,
 948                          *   value in the right column.
 949                          * The right column starts at a tab stop.
 950                          */
 951                         (void) printf("%s:\t", scp->name);
 952 
 953                         c = strlen(scp->name) + 1;
 954                         c = (c+TabStop) / TabStop, c *= TabStop;
 955                         for (; c < RightColumn; c += TabStop)
 956                                 (void) putchar('\t');
 957 
 958                         /*
 959                          * for pathconf() related variables that require
 960                          * a pathname, use "."
 961                          */
 962                         stat = getconf(scp, scp->type == PATHCONF ? 3 : 2,
 963                             scp->name, DefPathName);
 964 
 965                         exstat |= stat;
 966 
 967                         /*
 968                          * if stat != 0, then an error message was already
 969                          * printed in getconf(),
 970                          * so don't need to print one here
 971                          */
 972                 }
 973         } else {
 974 
 975                 /*
 976                  * find the name of the specified variable (argv[1])
 977                  * and print its value.
 978                  */
 979                 for (scp = &sctab[0]; scp->name != NULL; ++scp)
 980                         if (strcmp(argv[1], scp->name) == 0) {
 981                                 exstat = getconf(scp, argc, argv[1], argv[2]);
 982                                 break;
 983                         }
 984 
 985                 /*
 986                  * if at last entry in table, then the user specified
 987                  * variable is invalid
 988                  */
 989                 if (scp->name == NULL) {
 990                         errno = EINVAL;
 991                         (void) fprintf(stderr, gettext(INVAL_ARG), argv[1]);
 992                         return (1);
 993                 }
 994         }
 995         return (exstat);
 996 }