]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
kmod-depmod: dump modules.dep.bin
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Sat, 24 Dec 2011 01:21:48 +0000 (23:21 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Tue, 27 Dec 2011 14:09:16 +0000 (12:09 -0200)
tools/kmod-depmod.c

index cfa423c047d5fd0a211090c1a492d64683637e3c..a5ec631141d0aa701afdc8eb41a642147e314d64 100644 (file)
@@ -2262,6 +2262,89 @@ static int output_deps(struct depmod *depmod, FILE *out)
        return 0;
 }
 
+static int output_deps_bin(struct depmod *depmod, FILE *out)
+{
+       struct index_node *idx;
+       size_t i;
+
+       if (out == stdout)
+               return 0;
+
+       idx = index_create();
+       if (idx == NULL)
+               return -ENOMEM;
+
+       for (i = 0; i < depmod->modules.count; i++) {
+               const struct mod **deps, *mod = depmod->modules.array[i];
+               const char *p = mod_get_compressed_path(mod);
+               char *line;
+               size_t j, n_deps, linepos, linelen, slen;
+               int duplicate;
+
+               if (mod->dep_loop) {
+                       DBG("Ignored %s due dependency loops\n", p);
+                       continue;
+               }
+
+               deps = mod_get_all_sorted_dependencies(mod, &n_deps);
+               if (deps == NULL && n_deps > 0) {
+                       ERR("Could not get all sorted dependencies of %s\n", p);
+                       continue;
+               }
+
+               linelen = strlen(p) + 1;
+               for (j = 0; j < n_deps; j++) {
+                       const struct mod *d = deps[j];
+                       if (d->dep_loop) {
+                               DBG("Ignored %s (dependency of %s) "
+                                   "due dependency loops\n",
+                                   mod_get_compressed_path(d), p);
+                               continue;
+                       }
+                       linelen += 1 + strlen(mod_get_compressed_path(d));
+               }
+
+               line = malloc(linelen + 1);
+               if (line == NULL) {
+                       free(deps);
+                       ERR("modules.deps.bin: out of memory\n");
+                       continue;
+               }
+
+               linepos = 0;
+               slen = strlen(p);
+               memcpy(line + linepos, p, slen);
+               linepos += slen;
+               line[linepos] = ':';
+               linepos++;
+
+               for (j = 0; j < n_deps; j++) {
+                       const struct mod *d = deps[j];
+                       const char *dp;
+                       if (d->dep_loop)
+                               continue;
+                       line[linepos] = ' ';
+                       linepos++;
+
+                       dp = mod_get_compressed_path(d);
+                       slen = strlen(dp);
+                       memcpy(line + linepos, dp, slen);
+                       linepos += slen;
+               }
+               line[linepos] = '\0';
+
+               duplicate = index_insert(idx, mod->modname, line, mod->idx);
+               if (duplicate && depmod->cfg->warn_dups)
+                       WRN("duplicate module deps:\n%s\n", line);
+               free(line);
+       }
+
+       index_write(idx, out);
+       index_destroy(idx);
+
+       return 0;
+}
+
 static int output_aliases(struct depmod *depmod, FILE *out)
 {
        size_t i;
@@ -2532,7 +2615,7 @@ static int depmod_output(struct depmod *depmod, FILE *out)
                int (*cb)(struct depmod *depmod, FILE *out);
        } *itr, depfiles[] = {
                {"modules.dep", output_deps},
-               //{"modules.dep.bin", output_deps_bin},
+               {"modules.dep.bin", output_deps_bin},
                {"modules.alias", output_aliases},
                {"modules.alias.bin", output_aliases_bin},
                {"modules.softdep", output_softdeps},