1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <malloc.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <asm/unistd.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern int delete_module(const char *, unsigned int); 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint rmmod_main(int argc, char **argv) 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 13fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj int ret, i; 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *modname, *dot; 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* make sure we've got an argument */ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 2) { 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "usage: rmmod <module>\n"); 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* if given /foo/bar/blah.ko, make a weak attempt 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to convert to "blah", just for convenience 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project modname = strrchr(argv[1], '/'); 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!modname) 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project modname = argv[1]; 28ec4db51f88401ecf09769511e3c9deb58d721184Tanguy Pruvot else modname++; 29ec4db51f88401ecf09769511e3c9deb58d721184Tanguy Pruvot 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dot = strchr(argv[1], '.'); 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dot) 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dot = '\0'; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj /* Replace "-" with "_". This would keep rmmod 35fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj * compatible with module-init-tools version of 36fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj * rmmod 37fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj */ 38fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj for (i = 0; modname[i] != '\0'; i++) { 39fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj if (modname[i] == '-') 40fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj modname[i] = '_'; 41fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj } 42fc26c0ba59ab1f74251fb95de2ee6837035e74e4Vishal Bhoj 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* pass it to the kernel */ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = delete_module(modname, O_NONBLOCK | O_EXCL); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret != 0) { 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "rmmod: delete_module '%s' failed (errno %d)\n", 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project modname, errno); 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54