diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-10-01 10:18:00 +0100 |
---|---|---|
committer | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-10-01 10:18:00 +0100 |
commit | 77e210c6be85871c655243fdd08da283167aca5b (patch) | |
tree | 0445f67d0bbc5d2d4b1e20f8cf19f668e17796d0 | |
parent | ea21199f7229d020c10ea5d4eadc8530cc1537d3 (diff) | |
parent | fdae0df92cf48e02b89376a67e405191e2949977 (diff) | |
download | module-init-tools-alan.tar.gz |
Merge branch 'master' into forkbombalan
Conflicts:
modprobe.c
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | depmod.c | 75 | ||||
-rw-r--r-- | doc/modprobe.sgml | 9 | ||||
-rw-r--r-- | logging.h | 18 | ||||
-rw-r--r-- | modinfo.c | 2 | ||||
-rw-r--r-- | modprobe.c | 54 | ||||
-rw-r--r-- | tables.c | 24 | ||||
-rw-r--r-- | tables.h | 16 |
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 @@ -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> @@ -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) @@ -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; } @@ -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; @@ -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; } @@ -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 */ |