rmmod.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
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{ 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 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]; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dot = strchr(argv[1], '.'); 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (dot) 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dot = '\0'; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project /* pass it to the kernel */ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = delete_module(modname, O_NONBLOCK | O_EXCL); 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret != 0) { 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "rmmod: delete_module '%s' failed (errno %d)\n", 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project modname, errno); 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 43