[PATCH] Re: modprobe documentation discrepancy (modules.dep support)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi again,

below is a patch to (re-)add support for modules.dep (in addition to
modules.dep.bin), in a very dirty way. Basically I just took parts of the 
original code from module-init-tools...

Also, it fixes the CHECK_ERR_AND_FINISH macro.


However, this doesn't fix the whole "problem" - 'modprobe nonexistingmodule'
is called, no error is printed, because of the faulty processing of subsequent
non-existent files (like modules.builtin.bin etc. - which depmod.pl doesn't 
generate).

To fully fix this, one would have to also add support for the other
legacy files. Well, at least a support to handle the missing files gracefully.

Fixing this is important for when you want to cross-compile the kernel in a 
non-linux environment. I didn't find find any other tool than depmod.pl that 
could generate all the files required by modprobe (but depmod.pl, as mentioned 
before, doesn't generate other .bin files) - and kmod/module-init-tools can't 
be cross-compiled for cygwin/mingw32...


Best regards,
Andrej Krutak
SYSGO

---
 libkmod/libkmod-module.c |    4 +-
 libkmod/libkmod.c        |  107 
+++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 107 insertions(+), 4 deletions(-)

diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
index 3d3325f..e737d30 100644
--- a/libkmod/libkmod-module.c
+++ b/libkmod/libkmod-module.c
@@ -473,7 +473,7 @@ KMOD_EXPORT struct kmod_module *kmod_module_ref(struct 
kmod_module *mod)
 		if ((_err) < 0)						\
 			goto _label_err;				\
 		if (*(_list) != NULL)					\
-			goto finish;					\
+			goto label_finish;					\
 	} while (0)
 
 /**
@@ -553,7 +553,7 @@ finish:
 	DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list);
 	return err;
 fail:
-	DBG(ctx, "Failed to lookup %s\n", alias);
+	DBG(ctx, "Failed to lookup %s (%d)\n", alias, err);
 	kmod_module_unref_list(*list);
 	*list = NULL;
 	return err;
diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c
index ef83e31..4a60416 100644
--- a/libkmod/libkmod.c
+++ b/libkmod/libkmod.c
@@ -533,11 +533,106 @@ finish:
 	return err;
 }
 
+/**
+ * modname_equal - compare module names (up to len), with '_' and '-' equal
+ *
+ * @a:		first module name
+ * @b:		second module name
+ * @len:	length to compare
+ *
+ */
+static int modname_equal(const char *a, const char *b, unsigned int len)
+{
+	unsigned int i;
+
+	if (strlen(b) != len)
+		return 0;
+
+	for (i = 0; i < len; i++) {
+		if ((a[i] == '_' || a[i] == '-')
+		    && (b[i] == '_' || b[i] == '-'))
+			continue;
+		if (a[i] != b[i])
+			return 0;
+	}
+	return 1;
+}
+
+static char *my_basename(const char *path)
+{
+	const char *base = strrchr(path, '/');
+	if (base)
+		return (char *) base + 1;
+	return (char *) path;
+}
+
+
+/**
+ * add_modules_dep_line - parse a dep line from the module.dep[.bin] file
+ *
+ * @line:	input file line
+ * @name:	module name
+ *
+ * Add dependency information if this line of the dep file matches mod name
+ */
+static int is_module_line(char *line,
+				const char *name)
+{
+	char *ptr;
+	int len;
+	char *modname;
+	int rv;
+
+	line = strdup(line);
+
+	/* Ignore lines without : or which start with a # */
+	ptr = strchr(line, ':');
+	if (ptr == NULL || line[strspn(line, "\t ")] == '#') {
+		free(line);
+		return 0;
+	}
+
+	/* Is this the module we are looking for? */
+	*ptr = '\0';
+	modname = my_basename(line);
+
+	len = strlen(modname);
+	if (strchr(modname, '.'))
+		len = strchr(modname, '.') - modname;
+
+	rv = modname_equal(modname, name, len);
+
+	free(line);
+	return rv;
+}
+
+static char *kmod_search_moddep_legacy(struct kmod_ctx *ctx, const char 
*name, const char *fn)
+{
+	char *line;
+	FILE *modules_dep;
+	
+	modules_dep = fopen(fn, "r");
+	if (!modules_dep)
+		return NULL;
+
+	/* Stop at first line, as we can have duplicates (eg. symlinks
+           from boot/ */
+	while ((line = getline_wrapped(modules_dep, NULL)) != NULL) {
+		if (is_module_line(line, name))
+			break;
+		free(line);
+	}
+	fclose(modules_dep);
+
+	return line;
+}
+
 char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name)
 {
 	struct index_file *idx;
 	char fn[PATH_MAX];
 	char *line;
+	
 
 	if (ctx->indexes[KMOD_INDEX_MODULES_DEP]) {
 		DBG(ctx, "use mmaped index '%s' modname=%s\n",
@@ -553,8 +648,16 @@ char *kmod_search_moddep(struct kmod_ctx *ctx, const char 
*name)
 
 	idx = index_file_open(fn);
 	if (idx == NULL) {
-		DBG(ctx, "could not open moddep file '%s'\n", fn);
-		return NULL;
+		struct stat st;
+		
+		snprintf(fn, sizeof(fn), "%s/%s", ctx->dirname,
+					index_files[KMOD_INDEX_MODULES_DEP].fn);
+		if (stat(fn, &st) != 0) {
+			DBG(ctx, "could not open moddep file '%s[.bin]'\n", fn);
+			return NULL;
+		}
+		
+		return kmod_search_moddep_legacy(ctx, name, fn);
 	}
 
 	line = index_search(idx, name);
-- 
1.7.9.5


--
To unsubscribe from this list: send the line "unsubscribe linux-modules" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux