From: Tobias Stoeckmann Date: Wed, 23 Oct 2024 21:49:05 +0000 (+0200) Subject: tools: Extract options_from_array into opt.c X-Git-Tag: v34~182 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a3787fb134aa9a96db3c97891715108db882c80d;p=thirdparty%2Fkmod.git tools: Extract options_from_array into opt.c The function should be used in insmod as well to allow identical handling of module options between insmod and modprobe. Prepare using the function in insmod by extracting it into opt.c. Signed-off-by: Tobias Stoeckmann Link: https://github.com/kmod-project/kmod/pull/204 Signed-off-by: Lucas De Marchi --- diff --git a/Makefile.am b/Makefile.am index 93d461ce..3f4e132b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -174,6 +174,8 @@ tools_kmod_SOURCES = \ tools/lsmod.c \ tools/modinfo.c \ tools/modprobe.c \ + tools/opt.c \ + tools/opt.h \ tools/rmmod.c \ tools/static-nodes.c diff --git a/meson.build b/meson.build index 2ed33c28..dc855265 100644 --- a/meson.build +++ b/meson.build @@ -399,6 +399,8 @@ kmod_sources = files( 'tools/lsmod.c', 'tools/modinfo.c', 'tools/modprobe.c', + 'tools/opt.c', + 'tools/opt.h', 'tools/rmmod.c', 'tools/static-nodes.c', ) diff --git a/tools/kmod.h b/tools/kmod.h index 1eb54835..69b3dba8 100644 --- a/tools/kmod.h +++ b/tools/kmod.h @@ -34,3 +34,4 @@ static inline void kmod_version(void) } #include "log.h" +#include "opt.h" diff --git a/tools/modprobe.c b/tools/modprobe.c index b1e5f48e..5c2c53a6 100644 --- a/tools/modprobe.c +++ b/tools/modprobe.c @@ -679,62 +679,6 @@ static void env_modprobe_options_append(const char *value) free(env); } -static int options_from_array(char **args, int nargs, char **output) -{ - char *opts = NULL; - size_t optslen = 0; - int i, err = 0; - - for (i = 1; i < nargs; i++) { - size_t len = strlen(args[i]); - size_t qlen = 0; - const char *value; - void *tmp; - - value = strchr(args[i], '='); - if (value) { - value++; - if (*value != '"' && *value != '\'') { - if (strchr(value, ' ')) - qlen = 2; - } - } - - tmp = realloc(opts, optslen + len + qlen + 2); - if (!tmp) { - err = -errno; - free(opts); - opts = NULL; - ERR("could not gather module options: out-of-memory\n"); - break; - } - opts = tmp; - if (optslen > 0) { - opts[optslen] = ' '; - optslen++; - } - if (qlen == 0) { - memcpy(opts + optslen, args[i], len + 1); - optslen += len; - } else { - size_t keylen = value - args[i]; - size_t valuelen = len - keylen; - memcpy(opts + optslen, args[i], keylen); - optslen += keylen; - opts[optslen] = '"'; - optslen++; - memcpy(opts + optslen, value, valuelen); - optslen += valuelen; - opts[optslen] = '"'; - optslen++; - opts[optslen] = '\0'; - } - } - - *output = opts; - return err; -} - static char **prepend_options_from_env(int *p_argc, char **orig_argv) { const char *p, *env = getenv("MODPROBE_OPTIONS"); diff --git a/tools/opt.c b/tools/opt.c new file mode 100644 index 00000000..2447f51b --- /dev/null +++ b/tools/opt.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2011-2013 ProFUSION embedded systems + */ + +#include +#include +#include + +#include "kmod.h" + +int options_from_array(char **args, int nargs, char **output) +{ + char *opts = NULL; + size_t optslen = 0; + int i, err = 0; + + for (i = 1; i < nargs; i++) { + size_t len = strlen(args[i]); + size_t qlen = 0; + const char *value; + void *tmp; + + value = strchr(args[i], '='); + if (value) { + value++; + if (*value != '"' && *value != '\'') { + if (strchr(value, ' ')) + qlen = 2; + } + } + + tmp = realloc(opts, optslen + len + qlen + 2); + if (!tmp) { + err = -errno; + free(opts); + opts = NULL; + ERR("could not gather module options: out-of-memory\n"); + break; + } + opts = tmp; + if (optslen > 0) { + opts[optslen] = ' '; + optslen++; + } + if (qlen == 0) { + memcpy(opts + optslen, args[i], len + 1); + optslen += len; + } else { + size_t keylen = value - args[i]; + size_t valuelen = len - keylen; + memcpy(opts + optslen, args[i], keylen); + optslen += keylen; + opts[optslen] = '"'; + optslen++; + memcpy(opts + optslen, value, valuelen); + optslen += valuelen; + opts[optslen] = '"'; + optslen++; + opts[optslen] = '\0'; + } + } + + *output = opts; + return err; +} diff --git a/tools/opt.h b/tools/opt.h new file mode 100644 index 00000000..48568d7d --- /dev/null +++ b/tools/opt.h @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2011-2013 ProFUSION embedded systems + */ + +int options_from_array(char **args, int nargs, char **output);