1*cf5a6c84SAndroid Build Coastguard Worker /* getconf.c - get configuration values
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2017 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getconf.c
6*cf5a6c84SAndroid Build Coastguard Worker *
7*cf5a6c84SAndroid Build Coastguard Worker * Deviations from posix: no -v because nothing says what it should DO.
8*cf5a6c84SAndroid Build Coastguard Worker * Added -l, what symbols should be included is a bit unclear.
9*cf5a6c84SAndroid Build Coastguard Worker * Added -a, copied FSF behavior of assuming "/" if no path supplied.
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker USE_GETCONF(NEWTOY(getconf, ">2al", TOYFLAG_USR|TOYFLAG_BIN))
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker config GETCONF
14*cf5a6c84SAndroid Build Coastguard Worker bool "getconf"
15*cf5a6c84SAndroid Build Coastguard Worker default y
16*cf5a6c84SAndroid Build Coastguard Worker help
17*cf5a6c84SAndroid Build Coastguard Worker usage: getconf -a [PATH] | -l | NAME [PATH]
18*cf5a6c84SAndroid Build Coastguard Worker
19*cf5a6c84SAndroid Build Coastguard Worker Get system configuration values. Values from pathconf(3) require a path.
20*cf5a6c84SAndroid Build Coastguard Worker
21*cf5a6c84SAndroid Build Coastguard Worker -a Show all (defaults to "/" if no path given)
22*cf5a6c84SAndroid Build Coastguard Worker -l List available value names (grouped by source)
23*cf5a6c84SAndroid Build Coastguard Worker */
24*cf5a6c84SAndroid Build Coastguard Worker
25*cf5a6c84SAndroid Build Coastguard Worker #define FOR_getconf
26*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
27*cf5a6c84SAndroid Build Coastguard Worker #include <limits.h>
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker // This is missing on glibc (bionic has it).
30*cf5a6c84SAndroid Build Coastguard Worker #ifndef _SC_XOPEN_UUCP
31*cf5a6c84SAndroid Build Coastguard Worker #define _SC_XOPEN_UUCP -1
32*cf5a6c84SAndroid Build Coastguard Worker #endif
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Worker #ifdef __APPLE__
35*cf5a6c84SAndroid Build Coastguard Worker // macOS doesn't have a bunch of stuff. The actual macOS getconf says
36*cf5a6c84SAndroid Build Coastguard Worker // "no such parameter", but -- unless proven otherwise -- it seems more useful
37*cf5a6c84SAndroid Build Coastguard Worker // for portability if we act like we understood but say "undefined"?
38*cf5a6c84SAndroid Build Coastguard Worker #define _SC_AVPHYS_PAGES -1
39*cf5a6c84SAndroid Build Coastguard Worker #define _SC_THREAD_ROBUST_PRIO_INHERIT -1
40*cf5a6c84SAndroid Build Coastguard Worker #define _SC_THREAD_ROBUST_PRIO_PROTECT -1
41*cf5a6c84SAndroid Build Coastguard Worker #define _SC_UIO_MAXIOV -1
42*cf5a6c84SAndroid Build Coastguard Worker #define _SC_V7_ILP32_OFF32 -1
43*cf5a6c84SAndroid Build Coastguard Worker #define _SC_V7_ILP32_OFFBIG -1
44*cf5a6c84SAndroid Build Coastguard Worker #define _SC_V7_LP64_OFF64 -1
45*cf5a6c84SAndroid Build Coastguard Worker #define _SC_V7_LPBIG_OFFBIG -1
46*cf5a6c84SAndroid Build Coastguard Worker #define _CS_V7_ENV -1
47*cf5a6c84SAndroid Build Coastguard Worker #endif
48*cf5a6c84SAndroid Build Coastguard Worker
49*cf5a6c84SAndroid Build Coastguard Worker struct config {
50*cf5a6c84SAndroid Build Coastguard Worker char *name;
51*cf5a6c84SAndroid Build Coastguard Worker long long value;
52*cf5a6c84SAndroid Build Coastguard Worker };
53*cf5a6c84SAndroid Build Coastguard Worker
54*cf5a6c84SAndroid Build Coastguard Worker // Lists of symbols getconf can query, broken down by whether we call sysconf(),
55*cf5a6c84SAndroid Build Coastguard Worker // confstr(), or output the macro value directly.
56*cf5a6c84SAndroid Build Coastguard Worker
57*cf5a6c84SAndroid Build Coastguard Worker // Probe the live system
58*cf5a6c84SAndroid Build Coastguard Worker static struct config sysconfs[] = {
59*cf5a6c84SAndroid Build Coastguard Worker /* POSIX */
60*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {"_POSIX_" #n,_SC_ ## n}
61*cf5a6c84SAndroid Build Coastguard Worker CONF(ADVISORY_INFO), CONF(BARRIERS), CONF(ASYNCHRONOUS_IO),
62*cf5a6c84SAndroid Build Coastguard Worker CONF(CLOCK_SELECTION), CONF(CPUTIME), CONF(FSYNC), CONF(IPV6),
63*cf5a6c84SAndroid Build Coastguard Worker CONF(JOB_CONTROL), CONF(MAPPED_FILES), CONF(MEMLOCK), CONF(MEMLOCK_RANGE),
64*cf5a6c84SAndroid Build Coastguard Worker CONF(MEMORY_PROTECTION), CONF(MESSAGE_PASSING), CONF(MONOTONIC_CLOCK),
65*cf5a6c84SAndroid Build Coastguard Worker CONF(PRIORITY_SCHEDULING), CONF(RAW_SOCKETS), CONF(READER_WRITER_LOCKS),
66*cf5a6c84SAndroid Build Coastguard Worker CONF(REALTIME_SIGNALS), CONF(REGEXP), CONF(SAVED_IDS), CONF(SEMAPHORES),
67*cf5a6c84SAndroid Build Coastguard Worker CONF(SHARED_MEMORY_OBJECTS), CONF(SHELL), CONF(SPAWN), CONF(SPIN_LOCKS),
68*cf5a6c84SAndroid Build Coastguard Worker CONF(SPORADIC_SERVER), CONF(SS_REPL_MAX), CONF(SYNCHRONIZED_IO),
69*cf5a6c84SAndroid Build Coastguard Worker CONF(THREAD_ATTR_STACKADDR), CONF(THREAD_ATTR_STACKSIZE),
70*cf5a6c84SAndroid Build Coastguard Worker CONF(THREAD_CPUTIME), CONF(THREAD_PRIO_INHERIT), CONF(THREAD_PRIO_PROTECT),
71*cf5a6c84SAndroid Build Coastguard Worker CONF(THREAD_PRIORITY_SCHEDULING), CONF(THREAD_PROCESS_SHARED),
72*cf5a6c84SAndroid Build Coastguard Worker CONF(THREAD_ROBUST_PRIO_INHERIT), CONF(THREAD_ROBUST_PRIO_PROTECT),
73*cf5a6c84SAndroid Build Coastguard Worker CONF(THREAD_SAFE_FUNCTIONS), CONF(THREAD_SPORADIC_SERVER), CONF(THREADS),
74*cf5a6c84SAndroid Build Coastguard Worker CONF(TIMEOUTS), CONF(TIMERS), CONF(TRACE), CONF(TRACE_EVENT_FILTER),
75*cf5a6c84SAndroid Build Coastguard Worker CONF(TRACE_EVENT_NAME_MAX), CONF(TRACE_INHERIT), CONF(TRACE_LOG),
76*cf5a6c84SAndroid Build Coastguard Worker CONF(TRACE_NAME_MAX), CONF(TRACE_SYS_MAX), CONF(TRACE_USER_EVENT_MAX),
77*cf5a6c84SAndroid Build Coastguard Worker CONF(TYPED_MEMORY_OBJECTS), CONF(VERSION), CONF(V7_ILP32_OFF32),
78*cf5a6c84SAndroid Build Coastguard Worker CONF(V7_ILP32_OFFBIG), CONF(V7_LP64_OFF64), CONF(V7_LPBIG_OFFBIG),
79*cf5a6c84SAndroid Build Coastguard Worker
80*cf5a6c84SAndroid Build Coastguard Worker /* POSIX.2 */
81*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
82*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {"POSIX2_" #n,_SC_2_ ## n}
83*cf5a6c84SAndroid Build Coastguard Worker CONF(C_BIND), CONF(C_DEV), CONF(CHAR_TERM), CONF(FORT_DEV), CONF(FORT_RUN),
84*cf5a6c84SAndroid Build Coastguard Worker CONF(LOCALEDEF), CONF(PBS), CONF(PBS_ACCOUNTING), CONF(PBS_CHECKPOINT),
85*cf5a6c84SAndroid Build Coastguard Worker CONF(PBS_LOCATE), CONF(PBS_MESSAGE), CONF(PBS_TRACK), CONF(SW_DEV),
86*cf5a6c84SAndroid Build Coastguard Worker CONF(UPE), CONF(VERSION),
87*cf5a6c84SAndroid Build Coastguard Worker
88*cf5a6c84SAndroid Build Coastguard Worker /* X/Open */
89*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
90*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {"_XOPEN_" #n,_SC_XOPEN_ ## n}
91*cf5a6c84SAndroid Build Coastguard Worker CONF(CRYPT), CONF(ENH_I18N), CONF(REALTIME), CONF(REALTIME_THREADS),
92*cf5a6c84SAndroid Build Coastguard Worker CONF(SHM), CONF(STREAMS), CONF(UNIX), CONF(UUCP), CONF(VERSION),
93*cf5a6c84SAndroid Build Coastguard Worker
94*cf5a6c84SAndroid Build Coastguard Worker /* No obvious standard */
95*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
96*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {#n,_SC_ ## n}
97*cf5a6c84SAndroid Build Coastguard Worker CONF(AIO_LISTIO_MAX), CONF(AIO_MAX), CONF(AIO_PRIO_DELTA_MAX), CONF(ARG_MAX),
98*cf5a6c84SAndroid Build Coastguard Worker CONF(ATEXIT_MAX), CONF(BC_BASE_MAX), CONF(BC_DIM_MAX), CONF(BC_SCALE_MAX),
99*cf5a6c84SAndroid Build Coastguard Worker CONF(BC_STRING_MAX), CONF(CHILD_MAX), CONF(CLK_TCK), CONF(COLL_WEIGHTS_MAX),
100*cf5a6c84SAndroid Build Coastguard Worker CONF(DELAYTIMER_MAX), CONF(EXPR_NEST_MAX), CONF(HOST_NAME_MAX),
101*cf5a6c84SAndroid Build Coastguard Worker CONF(IOV_MAX), CONF(LINE_MAX), CONF(LOGIN_NAME_MAX), CONF(NGROUPS_MAX),
102*cf5a6c84SAndroid Build Coastguard Worker CONF(MQ_OPEN_MAX), CONF(MQ_PRIO_MAX), CONF(NPROCESSORS_CONF),
103*cf5a6c84SAndroid Build Coastguard Worker CONF(NPROCESSORS_ONLN), CONF(OPEN_MAX), CONF(PAGE_SIZE),
104*cf5a6c84SAndroid Build Coastguard Worker CONF(PAGESIZE), CONF(RAW_SOCKETS), CONF(RE_DUP_MAX), CONF(RTSIG_MAX),
105*cf5a6c84SAndroid Build Coastguard Worker CONF(SEM_NSEMS_MAX), CONF(SEM_VALUE_MAX), CONF(SIGQUEUE_MAX),
106*cf5a6c84SAndroid Build Coastguard Worker CONF(STREAM_MAX), CONF(SYMLOOP_MAX), CONF(TIMER_MAX), CONF(TTY_NAME_MAX),
107*cf5a6c84SAndroid Build Coastguard Worker CONF(TZNAME_MAX), CONF(UIO_MAXIOV),
108*cf5a6c84SAndroid Build Coastguard Worker
109*cf5a6c84SAndroid Build Coastguard Worker /* bionic and glibc have these; macOS and musl don't. */
110*cf5a6c84SAndroid Build Coastguard Worker #ifdef _SC_LEVEL1_ICACHE_SIZE
111*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL1_ICACHE_SIZE), CONF(LEVEL1_ICACHE_ASSOC),
112*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL1_ICACHE_LINESIZE), CONF(LEVEL1_DCACHE_SIZE),
113*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL1_DCACHE_ASSOC), CONF(LEVEL1_DCACHE_LINESIZE),
114*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL2_CACHE_SIZE),CONF(LEVEL2_CACHE_ASSOC),CONF(LEVEL2_CACHE_LINESIZE),
115*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL3_CACHE_SIZE),CONF(LEVEL3_CACHE_ASSOC),CONF(LEVEL3_CACHE_LINESIZE),
116*cf5a6c84SAndroid Build Coastguard Worker CONF(LEVEL4_CACHE_SIZE),CONF(LEVEL4_CACHE_ASSOC),CONF(LEVEL4_CACHE_LINESIZE),
117*cf5a6c84SAndroid Build Coastguard Worker #endif
118*cf5a6c84SAndroid Build Coastguard Worker
119*cf5a6c84SAndroid Build Coastguard Worker /* Names that just don't match the symbol, do it by hand */
120*cf5a6c84SAndroid Build Coastguard Worker {"_AVPHYS_PAGES", _SC_AVPHYS_PAGES}, {"_PHYS_PAGES", _SC_PHYS_PAGES},
121*cf5a6c84SAndroid Build Coastguard Worker {"_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
122*cf5a6c84SAndroid Build Coastguard Worker {"_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
123*cf5a6c84SAndroid Build Coastguard Worker
124*cf5a6c84SAndroid Build Coastguard Worker /* There's a weird "PTHREAD" vs "THREAD" mismatch here. */
125*cf5a6c84SAndroid Build Coastguard Worker {"PTHREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
126*cf5a6c84SAndroid Build Coastguard Worker {"PTHREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
127*cf5a6c84SAndroid Build Coastguard Worker {"PTHREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
128*cf5a6c84SAndroid Build Coastguard Worker {"PTHREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
129*cf5a6c84SAndroid Build Coastguard Worker };
130*cf5a6c84SAndroid Build Coastguard Worker
131*cf5a6c84SAndroid Build Coastguard Worker // Probe the live system with a path
132*cf5a6c84SAndroid Build Coastguard Worker static struct config pathconfs[] = {
133*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
134*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {#n,_PC_ ## n}
135*cf5a6c84SAndroid Build Coastguard Worker CONF(ASYNC_IO), CONF(CHOWN_RESTRICTED), CONF(FILESIZEBITS), CONF(LINK_MAX),
136*cf5a6c84SAndroid Build Coastguard Worker CONF(MAX_CANON), CONF(MAX_INPUT), CONF(NAME_MAX), CONF(NO_TRUNC),
137*cf5a6c84SAndroid Build Coastguard Worker CONF(PATH_MAX), CONF(PIPE_BUF), CONF(PRIO_IO), CONF(SYMLINK_MAX),
138*cf5a6c84SAndroid Build Coastguard Worker CONF(SYNC_IO),
139*cf5a6c84SAndroid Build Coastguard Worker {"_POSIX_VDISABLE", _PC_VDISABLE},
140*cf5a6c84SAndroid Build Coastguard Worker };
141*cf5a6c84SAndroid Build Coastguard Worker
142*cf5a6c84SAndroid Build Coastguard Worker // Strings out of a header
143*cf5a6c84SAndroid Build Coastguard Worker static struct config confstrs[] = {
144*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
145*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {#n,_CS_ ## n}
146*cf5a6c84SAndroid Build Coastguard Worker CONF(PATH), CONF(V7_ENV)
147*cf5a6c84SAndroid Build Coastguard Worker };
148*cf5a6c84SAndroid Build Coastguard Worker
149*cf5a6c84SAndroid Build Coastguard Worker // Integers out of a header
150*cf5a6c84SAndroid Build Coastguard Worker static struct config limits[] = {
151*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
152*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {#n,n}
153*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_AIO_LISTIO_MAX), CONF(_POSIX_AIO_MAX), CONF(_POSIX_ARG_MAX),
154*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_CHILD_MAX), CONF(_POSIX_DELAYTIMER_MAX),
155*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_HOST_NAME_MAX), CONF(_POSIX_LINK_MAX),
156*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_LOGIN_NAME_MAX), CONF(_POSIX_MAX_CANON),
157*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_MAX_INPUT), CONF(_POSIX_NAME_MAX), CONF(_POSIX_NGROUPS_MAX),
158*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_OPEN_MAX), CONF(_POSIX_PATH_MAX), CONF(_POSIX_PIPE_BUF),
159*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_RE_DUP_MAX), CONF(_POSIX_RTSIG_MAX), CONF(_POSIX_SEM_NSEMS_MAX),
160*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_SEM_VALUE_MAX), CONF(_POSIX_SIGQUEUE_MAX), CONF(_POSIX_SSIZE_MAX),
161*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_STREAM_MAX), CONF(_POSIX_SYMLINK_MAX), CONF(_POSIX_SYMLOOP_MAX),
162*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_THREAD_DESTRUCTOR_ITERATIONS), CONF(_POSIX_THREAD_KEYS_MAX),
163*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_THREAD_THREADS_MAX), CONF(_POSIX_TIMER_MAX),
164*cf5a6c84SAndroid Build Coastguard Worker CONF(_POSIX_TTY_NAME_MAX), CONF(_POSIX_TZNAME_MAX),
165*cf5a6c84SAndroid Build Coastguard Worker CONF(CHAR_MAX), CONF(CHAR_MIN), CONF(INT_MAX), CONF(INT_MIN), CONF(SCHAR_MAX),
166*cf5a6c84SAndroid Build Coastguard Worker CONF(SCHAR_MIN), CONF(SHRT_MAX), CONF(SHRT_MIN), CONF(SSIZE_MAX),
167*cf5a6c84SAndroid Build Coastguard Worker CONF(UCHAR_MAX), CONF(UINT_MAX), CONF(ULONG_MAX), CONF(USHRT_MAX),
168*cf5a6c84SAndroid Build Coastguard Worker CONF(CHAR_BIT),
169*cf5a6c84SAndroid Build Coastguard Worker /* Not available in glibc without _GNU_SOURCE. */
170*cf5a6c84SAndroid Build Coastguard Worker {"LONG_BIT", 8*sizeof(long)},
171*cf5a6c84SAndroid Build Coastguard Worker {"WORD_BIT", 8*sizeof(int)},
172*cf5a6c84SAndroid Build Coastguard Worker #undef CONF
173*cf5a6c84SAndroid Build Coastguard Worker #define CONF(n) {#n,_ ## n}
174*cf5a6c84SAndroid Build Coastguard Worker CONF(POSIX2_BC_BASE_MAX), CONF(POSIX2_BC_DIM_MAX),
175*cf5a6c84SAndroid Build Coastguard Worker CONF(POSIX2_BC_SCALE_MAX), CONF(POSIX2_BC_STRING_MAX),
176*cf5a6c84SAndroid Build Coastguard Worker CONF(POSIX2_CHARCLASS_NAME_MAX), CONF(POSIX2_COLL_WEIGHTS_MAX),
177*cf5a6c84SAndroid Build Coastguard Worker CONF(POSIX2_EXPR_NEST_MAX), CONF(POSIX2_LINE_MAX), CONF(POSIX2_RE_DUP_MAX),
178*cf5a6c84SAndroid Build Coastguard Worker };
179*cf5a6c84SAndroid Build Coastguard Worker
180*cf5a6c84SAndroid Build Coastguard Worker // Names we need to handle ourselves (default to blank but shouldn't error)
181*cf5a6c84SAndroid Build Coastguard Worker static struct config others[] = {
182*cf5a6c84SAndroid Build Coastguard Worker {"LFS_CFLAGS", 0}, {"LFS_LDFLAGS", 0}, {"LFS_LIBS", 0}
183*cf5a6c84SAndroid Build Coastguard Worker };
184*cf5a6c84SAndroid Build Coastguard Worker
show_conf(int i,struct config * c,const char * path)185*cf5a6c84SAndroid Build Coastguard Worker static void show_conf(int i, struct config *c, const char *path)
186*cf5a6c84SAndroid Build Coastguard Worker {
187*cf5a6c84SAndroid Build Coastguard Worker if (i<2) {
188*cf5a6c84SAndroid Build Coastguard Worker long l = i ? pathconf(path, c->value) : sysconf(c->value);
189*cf5a6c84SAndroid Build Coastguard Worker
190*cf5a6c84SAndroid Build Coastguard Worker if (l == -1) puts("undefined");
191*cf5a6c84SAndroid Build Coastguard Worker else printf("%ld\n", l);
192*cf5a6c84SAndroid Build Coastguard Worker } else if (i==2) {
193*cf5a6c84SAndroid Build Coastguard Worker confstr(c->value, toybuf, sizeof(toybuf));
194*cf5a6c84SAndroid Build Coastguard Worker puts(toybuf);
195*cf5a6c84SAndroid Build Coastguard Worker } else if (i==3) printf("%lld\n", c->value);
196*cf5a6c84SAndroid Build Coastguard Worker // LFS_CFLAGS on 32 bit should enable Large File Support for kernel builds
197*cf5a6c84SAndroid Build Coastguard Worker else puts(sizeof(long)==4 && !strcmp(c->name, "LFS_CFLAGS") ?
198*cf5a6c84SAndroid Build Coastguard Worker "-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" : "");
199*cf5a6c84SAndroid Build Coastguard Worker }
200*cf5a6c84SAndroid Build Coastguard Worker
getconf_main(void)201*cf5a6c84SAndroid Build Coastguard Worker void getconf_main(void)
202*cf5a6c84SAndroid Build Coastguard Worker {
203*cf5a6c84SAndroid Build Coastguard Worker struct config *configs[] = {sysconfs, pathconfs, confstrs, limits, others},
204*cf5a6c84SAndroid Build Coastguard Worker *c = 0;
205*cf5a6c84SAndroid Build Coastguard Worker int i, j, lens[] = {ARRAY_LEN(sysconfs), ARRAY_LEN(pathconfs),
206*cf5a6c84SAndroid Build Coastguard Worker ARRAY_LEN(confstrs), ARRAY_LEN(limits), ARRAY_LEN(others)};
207*cf5a6c84SAndroid Build Coastguard Worker char *name, *path = (toys.optc==2) ? toys.optargs[1] : "/",
208*cf5a6c84SAndroid Build Coastguard Worker *config_names[] = {"sysconf(3)", "pathconf(3)", "confstr(3)",
209*cf5a6c84SAndroid Build Coastguard Worker "<limits.h>", "Misc"};
210*cf5a6c84SAndroid Build Coastguard Worker
211*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(a)) {
212*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<5; i++) {
213*cf5a6c84SAndroid Build Coastguard Worker for (j = 0; j<lens[i]; j++) {
214*cf5a6c84SAndroid Build Coastguard Worker c = &configs[i][j];
215*cf5a6c84SAndroid Build Coastguard Worker printf("%-34s ", c->name);
216*cf5a6c84SAndroid Build Coastguard Worker show_conf(i, c, path);
217*cf5a6c84SAndroid Build Coastguard Worker }
218*cf5a6c84SAndroid Build Coastguard Worker }
219*cf5a6c84SAndroid Build Coastguard Worker return;
220*cf5a6c84SAndroid Build Coastguard Worker }
221*cf5a6c84SAndroid Build Coastguard Worker
222*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(l)) {
223*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i<5; i++) {
224*cf5a6c84SAndroid Build Coastguard Worker printf("%s\n", config_names[i]);
225*cf5a6c84SAndroid Build Coastguard Worker for (j = 0; j<lens[i]; j++) printf(" %s\n", configs[i][j].name);
226*cf5a6c84SAndroid Build Coastguard Worker }
227*cf5a6c84SAndroid Build Coastguard Worker return;
228*cf5a6c84SAndroid Build Coastguard Worker }
229*cf5a6c84SAndroid Build Coastguard Worker
230*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc<1) help_exit(0);
231*cf5a6c84SAndroid Build Coastguard Worker name = *toys.optargs;
232*cf5a6c84SAndroid Build Coastguard Worker
233*cf5a6c84SAndroid Build Coastguard Worker // Workaround for autogen using CS_PATH instead of PATH
234*cf5a6c84SAndroid Build Coastguard Worker if (!strcmp("CS_PATH", name)) name += 3;
235*cf5a6c84SAndroid Build Coastguard Worker
236*cf5a6c84SAndroid Build Coastguard Worker // Find the config.
237*cf5a6c84SAndroid Build Coastguard Worker for (i = j = 0; ; j++) {
238*cf5a6c84SAndroid Build Coastguard Worker if (j==lens[i]) j = 0, i++;
239*cf5a6c84SAndroid Build Coastguard Worker if (i==5) error_exit("bad '%s'", name);
240*cf5a6c84SAndroid Build Coastguard Worker c = &configs[i][j];
241*cf5a6c84SAndroid Build Coastguard Worker if (!strcmp(c->name, name)) break;
242*cf5a6c84SAndroid Build Coastguard Worker }
243*cf5a6c84SAndroid Build Coastguard Worker
244*cf5a6c84SAndroid Build Coastguard Worker // Check that we do/don't have the extra path argument.
245*cf5a6c84SAndroid Build Coastguard Worker if (i==1) {
246*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc!=2) help_exit("%s needs a path", name);
247*cf5a6c84SAndroid Build Coastguard Worker } else if (toys.optc!=1) help_exit("%s does not take a path", name);
248*cf5a6c84SAndroid Build Coastguard Worker
249*cf5a6c84SAndroid Build Coastguard Worker show_conf(i, c, path);
250*cf5a6c84SAndroid Build Coastguard Worker }
251