diff options
author | Glenn L McGrath | 2003-09-08 00:32:49 +0000 |
---|---|---|
committer | Glenn L McGrath | 2003-09-08 00:32:49 +0000 |
commit | 350733abb8157cd8e9e0b6bb10e8699a96c31a20 (patch) | |
tree | 7b7e5b70f47b853478e61082cdcd53a9fdf9ba2e /modutils | |
parent | d6bdd5dc088b2673b6e9fd212628a95cc1911756 (diff) | |
download | busybox-350733abb8157cd8e9e0b6bb10e8699a96c31a20.zip busybox-350733abb8157cd8e9e0b6bb10e8699a96c31a20.tar.gz |
Busybox modprobe has a couple of irritating quirks:
- attempting to modprobe a module that is already loaded yields "Failed
to load module", whereas modutils quietly ignores such a request.
- if a module genuinely can't be loaded due to missing symbols or
similar problems, modprobe doesn't produce any useful diagnostics
because the output from insmod has been redirected to /dev/null.
Here's a patch to address these issue
Patch by Philip Blundell
Diffstat (limited to 'modutils')
-rw-r--r-- | modutils/modprobe.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/modutils/modprobe.c b/modutils/modprobe.c index b4bff51..07cbb6f 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -319,6 +319,32 @@ static struct dep_t *build_dep ( void ) return first; } +/* return 1 = loaded, 0 = not loaded, -1 = can't tell */ +static int already_loaded (const char *name) +{ + int fd; + char buffer[256]; + + fd = open ("/proc/modules", O_RDONLY); + if (fd < 0) + return -1; + + while ( reads ( fd, buffer, sizeof( buffer ))) { + char *p; + + p = strchr (buffer, ' '); + if (p) { + *p = 0; + if (strcmp (name, buffer) == 0) { + close (fd); + return 1; + } + } + } + + close (fd); + return 0; +} static int mod_process ( struct mod_list_t *list, int do_insert ) { @@ -326,10 +352,13 @@ static int mod_process ( struct mod_list_t *list, int do_insert ) int rc = 1; while ( list ) { - if ( do_insert ) - snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s %s 2>/dev/null", do_syslog ? "-s" : "", autoclean ? "-k" : "", quiet ? "-q" : "", list-> m_module, list-> m_options ? list-> m_options : "" ); - else - snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s 2>/dev/null", do_syslog ? "-s" : "", list-> m_module ); + if ( do_insert ) { + if (already_loaded (list->m_module) != 1) + snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s %s", do_syslog ? "-s" : "", autoclean ? "-k" : "", quiet ? "-q" : "", list-> m_module, list-> m_options ? list-> m_options : "" ); + } else { + if (already_loaded (list->m_module) != 0) + snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s", do_syslog ? "-s" : "", list-> m_module ); + } if ( verbose ) printf ( "%s\n", lcmd ); |