X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=lsmod.c;h=76ed2fdd8f0ea2d999e3be9d1f0f69103933beee;hb=ed424dbf1d3d4f0448b9bfdc6b6128d4c90514ee;hp=41575585fcd13f395b70abbd05b7e1c48b0d9bb6;hpb=f5d5e77321ad32b3952dcdf21d14fd0ef3d4c1a9;p=oweals%2Fbusybox.git diff --git a/lsmod.c b/lsmod.c index 41575585f..76ed2fdd8 100644 --- a/lsmod.c +++ b/lsmod.c @@ -2,7 +2,7 @@ /* * Mini lsmod implementation for busybox * - * Copyright (C) 1999,2000 by Lineo, inc. + * Copyright (C) 1999,2000,2001 by Lineo, inc. * Written by Erik Andersen , * * Modified by Alcove, Julien Gaulmin and @@ -25,9 +25,9 @@ * */ -#include "busybox.h" #include #include +#include #include #include #include @@ -37,6 +37,7 @@ #include #include #include +#include "busybox.h" @@ -51,8 +52,7 @@ struct module_info }; -int query_module(const char *name, int which, void *buf, size_t bufsize, - size_t *ret); +int query_module(const char *name, int which, void *buf, size_t bufsize, size_t *ret); /* Values for query_module's which. */ static const int QM_MODULES = 1; @@ -69,19 +69,36 @@ 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; char *module_names, *mn, *deps, *dn; - size_t bufsize, nmod, count, i, j; + size_t bufsize, depsize, nmod, count, i, j; module_names = xmalloc(bufsize = 256); - deps = xmalloc(bufsize); - if (query_module(NULL, QM_MODULES, module_names, bufsize, &nmod)) { + if (my_query_module(NULL, QM_MODULES, (void **)&module_names, &bufsize, + &nmod)) { perror_msg_and_die("QM_MODULES"); } + deps = xmalloc(depsize = 256); printf("Module Size Used by\n"); for (i = 0, mn = module_names; i < nmod; mn += strlen(mn) + 1, i++) { if (query_module(mn, QM_INFO, &info, sizeof(info), &count)) { @@ -92,23 +109,14 @@ extern int lsmod_main(int argc, char **argv) /* else choke */ perror_msg_and_die("module %s: QM_INFO", mn); } - while (query_module(mn, QM_REFS, deps, bufsize, &count)) { + if (my_query_module(mn, QM_REFS, (void **)&deps, &depsize, &count)) { if (errno == ENOENT) { /* The module was removed out from underneath us. */ continue; } - if (errno != ENOSPC) { - error_msg_and_die("module %s: QM_REFS", mn); - } - deps = xrealloc(deps, bufsize = count); + perror_msg_and_die("module %s: QM_REFS", mn); } printf("%-20s%8lu%4ld ", mn, info.size, info.usecount); - 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("] "); - if (info.flags & NEW_MOD_DELETED) printf("(deleted)"); else if (info.flags & NEW_MOD_INITIALIZING) @@ -121,6 +129,12 @@ extern int lsmod_main(int argc, char **argv) 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"); } @@ -130,10 +144,6 @@ extern int lsmod_main(int argc, char **argv) #else /*BB_FEATURE_OLD_MODULE_INTERFACE*/ -#if ! defined BB_FEATURE_USE_PROCFS -#error Sorry, I depend on the /proc filesystem right now. -#endif - extern int lsmod_main(int argc, char **argv) { int fd, i;