[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