[Toybox] [PATCH] getconf: add pathconf(3) variables.

enh enh at google.com
Tue Oct 2 16:21:33 PDT 2018


(in case it's not obvious, this is on top of my other getconf patch
from earlier today.)
On Tue, Oct 2, 2018 at 4:20 PM enh <enh at google.com> wrote:
>
> Also improve the -l output to include sections (because you need to
> know whether you're dealing with a pathconf variable to supply the
> required path).
> ---
>  toys/posix/getconf.c | 87 +++++++++++++++++++++++++++-----------------
>  1 file changed, 54 insertions(+), 33 deletions(-)
>
> diff --git a/toys/posix/getconf.c b/toys/posix/getconf.c
> index a9ef298..d10365b 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");
>    }
>  }
> --
> 2.19.0.605.g01d371f741-goog



More information about the Toybox mailing list