int lsmod_main(int argc, char **argv) { struct module_info info; char *module_names, *mn, *deps, *dn; size_t bufsize, depsize, nmod, count, i, j; module_names = xmalloc(bufsize = 256); if (my_query_module(NULL, QM_MODULES, (void **)&module_names, &bufsize, &nmod)) { bb_perror_msg_and_die("QM_MODULES"); } deps = xmalloc(depsize = 256); printf("Module Size Used by"); check_tainted(); for (i = 0, mn = module_names; i < nmod; mn += strlen(mn) + 1, i++) { if (query_module(mn, QM_INFO, &info, sizeof(info), &count)) { if (errno == ENOENT) { /* The module was removed out from underneath us. */ continue; } /* else choke */ bb_perror_msg_and_die("module %s: QM_INFO", mn); } if (my_query_module(mn, QM_REFS, (void **)&deps, &depsize, &count)) { if (errno == ENOENT) { /* The module was removed out from underneath us. */ continue; } bb_perror_msg_and_die("module %s: QM_REFS", mn); } printf("%-20s%8lu%4ld", mn, info.size, info.usecount); if (info.flags & NEW_MOD_DELETED) printf(" (deleted)"); else if (info.flags & NEW_MOD_INITIALIZING) printf(" (initializing)"); else if (!(info.flags & NEW_MOD_RUNNING)) printf(" (uninitialized)"); else { if (info.flags & NEW_MOD_AUTOCLEAN) printf(" (autoclean) "); if (!(info.flags & NEW_MOD_USED_ONCE)) printf(" (unused)"); } if (count) printf(" ["); for (j = 0, dn = deps; j < count; dn += strlen(dn) + 1, j++) { printf("%s%s", dn, (j==count-1)? "":" "); } if (count) printf("]"); printf("\n"); } #ifdef CONFIG_FEATURE_CLEAN_UP free(module_names); #endif return( 0); }
extern int rmmod_main(int argc, char **argv) { int n, ret = EXIT_SUCCESS; size_t nmod = 0; /* number of modules */ size_t pnmod = -1; /* previous number of modules */ void *buf; /* hold the module names which we ignore but must get */ size_t bufsize = 0; unsigned int flags = O_NONBLOCK|O_EXCL; /* Parse command line. */ while ((n = getopt(argc, argv, "a")) != EOF) { switch (n) { case 'w': // --wait flags &= ~O_NONBLOCK; break; case 'f': // --force flags |= O_TRUNC; break; case 'a': /* Unload _all_ unused modules via NULL delete_module() call */ /* until the number of modules does not change */ buf = xmalloc(bufsize = 256); while (nmod != pnmod) { if (delete_module(NULL)) bb_perror_msg_and_die("rmmod"); pnmod = nmod; /* 1 == QM_MODULES */ if (my_query_module(NULL, 1, &buf, &bufsize, &nmod)) { bb_perror_msg_and_die("QM_MODULES"); } } #ifdef CONFIG_FEATURE_CLEAN_UP free(buf); #endif return EXIT_SUCCESS; default: bb_show_usage(); } } 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; } } return(ret); }
extern int rmmod_main(int argc, char **argv) { int n, ret = EXIT_SUCCESS; unsigned int flags = O_NONBLOCK|O_EXCL; #ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE /* bb_common_bufsiz1 hold the module names which we ignore but must get */ size_t bufsize = sizeof(bb_common_bufsiz1); #endif /* Parse command line. */ n = bb_getopt_ulflags(argc, argv, "wfa"); if((n & 1)) // --wait flags &= ~O_NONBLOCK; if((n & 2)) // --force flags |= O_TRUNC; if((n & 4)) { /* Unload _all_ unused modules via NULL delete_module() call */ /* until the number of modules does not change */ size_t nmod = 0; /* number of modules */ size_t pnmod = -1; /* previous number of modules */ while (nmod != pnmod) { if (syscall(__NR_delete_module, NULL, flags) != 0) { if (errno==EFAULT) return(ret); bb_perror_msg_and_die("rmmod"); } pnmod = nmod; #ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE /* 1 == QM_MODULES */ if (my_query_module(NULL, 1, &bb_common_bufsiz1, &bufsize, &nmod)) { bb_perror_msg_and_die("QM_MODULES"); } #endif } return EXIT_SUCCESS; } if (optind == argc) bb_show_usage(); for (n = optind; n < argc; n++) { #ifdef CONFIG_FEATURE_2_6_MODULES const char *afterslash; char *module_name; afterslash = strrchr(argv[n], '/'); if (!afterslash) afterslash = argv[n]; else afterslash++; module_name = alloca(strlen(afterslash) + 1); filename2modname(module_name, afterslash); #else #define module_name argv[n] #endif if (syscall(__NR_delete_module, module_name, flags) != 0) { bb_perror_msg("%s", argv[n]); ret = EXIT_FAILURE; } } return(ret); }