[BACK]Return to getconf.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / getconf

Annotation of src/usr.bin/getconf/getconf.c, Revision 1.22

1.22    ! claudio     1: /*     $OpenBSD: getconf.c,v 1.21 2021/07/12 15:09:19 beck Exp $       */
1.3       deraadt     2:
1.2       deraadt     3: /*-
                      4:  * Copyright (c) 1996 The NetBSD Foundation, Inc.
1.1       deraadt     5:  * All rights reserved.
                      6:  *
1.2       deraadt     7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by J.T. Conklin.
                      9:  *
1.1       deraadt    10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *      This product includes software developed by Winning Strategies, Inc.
                     21:  * 4. The name of the author may not be used to endorse or promote products
                     22:  *    derived from this software without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     25:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     26:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     27:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     28:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     29:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     30:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     31:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     32:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     33:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     34:  */
                     35:
                     36: /*
                     37:  * POSIX.2 getconf utility
                     38:  *
                     39:  * Written by:
                     40:  *     J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
                     41:  */
                     42:
1.19      schwarze   43: #include <err.h>
                     44: #include <errno.h>
                     45: #include <limits.h>
1.1       deraadt    46: #include <stdio.h>
                     47: #include <stdlib.h>
1.9       david      48: #include <string.h>
1.1       deraadt    49: #include <unistd.h>
                     50:
1.19      schwarze   51: static void __dead usage(void);
1.13      guenther   52: static void list_var(int);
                     53: static int compilation_spec_valid(const char *);
1.1       deraadt    54:
                     55: struct conf_variable
                     56: {
                     57:   const char *name;
                     58:   enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT } type;
                     59:   long value;
                     60: };
                     61:
