aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2004-07-20 10:05:13 +0000
committerEric Andersen <andersen@codepoet.org>2004-07-20 10:05:13 +0000
commitc0693ed61bce201b4307252c48c6b96fa09319f9 (patch)
tree855f1c2c6398cb861837c3ff7e701514fd994aa8
parentaea8e0eea7bbdf3eeefcd977dcce0ece79f40f21 (diff)
downloadbusybox-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.c40
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;
+ }
}
}