[LTP] [PATCH 1/3] kconfig: add funtion to parse /proc/cmdline

Li Wang liwang@redhat.com
Sat Mar 9 09:09:00 CET 2024


On Sat, Mar 9, 2024 at 4:46 AM Cyril Hrubis <chrubis@suse.cz> wrote:

> Hi!
> > +/**
> > + * Macro to initialize a tst_kcmdline_param structure with a specified
> parameter
> > + * name and an empty value. This is useful for setting up an array of
> parameter
> > + * structures before parsing the actual command-line arguments.
> > + */
> > +#define TST_KCMDLINE_INIT(paraname) { \
> > +     .key = paraname, \
> > +     .value = "" \
> > +}
> > +
> > +/* Structure for storing command-line parameter key and its
> corresponding value */
> > +struct tst_kcmdline_param {
>                        ^
>                        maybe var as short for variable would be better
>                        name
> > +     const char *key;
> > +     char value[128];
> > +};
> > +
> > +/**
> > + * Parses command-line parameters from /proc/cmdline and stores them in
> params array
> > + * params: The array of tst_kcmdline_param structures to be filled with
> parsed key-value pairs
> > + * params_len: The length of the params array, indicating how many
> parameters to parse
> > + */
> > +void tst_kcmdline_parse(struct tst_kcmdline_param params[], size_t
> params_len);
> > +
> >  #endif       /* TST_KCONFIG_H__ */
> > diff --git a/lib/tst_kconfig.c b/lib/tst_kconfig.c
> > index 595ea4b09..f79dea5c6 100644
> > --- a/lib/tst_kconfig.c
> > +++ b/lib/tst_kconfig.c
> > @@ -565,3 +565,44 @@ char tst_kconfig_get(const char *confname)
> >
> >       return var.choice;
> >  }
> > +
> > +void tst_kcmdline_parse(struct tst_kcmdline_param params[], size_t
> params_len) {
> > +     FILE *proc_cmdline;
> > +     char cmdline[4096];
> > +     char *token, *key, *value;
> > +
> > +     proc_cmdline = fopen("/proc/cmdline", "r");
> > +     if (proc_cmdline == NULL)
> > +             tst_brk(TBROK | TERRNO, "Failed to open /proc/cmdline for
> reading");
> > +
> > +     if (fgets(cmdline, sizeof(cmdline), proc_cmdline) == NULL) {
> > +             fclose(proc_cmdline);
> > +
> > +             if (feof(proc_cmdline))
> > +                     tst_brk(TBROK, "End-of-File reached on
> /proc/cmdline without reading any data");
> > +             else
> > +                     tst_brk(TBROK | TERRNO, "Failed to read from
> /proc/cmdline");
> > +     }
> > +     fclose(proc_cmdline);
>
> Uff, this is ugly. We have FILE and then use it as if we had fd and read
> it as a whole. The whole point of FILE is that glibc manages the buffers
> and reads so that we can access it character by character without being
> slow. It would be way cleaner if we just read the file character by
> character building up the key and value while we do that.
>

Indeed, this is much better than my way. Thanks!


-- 
Regards,
Li Wang


More information about the ltp mailing list