aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Jenkins <alan-jenkins@tuffmail.co.uk>2009-10-01 10:18:00 +0100
committerAlan Jenkins <alan-jenkins@tuffmail.co.uk>2009-10-01 10:18:00 +0100
commit77e210c6be85871c655243fdd08da283167aca5b (patch)
tree0445f67d0bbc5d2d4b1e20f8cf19f668e17796d0
parentea21199f7229d020c10ea5d4eadc8530cc1537d3 (diff)
parentfdae0df92cf48e02b89376a67e405191e2949977 (diff)
downloadmodule-init-tools-alan.tar.gz
Merge branch 'master' into forkbombalan
Conflicts: modprobe.c
-rw-r--r--configure.ac2
-rw-r--r--depmod.c75
-rw-r--r--doc/modprobe.sgml9
-rw-r--r--logging.h18
-rw-r--r--modinfo.c2
-rw-r--r--modprobe.c54
-rw-r--r--tables.c24
-rw-r--r--tables.h16
8 files changed, 163 insertions, 37 deletions
diff --git a/configure.ac b/configure.ac
index 3d9e710..75d3b15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(module-init-tools,3.10)
+AC_INIT(module-init-tools,3.11-rc1)
AC_CANONICAL_SYSTEM
diff --git a/depmod.c b/depmod.c
index 4c8caa0..5b90b3a 100644
--- a/depmod.c
+++ b/depmod.c
@@ -434,7 +434,7 @@ static const char *compress_path(const char *path, const char *basedir)
return path;
}
-static void output_deps(struct module *modules,
+static int output_deps(struct module *modules,
FILE *out, char *dirname)
{
struct module *i;
@@ -453,12 +453,13 @@ static void output_deps(struct module *modules,
}
fprintf(out, "\n");
}
+ return 1;
}
/* warn whenever duplicate module aliases, deps, or symbols are found. */
int warn_dups = 0;
-static void output_deps_bin(struct module *modules,
+static int output_deps_bin(struct module *modules,
FILE *out, char *dirname)
{
struct module *i;
@@ -495,6 +496,8 @@ static void output_deps_bin(struct module *modules,
index_write(index, out);
index_destroy(index);
+
+ return 1;
}
@@ -769,7 +772,7 @@ static struct module *parse_modules(struct module *list)
}
/* Simply dump hash table. */
-static void output_symbols(struct module *unused, FILE *out, char *dirname)
+static int output_symbols(struct module *unused, FILE *out, char *dirname)
{
unsigned int i;
@@ -786,9 +789,10 @@ static void output_symbols(struct module *unused, FILE *out, char *dirname)
}
}
}
+ return 1;
}
-static void output_symbols_bin(struct module *unused, FILE *out, char *dirname)
+static int output_symbols_bin(struct module *unused, FILE *out, char *dirname)
{
struct index_node *index;
unsigned int i;
@@ -817,9 +821,47 @@ static void output_symbols_bin(struct module *unused, FILE *out, char *dirname)
index_write(index, out);
index_destroy(index);
+
+ return 1;
}
-static void output_aliases(struct module *modules, FILE *out, char *dirname)
+static int output_builtin_bin(struct module *unused, FILE *out, char *dirname)
+{
+ struct index_node *index;
+ char *textfile, *line;
+ unsigned int linenum;
+ FILE *f;
+
+ nofail_asprintf(&textfile, "%s/modules.builtin", dirname);
+ if (!(f = fopen(textfile, "r"))) {
+ if (errno != ENOENT)
+ fatal("Could not open '%s': %s\n",
+ textfile, strerror(errno));
+ free(textfile);
+ return 0;
+ }
+ free(textfile);
+ index = index_create();
+
+ while ((line = getline_wrapped(f, &linenum)) != NULL) {
+ char *module = line;
+
+ if (!*line || *line == '#') {
+ free(line);
+ continue;
+ }
+ filename2modname(module, module);
+ index_insert(index, module, "", 0);
+ free(line);
+ }
+ fclose(f);
+ index_write(index, out);
+ index_destroy(index);
+
+ return 1;
+}
+
+static int output_aliases(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
struct elf_file *file;
@@ -849,9 +891,10 @@ static void output_aliases(struct module *modules, FILE *out, char *dirname)
}
strtbl_free(tbl);
}
+ return 1;
}
-static void output_aliases_bin(struct module *modules, FILE *out, char *dirname)
+static int output_aliases_bin(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
struct elf_file *file;
@@ -901,11 +944,13 @@ static void output_aliases_bin(struct module *modules, FILE *out, char *dirname)
index_write(index, out);
index_destroy(index);
+
+ return 1;
}
struct depfile {
char *name;
- void (*func)(struct module *, FILE *, char *dirname);
+ int (*func)(struct module *, FILE *, char *dirname);
int map_file;
};
@@ -923,7 +968,8 @@ static struct depfile depfiles[] = {
{ "modules.alias", output_aliases, 0 },
{ "modules.alias.bin", output_aliases_bin, 0 },
{ "modules.symbols", output_symbols, 0 },
- { "modules.symbols.bin", output_symbols_bin, 0 }
+ { "modules.symbols.bin", output_symbols_bin, 0 },
+ { "modules.builtin.bin", output_builtin_bin, 0 },
};
/* If we can't figure it out, it's safe to say "true". */
@@ -1368,6 +1414,7 @@ int main(int argc, char *argv[])
for (i = 0; i < sizeof(depfiles)/sizeof(depfiles[0]); i++) {
FILE *out;
+ int res;
struct depfile *d = &depfiles[i];
char depname[strlen(dirname) + 1 + strlen(d->name) + 1];
char tmpname[strlen(dirname) + 1 + strlen(d->name) +
@@ -1388,12 +1435,18 @@ int main(int argc, char *argv[])
if (ends_in(depname, ".bin"))
continue;
}
- d->func(list, out, dirname);
- if (!doing_stdout) {
- fclose(out);
+ res = d->func(list, out, dirname);
+ if (doing_stdout)
+ continue;
+ fclose(out);
+ if (res) {
if (rename(tmpname, depname) < 0)
fatal("Could not rename %s into %s: %s\n",
tmpname, depname, strerror(errno));
+ } else {
+ if (unlink(tmpname) < 0)
+ warn("Could not delete %s: %s\n",
+ tmpname, strerror(errno));
}
}
diff --git a/doc/modprobe.sgml b/doc/modprobe.sgml
index fde8ca7..69b2d84 100644
--- a/doc/modprobe.sgml
+++ b/doc/modprobe.sgml
@@ -367,6 +367,15 @@
</listitem>
</varlistentry>
<varlistentry>
+ <term><option>--resolve-alias</option>
+ </term>
+ <listitem>
+ <para>
+ Print all module names matching an alias.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
<term><option>-o</option> <option>--name</option>
</term>
<listitem>
diff --git a/logging.h b/logging.h
index c01187b..fb11df0 100644
--- a/logging.h
+++ b/logging.h
@@ -10,12 +10,18 @@ extern int quiet;
/* Do we want informative messages as well as errors? */
extern int verbose;
-extern void fatal(const char *fmt, ...);
-extern void error(const char *fmt, ...);
-extern void warn(const char *fmt, ...);
-extern void info(const char *fmt, ...);
-
-typedef void (*errfn_t)(const char *fmt, ...);
+#ifdef __GNUC__
+#define _printf __attribute__((format(printf, 1, 2)))
+#else
+#define _printf
+#endif
+
+extern void _printf fatal(const char *fmt, ...);
+extern void _printf error(const char *fmt, ...);
+extern void _printf warn(const char *fmt, ...);
+extern void _printf info(const char *fmt, ...);
+
+typedef void _printf (*errfn_t)(const char *fmt, ...);
static inline void grammar(const char *cmd,
const char *filename, unsigned int line)
diff --git a/modinfo.c b/modinfo.c
index 1c1b57e..c2d733f 100644
--- a/modinfo.c
+++ b/modinfo.c
@@ -242,7 +242,7 @@ static struct elf_file *grab_module(const char *name,
module = grab_elf_file(filename);
if (!module)
error("modinfo: could not open %s: %s\n",
- *filename, strerror(errno));
+ filename, strerror(errno));
free(filename);
return module;
}
diff --git a/modprobe.c b/modprobe.c
index 9d1bb51..6743759 100644
--- a/modprobe.c
+++ b/modprobe.c
@@ -69,7 +69,8 @@ typedef enum
mit_ignore_commands = 16,
mit_ignore_loaded = 32,
mit_strip_vermagic = 64,
- mit_strip_modversion = 128
+ mit_strip_modversion = 128,
+ mit_resolve_alias = 256
} modprobe_flags_t;
@@ -590,7 +591,25 @@ static int read_attribute(const char *filename, char *buf, size_t buflen)
return (s == NULL) ? -1 : 1;
}
-/* Is module in /sys/module? If so, fill in usecount if not NULL.
+/* is this a built-in module?
+ * 0: no, 1: yes, -1: don't know
+ */
+static int module_builtin(const char *dirname, const char *modname)
+{
+ struct index_file *index;
+ char *filename, *value;
+
+ nofail_asprintf(&filename, "%s/modules.builtin.bin", dirname);
+ index = index_file_open(filename);
+ free(filename);
+ if (!index)
+ return -1;
+ value = index_search(index, modname);
+ free(value);
+ return value ? 1 : 0;
+}
+
+/* Is module in /sys/module? If so, fill in usecount if not NULL.
0 means no, 1 means yes, -1 means unknown.
*/
static int module_in_sysfs(const char *modname, unsigned int *usecount)
@@ -1388,6 +1407,23 @@ static int handle_module(const char *modname,
return 0;
}
+int handle_builtin_module(const char *modname,
+ errfn_t error,
+ modprobe_flags_t flags)
+{
+ if (flags & mit_remove) {
+ error("Module %s is builtin\n", modname);
+ return 1;
+ } else if (flags & mit_first_time) {
+ error("Module %s already in kernel (builtin).\n", modname);
+ return 1;
+ } else if (flags & mit_ignore_loaded) {
+ /* --show-depends given */
+ info("builtin %s\n", modname);
+ }
+ return 0;
+}
+
int do_modprobe(char *modname,
char *newname,
char *cmdline_opts,
@@ -1433,10 +1469,20 @@ int do_modprobe(char *modname,
modname, 0, flags & mit_remove,
&modoptions, &commands,
&aliases, &blacklist);
+ /* builtin module? */
+ if (!aliases && module_builtin(dirname, modname) > 0) {
+ return handle_builtin_module(modname, error,
+ flags);
+ }
}
}
aliases = apply_blacklist(aliases, blacklist);
+ if(flags & mit_resolve_alias) {
+ for(; aliases; aliases=aliases->next)
+ printf("%s\n", aliases->module);
+ return 0;
+ }
if (aliases) {
errfn_t err = error;
@@ -1475,6 +1521,7 @@ static struct option options[] = { { "version", 0, NULL, 'V' },
{ "show", 0, NULL, 'n' },
{ "dry-run", 0, NULL, 'n' },
{ "show-depends", 0, NULL, 'D' },
+ { "resolve-alias", 0, NULL, 'R' },
{ "dirname", 1, NULL, 'd' },
{ "set-version", 1, NULL, 'S' },
{ "config", 1, NULL, 'C' },
@@ -1555,6 +1602,9 @@ int main(int argc, char *argv[])
flags |= mit_ignore_loaded;
verbose = 1;
break;
+ case 'R':
+ flags |= mit_resolve_alias;
+ break;
case 'o':
newname = optarg;
break;
diff --git a/tables.c b/tables.c
index 2f44450..c862920 100644
--- a/tables.c
+++ b/tables.c
@@ -34,7 +34,7 @@ static void output_pci_entry(struct pci_device_id *pci, char *name, FILE *out,
END(pci->class_mask, conv));
}
-void output_pci_table(struct module *modules, FILE *out, char *dirname)
+int output_pci_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -53,6 +53,7 @@ void output_pci_table(struct module *modules, FILE *out, char *dirname)
for (e = t->pci_table; e->vendor; e = (void *)e + t->pci_size)
output_pci_entry(e, shortname, out, i->file->conv);
}
+ return 1;
}
/* We set driver_info to zero */
@@ -78,7 +79,7 @@ static void output_usb_entry(struct usb_device_id *usb, char *name, FILE *out,
END(usb->bInterfaceProtocol, conv));
}
-void output_usb_table(struct module *modules, FILE *out, char *dirname)
+int output_usb_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -104,6 +105,7 @@ void output_usb_table(struct module *modules, FILE *out, char *dirname)
e = (void *)e + t->usb_size)
output_usb_entry(e, shortname, out, i->file->conv);
}
+ return 1;
}
static void output_ieee1394_entry(struct ieee1394_device_id *fw, char *name,
@@ -118,7 +120,7 @@ static void output_ieee1394_entry(struct ieee1394_device_id *fw, char *name,
END(fw->version, conv));
}
-void output_ieee1394_table(struct module *modules, FILE *out, char *dirname)
+int output_ieee1394_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -138,6 +140,7 @@ void output_ieee1394_table(struct module *modules, FILE *out, char *dirname)
fw = (void *) fw + t->ieee1394_size)
output_ieee1394_entry(fw, shortname, out, i->file->conv);
}
+ return 1;
}
@@ -151,7 +154,7 @@ static void output_ccw_entry(struct ccw_device_id *ccw, char *name, FILE *out,
END(ccw->dev_type, conv), END(ccw->dev_model, conv));
}
-void output_ccw_table(struct module *modules, FILE *out, char *dirname)
+int output_ccw_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -172,6 +175,7 @@ void output_ccw_table(struct module *modules, FILE *out, char *dirname)
e = (void *) e + t->ccw_size)
output_ccw_entry(e, shortname, out, i->file->conv);
}
+ return 1;
}
#define ISAPNP_VENDOR(a,b,c) (((((a)-'A'+1)&0x3f)<<2)|\
@@ -192,7 +196,7 @@ static void put_isapnp_id(FILE *out, const char *id)
fprintf(out, " 0x%04x 0x%04x ", vendor, device);
}
-void output_isapnp_table(struct module *modules, FILE *out, char *dirname)
+int output_isapnp_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -238,6 +242,7 @@ void output_isapnp_table(struct module *modules, FILE *out, char *dirname)
}
}
}
+ return 1;
}
#define MATCH_bustype 1
@@ -412,7 +417,7 @@ static int output_input_entry_64_old(struct input_device_id_old_64 *input,
return 0;
}
-void output_input_table(struct module *modules, FILE *out, char *dirname)
+int output_input_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -468,6 +473,7 @@ void output_input_table(struct module *modules, FILE *out, char *dirname)
}
}
}
+ return 1;
}
static void output_serio_entry(struct serio_device_id *serio, char *name, FILE *out)
@@ -482,7 +488,7 @@ static void output_serio_entry(struct serio_device_id *serio, char *name, FILE *
}
-void output_serio_table(struct module *modules, FILE *out, char *dirname)
+int output_serio_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -500,6 +506,7 @@ void output_serio_table(struct module *modules, FILE *out, char *dirname)
for (e = t->serio_table; e->type || e->proto; e = (void *)e + t->serio_size)
output_serio_entry(e, shortname, out);
}
+ return 1;
}
@@ -542,7 +549,7 @@ static void output_of_entry(struct of_device_id *dev, char *name, FILE *out)
free(compatible);
}
-void output_of_table(struct module *modules, FILE *out, char *dirname)
+int output_of_table(struct module *modules, FILE *out, char *dirname)
{
struct module *i;
@@ -560,4 +567,5 @@ void output_of_table(struct module *modules, FILE *out, char *dirname)
e = (void *)e + t->of_size)
output_of_entry(e, shortname, out);
}
+ return 1;
}
diff --git a/tables.h b/tables.h
index 8a1420f..920e8df 100644
--- a/tables.h
+++ b/tables.h
@@ -175,13 +175,13 @@ struct of_device_id {
/* Functions provided by tables.c */
struct module;
-void output_usb_table(struct module *modules, FILE *out, char *dirname);
-void output_ieee1394_table(struct module *modules, FILE *out, char *dirname);
-void output_pci_table(struct module *modules, FILE *out, char *dirname);
-void output_ccw_table(struct module *modules, FILE *out, char *dirname);
-void output_isapnp_table(struct module *modules, FILE *out, char *dirname);
-void output_input_table(struct module *modules, FILE *out, char *dirname);
-void output_serio_table(struct module *modules, FILE *out, char *dirname);
-void output_of_table(struct module *modules, FILE *out, char *dirname);
+int output_usb_table(struct module *modules, FILE *out, char *dirname);
+int output_ieee1394_table(struct module *modules, FILE *out, char *dirname);
+int output_pci_table(struct module *modules, FILE *out, char *dirname);
+int output_ccw_table(struct module *modules, FILE *out, char *dirname);
+int output_isapnp_table(struct module *modules, FILE *out, char *dirname);
+int output_input_table(struct module *modules, FILE *out, char *dirname);
+int output_serio_table(struct module *modules, FILE *out, char *dirname);
+int output_of_table(struct module *modules, FILE *out, char *dirname);
#endif /* MODINITTOOLS_TABLES_H */