diff options
-rw-r--r-- | toys/posix/getconf.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/toys/posix/getconf.c b/toys/posix/getconf.c index 6885f01f..6e230efb 100644 --- a/toys/posix/getconf.c +++ b/toys/posix/getconf.c @@ -5,18 +5,20 @@ * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/getconf.c * * Deviations from posix: no -v because nothing says what it should DO. - * Added -l, what symbols should be included is a bit unclear + * Added -l, what symbols should be included is a bit unclear. + * Added -a, copied FSF behavior of assuming "/" if no path supplied. -USE_GETCONF(NEWTOY(getconf, ">2l", TOYFLAG_USR|TOYFLAG_BIN)) +USE_GETCONF(NEWTOY(getconf, ">2al", TOYFLAG_USR|TOYFLAG_BIN)) config GETCONF bool "getconf" default y help - usage: getconf -l | NAME [PATH] + usage: getconf -a [PATH] | -l | NAME [PATH] Get system configuration values. Values from pathconf(3) require a path. + -a Show all (defaults to "/" if no path given) -l List available value names (grouped by source) */ @@ -28,7 +30,9 @@ config GETCONF #ifndef _SC_XOPEN_UUCP #define _SC_XOPEN_UUCP -1 #endif -// This is missing on musl 1.1.20 + +// When NDK r19 ships in 2018Q4, switch to _SC_UIO_MAXIOV. +// (Until then use this workaround for musl.) #ifndef UIO_MAXIOV #define UIO_MAXIOV 1024 #endif @@ -158,15 +162,43 @@ struct config others[] = { {"LFS_CFLAGS", 0}, {"LFS_LDFLAGS", 0}, {"LFS_LIBS", 0} }; +static void show_conf(int i, struct config *c, const char *path) +{ + if (i<2) { + long l = i ? pathconf(path, c->value) : sysconf(c->value); + + if (l == -1) puts("undefined"); + else printf("%ld\n", l); + } else if (i==2) { + confstr(c->value, toybuf, sizeof(toybuf)); + puts(toybuf); + } else if (i==3) printf("%lld\n", c->value); + // LFS_CFLAGS on 32 bit should enable Large File Support for kernel builds + else puts(sizeof(long)==4 && !strcmp(c->name, "LFS_CFLAGS") ? + "-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" : ""); +} + void getconf_main(void) { struct config *configs[] = {sysconfs, pathconfs, confstrs, limits, others}, *c = NULL; int i, j, lens[] = {ARRAY_LEN(sysconfs), ARRAY_LEN(pathconfs), ARRAY_LEN(confstrs), ARRAY_LEN(limits), ARRAY_LEN(others)}; - char *name, *config_names[] = {"sysconf(3)", "pathconf(3)", "confstr(3)", + char *name, *path = (toys.optc==2) ? toys.optargs[1] : "/", + *config_names[] = {"sysconf(3)", "pathconf(3)", "confstr(3)", "<limits.h>", "Misc"}; + if (toys.optflags&FLAG_a) { + for (i = 0; i<5; i++) { + for (j = 0; j<lens[i]; j++) { + c = &configs[i][j]; + printf("%-34s ", c->name); + show_conf(i, c, path); + } + } + return; + } + if (toys.optflags&FLAG_l) { for (i = 0; i<5; i++) { printf("%s\n", config_names[i]); @@ -194,17 +226,5 @@ void getconf_main(void) if (toys.optc!=2) help_exit("%s needs a path", name); } else if (toys.optc!=1) help_exit("%s does not take a path", name); - if (i<2) { - long l = i ? pathconf(toys.optargs[1], c->value) : sysconf(c->value); - - if (l == -1) puts("undefined"); - else printf("%ld\n", l); - } else if (i==1) printf("%ld\n", pathconf(toys.optargs[1], c->value)); - else if (i==2) { - confstr(c->value, toybuf, sizeof(toybuf)); - puts(toybuf); - } else if (i==3) printf("%lld\n", c->value); - // LFS_CFLAGS on 32 bit should enable Large File Support (kernel build cares) - else if (sizeof(long)==4 && !j) - puts("-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"); + show_conf(i, c, path); } |