]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
tools: Extract options_from_array into opt.c
authorTobias Stoeckmann <tobias@stoeckmann.org>
Wed, 23 Oct 2024 21:49:05 +0000 (23:49 +0200)
committerLucas De Marchi <lucas.de.marchi@gmail.com>
Thu, 24 Oct 2024 03:10:39 +0000 (22:10 -0500)
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 <tobias@stoeckmann.org>
Link: https://github.com/kmod-project/kmod/pull/204
Signed-off-by: Lucas De Marchi <lucas.de.marchi@gmail.com>
Makefile.am
meson.build
tools/kmod.h
tools/modprobe.c
tools/opt.c [new file with mode: 0644]
tools/opt.h [new file with mode: 0644]

index 93d461ce071738ffe0cdc998b16a6302ba923558..3f4e132b932baab21d1f9533096c96c7967dec6f 100644 (file)
@@ -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
 
index 2ed33c28471f6a1a1345f9770d73eff84dc25cd3..dc855265fcb7aa159dd2f29922ba28939e3bffe9 100644 (file)
@@ -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',
 )
index 1eb54835ae44b6fadd4e3d5ba11432926b32757f..69b3dba8f4620965ee7db63fd4e96f5544e524d3 100644 (file)
@@ -34,3 +34,4 @@ static inline void kmod_version(void)
 }
 
 #include "log.h"
+#include "opt.h"
index b1e5f48ef4ef9cf82125846e098cd6f682b49b6f..5c2c53a6bae02928b0afa3be885dcee7286b1e8d 100644 (file)
@@ -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 (file)
index 0000000..2447f51
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2011-2013  ProFUSION embedded systems
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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 (file)
index 0000000..48568d7
--- /dev/null
@@ -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);