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