1.13      guenther   62:
                     63: #define constant_row(name)              { #name, CONSTANT, name },
                     64: #define sysconf_row(name)               { #name, SYSCONF,  _SC_##name },
                     65: #define pathconf_row(name)              { #name, PATHCONF, _PC_##name },
                     66: #define confstr_row(name)               { #name, CONFSTR,  _CS_##name },
                     67: #define posix_constant_row(name)        { #name, CONSTANT, _POSIX_##name },
                     68: #define posix_confstr_row(name)                 { #name, CONFSTR,  _CS_POSIX_##name },
                     69: #define compat_posix2_sysconf_row(name)         { #name, SYSCONF,  _SC_2_##name },
                     70: #define compat_posix2_constant_row(name) { #name, CONSTANT, _POSIX2_##name },
                     71:
                     72: /* Some sysconf variables don't follow the pattern of the others */
                     73: #define posix2_sysconf_row(name) \
                     74:                        { "_POSIX2_" #name, SYSCONF,  _SC_2_##name },
                     75: #define posix2_pathconf_row(name) \
                     76:                        { "_POSIX2_" #name, PATHCONF,  _PC_2_##name },
                     77: #define pthread_sysconf_row(name) \
                     78:                        { "_PTHREAD_" #name, SYSCONF,  _SC_THREAD_##name },
                     79: #define xopen_sysconf_row(name) \
                     80:                        { "_XOPEN_" #name, SYSCONF,  _SC_XOPEN_##name },
                     81:
1.1       deraadt    82: const struct conf_variable conf_table[] =
                     83: {
1.13      guenther   84:   /* Configuration strings */
                     85:   confstr_row(PATH)
                     86:   confstr_row(V7_ENV)
                     87:   confstr_row(V6_ENV)
                     88:
                     89:   /* Symbolic Utility Limits */
                     90:   sysconf_row(BC_BASE_MAX)
                     91:   sysconf_row(BC_DIM_MAX)
                     92:   sysconf_row(BC_SCALE_MAX)
                     93:   sysconf_row(BC_STRING_MAX)
                     94:   sysconf_row(COLL_WEIGHTS_MAX)
                     95:   sysconf_row(EXPR_NEST_MAX)
                     96:   sysconf_row(LINE_MAX)
                     97:   sysconf_row(RE_DUP_MAX)
1.1       deraadt    98:
1.13      guenther   99:   /* POSIX.1 Configurable System Variables */
                    100:   sysconf_row(AIO_LISTIO_MAX)
                    101:   sysconf_row(AIO_MAX)
                    102:   sysconf_row(AIO_PRIO_DELTA_MAX)
                    103:   sysconf_row(ARG_MAX)
                    104:   sysconf_row(CHILD_MAX)
                    105:   sysconf_row(CLK_TCK)
                    106:   sysconf_row(NGROUPS_MAX)
                    107:   sysconf_row(OPEN_MAX)
                    108:   sysconf_row(STREAM_MAX)
                    109:   sysconf_row(TZNAME_MAX)
                    110:   sysconf_row(PAGE_SIZE)
                    111:   sysconf_row(PAGESIZE)
                    112:
                    113:   sysconf_row(SEM_NSEMS_MAX)
                    114:   sysconf_row(SEM_VALUE_MAX)
                    115:   sysconf_row(HOST_NAME_MAX)
                    116:   sysconf_row(LOGIN_NAME_MAX)
                    117:
                    118:   sysconf_row(ATEXIT_MAX)
                    119:   sysconf_row(DELAYTIMER_MAX)
                    120:   sysconf_row(IOV_MAX)
                    121:   sysconf_row(MQ_OPEN_MAX)
                    122:   sysconf_row(MQ_PRIO_MAX)
                    123:   sysconf_row(RTSIG_MAX)
                    124:   sysconf_row(SIGQUEUE_MAX)
                    125:   sysconf_row(SYMLOOP_MAX)
                    126:   sysconf_row(TIMER_MAX)
                    127:   sysconf_row(TTY_NAME_MAX)
                    128:
                    129:   posix2_sysconf_row(PBS)
                    130:   posix2_sysconf_row(PBS_ACCOUNTING)
                    131:   posix2_sysconf_row(PBS_CHECKPOINT)
                    132:   posix2_sysconf_row(PBS_LOCATE)
                    133:   posix2_sysconf_row(PBS_MESSAGE)
                    134:   posix2_sysconf_row(PBS_TRACK)
                    135:
                    136:   pthread_sysconf_row(DESTRUCTOR_ITERATIONS)
                    137:   pthread_sysconf_row(KEYS_MAX)
                    138:   pthread_sysconf_row(STACK_MIN)
                    139:   pthread_sysconf_row(THREADS_MAX)
                    140:
                    141:   xopen_sysconf_row(SHM)
                    142:   xopen_sysconf_row(CRYPT)
                    143:   xopen_sysconf_row(ENH_I18N)
                    144:   xopen_sysconf_row(REALTIME)
                    145:   xopen_sysconf_row(REALTIME_THREADS)
                    146:   xopen_sysconf_row(STREAMS)
                    147:   xopen_sysconf_row(UNIX)
                    148:   xopen_sysconf_row(UUCP)
                    149:   xopen_sysconf_row(VERSION)
                    150:
                    151:   pathconf_row(FILESIZEBITS)
                    152:   pathconf_row(LINK_MAX)
                    153:   pathconf_row(MAX_CANON)
                    154:   pathconf_row(MAX_INPUT)
                    155:   pathconf_row(NAME_MAX)
                    156:   pathconf_row(PATH_MAX)
                    157:   pathconf_row(PIPE_BUF)
                    158:   pathconf_row(SYMLINK_MAX)
                    159:
                    160:   posix2_pathconf_row(SYMLINKS)
                    161:
                    162:   constant_row(_POSIX2_CHARCLASS_NAME_MAX)
                    163:   constant_row(_XOPEN_IOV_MAX)
                    164:   constant_row(_XOPEN_NAME_MAX)
                    165:   constant_row(_XOPEN_PATH_MAX)
1.17      millert   166:
                    167:   /* Extensions */
                    168:   sysconf_row(PHYS_PAGES)
                    169:   sysconf_row(AVPHYS_PAGES)
                    170:   sysconf_row(NPROCESSORS_CONF)
                    171:   sysconf_row(NPROCESSORS_ONLN)
1.13      guenther  172:
                    173:   { NULL }
                    174: };
                    175:
                    176: /*
                    177:  * Lots of names have a leading "_POSIX_", so put them in a table with
                    178:  * that prefix trimmed
                    179:  */
                    180: const char uposix_prefix[] = "_POSIX_";
                    181: const struct conf_variable uposix_conf_table[] =
                    182: {
                    183:   /* POSIX.1 Maximum Values */
                    184:   posix_constant_row(CLOCKRES_MIN)
1.1       deraadt   185:
                    186:   /* POSIX.1 Minimum Values */
1.13      guenther  187:   /*posix_constant_row(AIO_LISTIO_MAX)*/
                    188:   /*posix_constant_row(AIO_MAX)*/
                    189:   posix_constant_row(ARG_MAX)
                    190:   posix_constant_row(CHILD_MAX)
                    191:   /*posix_constant_row(DELAYTIMER_MAX)*/
                    192:   posix_constant_row(HOST_NAME_MAX)
                    193:   posix_constant_row(LINK_MAX)
                    194:   posix_constant_row(LOGIN_NAME_MAX)
                    195:   posix_constant_row(MAX_CANON)
                    196:   posix_constant_row(MAX_INPUT)
                    197:   /*posix_constant_row(MQ_OPEN_MAX)*/
                    198:   /*posix_constant_row(MQ_PRIO_MAX)*/
                    199:   posix_constant_row(NAME_MAX)
                    200:   posix_constant_row(NGROUPS_MAX)
                    201:   posix_constant_row(OPEN_MAX)
                    202:   posix_constant_row(PATH_MAX)
                    203:   posix_constant_row(PIPE_BUF)
                    204:   posix_constant_row(RE_DUP_MAX)
                    205:   /*posix_constant_row(RTSIG_MAX)*/
                    206:   posix_constant_row(SEM_NSEMS_MAX)
                    207:   posix_constant_row(SEM_VALUE_MAX)
                    208:   /*posix_constant_row(SIGQUEUE_MAX)*/
                    209:   posix_constant_row(SSIZE_MAX)
                    210:   /*posix_constant_row(SS_REPL_MAX)*/
                    211:   posix_constant_row(STREAM_MAX)
                    212:   posix_constant_row(SYMLINK_MAX)
                    213:   posix_constant_row(SYMLOOP_MAX)
                    214:   posix_constant_row(THREAD_DESTRUCTOR_ITERATIONS)
                    215:   posix_constant_row(THREAD_KEYS_MAX)
                    216:   posix_constant_row(THREAD_THREADS_MAX)
                    217:   /*posix_constant_row(TIMER_MAX)*/
                    218:   posix_constant_row(TTY_NAME_MAX)
                    219:   posix_constant_row(TZNAME_MAX)
                    220:
                    221:   /* POSIX.1 Configurable System Variables */
                    222:   sysconf_row(JOB_CONTROL)
                    223:   sysconf_row(SAVED_IDS)
                    224:   sysconf_row(VERSION)
                    225:   sysconf_row(FSYNC)
                    226:   sysconf_row(MONOTONIC_CLOCK)
                    227:   sysconf_row(THREAD_SAFE_FUNCTIONS)
                    228:   sysconf_row(ADVISORY_INFO)
                    229:   sysconf_row(BARRIERS)
                    230:   sysconf_row(ASYNCHRONOUS_IO)
                    231:   sysconf_row(CLOCK_SELECTION)
                    232:   sysconf_row(CPUTIME)
                    233:   sysconf_row(IPV6)
                    234:   sysconf_row(MAPPED_FILES)
                    235:   sysconf_row(MEMLOCK)
                    236:   sysconf_row(MEMLOCK_RANGE)
                    237:   sysconf_row(MEMORY_PROTECTION)
                    238:   sysconf_row(MESSAGE_PASSING)
                    239:   sysconf_row(PRIORITIZED_IO)
                    240:   sysconf_row(PRIORITY_SCHEDULING)
                    241:   sysconf_row(RAW_SOCKETS)
                    242:   sysconf_row(READER_WRITER_LOCKS)
                    243:   sysconf_row(REALTIME_SIGNALS)
                    244:   sysconf_row(REGEXP)
                    245:   sysconf_row(SEMAPHORES)
                    246:   sysconf_row(SHARED_MEMORY_OBJECTS)
                    247:   sysconf_row(SHELL)
                    248:   sysconf_row(SPAWN)
                    249:   sysconf_row(SPIN_LOCKS)
                    250:   sysconf_row(SPORADIC_SERVER)
                    251:   sysconf_row(SS_REPL_MAX)
                    252:   sysconf_row(SYNCHRONIZED_IO)
                    253:   sysconf_row(THREAD_ATTR_STACKADDR)
                    254:   sysconf_row(THREAD_ATTR_STACKSIZE)
                    255:   sysconf_row(THREAD_CPUTIME)
                    256:   sysconf_row(THREAD_PRIO_INHERIT)
                    257:   sysconf_row(THREAD_PRIO_PROTECT)
                    258:   sysconf_row(THREAD_PRIORITY_SCHEDULING)
                    259:   sysconf_row(THREAD_PROCESS_SHARED)
                    260:   sysconf_row(THREAD_ROBUST_PRIO_INHERIT)
                    261:   sysconf_row(THREAD_SPORADIC_SERVER)
                    262:   sysconf_row(THREADS)
                    263:   sysconf_row(TIMEOUTS)
                    264:   sysconf_row(TIMERS)
                    265:   sysconf_row(TRACE)
                    266:   sysconf_row(TRACE_EVENT_FILTER)
                    267:   sysconf_row(TRACE_EVENT_NAME_MAX)
                    268:   sysconf_row(TRACE_INHERIT)
                    269:   sysconf_row(TRACE_LOG)
                    270:   sysconf_row(TRACE_NAME_MAX)
                    271:   sysconf_row(TRACE_SYS_MAX)
                    272:   sysconf_row(TRACE_USER_EVENT_MAX)
                    273:   sysconf_row(TYPED_MEMORY_OBJECTS)
                    274:
                    275:   /*
                    276:    * If new compilation specification are added (V8_*?) then add them
                    277:    * to the compilation_specs array below too
                    278:    */
                    279:   sysconf_row(V7_ILP32_OFF32)
                    280:   sysconf_row(V7_ILP32_OFFBIG)
                    281:   sysconf_row(V7_LP64_OFF64)
                    282:   sysconf_row(V7_LPBIG_OFFBIG)
                    283:   sysconf_row(V6_ILP32_OFF32)
                    284:   sysconf_row(V6_ILP32_OFFBIG)
                    285:   sysconf_row(V6_LP64_OFF64)
                    286:   sysconf_row(V6_LPBIG_OFFBIG)
                    287:
                    288:   /* POSIX.1 Configurable Path Variables */
                    289:   pathconf_row(CHOWN_RESTRICTED)
                    290:   pathconf_row(NO_TRUNC)
                    291:   pathconf_row(VDISABLE)
                    292:   pathconf_row(ASYNC_IO)
                    293:   pathconf_row(PRIO_IO)
                    294:   pathconf_row(SYNC_IO)
1.16      guenther  295:   pathconf_row(TIMESTAMP_RESOLUTION)
1.1       deraadt   296:
1.13      guenther  297:   { NULL }
                    298: };
                    299:
                    300: /*
                    301:  * Then there are the "POSIX_*" values
                    302:  */
                    303: const char posix_prefix[] = "POSIX_";
                    304: const struct conf_variable posix_conf_table[] =
                    305: {
                    306:   pathconf_row(ALLOC_SIZE_MIN)
                    307:   pathconf_row(REC_INCR_XFER_SIZE)
                    308:   pathconf_row(REC_MAX_XFER_SIZE)
                    309:   pathconf_row(REC_MIN_XFER_SIZE)
                    310:   pathconf_row(REC_XFER_ALIGN)
                    311:
                    312:   posix_confstr_row(V7_ILP32_OFF32_CFLAGS)
                    313:   posix_confstr_row(V7_ILP32_OFF32_LDFLAGS)
                    314:   posix_confstr_row(V7_ILP32_OFF32_LIBS)
                    315:   posix_confstr_row(V7_ILP32_OFFBIG_CFLAGS)
                    316:   posix_confstr_row(V7_ILP32_OFFBIG_LDFLAGS)
                    317:   posix_confstr_row(V7_ILP32_OFFBIG_LIBS)
                    318:   posix_confstr_row(V7_LP64_OFF64_CFLAGS)
                    319:   posix_confstr_row(V7_LP64_OFF64_LDFLAGS)
                    320:   posix_confstr_row(V7_LP64_OFF64_LIBS)
                    321:   posix_confstr_row(V7_LPBIG_OFFBIG_CFLAGS)
                    322:   posix_confstr_row(V7_LPBIG_OFFBIG_LDFLAGS)
                    323:   posix_confstr_row(V7_LPBIG_OFFBIG_LIBS)
                    324:   posix_confstr_row(V7_THREADS_CFLAGS)
                    325:   posix_confstr_row(V7_THREADS_LDFLAGS)
                    326:   posix_confstr_row(V7_WIDTH_RESTRICTED_ENVS)
                    327:   posix_confstr_row(V6_ILP32_OFF32_CFLAGS)
                    328:   posix_confstr_row(V6_ILP32_OFF32_LDFLAGS)
                    329:   posix_confstr_row(V6_ILP32_OFF32_LIBS)
                    330:   posix_confstr_row(V6_ILP32_OFFBIG_CFLAGS)
                    331:   posix_confstr_row(V6_ILP32_OFFBIG_LDFLAGS)
                    332:   posix_confstr_row(V6_ILP32_OFFBIG_LIBS)
                    333:   posix_confstr_row(V6_LP64_OFF64_CFLAGS)
                    334:   posix_confstr_row(V6_LP64_OFF64_LDFLAGS)
                    335:   posix_confstr_row(V6_LP64_OFF64_LIBS)
                    336:   posix_confstr_row(V6_LPBIG_OFFBIG_CFLAGS)
                    337:   posix_confstr_row(V6_LPBIG_OFFBIG_LDFLAGS)
                    338:   posix_confstr_row(V6_LPBIG_OFFBIG_LIBS)
                    339:   posix_confstr_row(V6_WIDTH_RESTRICTED_ENVS)
                    340:
                    341:   { NULL }
                    342: };
1.1       deraadt   343:
1.13      guenther  344: /*
                    345:  * Finally, there are variables that are accepted with a prefix
                    346:  * of either "_POSIX2_" or "POSIX2_"
                    347:  */
                    348: const char compat_posix2_prefix[] = "POSIX2_";
                    349: const struct conf_variable compat_posix2_conf_table[] =
                    350: {
1.1       deraadt   351:   /* Optional Facility Configuration Values */
1.13      guenther  352:   compat_posix2_sysconf_row(VERSION)
                    353:   compat_posix2_sysconf_row(C_BIND)
                    354:   compat_posix2_sysconf_row(C_DEV)
                    355:   compat_posix2_sysconf_row(CHAR_TERM)
                    356:   compat_posix2_sysconf_row(FORT_DEV)
                    357:   compat_posix2_sysconf_row(FORT_RUN)
                    358:   compat_posix2_sysconf_row(LOCALEDEF)
                    359:   compat_posix2_sysconf_row(SW_DEV)
                    360:   compat_posix2_sysconf_row(UPE)
1.1       deraadt   361:
1.13      guenther  362:   /* Utility Limit Minimum Values */
                    363:   compat_posix2_constant_row(BC_BASE_MAX)
                    364:   compat_posix2_constant_row(BC_DIM_MAX)
                    365:   compat_posix2_constant_row(BC_SCALE_MAX)
                    366:   compat_posix2_constant_row(BC_STRING_MAX)
                    367:   compat_posix2_constant_row(COLL_WEIGHTS_MAX)
                    368:   compat_posix2_constant_row(EXPR_NEST_MAX)
                    369:   compat_posix2_constant_row(LINE_MAX)
                    370:   compat_posix2_constant_row(RE_DUP_MAX)
1.1       deraadt   371:
                    372:   { NULL }
                    373: };
                    374:
1.13      guenther  375: #undef constant_row
                    376: #undef sysconf_row
                    377: #undef pathconf_row
                    378: #undef confstr_row
                    379: #undef posix_constant_row
                    380: #undef posix_confstr_row
                    381: #undef compat_posix2_sysconf_row
                    382: #undef compat_posix2_constant_row
                    383:
                    384:
                    385: /*
                    386:  * What values are possibly accepted by the -v option?
                    387:  * These are implied to have a prefix of posix_prefix
                    388:  */
                    389: const char *compilation_specs[] = {
                    390:   "V7_ILP32_OFF32",
                    391:   "V7_ILP32_OFFBIG",
                    392:   "V7_LP64_OFF64",
                    393:   "V7_LPBIG_OFFBIG",
                    394:   "V6_ILP32_OFF32",
                    395:   "V6_ILP32_OFFBIG",
                    396:   "V6_LP64_OFF64",
                    397:   "V6_LPBIG_OFFBIG",
                    398:   NULL
                    399: };
1.1       deraadt   400:
                    401: int
1.8       deraadt   402: main(int argc, char *argv[])
1.1       deraadt   403: {
                    404:        int ch;
                    405:        const struct conf_variable *cp;
                    406:
                    407:        long val;
                    408:        size_t slen;
                    409:        char * sval;
                    410:
1.13      guenther  411:        while ((ch = getopt(argc, argv, "lLv:")) != -1) {
1.1       deraadt   412:                switch (ch) {
1.13      guenther  413:                case 'l':       /* nonstandard: list system variables */
                    414:                        list_var(0);
                    415:                        return (0);
                    416:                case 'L':       /* nonstandard: list path variables */
                    417:                        list_var(1);
                    418:                        return (0);
                    419:                case 'v':
                    420:                        if (! compilation_spec_valid(optarg))
                    421:                                errx(1, "%s: unknown specification", optarg);
                    422:                        break;
1.1       deraadt   423:                case '?':
                    424:                default:
                    425:                        usage();
                    426:                }
                    427:        }
                    428:        argc -= optind;
                    429:        argv += optind;
                    430:
1.15      guenther  431:        if (argc < 1 || argc > 2)
1.1       deraadt   432:                usage();
                    433:
1.13      guenther  434:        /* pick a table based on a possible prefix */
                    435:        if (strncmp(*argv, uposix_prefix, sizeof(uposix_prefix) - 1) == 0) {
                    436:                cp = uposix_conf_table;
                    437:                slen = sizeof(uposix_prefix) - 1;
                    438:        } else if (strncmp(*argv, posix_prefix,
                    439:            sizeof(posix_prefix) - 1) == 0) {
                    440:                cp = posix_conf_table;
                    441:                slen = sizeof(posix_prefix) - 1;
                    442:        } else {
                    443:                cp = conf_table;
                    444:                slen = 0;
                    445:        }
                    446:
                    447:        /* scan the table */
                    448:        for (; cp->name != NULL; cp++)
                    449:                if (strcmp(*argv + slen, cp->name) == 0)
1.1       deraadt   450:                        break;
1.13      guenther  451:
                    452:        /*
                    453:         * If no match, then make a final check against
                    454:         * compat_posix2_conf_table, with special magic to accept/skip
                    455:         * a leading underbar
                    456:         */
                    457:        slen = argv[0][0] == '_';
                    458:        if (cp->name == NULL && strncmp(*argv + slen, compat_posix2_prefix,
                    459:            sizeof(compat_posix2_prefix) - 1) == 0) {
                    460:                slen += sizeof(compat_posix2_prefix) - 1;
                    461:                for (cp = compat_posix2_conf_table; cp->name != NULL; cp++) {
                    462:                        if (strcmp(*argv + slen, cp->name) == 0)
                    463:                                break;
                    464:                }
1.1       deraadt   465:        }
1.13      guenther  466:
1.15      guenther  467:        if (cp->name == NULL)
1.2       deraadt   468:                errx(1, "%s: unknown variable", *argv);
1.1       deraadt   469:
                    470:        if (cp->type == PATHCONF) {
                    471:                if (argc != 2) usage();
                    472:        } else {
                    473:                if (argc != 1) usage();
                    474:        }
                    475:
                    476:        switch (cp->type) {
                    477:        case CONSTANT:
1.18      jca       478:                if (pledge("stdio", NULL) == -1)
                    479:                        err(1, "pledge");
1.1       deraadt   480:                printf("%ld\n", cp->value);
                    481:                break;
                    482:
                    483:        case CONFSTR:
1.18      jca       484:                if (pledge("stdio", NULL) == -1)
                    485:                        err(1, "pledge");
1.10      otto      486:                errno = 0;
1.15      guenther  487:                if ((slen = confstr(cp->value, NULL, 0)) == 0) {
                    488:                        if (errno != 0)
                    489:                                err(1, NULL);
                    490:
                    491:                        printf("undefined\n");
                    492:                } else {
                    493:                        if ((sval = malloc(slen)) == NULL)
                    494:                                err(1, NULL);
                    495:
                    496:                        confstr(cp->value, sval, slen);
                    497:                        printf("%s\n", sval);
1.10      otto      498:                }
1.1       deraadt   499:                break;
                    500:
                    501:        case SYSCONF:
1.22    ! claudio   502:                if (pledge("stdio ps vminfo", NULL) == -1)
1.18      jca       503:                        err(1, "pledge");
1.1       deraadt   504:                errno = 0;
                    505:                if ((val = sysconf(cp->value)) == -1) {
1.15      guenther  506:                        if (errno != 0)
1.1       deraadt   507:                                err(1, NULL);
                    508:
1.15      guenther  509:                        printf("undefined\n");
1.1       deraadt   510:                } else {
                    511:                        printf("%ld\n", val);
                    512:                }
                    513:                break;
                    514:
                    515:        case PATHCONF:
1.20      mestre    516:                if (unveil(argv[1], "r") == -1)
1.21      beck      517:                        err(1, "unveil %s", argv[1]);
1.18      jca       518:                if (pledge("stdio rpath", NULL) == -1)
                    519:                        err(1, "pledge");
1.1       deraadt   520:                errno = 0;
                    521:                if ((val = pathconf(argv[1], cp->value)) == -1) {
1.15      guenther  522:                        if (errno != 0)
1.1       deraadt   523:                                err(1, "%s", argv[1]);
                    524:
1.15      guenther  525:                        printf("undefined\n");
1.1       deraadt   526:                } else {
1.15      guenther  527:                        printf("%ld\n", val);
1.1       deraadt   528:                }
                    529:                break;
                    530:        }
                    531:
1.19      schwarze  532:        return ferror(stdout);
1.1       deraadt   533: }
                    534:
                    535:
1.19      schwarze  536: static void __dead
1.8       deraadt   537: usage(void)
1.1       deraadt   538: {
1.4       aaron     539:        extern char *__progname;
                    540:
1.14      jmc       541:        (void)fprintf(stderr,
                    542:            "usage: %s [-Ll] [-v specification] name [pathname]\n",
1.13      guenther  543:            __progname);
1.4       aaron     544:        exit(1);
1.13      guenther  545: }
                    546:
                    547: static void
                    548: list_var(int do_pathconf)
                    549: {
                    550:        const struct conf_variable *cp;
                    551:
                    552:        for (cp = uposix_conf_table; cp->name != NULL; cp++)
                    553:                if ((cp->type == PATHCONF) == do_pathconf)
                    554:                        printf("%s%s\n", uposix_prefix, cp->name);
                    555:        for (cp = posix_conf_table; cp->name != NULL; cp++)
                    556:                if ((cp->type == PATHCONF) == do_pathconf)
                    557:                        printf("%s%s\n", posix_prefix, cp->name);
                    558:        for (cp = conf_table; cp->name != NULL; cp++)
                    559:                if ((cp->type == PATHCONF) == do_pathconf)
                    560:                        printf("%s\n", cp->name);
                    561:        for (cp = compat_posix2_conf_table; cp->name != NULL; cp++)
                    562:                if ((cp->type == PATHCONF) == do_pathconf)
                    563:                        printf("_%s%s\n", compat_posix2_prefix, cp->name);
                    564: }
                    565:
                    566: static int
                    567: compilation_spec_valid(const char *spec)
                    568: {
                    569:        const char **sp;
                    570:        const struct conf_variable *cp;
                    571:
                    572:        if (strncmp(spec, posix_prefix, sizeof(posix_prefix) - 1) != 0)
                    573:                return (0);
                    574:
                    575:        spec += sizeof(posix_prefix) - 1;
                    576:        for (sp = compilation_specs; *sp != NULL; sp++)
                    577:                if (strcmp(spec, *sp) == 0)
                    578:                        break;
                    579:        if (*sp == NULL)
                    580:                return (0);
                    581:
                    582:        for (cp = uposix_conf_table; cp->name != NULL; cp++)
                    583:                if (strcmp(spec, cp->name) == 0 && cp->type == SYSCONF)
                    584:                        return (sysconf(cp->value) != -1);
                    585:
                    586:        return (0);
1.1       deraadt   587: }