diff --git a/Makefile b/Makefile index 0f8712e..eb2b462 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ SRC = \ ifeq ($(OS),linux) SRC += \ insmod.c \ + lsmod.c \ rmmod.c endif diff --git a/lsmod.c b/lsmod.c new file mode 100644 index 0000000..fd306bc --- /dev/null +++ b/lsmod.c @@ -0,0 +1,60 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include "util.h" + +static void parse_modline(char *buf, char **name, char **size, + char **refcount, char **users); + +static void +usage(void) +{ + eprintf("usage: %s\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + const char *modfile = "/proc/modules"; + FILE *fp; + char buf[BUFSIZ]; + char *name, *size, *refcount, *users; + size_t len; + + ARGBEGIN { + default: + usage(); + } ARGEND; + + if (argc > 0) + usage(); + + printf("%-23s Size Used by\n", "Module"); + + fp = fopen(modfile, "r"); + if (!fp) + eprintf("fopen %s:", modfile); + while (fgets(buf, sizeof buf, fp)) { + parse_modline(buf, &name, &size, &refcount, &users); + if (!name || !size || !refcount || !users) + enprintf(1, "invalid format: %s\n", modfile); + len = strlen(users) - 1; + if (users[len] == ',' || users[len] == '-') + users[len] = '\0'; + printf("%-20s%8s%3s %s\n", name, size, refcount, + users); + } + fclose(fp); + return 0; +} + +static void +parse_modline(char *buf, char **name, char **size, + char **refcount, char **users) +{ + *name = strtok(buf, " "); + *size = strtok(NULL, " "); + *refcount = strtok(NULL, " "); + *users = strtok(NULL, " "); +}