#include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <malloc.h> #include <errno.h> #include <asm/unistd.h> extern int delete_module(const char *, unsigned int); int rmmod_main(int argc, char **argv) { int ret, i; char *modname, *dot; /* make sure we've got an argument */ if (argc < 2) { fprintf(stderr, "usage: rmmod <module>\n"); return -1; } /* if given /foo/bar/blah.ko, make a weak attempt * to convert to "blah", just for convenience */ modname = strrchr(argv[1], '/'); if (!modname) modname = argv[1]; else modname++; dot = strchr(argv[1], '.'); if (dot) *dot = '\0'; /* Replace "-" with "_". This would keep rmmod * compatible with module-init-tools version of * rmmod */ for (i = 0; modname[i] != '\0'; i++) { if (modname[i] == '-') modname[i] = '_'; } /* pass it to the kernel */ ret = delete_module(modname, O_NONBLOCK | O_EXCL); if (ret != 0) { fprintf(stderr, "rmmod: delete_module '%s' failed (errno %d)\n", modname, errno); return -1; } return 0; }