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