lsmod - Show the status of modules in the Linux Kernel
# SYNOPSIS
-*lsmod*
+
+*lsmod* [_OPTIONS_]
# DESCRIPTION
*lsmod* is a trivial program which nicely formats the contents of the
/proc/modules, showing what kernel modules are currently loaded.
+# OPTIONS
+
+*-s*
+*--syslog*
+ Send errors to syslog instead of standard error.
+
+*-v*
+*--verbose*
+ Print messages about what the program is doing. Usually *lsmod* prints
+ messages only if something goes wrong.
+
+*-V*
+*--version*
+ Show version of program and exit.
+
+*-h*
+*--help*
+ Print the help message and exit.
+
# COPYRIGHT
This manual page originally Copyright 2002, Rusty Russell, IBM Corporation.
*/
#include <errno.h>
+#include <getopt.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include "kmod.h"
+static const char cmdopts_s[] = "svVh";
+static const struct option cmdopts[] = {
+ // clang-format off
+ { "syslog", no_argument, 0, 's' },
+ { "verbose", no_argument, 0, 'v' },
+ { "version", no_argument, 0, 'V' },
+ { "help", no_argument, 0, 'h' },
+ { NULL, 0, 0, 0 },
+ // clang-format on
+};
+
+static void help(void)
+{
+ printf("Usage:\n"
+ "\t%s [options]\n"
+ "Options:\n"
+ "\t-s, --syslog print to syslog, not stderr\n"
+ "\t-v, --verbose enables more messages\n"
+ "\t-V, --version show version\n"
+ "\t-h, --help show this help\n",
+ program_invocation_short_name);
+}
+
static int do_lsmod(int argc, char *argv[])
{
- struct kmod_ctx *ctx;
+ struct kmod_ctx *ctx = NULL;
const char *null_config = NULL;
struct kmod_list *list, *itr;
- int err;
+ int verbose = LOG_ERR;
+ int use_syslog;
+ int err, r = 0;
- if (argc != 1) {
- fprintf(stderr, "Usage: %s\n", argv[0]);
- return EXIT_FAILURE;
+ for (;;) {
+ int c, idx = 0;
+ c = getopt_long(argc, argv, cmdopts_s, cmdopts, &idx);
+ if (c == -1)
+ break;
+ switch (c) {
+ case 's':
+ use_syslog = 1;
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'h':
+ help();
+ return EXIT_SUCCESS;
+ case 'V':
+ kmod_version();
+ return EXIT_SUCCESS;
+ case '?':
+ return EXIT_FAILURE;
+ default:
+ ERR("unexpected getopt_long() value '%c'.\n", c);
+ return EXIT_FAILURE;
+ }
+ }
+
+ log_open(use_syslog);
+
+ if (optind < argc) {
+ ERR("too many arguments provided.\n");
+ r = EXIT_FAILURE;
+ goto done;
}
ctx = kmod_new(NULL, &null_config);
- if (ctx == NULL) {
- fputs("Error: kmod_new() failed!\n", stderr);
- return EXIT_FAILURE;
+ if (!ctx) {
+ ERR("kmod_new() failed!\n");
+ r = EXIT_FAILURE;
+ goto done;
}
+ log_setup_kmod_log(ctx, verbose);
+
err = kmod_module_new_from_loaded(ctx, &list);
if (err < 0) {
- fprintf(stderr, "Error: could not get list of modules: %s\n",
- strerror(-err));
- kmod_unref(ctx);
- return EXIT_FAILURE;
+ ERR("could not get list of modules: %s\n", strerror(-err));
+ r = EXIT_FAILURE;
+ goto done;
}
puts("Module Size Used by");
kmod_module_unref(mod);
}
kmod_module_unref_list(list);
+
+done:
kmod_unref(ctx);
+ log_close();
- return EXIT_SUCCESS;
+ return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
const struct kmod_cmd kmod_cmd_compat_lsmod = {