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
usage()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
namecmp(const void * a,const void * b)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
getconf(struct sctab * scp,int argc,char * name,char * file)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
main(int argc,char ** argv)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