xref: /illumos-gate/usr/src/cmd/getconf/getconf.c (revision 45ede40b2394db7967e59f19288fae9b62efd4aa)
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 }
1005