1*3b665a45Sderaadt /*- 2*3b665a45Sderaadt * Copyright (c) 1996 The NetBSD Foundation, Inc. 3df930be7Sderaadt * All rights reserved. 4df930be7Sderaadt * 5*3b665a45Sderaadt * This code is derived from software contributed to The NetBSD Foundation 6*3b665a45Sderaadt * by J.T. Conklin. 7*3b665a45Sderaadt * 8df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 9df930be7Sderaadt * modification, are permitted provided that the following conditions 10df930be7Sderaadt * are met: 11df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 12df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 13df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 14df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 15df930be7Sderaadt * documentation and/or other materials provided with the distribution. 16df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software 17df930be7Sderaadt * must display the following acknowledgement: 18df930be7Sderaadt * This product includes software developed by Winning Strategies, Inc. 19df930be7Sderaadt * 4. The name of the author may not be used to endorse or promote products 20df930be7Sderaadt * derived from this software without specific prior written permission. 21df930be7Sderaadt * 22df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23df930be7Sderaadt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24df930be7Sderaadt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25df930be7Sderaadt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26df930be7Sderaadt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27df930be7Sderaadt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28df930be7Sderaadt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29df930be7Sderaadt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30df930be7Sderaadt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31df930be7Sderaadt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32df930be7Sderaadt */ 33df930be7Sderaadt 34df930be7Sderaadt /* 35df930be7Sderaadt * POSIX.2 getconf utility 36df930be7Sderaadt * 37df930be7Sderaadt * Written by: 38df930be7Sderaadt * J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc. 39df930be7Sderaadt */ 40df930be7Sderaadt 41df930be7Sderaadt #ifndef lint 42*3b665a45Sderaadt static char rcsid[] = "$Id: getconf.c,v 1.2 1996/05/04 09:15:06 deraadt Exp $"; 43df930be7Sderaadt #endif /* not lint */ 44df930be7Sderaadt 45df930be7Sderaadt #include <stdio.h> 46df930be7Sderaadt #include <stdlib.h> 47df930be7Sderaadt #include <limits.h> 48df930be7Sderaadt #include <locale.h> 49df930be7Sderaadt #include <unistd.h> 50df930be7Sderaadt #include <errno.h> 51df930be7Sderaadt 52df930be7Sderaadt static void usage __P((void)); 53df930be7Sderaadt 54df930be7Sderaadt struct conf_variable 55df930be7Sderaadt { 56df930be7Sderaadt const char *name; 57df930be7Sderaadt enum { SYSCONF, CONFSTR, PATHCONF, CONSTANT } type; 58df930be7Sderaadt long value; 59df930be7Sderaadt }; 60df930be7Sderaadt 61df930be7Sderaadt const struct conf_variable conf_table[] = 62df930be7Sderaadt { 63df930be7Sderaadt { "PATH", CONFSTR, _CS_PATH }, 64df930be7Sderaadt 65df930be7Sderaadt /* Utility Limit Minimum Values */ 66df930be7Sderaadt { "POSIX2_BC_BASE_MAX", CONSTANT, _POSIX2_BC_BASE_MAX }, 67df930be7Sderaadt { "POSIX2_BC_DIM_MAX", CONSTANT, _POSIX2_BC_DIM_MAX }, 68df930be7Sderaadt { "POSIX2_BC_SCALE_MAX", CONSTANT, _POSIX2_BC_SCALE_MAX }, 69df930be7Sderaadt { "POSIX2_BC_STRING_MAX", CONSTANT, _POSIX2_BC_STRING_MAX }, 70df930be7Sderaadt { "POSIX2_COLL_WEIGHTS_MAX", CONSTANT, _POSIX2_COLL_WEIGHTS_MAX }, 71df930be7Sderaadt { "POSIX2_EXPR_NEST_MAX", CONSTANT, _POSIX2_EXPR_NEST_MAX }, 72df930be7Sderaadt { "POSIX2_LINE_MAX", CONSTANT, _POSIX2_LINE_MAX }, 73df930be7Sderaadt { "POSIX2_RE_DUP_MAX", CONSTANT, _POSIX2_RE_DUP_MAX }, 74df930be7Sderaadt { "POSIX2_VERSION", CONSTANT, _POSIX2_VERSION }, 75df930be7Sderaadt 76df930be7Sderaadt /* POSIX.1 Minimum Values */ 77df930be7Sderaadt { "_POSIX_ARG_MAX", CONSTANT, _POSIX_ARG_MAX }, 78df930be7Sderaadt { "_POSIX_CHILD_MAX", CONSTANT, _POSIX_CHILD_MAX }, 79df930be7Sderaadt { "_POSIX_LINK_MAX", CONSTANT, _POSIX_LINK_MAX }, 80df930be7Sderaadt { "_POSIX_MAX_CANON", CONSTANT, _POSIX_MAX_CANON }, 81df930be7Sderaadt { "_POSIX_MAX_INPUT", CONSTANT, _POSIX_MAX_INPUT }, 82df930be7Sderaadt { "_POSIX_NAME_MAX", CONSTANT, _POSIX_NAME_MAX }, 83df930be7Sderaadt { "_POSIX_NGROUPS_MAX", CONSTANT, _POSIX_NGROUPS_MAX }, 84df930be7Sderaadt { "_POSIX_OPEN_MAX", CONSTANT, _POSIX_OPEN_MAX }, 85df930be7Sderaadt { "_POSIX_PATH_MAX", CONSTANT, _POSIX_PIPE_BUF }, 86df930be7Sderaadt { "_POSIX_PIPE_BUF", CONSTANT, _POSIX_PIPE_BUF }, 87df930be7Sderaadt { "_POSIX_SSIZE_MAX", CONSTANT, _POSIX_SSIZE_MAX }, 88df930be7Sderaadt { "_POSIX_STREAM_MAX", CONSTANT, _POSIX_STREAM_MAX }, 89df930be7Sderaadt { "_POSIX_TZNAME_MAX", CONSTANT, _POSIX_TZNAME_MAX }, 90df930be7Sderaadt 91df930be7Sderaadt /* Symbolic Utility Limits */ 92df930be7Sderaadt { "BC_BASE_MAX", SYSCONF, _SC_BC_BASE_MAX }, 93df930be7Sderaadt { "BC_DIM_MAX", SYSCONF, _SC_BC_DIM_MAX }, 94df930be7Sderaadt { "BC_SCALE_MAX", SYSCONF, _SC_BC_SCALE_MAX }, 95df930be7Sderaadt { "BC_STRING_MAX", SYSCONF, _SC_BC_STRING_MAX }, 96df930be7Sderaadt { "COLL_WEIGHTS_MAX", SYSCONF, _SC_COLL_WEIGHTS_MAX }, 97df930be7Sderaadt { "EXPR_NEST_MAX", SYSCONF, _SC_EXPR_NEST_MAX }, 98df930be7Sderaadt { "LINE_MAX", SYSCONF, _SC_LINE_MAX }, 99df930be7Sderaadt { "RE_DUP_MAX", SYSCONF, _SC_RE_DUP_MAX }, 100df930be7Sderaadt 101df930be7Sderaadt /* Optional Facility Configuration Values */ 102df930be7Sderaadt #if 0 103df930be7Sderaadt { "POSIX2_C_BIND", SYSCONF, ??? }, 104df930be7Sderaadt #endif 105df930be7Sderaadt { "POSIX2_C_DEV", SYSCONF, _SC_2_C_DEV }, 106df930be7Sderaadt { "POSIX2_CHAR_TERM", SYSCONF, _SC_2_CHAR_TERM }, 107df930be7Sderaadt { "POSIX2_FORT_DEV", SYSCONF, _SC_2_FORT_DEV }, 108df930be7Sderaadt { "POSIX2_FORT_RUN", SYSCONF, _SC_2_FORT_RUN }, 109df930be7Sderaadt { "POSIX2_LOCALEDEF", SYSCONF, _SC_2_LOCALEDEF }, 110df930be7Sderaadt { "POSIX2_SW_DEV", SYSCONF, _SC_2_SW_DEV }, 111df930be7Sderaadt { "POSIX2_UPE", SYSCONF, _SC_2_UPE }, 112df930be7Sderaadt 113df930be7Sderaadt /* POSIX.1 Configurable System Variables */ 114df930be7Sderaadt { "ARG_MAX", SYSCONF, _SC_ARG_MAX }, 115df930be7Sderaadt { "CHILD_MAX", SYSCONF, _SC_CHILD_MAX }, 116df930be7Sderaadt { "CLK_TCK", SYSCONF, _SC_CLK_TCK }, 117df930be7Sderaadt { "NGROUPS_MAX", SYSCONF, _SC_NGROUPS_MAX }, 118df930be7Sderaadt { "OPEN_MAX", SYSCONF, _SC_OPEN_MAX }, 119df930be7Sderaadt { "STREAM_MAX", SYSCONF, _SC_STREAM_MAX }, 120df930be7Sderaadt { "TZNAME_MAX", SYSCONF, _SC_TZNAME_MAX }, 121df930be7Sderaadt { "_POSIX_JOB_CONTROL", SYSCONF, _SC_JOB_CONTROL }, 122df930be7Sderaadt { "_POSIX_SAVED_IDS", SYSCONF, _SC_SAVED_IDS }, 123df930be7Sderaadt { "_POSIX_VERSION", SYSCONF, _SC_VERSION }, 124df930be7Sderaadt 125df930be7Sderaadt { "LINK_MAX", PATHCONF, _PC_LINK_MAX }, 126df930be7Sderaadt { "MAX_CANON", PATHCONF, _PC_MAX_CANON }, 127df930be7Sderaadt { "MAX_INPUT", PATHCONF, _PC_MAX_INPUT }, 128df930be7Sderaadt { "NAME_MAX", PATHCONF, _PC_NAME_MAX }, 129df930be7Sderaadt { "PATH_MAX", PATHCONF, _PC_PATH_MAX }, 130df930be7Sderaadt { "PIPE_BUF", PATHCONF, _PC_PIPE_BUF }, 131df930be7Sderaadt { "_POSIX_CHOWN_RESTRICTED", PATHCONF, _PC_CHOWN_RESTRICTED }, 132df930be7Sderaadt { "_POSIX_NO_TRUNC", PATHCONF, _PC_NO_TRUNC }, 133df930be7Sderaadt { "_POSIX_VDISABLE", PATHCONF, _PC_VDISABLE }, 134df930be7Sderaadt 135df930be7Sderaadt { NULL } 136df930be7Sderaadt }; 137df930be7Sderaadt 138df930be7Sderaadt 139df930be7Sderaadt int 140df930be7Sderaadt main(argc, argv) 141df930be7Sderaadt int argc; 142df930be7Sderaadt char **argv; 143df930be7Sderaadt { 144df930be7Sderaadt int ch; 145df930be7Sderaadt const struct conf_variable *cp; 146df930be7Sderaadt 147df930be7Sderaadt long val; 148df930be7Sderaadt size_t slen; 149df930be7Sderaadt char * sval; 150df930be7Sderaadt 151df930be7Sderaadt setlocale(LC_ALL, ""); 152df930be7Sderaadt 153df930be7Sderaadt while ((ch = getopt(argc, argv, "")) != -1) { 154df930be7Sderaadt switch (ch) { 155df930be7Sderaadt case '?': 156df930be7Sderaadt default: 157df930be7Sderaadt usage(); 158df930be7Sderaadt } 159df930be7Sderaadt } 160df930be7Sderaadt argc -= optind; 161df930be7Sderaadt argv += optind; 162df930be7Sderaadt 163df930be7Sderaadt if (argc < 1 || argc > 2) { 164df930be7Sderaadt usage(); 165df930be7Sderaadt /* NOTREACHED */ 166df930be7Sderaadt } 167df930be7Sderaadt 168df930be7Sderaadt for (cp = conf_table; cp->name != NULL; cp++) { 169df930be7Sderaadt if (strcmp(*argv, cp->name) == 0) 170df930be7Sderaadt break; 171df930be7Sderaadt } 172df930be7Sderaadt if (cp->name == NULL) { 173*3b665a45Sderaadt errx(1, "%s: unknown variable", *argv); 174df930be7Sderaadt /* NOTREACHED */ 175df930be7Sderaadt } 176df930be7Sderaadt 177df930be7Sderaadt if (cp->type == PATHCONF) { 178df930be7Sderaadt if (argc != 2) usage(); 179df930be7Sderaadt } else { 180df930be7Sderaadt if (argc != 1) usage(); 181df930be7Sderaadt } 182df930be7Sderaadt 183df930be7Sderaadt switch (cp->type) { 184df930be7Sderaadt case CONSTANT: 185df930be7Sderaadt printf("%ld\n", cp->value); 186df930be7Sderaadt break; 187df930be7Sderaadt 188df930be7Sderaadt case CONFSTR: 189df930be7Sderaadt slen = confstr (cp->value, (char *) 0, (size_t) 0); 190df930be7Sderaadt 191df930be7Sderaadt if ((sval = malloc(slen)) == NULL) 192df930be7Sderaadt err(1, NULL); 193df930be7Sderaadt 194df930be7Sderaadt confstr(cp->value, sval, slen); 195df930be7Sderaadt printf("%s\n", sval); 196df930be7Sderaadt break; 197df930be7Sderaadt 198df930be7Sderaadt case SYSCONF: 199df930be7Sderaadt errno = 0; 200df930be7Sderaadt if ((val = sysconf(cp->value)) == -1) { 201df930be7Sderaadt if (errno != 0) { 202df930be7Sderaadt err(1, NULL); 203df930be7Sderaadt /* NOTREACHED */ 204df930be7Sderaadt } 205df930be7Sderaadt 206df930be7Sderaadt printf ("undefined\n"); 207df930be7Sderaadt } else { 208df930be7Sderaadt printf("%ld\n", val); 209df930be7Sderaadt } 210df930be7Sderaadt break; 211df930be7Sderaadt 212df930be7Sderaadt case PATHCONF: 213df930be7Sderaadt errno = 0; 214df930be7Sderaadt if ((val = pathconf(argv[1], cp->value)) == -1) { 215df930be7Sderaadt if (errno != 0) { 216df930be7Sderaadt err(1, "%s", argv[1]); 217df930be7Sderaadt /* NOTREACHED */ 218df930be7Sderaadt } 219df930be7Sderaadt 220df930be7Sderaadt printf ("undefined\n"); 221df930be7Sderaadt } else { 222df930be7Sderaadt printf ("%ld\n", val); 223df930be7Sderaadt } 224df930be7Sderaadt break; 225df930be7Sderaadt } 226df930be7Sderaadt 227df930be7Sderaadt exit (ferror(stdout)); 228df930be7Sderaadt } 229df930be7Sderaadt 230df930be7Sderaadt 231df930be7Sderaadt static void 232df930be7Sderaadt usage() 233df930be7Sderaadt { 234df930be7Sderaadt fprintf (stderr, "usage: getconf system_var\n"); 235df930be7Sderaadt fprintf (stderr, " getconf path_var pathname\n"); 236df930be7Sderaadt exit(1); 237df930be7Sderaadt } 238