[PATCH] modutils: Add /proc/cmdline module option parsing support

Ozan Çağlayan ozan at pardus.org.tr
Fri Jan 22 23:50:20 UTC 2010


This adds module option parsing support from /proc/cmdline like in
module-init-tools.

The options passed through /proc/cmdline are always squeezed by the ones
provided with command line arguments.

It's tested against single module loading through module name and alias.

Signed-off-by: Ozan Çağlayan <ozan at pardus.org.tr>
---
 modutils/modprobe.c |    3 ++-
 modutils/modutils.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 modutils/modutils.h |    1 +
 3 files changed, 45 insertions(+), 1 deletions(-)

diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index 2860ae0..ca4d75a 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -82,7 +82,7 @@ static char *gather_options_str(char *opts, const char *append)
 	/* Speed-optimized. We call gather_options_str many times. */
 	if (opts == NULL) {
 		opts = xstrdup(append);
-	} else {
+	} else if (append) {
 		int optlen = strlen(opts);
 		opts = xrealloc(opts, optlen + strlen(append) + 2);
 		sprintf(opts + optlen, " %s", append);
@@ -286,6 +286,7 @@ static int do_modprobe(struct module_entry *m)
 
 		options = m2->options;
 		m2->options = NULL;
+		options = gather_options_str(options, parse_kcmdline_module_options(m2->modname));
 		if (m == m2)
 			options = gather_options_str(options, G.cmdline_mopts);
 		rc = bb_init_module(fn, options);
diff --git a/modutils/modutils.c b/modutils/modutils.c
index 850a868..98fac74 100644
--- a/modutils/modutils.c
+++ b/modutils/modutils.c
@@ -111,6 +111,48 @@ void* FAST_FUNC try_to_mmap_module(const char *filename, size_t *image_size_p)
 }
 #endif
 
+char * FAST_FUNC parse_kcmdline_module_options(char *modulename)
+{
+	char *kcmdline_buf;
+	char *options;
+	char *token, *sep, *modname, *modoption;
+	int len;
+
+	/* defined in arch/<architecture>/include/asm/setup.h
+	 * maximum is 2048 for IA64 and SPARC */
+	kcmdline_buf = xmalloc(2048);
+
+	len = open_read_close("/proc/cmdline", kcmdline_buf, 2047);
+	if (len < 0)
+		return NULL;
+
+	/* Read was succesful */
+	kcmdline_buf[len] = '\0';
+
+	/* Initial allocation */
+	options = xzalloc(1);
+	len = 0;
+
+	while ((token = strsep(&kcmdline_buf, "\n\t ")) != NULL) {
+		if ((sep = strchr(token, '.')) && strchr(sep, '=')) {
+			modname = token;
+			*sep = '\0';
+			modoption = ++sep;
+			if (!strcmp(modulename, modname)) {
+				/* Found parameters for the relevant module */
+				options = xrealloc(options, len + strlen(modoption) + 2);
+				len += sprintf(options + len, "%s ", modoption);
+			}
+		}
+	}
+	free(kcmdline_buf);
+
+	/* Strip last space */
+	if (len > 0)
+	    options[len-1] = '\0';
+	return options;
+}
+
 /* Return:
  * 0 on success,
  * -errno on open/read error,
diff --git a/modutils/modutils.h b/modutils/modutils.h
index 131a508..1f787a4 100644
--- a/modutils/modutils.h
+++ b/modutils/modutils.h
@@ -22,6 +22,7 @@ char *replace_underscores(char *s) FAST_FUNC;
 int string_to_llist(char *string, llist_t **llist, const char *delim) FAST_FUNC;
 char *filename2modname(const char *filename, char *modname) FAST_FUNC;
 char *parse_cmdline_module_options(char **argv) FAST_FUNC;
+char *parse_kcmdline_module_options(char *modulename) FAST_FUNC;
 
 #define INSMOD_OPTS \
 	"vq" \
-- 
1.6.5.6



More information about the busybox mailing list