diff options
author | Eric Andersen <andersen@codepoet.org> | 2004-07-20 10:05:13 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2004-07-20 10:05:13 +0000 |
commit | c0693ed61bce201b4307252c48c6b96fa09319f9 (patch) | |
tree | 855f1c2c6398cb861837c3ff7e701514fd994aa8 | |
parent | aea8e0eea7bbdf3eeefcd977dcce0ece79f40f21 (diff) | |
download | busybox-c0693ed61bce201b4307252c48c6b96fa09319f9.tar.gz |
Deal with the fact that 2.6.x kernels replace any '-'s in the
module name with a '_'.
-Erik
-rw-r--r-- | modutils/rmmod.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/modutils/rmmod.c b/modutils/rmmod.c index 5576eb6a1..3693aec7c 100644 --- a/modutils/rmmod.c +++ b/modutils/rmmod.c @@ -26,9 +26,33 @@ #include <stdlib.h> #include <getopt.h> #include <fcntl.h> +#include <string.h> #include <sys/syscall.h> #include "busybox.h" +#ifdef CONFIG_FEATURE_2_6_MODULES +static inline void filename2modname(char *modname, const char *filename) +{ + const char *afterslash; + unsigned int i; + + afterslash = strrchr(filename, '/'); + if (!afterslash) + afterslash = filename; + else + afterslash++; + + /* Convert to underscores, stop at first . */ + for (i = 0; afterslash[i] && afterslash[i] != '.'; i++) { + if (afterslash[i] == '-') + modname[i] = '_'; + else + modname[i] = afterslash[i]; + } + modname[i] = '\0'; +} +#endif + extern int rmmod_main(int argc, char **argv) { int n, ret = EXIT_SUCCESS; @@ -81,10 +105,18 @@ extern int rmmod_main(int argc, char **argv) if (optind == argc) bb_show_usage(); - for (n = optind; n < argc; n++) { - if (syscall(__NR_delete_module, argv[n], flags) < 0) { - bb_perror_msg("%s", argv[n]); - ret = EXIT_FAILURE; + { +#ifdef CONFIG_FEATURE_2_6_MODULES + char module_name[strlen(argv[n]) + 1]; + filename2modname(module_name, argv[n]); +#else +#define module_name argv[n] +#endif + for (n = optind; n < argc; n++) { + if (syscall(__NR_delete_module, module_name, flags) < 0) { + bb_perror_msg("%s", argv[n]); + ret = EXIT_FAILURE; + } } } |