Re: [PATCH 1/2] kconfig: add support for type handlers

From: Arnaud Lacombe
Date: Fri Feb 25 2011 - 20:29:15 EST


Hi,

On Fri, Feb 25, 2011 at 7:44 PM, Jeff Mahoney <jeffm@xxxxxxxx> wrote:
>  This patch adds type handlers for compressed config files. Initial
>  support provides callouts for gzip and bzip2, but there's no reason
>  others could be added if demand is there.
>
>  This is intended to allow /proc/config.gz be a configuration source
>  for 'make oldconfig' when .config is absent.
>
this can be trivially scripted, any reason it _has_ to be done within kconfig ?

- Arnaud

> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx>
> ---
>
>  scripts/kconfig/zconf.l |   50 ++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 48 insertions(+), 2 deletions(-)
>
> --- a/scripts/kconfig/zconf.l
> +++ b/scripts/kconfig/zconf.l
> @@ -256,6 +256,44 @@ static void zconf_endhelp(void)
>        BEGIN(INITIAL);
>  }
>
> +static const struct type_handler {
> +       const char *suffix;
> +       const char *command;
> +} type_handlers[] = {
> +       {
> +               .suffix = ".gz",
> +               .command = "zcat",
> +       },
> +       {
> +               .suffix = ".bz2",
> +               .command = "bzcat",
> +       },
> +       /* Whatever other algorithms you like */
> +       {}
> +};
> +
> +static const struct type_handler *get_type_handler(const char *name)
> +{
> +       char *p = rindex(name, '.');
> +       if (p) {
> +               const struct type_handler *ops = type_handlers;
> +               for (ops = type_handlers; ops->suffix; ops++) {
> +                       if (!strcasecmp(ops->suffix, p))
> +                               break;
> +               }
> +               if (!ops->suffix)
> +                       return NULL;
> +               return ops;
> +       }
> +       return NULL;
> +}
> +
> +static FILE *zconf_popen(const char *command, const char *name)
> +{
> +       char cmdbuf[PATH_MAX + strlen(command) + 2];
> +       snprintf(cmdbuf, sizeof(cmdbuf), "%s %s", command, name);
> +       return popen(cmdbuf, "r");
> +}
>
>  /*
>  * Try to open specified file with following names:
> @@ -267,15 +305,23 @@ static void zconf_endhelp(void)
>  */
>  FILE *zconf_fopen(const char *name)
>  {
> +       const struct type_handler *handler = get_type_handler(name);
>        char *env, fullname[PATH_MAX+1];
>        FILE *f;
>
> -       f = fopen(name, "r");
> +       if (handler)
> +               f = zconf_popen(handler->command, name);
> +       else
> +               f = fopen(name, "r");
> +
>        if (!f && name != NULL && name[0] != '/') {
>                env = getenv(SRCTREE);
>                if (env) {
>                        sprintf(fullname, "%s/%s", env, name);
> -                       f = fopen(fullname, "r");
> +                       if (handler)
> +                               f = zconf_popen(handler->command, fullname);
> +                       else
> +                               f = fopen(fullname, "r");
>                }
>        }
>        return f;
>
> --
> Jeff Mahoney
> SUSE Labs
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/