diff options
-rw-r--r-- | toys/posix/getconf.c | 87 |
1 files changed, 54 insertions, 33 deletions
diff --git a/toys/posix/getconf.c b/toys/posix/getconf.c index a9ef298a..d10365b5 100644 --- a/toys/posix/getconf.c +++ b/toys/posix/getconf.c @@ -6,17 +6,19 @@ * * Deviations from posix: no -v because nothing says what it should DO. -USE_GETCONF(NEWTOY(getconf, "l", TOYFLAG_USR|TOYFLAG_BIN)) +USE_GETCONF(NEWTOY(getconf, ">2l", TOYFLAG_USR|TOYFLAG_BIN)) config GETCONF bool "getconf" default y help - usage: getconf [-l] [NAME...] + usage: getconf -l + usage: getconf NAME + usage: getconf NAME PATH - Get system configuration values. + Get system configuration values. Values from pathconf(3) require a path. - -l List available value names + -l List available value names (grouped by source) */ #define FOR_getconf @@ -94,6 +96,16 @@ struct config sysconfs[] = { CONF(NPROCESSORS_ONLN) }; +// Probe the live system with a path +struct config pathconfs[] = { +#undef CONF +#define CONF(n) {#n,_PC_ ## n} + CONF(ASYNC_IO), CONF(CHOWN_RESTRICTED), CONF(FILESIZEBITS), CONF(LINK_MAX), + CONF(MAX_CANON), CONF(MAX_INPUT), CONF(NAME_MAX), CONF(NO_TRUNC), + CONF(PATH_MAX), CONF(PIPE_BUF), CONF(PRIO_IO), CONF(SYMLINK_MAX), + CONF(SYNC_IO), CONF(VDISABLE), +}; + // Strings out of a header struct config confstrs[] = { #undef CONF @@ -130,41 +142,50 @@ struct config others[] = { void getconf_main(void) { - struct config *configs[] = {sysconfs, confstrs, limits, others}; - char **args; - int i, j, lens[] = {ARRAY_LEN(sysconfs), ARRAY_LEN(confstrs), - ARRAY_LEN(limits), ARRAY_LEN(others)}; + 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)", + "<limits.h>", "Misc"}; if (toys.optflags&FLAG_l) { - for (i = 0; i<4; i++) for (j = 0; j<lens[i]; j++) puts(configs[i][j].name); - + for (i = 0; i<5; i++) { + printf("%s\n", config_names[i]); + for (j = 0; j<lens[i]; j++) { + printf(" %s\n", configs[i][j].name); + } + } return; } - for (args = toys.optargs; *args; args++) { - char *name = *args; + if (toys.optc<1) help_exit(0); + name = *toys.optargs; - // Workaround for autogen using CS_PATH instead of PATH - if (!strcmp("CS_PATH", name)) name += 3; + // Workaround for autogen using CS_PATH instead of PATH + if (!strcmp("CS_PATH", name)) name += 3; - for (i = 0; i<4; i++) for (j = 0; j<lens[i]; j++) { - struct config *c = &configs[i][j]; - - if (strcmp(c->name, name)) continue; - - if (!i) printf("%ld\n", sysconf(c->value)); - else if (i==1) { - confstr(c->value, toybuf, sizeof(toybuf)); - puts(toybuf); - } else if (i==2) printf("%d\n", c->value); - // For legacy kernel build - else if (sizeof(long)==4 && !j) - puts("-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"); - - goto cont; - } - error_msg("bad '%s'", name); -cont: - ; + // Find the config. + for (i = 0; i<5; i++) for (j = 0; j<lens[i]; j++) { + c = &configs[i][j]; + if (!strcmp(c->name, name)) goto found; + } + error_msg("bad '%s'", name); + + found: + // Check that we do/don't have the extra path argument. + if (i==1) { + 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) printf("%ld\n", sysconf(c->value)); + 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("%d\n", c->value); + // For legacy kernel build + else if (sizeof(long)==4 && !j) { + puts("-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"); } } |