X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=lsmod.c;h=76ed2fdd8f0ea2d999e3be9d1f0f69103933beee;hb=63ae66198d3f2d51d077a8fbcdaf1e5fe80a210f;hp=c97d199a69e40d262cd86011ac05cc9b52998dc8;hpb=cbe31dace5fb24304694d399b9eb267fbe752516;p=oweals%2Fbusybox.git diff --git a/lsmod.c b/lsmod.c index c97d199a6..76ed2fdd8 100644 --- a/lsmod.c +++ b/lsmod.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -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"); }