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_ACL_ENABLED,        "ACL_ENABLED",          PATHCONF,  NOFLAGS,
 240         _PC_MIN_HOLE_SIZE,      "MIN_HOLE_SIZE",        PATHCONF,  NOFLAGS,
 241         _PC_SATTR_ENABLED,      "SATTR_ENABLED",        PATHCONF,  NOFLAGS,
 242         _PC_SATTR_EXISTS,       "SATTR_EXISTS",         PATHCONF,  NOFLAGS,
 243 
 244         /* UNIX 08 additions */
 245 
 246         _PC_TIMESTAMP_RESOLUTION, "_POSIX_TIMESTAMP_RESOLUTION",
 247             PATHCONF,   NOFLAGS,
 248 
 249         /* confstr() variables */
 250 
 251         /* POSIX.2-1992 description of getconf utility */
 252         _CS_PATH,               "PATH",                 CONFSTR,   NOFLAGS,
 253 
 254         /* POSIX.2-1992 table B-18 */
 255         _CS_PATH,               "CS_PATH",              CONFSTR,   NOFLAGS,
 256         _CS_PATH,               "_CS_PATH",             CONFSTR,   NOFLAGS,
 257 
 258         /* command names for large file configuration information */
 259         /* large file compilation environment configuration */
 260 
 261         _CS_LFS_CFLAGS,         "LFS_CFLAGS",           CONFSTR,   NOFLAGS,
 262         _CS_LFS_LDFLAGS,        "LFS_LDFLAGS",          CONFSTR,   NOFLAGS,
 263         _CS_LFS_LIBS,           "LFS_LIBS",             CONFSTR,   NOFLAGS,
 264         _CS_LFS_LINTFLAGS,      "LFS_LINTFLAGS",        CONFSTR,   NOFLAGS,
 265 
 266         /* transitional large file interface configuration */
 267 
 268         _CS_LFS64_CFLAGS,       "LFS64_CFLAGS",         CONFSTR,   NOFLAGS,
 269         _CS_LFS64_LDFLAGS,      "LFS64_LDFLAGS",        CONFSTR,   NOFLAGS,
 270         _CS_LFS64_LIBS,         "LFS64_LIBS",           CONFSTR,   NOFLAGS,
 271         _CS_LFS64_LINTFLAGS,    "LFS64_LINTFLAGS",      CONFSTR,   NOFLAGS,
 272 
 273         /*
 274          *  UNIX 98:
 275          *  confstr additions, these support
 276          *  programming specifications/environments.
 277          *
 278          * Unfortunately there is some uncertainty with
 279          * the standard at this point about the constant
 280          * name, thus we need to recognize BOTH with and
 281          * without the initial underscore.
 282          */
 283         _CS_XBS5_ILP32_OFF32_CFLAGS,    "XBS5_ILP32_OFF32_CFLAGS",
 284                 CONFSTR,        NOFLAGS,
 285         _CS_XBS5_ILP32_OFF32_CFLAGS,    "_XBS5_ILP32_OFF32_CFLAGS",
 286                 CONFSTR,        NOFLAGS,
 287 
 288         _CS_XBS5_ILP32_OFF32_LDFLAGS,   "XBS5_ILP32_OFF32_LDFLAGS",
 289                 CONFSTR,        NOFLAGS,
 290         _CS_XBS5_ILP32_OFF32_LDFLAGS,   "_XBS5_ILP32_OFF32_LDFLAGS",
 291                 CONFSTR,        NOFLAGS,
 292 
 293         _CS_XBS5_ILP32_OFF32_LIBS,      "XBS5_ILP32_OFF32_LIBS",
 294                 CONFSTR,        NOFLAGS,
 295         _CS_XBS5_ILP32_OFF32_LIBS,      "_XBS5_ILP32_OFF32_LIBS",
 296                 CONFSTR,        NOFLAGS,
 297 
 298         _CS_XBS5_ILP32_OFF32_LINTFLAGS, "XBS5_ILP32_OFF32_LINTFLAGS",
 299                 CONFSTR,        NOFLAGS,
 300         _CS_XBS5_ILP32_OFF32_LINTFLAGS, "_XBS5_ILP32_OFF32_LINTFLAGS",
 301                 CONFSTR,        NOFLAGS,
 302 
 303         _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "XBS5_ILP32_OFFBIG_CFLAGS",
 304                 CONFSTR,        NOFLAGS,
 305         _CS_XBS5_ILP32_OFFBIG_CFLAGS,   "_XBS5_ILP32_OFFBIG_CFLAGS",
 306                 CONFSTR,        NOFLAGS,
 307 
 308         _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "XBS5_ILP32_OFFBIG_LDFLAGS",
 309                 CONFSTR,        NOFLAGS,
 310         _CS_XBS5_ILP32_OFFBIG_LDFLAGS,  "_XBS5_ILP32_OFFBIG_LDFLAGS",
 311                 CONFSTR,        NOFLAGS,
 312 
 313         _CS_XBS5_ILP32_OFFBIG_LIBS,     "XBS5_ILP32_OFFBIG_LIBS",
 314                 CONFSTR,        NOFLAGS,
 315         _CS_XBS5_ILP32_OFFBIG_LIBS,     "_XBS5_ILP32_OFFBIG_LIBS",
 316                 CONFSTR,        NOFLAGS,
 317 
 318         _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "XBS5_ILP32_OFFBIG_LINTFLAGS",
 319                 CONFSTR,        NOFLAGS,
 320         _CS_XBS5_ILP32_OFFBIG_LINTFLAGS, "_XBS5_ILP32_OFFBIG_LINTFLAGS",
 321                 CONFSTR,        NOFLAGS,
 322 
 323         _CS_XBS5_LP64_OFF64_CFLAGS,     "XBS5_LP64_OFF64_CFLAGS",
 324                 CONFSTR,        NOFLAGS,
 325         _CS_XBS5_LP64_OFF64_CFLAGS,     "_XBS5_LP64_OFF64_CFLAGS",
 326                 CONFSTR,        NOFLAGS,
 327 
 328         _CS_XBS5_LP64_OFF64_LDFLAGS,    "XBS5_LP64_OFF64_LDFLAGS",
 329                 CONFSTR,        NOFLAGS,
 330         _CS_XBS5_LP64_OFF64_LDFLAGS,    "_XBS5_LP64_OFF64_LDFLAGS",
 331                 CONFSTR,        NOFLAGS,
 332 
 333         _CS_XBS5_LP64_OFF64_LIBS,       "XBS5_LP64_OFF64_LIBS",
 334                 CONFSTR,        NOFLAGS,
 335         _CS_XBS5_LP64_OFF64_LIBS,       "_XBS5_LP64_OFF64_LIBS",
 336                 CONFSTR,        NOFLAGS,
 337 
 338         _CS_XBS5_LP64_OFF64_LINTFLAGS,  "XBS5_LP64_OFF64_LINTFLAGS",
 339                 CONFSTR,        NOFLAGS,
 340         _CS_XBS5_LP64_OFF64_LINTFLAGS,  "_XBS5_LP64_OFF64_LINTFLAGS",
 341                 CONFSTR,        NOFLAGS,
 342 
 343         _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "XBS5_LPBIG_OFFBIG_CFLAGS",
 344                 CONFSTR,        NOFLAGS,
 345         _CS_XBS5_LPBIG_OFFBIG_CFLAGS,   "_XBS5_LPBIG_OFFBIG_CFLAGS",
 346                 CONFSTR,        NOFLAGS,
 347 
 348         _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "XBS5_LPBIG_OFFBIG_LDFLAGS",
 349                 CONFSTR,        NOFLAGS,
 350         _CS_XBS5_LPBIG_OFFBIG_LDFLAGS,  "_XBS5_LPBIG_OFFBIG_LDFLAGS",
 351                 CONFSTR,        NOFLAGS,
 352 
 353         _CS_XBS5_LPBIG_OFFBIG_LIBS,     "XBS5_LPBIG_OFFBIG_LIBS",
 354                 CONFSTR,        NOFLAGS,
 355         _CS_XBS5_LPBIG_OFFBIG_LIBS,     "_XBS5_LPBIG_OFFBIG_LIBS",
 356                 CONFSTR,        NOFLAGS,
 357 
 358         _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "XBS5_LPBIG_OFFBIG_LINTFLAGS",
 359                 CONFSTR,        NOFLAGS,
 360         _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS, "_XBS5_LPBIG_OFFBIG_LINTFLAGS",
 361                 CONFSTR,        NOFLAGS,
 362 
 363         /*
 364          * UNIX 03 confstr() additions for compilation environments
 365          */
 366         _CS_POSIX_V6_ILP32_OFF32_CFLAGS, "POSIX_V6_ILP32_OFF32_CFLAGS",
 367                 CONFSTR,        NOFLAGS,
 368         _CS_POSIX_V6_ILP32_OFF32_LDFLAGS, "POSIX_V6_ILP32_OFF32_LDFLAGS",
 369                 CONFSTR,        NOFLAGS,
 370         _CS_POSIX_V6_ILP32_OFF32_LIBS, "POSIX_V6_ILP32_OFF32_LIBS",
 371                 CONFSTR,        NOFLAGS,
 372         _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS, "POSIX_V6_ILP32_OFFBIG_CFLAGS",
 373                 CONFSTR,        NOFLAGS,
 374         _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS, "POSIX_V6_ILP32_OFFBIG_LDFLAGS",
 375                 CONFSTR,        NOFLAGS,
 376         _CS_POSIX_V6_ILP32_OFFBIG_LIBS, "POSIX_V6_ILP32_OFFBIG_LIBS",
 377                 CONFSTR,        NOFLAGS,
 378         _CS_POSIX_V6_LP64_OFF64_CFLAGS, "POSIX_V6_LP64_OFF64_CFLAGS",
 379                 CONFSTR,        NOFLAGS,
 380         _CS_POSIX_V6_LP64_OFF64_LDFLAGS, "POSIX_V6_LP64_OFF64_LDFLAGS",
 381                 CONFSTR,        NOFLAGS,
 382         _CS_POSIX_V6_LP64_OFF64_LIBS, "POSIX_V6_LP64_OFF64_LIBS",
 383                 CONFSTR,        NOFLAGS,
 384         _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS, "POSIX_V6_LPBIG_OFFBIG_CFLAGS",
 385                 CONFSTR,        NOFLAGS,
 386         _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS, "POSIX_V6_LPBIG_OFFBIG_LDFLAGS",
 387                 CONFSTR,        NOFLAGS,
 388         _CS_POSIX_V6_LPBIG_OFFBIG_LIBS, "POSIX_V6_LPBIG_OFFBIG_LIBS",
 389                 CONFSTR,        NOFLAGS,
 390         _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS, "POSIX_V6_WIDTH_RESTRICTED_ENVS",
 391                 CONFSTR,        NOFLAGS,
 392         /* End of UNIX 03 compilation environments */
 393 
 394 #ifdef  _SC_2_C_VERSION         /* POSIX.2 table B-4 */
 395         _SC_2_C_VERSION,        "_POSIX2_C_VERSION",    SYSCONF,   NOFLAGS,
 396 #else
 397         _POSIX2_C_VERSION,      "_POSIX2_C_VERSION",    SELFCONF,   NOFLAGS,
 398 #endif
 399 
 400 /*
 401  * XPG4 support BEGINS
 402  */
 403 
 404 #ifndef CHARCLASS_NAME_MAX
 405 #define CHARCLASS_NAME_MAX      -1
 406 #endif
 407 #ifndef CHAR_BIT
 408 #define CHAR_BIT        -1
 409 #endif
 410 #ifndef CHAR_MAX
 411 #define CHAR_MAX        -1
 412 #endif
 413 #ifndef CHAR_MIN
 414 #define CHAR_MIN        -1
 415 #endif
 416 #ifndef INT_MAX
 417 #define INT_MAX -1
 418 #endif
 419 #ifndef INT_MIN
 420 #define INT_MIN -1
 421 #endif
 422 #ifndef LONG_BIT
 423 #define LONG_BIT        -1
 424 #endif
 425 #ifndef LONG_MAX
 426 #define LONG_MAX        -1
 427 #endif
 428 #ifndef LONG_MIN
 429 #define LONG_MIN        -1
 430 #endif
 431 #ifndef MB_LEN_MAX
 432 #define MB_LEN_MAX      -1
 433 #endif
 434 #ifndef NL_NMAX
 435 #define NL_NMAX -1
 436 #endif
 437 #ifndef NL_ARGMAX
 438 #define NL_ARGMAX       -1
 439 #endif
 440 #ifndef NL_LANGMAX
 441 #define NL_LANGMAX      -1
 442 #endif
 443 #ifndef NL_MSGMAX
 444 #define NL_MSGMAX       -1
 445 #endif
 446 #ifndef NL_SETMAX
 447 #define NL_SETMAX       -1
 448 #endif
 449 #ifndef NL_TEXTMAX
 450 #define NL_TEXTMAX      -1
 451 #endif
 452 #ifndef NZERO
 453 #define NZERO   -1
 454 #endif
 455 #ifndef SCHAR_MAX
 456 #define SCHAR_MAX       -1
 457 #endif
 458 #ifndef SCHAR_MIN
 459 #define SCHAR_MIN       -1
 460 #endif
 461 #ifndef SHRT_MAX
 462 #define SHRT_MAX        -1
 463 #endif
 464 #ifndef SHRT_MIN
 465 #define SHRT_MIN        -1
 466 #endif
 467 #ifndef TMP_MAX
 468 #define TMP_MAX -1
 469 #endif
 470 #ifndef WORD_BIT
 471 #define WORD_BIT        -1
 472 #endif
 473 
 474 
 475 #ifndef _XOPEN_XPG2
 476 #define _XOPEN_XPG2     -1
 477 #endif
 478 #ifndef _XOPEN_XPG3
 479 #define _XOPEN_XPG3     -1
 480 #endif
 481 #ifndef _XOPEN_XPG4
 482 #define _XOPEN_XPG4     -1
 483 #endif
 484 
 485         /*
 486          * the following are values that we should find in <limits.h>
 487          * so we use SELFCONF here.
 488          *
 489          */
 490 
 491         /* POSIX.1-1990 */
 492         CHARCLASS_NAME_MAX,     "CHARCLASS_NAME_MAX",     SELFCONF,   NOFLAGS,
 493         SSIZE_MAX,              "SSIZE_MAX",    SELFCONF,   NOFLAGS,
 494 
 495         /* POSIX.1-1988 */
 496         CHAR_BIT,               "CHAR_BIT",     SELFCONF,   NOFLAGS,
 497         CHAR_MAX,               "CHAR_MAX",     SELFCONF,   NOFLAGS,
 498         CHAR_MIN,               "CHAR_MIN",     SELFCONF,   NOFLAGS,
 499         INT_MAX,                "INT_MAX",      SELFCONF,   NOFLAGS,
 500         INT_MIN,                "INT_MIN",      SELFCONF,   NOFLAGS,
 501         LONG_BIT,               "LONG_BIT",     SELFCONF,   NOFLAGS,
 502         LONG_MAX,               "LONG_MAX",     SELFCONF,   NOFLAGS,
 503         LONG_MIN,               "LONG_MIN",     SELFCONF,   NOFLAGS,
 504         MB_LEN_MAX,             "MB_LEN_MAX",   SELFCONF,   NOFLAGS,
 505         NL_NMAX,                "NL_NMAX",      SELFCONF,   NOFLAGS,
 506         NL_ARGMAX,              "NL_ARGMAX",    SELFCONF,   NOFLAGS,
 507         NL_LANGMAX,             "NL_LANGMAX",   SELFCONF,   NOFLAGS,
 508         NL_MSGMAX,              "NL_MSGMAX",    SELFCONF,   NOFLAGS,
 509         NL_SETMAX,              "NL_SETMAX",    SELFCONF,   NOFLAGS,
 510         NL_TEXTMAX,             "NL_TEXTMAX",   SELFCONF,   NOFLAGS,
 511         NZERO,                  "NZERO",        SELFCONF,   NOFLAGS,
 512         SCHAR_MAX,              "SCHAR_MAX",    SELFCONF,   NOFLAGS,
 513         SCHAR_MIN,              "SCHAR_MIN",    SELFCONF,   NOFLAGS,
 514         SHRT_MAX,               "SHRT_MAX",     SELFCONF,   NOFLAGS,
 515         SHRT_MIN,               "SHRT_MIN",     SELFCONF,   NOFLAGS,
 516         TMP_MAX,                "TMP_MAX",      SELFCONF,   NOFLAGS,
 517 
 518         /*
 519          * for the unsigned maximums, we cannot rely on the value -1
 520          * to indicate "undefined".
 521          */
 522 #ifndef UCHAR_MAX
 523         0,                      "UCHAR_MAX",    SELFCONF,   UNDEFINED,
 524 #else
 525         (long)UCHAR_MAX,        "UCHAR_MAX",    SELFCONF,   UNSIGNED_VALUE,
 526 #endif /* UCHAR_MAX */
 527 #ifndef UINT_MAX
 528         0,                      "UINT_MAX",     SELFCONF,   UNDEFINED,
 529 #else
 530         (long)UINT_MAX,         "UINT_MAX",     SELFCONF,   UNSIGNED_VALUE,
 531 #endif /* UINT_MAX */
 532 #ifndef ULONG_MAX
 533         0,                      "ULONG_MAX",    SELFCONF,   UNDEFINED,
 534 #else
 535         (long)ULONG_MAX,        "ULONG_MAX",    SELFCONF,   UNSIGNED_VALUE,
 536 #endif /* ULONG_MAX */
 537 #ifndef USHRT_MAX
 538         0,                      "USHRT_MAX",    SELFCONF,   UNDEFINED,
 539 #else
 540         (long)USHRT_MAX,        "USHRT_MAX",    SELFCONF,   UNSIGNED_VALUE,
 541 #endif /* USHRT_MAX */
 542 #ifndef SIZE_MAX
 543         0,                      "SIZE_MAX",     SELFCONF,   UNDEFINED,
 544 #else
 545         (long)SIZE_MAX,         "SIZE_MAX",     SELFCONF,   UNSIGNED_VALUE,
 546 #endif /* SIZE_MAX */
 547 
 548         WORD_BIT,               "WORD_BIT",     SELFCONF,   NOFLAGS,
 549 
 550         /* XPG4 Version 2 */
 551         _XOPEN_IOV_MAX,         "_XOPEN_IOV_MAX",  SELFCONF, NOFLAGS,
 552 
 553         /* UNIX 03 */
 554         _XOPEN_NAME_MAX,        "_XOPEN_NAME_MAX", SELFCONF, NOFLAGS,
 555         _XOPEN_PATH_MAX,        "_XOPEN_PATH_MAX", SELFCONF, NOFLAGS,
 556 
 557         /*
 558          * The following are defined via sysconf().  These are considered
 559          * an extension to sysconf().
 560          * The -0 is needed if _XOPEN_XPG? is defined to be an empty string.
 561          */
 562         _XOPEN_XPG2-0,          "_XOPEN_XPG2",  SELFCONF,    NOFLAGS,
 563         _XOPEN_XPG3-0,          "_XOPEN_XPG3",  SELFCONF,    NOFLAGS,
 564         _XOPEN_XPG4-0,          "_XOPEN_XPG4",  SELFCONF,    NOFLAGS,
 565 
 566         /*
 567          * The following should be provided by sysconf() (e.g use SYSCONF),
 568          * so we  look for the appropriate _SC_* symbol in <unistd.h>.
 569          * If it is not defined, then we use SELFCONF with the value of -1.
 570          */
 571         _SC_XOPEN_VERSION,      "_XOPEN_VERSION",       SYSCONF,   NOFLAGS,
 572         _SC_XOPEN_XCU_VERSION,  "_XOPEN_XCU_VERSION",   SYSCONF,   NOFLAGS,
 573         _SC_XOPEN_CRYPT,        "_XOPEN_CRYPT",         SYSCONF,   NOFLAGS,
 574         _SC_XOPEN_ENH_I18N,     "_XOPEN_ENH_I18N",      SYSCONF,   NOFLAGS,
 575         _SC_XOPEN_SHM,          "_XOPEN_SHM",           SYSCONF,   NOFLAGS,
 576 
 577 /*
 578  * XPG4 support ends
 579  */
 580 
 581 /* XPG4, Version 2 support */
 582 
 583         _SC_ATEXIT_MAX,         "ATEXIT_MAX",           SYSCONF,        NOFLAGS,
 584         _SC_PAGESIZE,           "PAGESIZE",             SYSCONF,        NOFLAGS,
 585         _SC_PAGE_SIZE,          "PAGE_SIZE",            SYSCONF,        NOFLAGS,
 586         _SC_XOPEN_UNIX,         "_XOPEN_UNIX",          SYSCONF,        NOFLAGS,
 587         _SC_IOV_MAX,            "IOV_MAX",              SYSCONF,        NOFLAGS,
 588 
 589 /*
 590  * UNIX 98 - XPG5 additions
 591  */
 592         _SC_XOPEN_LEGACY,       "_XOPEN_LEGACY",        SYSCONF,        NOFLAGS,
 593         _SC_PASS_MAX,           "PASS_MAX",             SYSCONF,        NOFLAGS,
 594         _SC_AIO_LISTIO_MAX,     "AIO_LISTIO_MAX",       SYSCONF,        NOFLAGS,
 595         _SC_AIO_MAX,            "AIO_MAX",              SYSCONF,        NOFLAGS,
 596         _SC_AIO_PRIO_DELTA_MAX, "AIO_PRIO_DELTA_MAX",   SYSCONF,        NOFLAGS,
 597         _SC_DELAYTIMER_MAX,     "DELAYTIMER_MAX",       SYSCONF,        NOFLAGS,
 598         _SC_MQ_OPEN_MAX,        "MQ_OPEN_MAX",          SYSCONF,        NOFLAGS,
 599         _SC_MQ_PRIO_MAX,        "MQ_PRIO_MAX",          SYSCONF,        NOFLAGS,
 600         _SC_RTSIG_MAX,          "RTSIG_MAX",            SYSCONF,        NOFLAGS,
 601         _SC_SEM_NSEMS_MAX,      "SEM_NSEMS_MAX",        SYSCONF,        NOFLAGS,
 602         _SC_SEM_VALUE_MAX,      "SEM_VALUE_MAX",        SYSCONF,        NOFLAGS,
 603         _SC_SIGQUEUE_MAX,       "SIGQUEUE_MAX",         SYSCONF,        NOFLAGS,
 604         _SC_TIMER_MAX,          "TIMER_MAX",            SYSCONF,        NOFLAGS,
 605 
 606         _SC_ASYNCHRONOUS_IO,    "_POSIX_ASYNCHRONOUS_IO", SYSCONF,      NOFLAGS,
 607         _SC_FSYNC,              "_POSIX_FSYNC",         SYSCONF,        NOFLAGS,
 608         _SC_MAPPED_FILES,       "_POSIX_MAPPED_FILES",  SYSCONF,        NOFLAGS,
 609         _SC_MEMLOCK,            "_POSIX_MEMLOCK",       SYSCONF,        NOFLAGS,
 610         _SC_MEMLOCK_RANGE,      "_POSIX_MEMLOCK_RANGE", SYSCONF,        NOFLAGS,
 611         _SC_MEMORY_PROTECTION,  "_POSIX_MEMORY_PROTECTION", SYSCONF,    NOFLAGS,
 612         _SC_MESSAGE_PASSING,    "_POSIX_MESSAGE_PASSING", SYSCONF,      NOFLAGS,
 613         _SC_PRIORITIZED_IO,     "_POSIX_PRIORITIZED_IO", SYSCONF,       NOFLAGS,
 614         _SC_PRIORITY_SCHEDULING, "_POSIX_PRIORITY_SCHEDULING", SYSCONF, NOFLAGS,
 615         _SC_REALTIME_SIGNALS,   "_POSIX_REALTIME_SIGNALS", SYSCONF,     NOFLAGS,
 616         _SC_SEMAPHORES,         "_POSIX_SEMAPHORES",    SYSCONF,        NOFLAGS,
 617 
 618         _SC_SHARED_MEMORY_OBJECTS, "_POSIX_SHARED_MEMORY_OBJECTS",
 619             SYSCONF,    NOFLAGS,
 620 
 621         _SC_SYNCHRONIZED_IO,    "_POSIX_SYNCHRONIZED_IO", SYSCONF,      NOFLAGS,
 622         _SC_TIMERS,             "_POSIX_TIMERS",        SYSCONF,        NOFLAGS,
 623 
 624         _SC_LOGIN_NAME_MAX,     "LOGIN_NAME_MAX",       SYSCONF,        NOFLAGS,
 625 
 626         _SC_THREAD_DESTRUCTOR_ITERATIONS, "PTHREAD_DESTRUCTOR_ITERATIONS",
 627             SYSCONF,    NOFLAGS,
 628 
 629         _SC_THREAD_KEYS_MAX,    "PTHREAD_KEYS_MAX",     SYSCONF,        NOFLAGS,
 630         _SC_THREAD_STACK_MIN,   "PTHREAD_STACK_MIN",    SYSCONF,        NOFLAGS,
 631         _SC_THREAD_THREADS_MAX, "PTHREAD_THREADS_MAX",  SYSCONF,        NOFLAGS,
 632 
 633         _SC_THREADS,            "_POSIX_THREADS",       SYSCONF,        NOFLAGS,
 634 
 635         _SC_THREAD_ATTR_STACKADDR, "POSIX_THREAD_ATTR_STACKADDR",
 636             SYSCONF,    NOFLAGS,
 637         _SC_THREAD_ATTR_STACKADDR, "_POSIX_THREAD_ATTR_STACKADDR",
 638             SYSCONF,    NOFLAGS,
 639 
 640         _SC_THREAD_ATTR_STACKSIZE, "POSIX_THREAD_ATTR_STACKSIZE",
 641             SYSCONF,    NOFLAGS,
 642         _SC_THREAD_ATTR_STACKSIZE, "_POSIX_THREAD_ATTR_STACKSIZE",
 643             SYSCONF,    NOFLAGS,
 644 
 645         _SC_THREAD_PRIORITY_SCHEDULING, "POSIX_THREAD_PRIORITY_SCHEDULING",
 646             SYSCONF,    NOFLAGS,
 647         _SC_THREAD_PRIORITY_SCHEDULING, "_POSIX_THREAD_PRIORITY_SCHEDULING",
 648             SYSCONF,    NOFLAGS,
 649 
 650         _SC_THREAD_PRIO_INHERIT, "POSIX_THREAD_PRIO_INHERIT",
 651             SYSCONF,    NOFLAGS,
 652         _SC_THREAD_PRIO_INHERIT, "_POSIX_THREAD_PRIO_INHERIT",
 653             SYSCONF,    NOFLAGS,
 654 
 655         _SC_THREAD_PRIO_PROTECT, "POSIX_THREAD_PRIO_PROTECT",
 656             SYSCONF,    NOFLAGS,
 657         _SC_THREAD_PRIO_PROTECT, "_POSIX_THREAD_PRIO_PROTECT",
 658             SYSCONF,    NOFLAGS,
 659 
 660         _SC_THREAD_PROCESS_SHARED, "POSIX_THREAD_PROCESS_SHARED",
 661             SYSCONF,    NOFLAGS,
 662         _SC_THREAD_PROCESS_SHARED, "_POSIX_THREAD_PROCESS_SHARED",
 663             SYSCONF,    NOFLAGS,
 664 
 665         _SC_THREAD_SAFE_FUNCTIONS, "POSIX_THREAD_SAFE_FUNCTIONS",
 666             SYSCONF,    NOFLAGS,
 667         _SC_THREAD_SAFE_FUNCTIONS, "_POSIX_THREAD_SAFE_FUNCTIONS",
 668             SYSCONF,    NOFLAGS,
 669 
 670         _SC_TTY_NAME_MAX,       "TTY_NAME_MAX",         SYSCONF,        NOFLAGS,
 671         _SC_XOPEN_REALTIME,     "_XOPEN_REALTIME",      SYSCONF,        NOFLAGS,
 672         _SC_XOPEN_REALTIME_THREADS, "_XOPEN_REALTIME_THREADS", SYSCONF, NOFLAGS,
 673 
 674         /*
 675          * Due to ambiguity in the standard we need
 676          * to recognize both the underscored name
 677          * and the non-underscored version in the
 678          * following variables.
 679          */
 680         _SC_XBS5_ILP32_OFF32,   "XBS5_ILP32_OFF32",     SYSCONF,        NOFLAGS,
 681         _SC_XBS5_ILP32_OFF32,   "_XBS5_ILP32_OFF32",    SYSCONF,        NOFLAGS,
 682 
 683         _SC_XBS5_ILP32_OFFBIG,  "XBS5_ILP32_OFFBIG",    SYSCONF,        NOFLAGS,
 684         _SC_XBS5_ILP32_OFFBIG,  "_XBS5_ILP32_OFFBIG",   SYSCONF,        NOFLAGS,
 685 
 686         _SC_XBS5_LP64_OFF64,    "XBS5_LP64_OFF64",      SYSCONF,        NOFLAGS,
 687         _SC_XBS5_LP64_OFF64,    "_XBS5_LP64_OFF64",     SYSCONF,        NOFLAGS,
 688 
 689         _SC_XBS5_LPBIG_OFFBIG,  "XBS5_LPBIG_OFFBIG",    SYSCONF,        NOFLAGS,
 690         _SC_XBS5_LPBIG_OFFBIG,  "_XBS5_LPBIG_OFFBIG",   SYSCONF,        NOFLAGS,
 691 
 692 /*
 693  * UNIX 03 additions for sysconf() names, and names that are not in interfaces
 694  */
 695         _SC_REGEXP,             "_POSIX_REGEXP",          SYSCONF,      NOFLAGS,
 696         _SC_SHELL,              "_POSIX_SHELL",           SYSCONF,      NOFLAGS,
 697         _SC_HOST_NAME_MAX,      "HOST_NAME_MAX",          SYSCONF,      NOFLAGS,
 698         _SC_READER_WRITER_LOCKS, "_POSIX_READER_WRITER_LOCKS", SYSCONF, NOFLAGS,
 699         _SC_IPV6,               "_POSIX_IPV6",            SYSCONF,      NOFLAGS,
 700         _SC_RAW_SOCKETS,        "_POSIX_RAW_SOCKETS",     SYSCONF,      NOFLAGS,
 701         _SC_XOPEN_STREAMS,      "_XOPEN_STREAMS",         SYSCONF,      NOFLAGS,
 702         _SC_SYMLOOP_MAX,        "SYMLOOP_MAX",            SYSCONF,      NOFLAGS,
 703         _SC_2_PBS,              "_POSIX2_PBS",            SYSCONF,      NOFLAGS,
 704         _SC_2_PBS_ACCOUNTING,   "_POSIX2_PBS_ACCOUNTING", SYSCONF,      NOFLAGS,
 705         _SC_2_PBS_CHECKPOINT,   "_POSIX2_PBS_CHECKPOINT", SYSCONF,      NOFLAGS,
 706         _SC_2_PBS_LOCATE,       "_POSIX2_PBS_LOCATE",     SYSCONF,      NOFLAGS,
 707         _SC_2_PBS_MESSAGE,      "_POSIX2_PBS_MESSAGE",    SYSCONF,      NOFLAGS,
 708         _SC_2_PBS_TRACK,        "_POSIX2_PBS_TRACK",      SYSCONF,      NOFLAGS,
 709 
 710         _SC_ADVISORY_INFO,      "_POSIX_ADVISORY_INFO",   SYSCONF,      NOFLAGS,
 711         _SC_BARRIERS,           "_POSIX_BARRIERS",        SYSCONF,      NOFLAGS,
 712         _SC_CLOCK_SELECTION,    "_POSIX_CLOCK_SELECTION", SYSCONF,      NOFLAGS,
 713         _SC_CPUTIME,            "_POSIX_CPUTIME",         SYSCONF,      NOFLAGS,
 714         _SC_MONOTONIC_CLOCK,    "_POSIX_MONOTONIC_CLOCK", SYSCONF,      NOFLAGS,
 715         _SC_SPAWN,              "_POSIX_SPAWN",           SYSCONF,      NOFLAGS,
 716         _SC_SPIN_LOCKS,         "_POSIX_SPIN_LOCKS",      SYSCONF,      NOFLAGS,
 717         _SC_SPORADIC_SERVER,    "_POSIX_SPORADIC_SERVER", SYSCONF,      NOFLAGS,
 718         _SC_SS_REPL_MAX,        "_POSIX_SS_REPL_MAX",     SYSCONF,      NOFLAGS,
 719         _SC_THREAD_CPUTIME,     "_POSIX_THREAD_CPUTIME",   SYSCONF,     NOFLAGS,
 720         _SC_THREAD_SPORADIC_SERVER, "_POSIX_THREAD_SPORADIC_SERVER",    SYSCONF,
 721                 NOFLAGS,
 722         _SC_TIMEOUTS,           "_POSIX_TIMEOUTS",        SYSCONF,      NOFLAGS,
 723         _SC_TRACE,              "_POSIX_TRACE",           SYSCONF,      NOFLAGS,
 724         _SC_TRACE_EVENT_FILTER, "_POSIX_TRACE_EVENT_FILTER", SYSCONF,   NOFLAGS,
 725         _SC_TRACE_EVENT_NAME_MAX, "_POSIX_TRACE_EVENT_NAME_MAX", SYSCONF,
 726                                                                         NOFLAGS,
 727         _SC_TRACE_INHERIT,      "_POSIX_TRACE_INHERIT",   SYSCONF,      NOFLAGS,
 728         _SC_TRACE_LOG,          "_POSIX_TRACE_LOG",       SYSCONF,      NOFLAGS,
 729         _SC_TRACE_NAME_MAX,     "_POSIX_TRACE_NAME_MAX",  SYSCONF,      NOFLAGS,
 730         _SC_TRACE_SYS_MAX,      "_POSIX_TRACE_SYS_MAX",   SYSCONF,      NOFLAGS,
 731         _SC_TRACE_USER_EVENT_MAX, "_POSIX_TRACE_USER_EVENT_MAX", SYSCONF,
 732                                                                         NOFLAGS,
 733         _SC_TYPED_MEMORY_OBJECTS, "_POSIX_TYPED_MEMORY_OBJECTS",        SYSCONF,
 734                 NOFLAGS,
 735 
 736         /*
 737          * Due to an ambiguity in the specification, we need to recognize both
 738          * the underscored POSIX name and the non-underscored name. In addition,
 739          * we need to permit the use of the _V6_* environment names specified
 740          * in unistd.h.
 741          */
 742         _SC_V6_ILP32_OFF32,     "_V6_ILP32_OFF32",      SYSCONF,        NOFLAGS,
 743         _SC_V6_ILP32_OFF32,     "_POSIX_V6_ILP32_OFF32", SYSCONF,       NOFLAGS,
 744         _SC_V6_ILP32_OFF32,     "POSIX_V6_ILP32_OFF32", SYSCONF,        NOFLAGS,
 745 
 746         _SC_V6_ILP32_OFFBIG,    "_V6_ILP32_OFFBIG",     SYSCONF,        NOFLAGS,
 747         _SC_V6_ILP32_OFFBIG,    "_POSIX_V6_ILP32_OFFBIG", SYSCONF,      NOFLAGS,
 748         _SC_V6_ILP32_OFFBIG,    "POSIX_V6_ILP32_OFFBIG", SYSCONF,       NOFLAGS,
 749 
 750         _SC_V6_LP64_OFF64,      "_V6_LP64_OFF64",       SYSCONF,        NOFLAGS,
 751         _SC_V6_LP64_OFF64,      "_POSIX_V6_LP64_OFF64", SYSCONF,        NOFLAGS,
 752         _SC_V6_LP64_OFF64,      "POSIX_V6_LP64_OFF64",  SYSCONF,        NOFLAGS,
 753 
 754         _SC_V6_LPBIG_OFFBIG,    "_V6_LPBIG_OFFBIG",     SYSCONF,        NOFLAGS,
 755         _SC_V6_LPBIG_OFFBIG,    "_POSIX_V6_LPBIG_OFFBIG", SYSCONF,      NOFLAGS,
 756         _SC_V6_LPBIG_OFFBIG,    "POSIX_V6_LPBIG_OFFBIG",  SYSCONF,      NOFLAGS,
 757 /*
 758  * System V Interface Definition
 759  */
 760         _SC_NPROCESSORS_CONF,   "NPROCESSORS_CONF",     SYSCONF,        NOFLAGS,
 761         _SC_NPROCESSORS_MAX,    "NPROCESSORS_MAX",      SYSCONF,        NOFLAGS,
 762         _SC_NPROCESSORS_ONLN,   "NPROCESSORS_ONLN",     SYSCONF,        NOFLAGS,
 763         0,              NULL,   0,      0               /* end of table */
 764 };
 765 
 766 
 767 /*
 768  * Print usage message.
 769  */
 770 static int
 771 usage()
 772 {
 773 
 774         (void) fputs(gettext(
 775             "usage:\tgetconf [-v specification] system_var\n"
 776             "\tgetconf [-v specification] path_var pathname\n"
 777             "\tgetconf -a\n"), stderr);
 778         return (2);
 779 }
 780 
 781 
 782 static int
 783 namecmp(const void *a, const void *b)
 784 {
 785         return (strcoll(((const struct sctab *)a)->name,
 786             ((const struct sctab *)b)->name));
 787 }
 788 
 789 
 790 static int
 791 getconf(struct sctab *scp, int argc, char *name, char *file)
 792 {
 793         register size_t len;
 794         register char *buffer;
 795         long value;
 796 
 797         switch (scp->type) {
 798         case SELFCONF:
 799                 if (argc > 2)
 800                         return (usage());
 801                 if (scp->flag & UNDEFINED ||
 802                     (!(scp->flag&UNSIGNED_VALUE) && scp->value == -1)) {
 803                         /* DO NOT TRANSLATE */
 804                         (void) printf("undefined\n");
 805                 } else
 806                         if (scp->flag & UNSIGNED_VALUE)
 807                                 (void) printf("%lu\n", scp->value);
 808                         else
 809                                 (void) printf("%ld\n", scp->value);
 810                 break;
 811 
 812         case SYSCONF:
 813                 if (argc > 2)
 814                         return (usage());
 815                 errno = 0;
 816                 if (scp->flag & UNDEFINED ||
 817                     (value = sysconf((int)scp->value)) == -1) {
 818                         if (errno == EINVAL) {
 819                                 (void) fprintf(stderr,
 820                                     gettext(INVAL_ARG), name);
 821                                 return (1);
 822                         } else {
 823                                 /* DO NOT TRANSLATE */
 824                                 (void) printf("undefined\n");
 825                                 return (0);
 826                         }
 827                 } else
 828                         (void) printf("%ld\n", value);
 829                 break;
 830 
 831         case CONFSTR:
 832                 if (argc > 2)
 833                         return (usage());
 834                 errno = 0;
 835                 len = confstr((int)scp->value, NULL, (size_t)0);
 836                 if (len == 0) {
 837                         if (errno == EINVAL) {
 838                                 (void) fprintf(stderr, gettext(INVAL_ARG),
 839                                     name);
 840                                 return (1);
 841                         } else {
 842                                 /* DO NOT TRANSLATE */
 843                                 (void) printf("undefined\n");
 844                                 return (0);
 845                         }
 846                 }
 847                 /*
 848                  * allocate space to store result of constr() into
 849                  */
 850                 if ((buffer = malloc(len)) == NULL) {
 851                         (void) fprintf(stderr,
 852                             gettext("insufficient memory available"));
 853                         return (1);
 854                 }
 855 
 856                 assert(confstr((int)scp->value, buffer, len) != 0);
 857 
 858                 (void) printf("%s\n", buffer);
 859                 free(buffer);
 860                 break;
 861 
 862         case PATHCONF:
 863                 if (argc != 3)
 864                         return (usage());
 865                 errno = 0;
 866                 if ((value = pathconf(file, (int)scp->value)) == -1) {
 867                         if (errno == EINVAL || errno == 0) {
 868                                 /* Does not support the association */
 869                                 /* DO NOT TRANSLATE */
 870                                 (void) printf("undefined\n");
 871                                 return (0);
 872                         } else {
 873                                 /* Probably problems with the pathname itself */
 874                                 if (aflag) {
 875                                         (void) printf("%s\n", file);
 876                                 } else {
 877                                         (void) printf("%s", file);
 878                                 }
 879                                 return (1);
 880                         }
 881                 }
 882                 (void) printf("%ld\n", value);
 883                 break;
 884         }
 885         return (0);
 886 }
 887 
 888 int
 889 main(int argc, char **argv)
 890 {
 891         register struct sctab *scp;
 892         int c;
 893         int exstat = 0;
 894 
 895         (void) setlocale(LC_ALL, "");
 896 #if     !defined(TEXT_DOMAIN)   /* Should be defined by cc -D */
 897 #define TEXT_DOMAIN "SYS_TEST"
 898 #endif
 899         (void) textdomain(TEXT_DOMAIN);
 900 
 901         while ((c = getopt(argc, argv, "av:")) != -1)
 902                 switch (c) {
 903                 case 'a':
 904                         aflag = 1;
 905                         break;
 906                 case 'v':
 907                         /*
 908                          * Unix98 adds the -v option to allow
 909                          * programming 'specifications' to be
 910                          * indicated, for present purposes
 911                          * the specification isn't really
 912                          * doing anything of value, so for
 913                          * the moment getopt just processes the
 914                          * option value and argv[1] is adjusted.
 915                          *
 916                          * At some later date we might want to
 917                          * do specification processing at this
 918                          * point.
 919                          */
 920                         break;
 921                 case '?':
 922                         return (usage());
 923                 }
 924         argc -= optind-1;
 925         argv += optind-1;
 926 
 927         if ((aflag && argc >= 2) || (!aflag && argc < 2))
 928                 return (usage());
 929         if (aflag) {
 930 
 931 #define TabStop         8
 932 #define RightColumn     32
 933 #define DefPathName     "."
 934 
 935                 /*
 936                  * sort the table by the "name" field
 937                  * so we print it in sorted order
 938                  */
 939         qsort(&sctab[0], (sizeof (sctab)/sizeof (struct sctab))-1,
 940             sizeof (struct sctab), namecmp);
 941 
 942                 /*
 943                  * print all the known symbols and their values
 944                  */
 945                 for (scp = &sctab[0]; scp->name != NULL; ++scp) {
 946                         int stat;
 947 
 948                         /*
 949                          * create 2 columns:
 950                          *   variable name in the left column,
 951                          *   value in the right column.
 952                          * The right column starts at a tab stop.
 953                          */
 954                         (void) printf("%s:\t", scp->name);
 955 
 956                         c = strlen(scp->name) + 1;
 957                         c = (c+TabStop) / TabStop, c *= TabStop;
 958                         for (; c < RightColumn; c += TabStop)
 959                                 (void) putchar('\t');
 960 
 961                         /*
 962                          * for pathconf() related variables that require
 963                          * a pathname, use "."
 964                          */
 965                         stat = getconf(scp, scp->type == PATHCONF ? 3 : 2,
 966                             scp->name, DefPathName);
 967 
 968                         exstat |= stat;
 969 
 970                         /*
 971                          * if stat != 0, then an error message was already
 972                          * printed in getconf(),
 973                          * so don't need to print one here
 974                          */
 975                 }
 976         } else {
 977 
 978                 /*
 979                  * find the name of the specified variable (argv[1])
 980                  * and print its value.
 981                  */
 982                 for (scp = &sctab[0]; scp->name != NULL; ++scp)
 983                         if (strcmp(argv[1], scp->name) == 0) {
 984                                 exstat = getconf(scp, argc, argv[1], argv[2]);
 985                                 break;
 986                         }
 987 
 988                 /*
 989                  * if at last entry in table, then the user specified
 990                  * variable is invalid
 991                  */
 992                 if (scp->name == NULL) {
 993                         errno = EINVAL;
 994                         (void) fprintf(stderr, gettext(INVAL_ARG), argv[1]);
 995                         return (1);
 996                 }
 997         }
 998         return (exstat);
 999 }