2 * ORIGINAL COPYRIGHT STATEMENT:
4 * Copyright (c) 1994 Winning Strategies, Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by Winning Strategies, Inc.
18 * 4. The name of the author may not be used to endorse or promote products
19 * derived from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 * POSIX.2 getconf utility
36 * Originally Written by:
37 * J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
39 * Heavily modified for inclusion in bash by
40 * Chet Ramey <chet@po.cwru.edu>
53 #include "bashgetopt.h"
58 enum { SYSCONF
, CONFSTR
, PATHCONF
, CONSTANT
, G_UNDEF
} type
;
62 /* Some systems do not define these; use POSIX.2 minimum recommended values. */
63 #ifndef _POSIX2_COLL_WEIGHTS_MAX
64 # define _POSIX2_COLL_WEIGHTS_MAX 2
67 static const struct conf_variable conf_table
[] =
69 /* POSIX.2 Configurable Variable Values */
70 { "PATH", CONFSTR
, _CS_PATH
},
71 { "CS_PATH", CONFSTR
, _CS_PATH
},
73 /* POSIX.1 Configurable Variable Values (only Solaris?) */
74 #if defined (_CS_LFS_CFLAGS)
75 { "LFS_CFLAGS", CONFSTR
, _CS_LFS_CFLAGS
},
76 { "LFS_LDFLAGS", CONFSTR
, _CS_LFS_LDFLAGS
},
77 { "LFS_LIBS", CONFSTR
, _CS_LFS_LIBS
},
78 { "LFS_LINTFLAGS", CONFSTR
, _CS_LFS_LINTFLAGS
},
80 #if defined (_CS_LFS64_CFLAGS)
81 { "LFS64_CFLAGS", CONFSTR
, _CS_LFS64_CFLAGS
},
82 { "LFS64_LDFLAGS", CONFSTR
, _CS_LFS64_LDFLAGS
},
83 { "LFS64_LIBS", CONFSTR
, _CS_LFS64_LIBS
},
84 { "LFS64_LINTFLAGS", CONFSTR
, _CS_LFS64_LINTFLAGS
},
87 /* Single UNIX Specification version 2 Configurable Variable Values */
88 #if defined (_CS_XBS5_ILP32_OFF32_CFLAGS)
89 { "XBS5_ILP32_OFF32_CFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFF32_CFLAGS
},
90 { "XBS5_ILP32_OFF32_LDFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFF32_LDFLAGS
},
91 { "XBS5_ILP32_OFF32_LIBS", CONFSTR
, _CS_XBS5_ILP32_OFF32_LIBS
},
92 { "XBS5_ILP32_OFF32_LINTFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFF32_LINTFLAGS
},
93 { "XBS5_ILP32_OFFBIG_CFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFFBIG_CFLAGS
},
94 { "XBS5_ILP32_OFFBIG_LDFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFFBIG_LDFLAGS
},
95 { "XBS5_ILP32_OFFBIG_LIBS", CONFSTR
, _CS_XBS5_ILP32_OFFBIG_LIBS
},
96 { "XBS5_ILP32_OFFBIG_LINTFLAGS", CONFSTR
, _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
},
97 { "XBS5_LP64_OFF64_CFLAGS", CONFSTR
, _CS_XBS5_LP64_OFF64_CFLAGS
},
98 { "XBS5_LP64_OFF64_LDFLAGS", CONFSTR
, _CS_XBS5_LP64_OFF64_LDFLAGS
},
99 { "XBS5_LP64_OFF64_LIBS", CONFSTR
, _CS_XBS5_LP64_OFF64_LIBS
},
100 { "XBS5_LP64_OFF64_LINTFLAGS", CONFSTR
, _CS_XBS5_LP64_OFF64_LINTFLAGS
},
101 { "XBS5_LPBIG_OFFBIG_CFLAGS", CONFSTR
, _CS_XBS5_LPBIG_OFFBIG_CFLAGS
},
102 { "XBS5_LPBIG_OFFBIG_LDFLAGS", CONFSTR
, _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
},
103 { "XBS5_LPBIG_OFFBIG_LIBS", CONFSTR
, _CS_XBS5_LPBIG_OFFBIG_LIBS
},
104 { "XBS5_LPBIG_OFFBIG_LINTFLAGS", CONFSTR
, _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
},
105 #endif /* _CS_XBS5_ILP32_OFF32_CFLAGS */
107 /* POSIX.2 Utility Limit Minimum Values */
108 #ifdef _POSIX2_BC_BASE_MAX
109 { "POSIX2_BC_BASE_MAX", CONSTANT
, _POSIX2_BC_BASE_MAX
},
111 { "POSIX2_BC_BASE_MAX", G_UNDEF
, -1 },
113 #ifdef _POSIX2_BC_DIM_MAX
114 { "POSIX2_BC_DIM_MAX", CONSTANT
, _POSIX2_BC_DIM_MAX
},
116 { "POSIX2_BC_DIM_MAX", G_UNDEF
, -1 },
118 #ifdef _POSIX2_BC_SCALE_MAX
119 { "POSIX2_BC_SCALE_MAX", CONSTANT
, _POSIX2_BC_SCALE_MAX
},
121 { "POSIX2_BC_SCALE_MAX", G_UNDEF
, -1 },
123 #ifdef _POSIX2_BC_STRING_MAX
124 { "POSIX2_BC_STRING_MAX", CONSTANT
, _POSIX2_BC_STRING_MAX
},
126 { "POSIX2_BC_STRING_MAX", G_UNDEF
, -1 },
128 #ifdef _POSIX2_COLL_WEIGHTS_MAX
129 { "POSIX2_COLL_WEIGHTS_MAX", CONSTANT
, _POSIX2_COLL_WEIGHTS_MAX
},
131 { "POSIX2_COLL_WEIGHTS_MAX", G_UNDEF
, -1 },
133 #if defined (_POSIX2_EQUIV_CLASS_MAX)
134 { "POSIX2_EQUIV_CLASS_MAX", CONSTANT
, _POSIX2_EQUIV_CLASS_MAX
},
136 #ifdef _POSIX2_EXPR_NEST_MAX
137 { "POSIX2_EXPR_NEST_MAX", CONSTANT
, _POSIX2_EXPR_NEST_MAX
},
139 { "POSIX2_EXPR_NEST_MAX", G_UNDEF
, -1 },
141 #ifdef _POSIX2_LINE_MAX
142 { "POSIX2_LINE_MAX", CONSTANT
, _POSIX2_LINE_MAX
},
144 { "POSIX2_LINE_MAX", G_UNDEF
, -1 },
146 #ifdef _POSIX2_RE_DUP_MAX
147 { "POSIX2_RE_DUP_MAX", CONSTANT
, _POSIX2_RE_DUP_MAX
},
149 { "POSIX2_RE_DUP_MAX", G_UNDEF
, -1 },
151 #if defined (_POSIX2_VERSION)
152 { "POSIX2_VERSION", CONSTANT
, _POSIX2_VERSION
},
154 # if !defined (_SC_2_VERSION)
155 { "POSIX2_VERSION", G_UNDEF
, -1 },
159 /* POSIX.1 Minimum Values */
160 { "_POSIX_ARG_MAX", CONSTANT
, _POSIX_ARG_MAX
},
161 { "_POSIX_CHILD_MAX", CONSTANT
, _POSIX_CHILD_MAX
},
162 { "_POSIX_LINK_MAX", CONSTANT
, _POSIX_LINK_MAX
},
163 { "_POSIX_MAX_CANON", CONSTANT
, _POSIX_MAX_CANON
},
164 { "_POSIX_MAX_INPUT", CONSTANT
, _POSIX_MAX_INPUT
},
165 { "_POSIX_NAME_MAX", CONSTANT
, _POSIX_NAME_MAX
},
166 { "_POSIX_NGROUPS_MAX", CONSTANT
, _POSIX_NGROUPS_MAX
},
167 { "_POSIX_OPEN_MAX", CONSTANT
, _POSIX_OPEN_MAX
},
168 { "_POSIX_PATH_MAX", CONSTANT
, _POSIX_PIPE_BUF
},
169 { "_POSIX_PIPE_BUF", CONSTANT
, _POSIX_PIPE_BUF
},
170 { "_POSIX_SSIZE_MAX", CONSTANT
, _POSIX_SSIZE_MAX
},
171 { "_POSIX_STREAM_MAX", CONSTANT
, _POSIX_STREAM_MAX
},
172 { "_POSIX_TZNAME_MAX", CONSTANT
, _POSIX_TZNAME_MAX
},
174 /* POSIX.2 Symbolic Utility Limits */
175 { "BC_BASE_MAX", SYSCONF
, _SC_BC_BASE_MAX
},
176 { "BC_DIM_MAX", SYSCONF
, _SC_BC_DIM_MAX
},
177 { "BC_SCALE_MAX", SYSCONF
, _SC_BC_SCALE_MAX
},
178 { "BC_STRING_MAX", SYSCONF
, _SC_BC_STRING_MAX
},
179 { "COLL_WEIGHTS_MAX", SYSCONF
, _SC_COLL_WEIGHTS_MAX
},
180 { "EXPR_NEST_MAX", SYSCONF
, _SC_EXPR_NEST_MAX
},
181 { "LINE_MAX", SYSCONF
, _SC_LINE_MAX
},
182 { "RE_DUP_MAX", SYSCONF
, _SC_RE_DUP_MAX
},
184 /* POSIX.2 Optional Facility Configuration Values */
186 { "POSIX2_C_BIND", SYSCONF
, _SC_2_C_BIND
},
188 { "POSIX2_C_BIND", G_UNDEF
, -1 },
191 { "POSIX2_C_DEV", SYSCONF
, _SC_2_C_DEV
},
193 { "POSIX2_C_DEV", G_UNDEF
, -1 },
195 #if defined (_SC_2_C_VERSION)
196 { "POSIX2_C_VERSION", SYSCONF
, _SC_2_C_VERSION
},
198 { "POSIX2_C_VERSION", G_UNDEF
, -1 },
200 #if defined (_SC_2_CHAR_TERM)
201 { "POSIX2_CHAR_TERM", SYSCONF
, _SC_2_CHAR_TERM
},
203 { "POSIX2_CHAR_TERM", G_UNDEF
, -1 },
205 #ifdef _SC_2_FORT_DEV
206 { "POSIX2_FORT_DEV", SYSCONF
, _SC_2_FORT_DEV
},
208 { "POSIX2_FORT_DEV", G_UNDEF
, -1 },
210 #ifdef _SC_2_FORT_RUN
211 { "POSIX2_FORT_RUN", SYSCONF
, _SC_2_FORT_RUN
},
213 { "POSIX2_FORT_RUN", G_UNDEF
, -1 },
215 #ifdef _SC_2_LOCALEDEF
216 { "POSIX2_LOCALEDEF", SYSCONF
, _SC_2_LOCALEDEF
},
218 { "POSIX2_LOCALEDEF", G_UNDEF
, -1 },
221 { "POSIX2_SW_DEV", SYSCONF
, _SC_2_SW_DEV
},
223 { "POSIX2_SW_DEV", G_UNDEF
, -1 },
225 #if defined (_SC2_UPE)
226 { "POSIX2_UPE", SYSCONF
, _SC_2_UPE
},
228 { "POSIX2_UPE", G_UNDEF
, -1 },
230 #if !defined (_POSIX2_VERSION) && defined (_SC_2_VERSION)
231 { "POSIX2_VERSION" SYSCONF
, _SC_2_VERSION
},
234 /* POSIX.1 Configurable System Variables */
235 { "ARG_MAX", SYSCONF
, _SC_ARG_MAX
},
236 { "CHILD_MAX", SYSCONF
, _SC_CHILD_MAX
},
237 { "CLK_TCK", SYSCONF
, _SC_CLK_TCK
},
238 { "NGROUPS_MAX", SYSCONF
, _SC_NGROUPS_MAX
},
239 { "OPEN_MAX", SYSCONF
, _SC_OPEN_MAX
},
240 { "STREAM_MAX", SYSCONF
, _SC_STREAM_MAX
},
241 { "TZNAME_MAX", SYSCONF
, _SC_TZNAME_MAX
},
242 { "_POSIX_JOB_CONTROL", SYSCONF
, _SC_JOB_CONTROL
},
243 { "_POSIX_SAVED_IDS", SYSCONF
, _SC_SAVED_IDS
},
244 { "_POSIX_VERSION", SYSCONF
, _SC_VERSION
},
246 /* POSIX.1 Optional Facility Configuration Values */
247 #if defined (_SC_ASYNCHRONOUS_IO)
248 { "_POSIX_ASYNCHRONOUS_IO", SYSCONF
, _SC_ASYNCHRONOUS_IO
},
250 #if defined (_SC_FSYNC)
251 { "_POSIX_FSYNC", SYSCONF
, _SC_FSYNC
},
253 #if defined (_SC_MAPPED_FILES)
254 { "_POSIX_MAPPED_FILES", SYSCONF
, _SC_MAPPED_FILES
},
256 #if defined (_SC_MEMLOCK)
257 { "_POSIX_MEMLOCK", SYSCONF
, _SC_MEMLOCK
},
259 #if defined (_SC_MEMLOCK_RANGE)
260 { "_POSIX_MEMLOCK_RANGE", SYSCONF
, _SC_MEMLOCK_RANGE
},
262 #if defined (_SC_MEMORY_PROTECTION)
263 { "_POSIX_MEMORY_PROTECTION", SYSCONF
, _SC_MEMORY_PROTECTION
},
265 #if defined (_SC_MESSAGE_PASSING)
266 { "_POSIX_MESSAGE_PASSING", SYSCONF
, _SC_MESSAGE_PASSING
},
268 #if defined (SC_PRIORITIZED_IO)
269 { "_POSIX_PRIORITIZED_IO", SYSCONF
, _SC_PRIORITIZED_IO
},
271 #if defined (_SC_PRIORITY_SCHEDULING)
272 { "_POSIX_PRIORITY_SCHEDULING", SYSCONF
, _SC_PRIORITY_SCHEDULING
},
274 #if defined (_SC_REALTIME_SIGNALS)
275 { "_POSIX_REALTIME_SIGNALS", SYSCONF
, _SC_REALTIME_SIGNALS
},
277 #if defined (_SC_SEMAPHORES)
278 { "_POSIX_SEMAPHORES", SYSCONF
, _SC_SEMAPHORES
},
280 #if defined (_SC_SHARED_MEMORY_OBJECTS)
281 { "_POSIX_SHARED_MEMORY_OBJECTS", SYSCONF
, _SC_SHARED_MEMORY_OBJECTS
},
283 #if defined (_SC_SYNCHRONIZED_IO)
284 { "_POSIX_SYNCHRONIZED_IO", SYSCONF
, _SC_SYNCHRONIZED_IO
},
286 #if defined (_SC_TIMERS)
287 { "_POSIX_TIMERS", SYSCONF
, _SC_TIMERS
},
289 #if defined (_SC_THREADS)
290 { "_POSIX_THREADS", SYSCONF
, _SC_THREADS
},
292 #if defined (_SC_THREADS)
293 { "_POSIX_THREAD_ATTR_STACKADDR", SYSCONF
, _SC_THREAD_ATTR_STACKADDR
},
295 #if defined (_SC_THREAD_ATTR_STACKSIZE)
296 { "_POSIX_THREAD_ATTR_STACKSIZE", SYSCONF
, _SC_THREAD_ATTR_STACKSIZE
},
298 #if defined (_SC_THREAD_PRIORITY_SCHEDULING)
299 { "_POSIX_THREAD_PRIORITY_SCHEDULING", SYSCONF
, _SC_THREAD_PRIORITY_SCHEDULING
},
301 #if defined (_SC_THREAD_PRIO_INHERIT)
302 { "_POSIX_THREAD_PRIO_INHERIT", SYSCONF
, _SC_THREAD_PRIO_INHERIT
},
304 #if defined (_SC_THREAD_PRIO_PROTECT)
305 { "_POSIX_THREAD_PRIO_PROTECT", SYSCONF
, _SC_THREAD_PRIO_PROTECT
},
307 #if defined (_SC_THREAD_PROCESS_SHARED)
308 { "_POSIX_THREAD_PROCESS_SHARED", SYSCONF
, _SC_THREAD_PROCESS_SHARED
},
310 #if defined (_SC_THREAD_SAFE_FUNCTIONS)
311 { "_POSIX_THREAD_SAFE_FUNCTIONS", SYSCONF
, _SC_THREAD_SAFE_FUNCTIONS
},
314 /* XPG 4.2 Configurable System Variables. */
315 #if defined (_SC_ATEXIT_MAX)
316 { "ATEXIT_MAX", SYSCONF
, _SC_ATEXIT_MAX
},
318 #if defined (_SC_IOV_MAX)
319 { "IOV_MAX", SYSCONF
, _SC_IOV_MAX
},
321 #if defined (_SC_PAGESIZE)
322 { "PAGESIZE", SYSCONF
, _SC_PAGESIZE
},
324 #if defined (_SC_PAGE_SIZE)
325 { "PAGE_SIZE", SYSCONF
, _SC_PAGE_SIZE
},
328 #if defined (_SC_AIO_LISTIO_MAX)
329 { "AIO_LISTIO_MAX", SYSCONF
, _SC_AIO_LISTIO_MAX
},
331 #if defined (_SC_AIO_MAX)
332 { "AIO_MAX", SYSCONF
, _SC_AIO_MAX
},
334 #if defined (_SC_AIO_PRIO_DELTA_MAX)
335 { "AIO_PRIO_DELTA_MAX", SYSCONF
, _SC_AIO_PRIO_DELTA_MAX
},
337 #if defined (_SC_DELAYTIMER_MAX)
338 { "DELAYTIMER_MAX", SYSCONF
, _SC_DELAYTIMER_MAX
},
340 #if defined (_SC_GETGR_R_SIZE_MAX)
341 { "GETGR_R_SIZE_MAX", SYSCONF
, _SC_GETGR_R_SIZE_MAX
},
343 #if defined (_SC_GETPW_R_SIZE_MAX)
344 { "GETPW_R_SIZE_MAX", SYSCONF
, _SC_GETPW_R_SIZE_MAX
},
346 #if defined (_SC_MQ_OPEN_MAX)
347 { "MQ_OPEN_MAX", SYSCONF
, _SC_MQ_OPEN_MAX
},
349 #if defined (_SC_MQ_PRIO_MAX)
350 { "MQ_PRIO_MAX", SYSCONF
, _SC_MQ_PRIO_MAX
},
352 #if defined (_SC_RTSIG_MAX)
353 { "RTSIG_MAX", SYSCONF
, _SC_RTSIG_MAX
},
355 #if defined (_SC_SEM_NSEMS_MAX)
356 { "SEM_NSEMS_MAX", SYSCONF
, _SC_SEM_NSEMS_MAX
},
358 #if defined (_SC_SEM_VALUE_MAX)
359 { "SEM_VALUE_MAX", SYSCONF
, _SC_SEM_VALUE_MAX
},
361 #if defined (_SC_SIGQUEUE_MAX)
362 { "SIGQUEUE_MAX", SYSCONF
, _SC_SIGQUEUE_MAX
},
364 #if defined (_SC_TIMER_MAX)
365 { "TIMER_MAX", SYSCONF
, _SC_TIMER_MAX
},
368 #if defined (_SC_LOGIN_NAME_MAX)
369 { "LOGIN_NAME_MAX", SYSCONF
, _SC_LOGIN_NAME_MAX
},
371 #if defined (_SC_LOGNAME_MAX)
372 { "LOGNAME_MAX", SYSCONF
, _SC_LOGNAME_MAX
},
374 #if defined (_SC_TTY_NAME_MAX)
375 { "TTY_NAME_MAX", SYSCONF
, _SC_TTY_NAME_MAX
},
378 #if defined (_SC_THREAD_DESTRUCTOR_ITERATIONS)
379 { "PTHREAD_DESTRUCTOR_ITERATIONS", SYSCONF
, _SC_THREAD_DESTRUCTOR_ITERATIONS
},
381 #if defined (_SC_THREAD_KEYS_MAX)
382 { "PTHREAD_KEYS_MAX", SYSCONF
, _SC_THREAD_KEYS_MAX
},
384 #if defined (_SC_THREAD_STACK_MIN)
385 { "PTHREAD_STACK_MIN", SYSCONF
, _SC_THREAD_STACK_MIN
},
387 #if defined (_SC_THREAD_THREADS_MAX)
388 { "PTHREAD_THREADS_MAX", SYSCONF
, _SC_THREAD_THREADS_MAX
},
391 /* XPG 4.2 Optional Facility Configuration Values */
392 #if defined (_SC_XOPEN_UNIX)
393 { "_XOPEN_UNIX", SYSCONF
, _SC_XOPEN_UNIX
},
394 { "_XOPEN_CRYPT", SYSCONF
, _SC_XOPEN_CRYPT
},
395 { "_XOPEN_ENH_I18N", SYSCONF
, _SC_XOPEN_ENH_I18N
},
396 { "_XOPEN_SHM", SYSCONF
, _SC_XOPEN_SHM
},
397 { "_XOPEN_VERSION", SYSCONF
, _SC_XOPEN_VERSION
},
398 # if defined (_SC_XOPEN_XCU_VERSION)
399 { "_XOPEN_XCU_VERSION", SYSCONF
, _SC_XOPEN_XCU_VERSION
},
402 #if defined (_SC_XOPEN_REALTIME)
403 { "_XOPEN_REALTIME", SYSCONF
, _SC_XOPEN_REALTIME
},
404 { "_XOPEN_REALTIME_THREADS", SYSCONF
, _SC_XOPEN_REALTIME_THREADS
},
406 #if defined (_SC_XOPEN_LEGACY)
407 { "_XOPEN_LEGACY", SYSCONF
, _SC_XOPEN_LEGACY
},
408 #endif /* _SC_XOPEN_LEGACY */
410 /* Single UNIX Specification version 2 Optional Facility Configuration Values */
411 #if defined (_SC_XBS5_ILP32_OFF32)
412 { "_XBS5_ILP32_OFF32", SYSCONF
, _SC_XBS5_ILP32_OFF32
},
413 { "_XBS5_ILP32_OFFBIG", SYSCONF
, _SC_XBS5_ILP32_OFFBIG
},
414 { "_XBS5_LP64_OFF64", SYSCONF
, _SC_XBS5_LP64_OFF64
},
415 { "_XBS5_LPBIG_OFFBIG", SYSCONF
, _SC_XBS5_LPBIG_OFFBIG
},
416 #endif /* _SC_XBS5_ILP32_OFF32 */
418 /* POSIX.1 Configurable Pathname Values */
419 { "LINK_MAX", PATHCONF
, _PC_LINK_MAX
},
420 { "MAX_CANON", PATHCONF
, _PC_MAX_CANON
},
421 { "MAX_INPUT", PATHCONF
, _PC_MAX_INPUT
},
422 { "NAME_MAX", PATHCONF
, _PC_NAME_MAX
},
423 { "PATH_MAX", PATHCONF
, _PC_PATH_MAX
},
424 { "PIPE_BUF", PATHCONF
, _PC_PIPE_BUF
},
425 { "_POSIX_CHOWN_RESTRICTED", PATHCONF
, _PC_CHOWN_RESTRICTED
},
426 { "_POSIX_NO_TRUNC", PATHCONF
, _PC_NO_TRUNC
},
427 { "_POSIX_VDISABLE", PATHCONF
, _PC_VDISABLE
},
429 /* XPG 4.2 Configurable Pathname Values */
430 #if defined (_PC_FILESIZEBITS)
431 { "FILESIZEBITS", PATHCONF
, _PC_FILESIZEBITS
},
433 #if defined (_PC_ASYNC_IO)
434 { "_POSIX_ASYNC_IO", PATHCONF
, _PC_ASYNC_IO
},
436 #if defined (_PC_PRIO_IO)
437 { "_POSIX_PRIO_IO", PATHCONF
, _PC_PRIO_IO
},
439 #if defined (_PC_SYNC_IO)
440 { "_POSIX_SYNC_IO", PATHCONF
, _PC_SYNC_IO
},
446 static int num_getconf_variables
= sizeof(conf_table
) / sizeof(struct conf_variable
) - 1;
448 extern char *this_command_name
;
449 extern char *xmalloc ();
450 extern char **make_builtin_argv ();
452 static void getconf_help ();
453 static int getconf_print ();
454 static int getconf_one ();
455 static int getconf_all ();
458 getconf_builtin (list
)
461 int c
, r
, opt
, aflag
;
465 reset_internal_getopt();
466 while ((opt
= internal_getopt (list
, "ah")) != -1) {
473 return(EXECUTION_SUCCESS
);
481 if ((aflag
== 0 && list
== 0) || (aflag
&& list
) || list_length(list
) > 2) {
486 r
= aflag
? getconf_all() : getconf_one(list
);
494 const struct conf_variable
*cp
;
495 register int i
, column
;
498 printf("Acceptable variable names are:\n");
499 for (cp
= conf_table
; cp
->name
!= NULL
; cp
++) {
500 if (cp
->type
== PATHCONF
)
501 printf("%s pathname\n", cp
->name
);
503 printf("%s\n", cp
->name
);
508 getconf_print(cp
, vpath
, all
)
509 struct conf_variable
*cp
;
519 printf("undefined\n");
523 printf("%ld\n", cp
->value
);
528 slen
= confstr (cp
->value
, (char *) 0, (size_t) 0);
532 printf ("getconf: %s\n", strerror(errno
));
534 builtin_error ("%s", strerror(errno
));
536 printf ("undefined\n");
537 return (EXECUTION_FAILURE
);
539 sval
= xmalloc(slen
);
541 confstr(cp
->value
, sval
, slen
);
542 printf("%s\n", sval
);
548 if ((val
= sysconf(cp
->value
)) == -1) {
551 printf("getconf: %s\n", strerror (errno
));
553 builtin_error ("%s", strerror (errno
));
554 return (EXECUTION_FAILURE
);
557 printf ("undefined\n");
559 printf("%ld\n", val
);
565 if ((val
= pathconf(vpath
, cp
->value
)) == -1) {
568 printf("getconf: %s: %s\n", vpath
, strerror (errno
));
570 builtin_error ("%s: %s", vpath
, strerror (errno
));
571 return (EXECUTION_FAILURE
);
574 printf ("undefined\n");
576 printf ("%ld\n", val
);
581 return ((ferror(stdout
) || cp
->type
== G_UNDEF
) ? EXECUTION_FAILURE
582 : EXECUTION_SUCCESS
);
588 const struct conf_variable
*cp
;
591 ret
= EXECUTION_SUCCESS
;
592 for (cp
= conf_table
; cp
->name
!= NULL
; cp
++) {
593 printf("%-35s", cp
->name
);
594 if (getconf_print(cp
, ".", 1) == EXECUTION_FAILURE
)
595 ret
= EXECUTION_FAILURE
;
604 const struct conf_variable
*cp
;
607 vname
= list
->word
->word
;
608 vpath
= (list
->next
&& list
->next
->word
) ? list
->next
->word
->word
611 for (cp
= conf_table
; cp
->name
!= NULL
; cp
++) {
612 if (strcmp(vname
, cp
->name
) == 0)
615 if (cp
->name
== NULL
) {
616 builtin_error ("%s: unknown variable", vname
);
617 return (EXECUTION_FAILURE
);
620 if (cp
->type
== PATHCONF
) {
621 if (list
->next
== 0) {
632 return (getconf_print(cp
, vpath
, 0));
635 static char *getconf_doc
[] = {
636 "getconf writes the current value of a configurable system limit or",
637 "option variable to the standard output.",
641 struct builtin getconf_struct
= {
646 "getconf -a or getconf -h or getconf sysvar or getconf pathvar pathname",