diff options
Diffstat (limited to 'modutils')
-rw-r--r-- | modutils/lsmod.c | 17 | ||||
-rw-r--r-- | modutils/rmmod.c | 20 |
2 files changed, 18 insertions, 19 deletions
diff --git a/modutils/lsmod.c b/modutils/lsmod.c index d51da2d..0d5ac75 100644 --- a/modutils/lsmod.c +++ b/modutils/lsmod.c @@ -98,23 +98,6 @@ static const int NEW_MOD_VISITED = 8; static const int NEW_MOD_USED_ONCE = 16; static const int NEW_MOD_INITIALIZING = 64; -static int my_query_module(const char *name, int which, void **buf, - size_t *bufsize, size_t *ret) -{ - int my_ret; - - my_ret = query_module(name, which, *buf, *bufsize, ret); - - if (my_ret == -1 && errno == ENOSPC) { - *buf = xrealloc(*buf, *ret); - *bufsize = *ret; - - my_ret = query_module(name, which, *buf, *bufsize, ret); - } - - return my_ret; -} - extern int lsmod_main(int argc, char **argv) { struct module_info info; diff --git a/modutils/rmmod.c b/modutils/rmmod.c index affe975..0103d91 100644 --- a/modutils/rmmod.c +++ b/modutils/rmmod.c @@ -34,14 +34,30 @@ extern int delete_module(const char * name); 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; /* Parse command line. */ while ((n = getopt(argc, argv, "a")) != EOF) { switch (n) { case 'a': /* Unload _all_ unused modules via NULL delete_module() call */ - if (delete_module(NULL)) - perror_msg_and_die("rmmod"); + /* until the number of modules does not change */ + buf = xmalloc(bufsize = 256); + while (nmod != pnmod) { + if (delete_module(NULL)) + perror_msg_and_die("rmmod"); + pnmod = nmod; + /* 1 == QM_MODULES */ + if (my_query_module(NULL, 1, &buf, &bufsize, &nmod)) { + perror_msg_and_die("QM_MODULES"); + } + } +#ifdef CONFIG_FEATURE_CLEAN_UP + free(buf); +#endif return EXIT_SUCCESS; default: show_usage(); |