diff options
author | Tom Gundersen <teg@jklm.no> | 2012-02-08 21:52:18 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-02-09 00:43:05 +0100 |
commit | 728beb28a713709f521d374c9f8f3da781969d26 (patch) | |
tree | bb2ca1fbce2bcac000b909c245faa973d931ef7e | |
parent | 2496985585f8d0febfc578b78d5fb098d545565b (diff) |
kmod-setup: use libkmod rather than modprobe
-rw-r--r-- | Makefile.am | 6 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/kmod-setup.c | 68 |
4 files changed, 47 insertions, 31 deletions
diff --git a/Makefile.am b/Makefile.am index e4e3510ddf..2856fabc75 100644 --- a/Makefile.am +++ b/Makefile.am @@ -728,10 +728,12 @@ systemd_SOURCES = \ systemd_CFLAGS = \ $(AM_CFLAGS) \ $(DBUS_CFLAGS) \ - $(UDEV_CFLAGS) + $(UDEV_CFLAGS) \ + $(KMOD_CFLAGS) systemd_LDADD = \ - libsystemd-core.la + libsystemd-core.la \ + $(KMOD_LIBS) test_engine_SOURCES = \ src/test-engine.c @@ -23,7 +23,7 @@ Features: * if a journal file is corrupt, rotate it and create a new one -* Port systemd-load-modules and setup-kmod.c to libkmod +* Port systemd-load-modules to libkmod * dbus: in fedora, make the machine a symlink to /etc/machine-id diff --git a/configure.ac b/configure.ac index 2d04ee9e6b..d540d95395 100644 --- a/configure.ac +++ b/configure.ac @@ -130,6 +130,8 @@ PKG_CHECK_MODULES(DBUS, [ dbus-1 >= 1.3.2 ]) AC_SUBST(DBUS_CFLAGS) AC_SUBST(DBUS_LIBS) +PKG_CHECK_MODULES(KMOD, [ libkmod >= 5 ]) + have_selinux=no AC_ARG_ENABLE(selinux, AS_HELP_STRING([--disable-selinux], [Disable optional SELINUX support])) if test "x$enable_selinux" != "xno"; then diff --git a/src/kmod-setup.c b/src/kmod-setup.c index 7bd7dcb182..7042de4a2c 100644 --- a/src/kmod-setup.c +++ b/src/kmod-setup.c @@ -23,6 +23,7 @@ #include <unistd.h> #include <string.h> #include <errno.h> +#include <libkmod.h> #include "macro.h" #include "execute.h" @@ -35,13 +36,18 @@ static const char * const kmod_table[] = { "unix", "/proc/net/unix" }; +static void systemd_kmod_log(void *data, int priority, const char *file, int line, + const char *fn, const char *format, va_list args) +{ + log_meta(priority, file, line, fn, format, args); +} + + int kmod_setup(void) { - unsigned i, n = 0; - const char * cmdline[3 + ELEMENTSOF(kmod_table) + 1]; - ExecCommand command; - ExecContext context; - pid_t pid; - int r; + unsigned i; + struct kmod_ctx *ctx = NULL; + struct kmod_module *mod; + int err; for (i = 0; i < ELEMENTSOF(kmod_table); i += 2) { @@ -49,34 +55,40 @@ int kmod_setup(void) { continue; log_debug("Your kernel apparently lacks built-in %s support. Might be a good idea to compile it in. " - "We'll now try to work around this by calling '/sbin/modprobe %s'...", - kmod_table[i], kmod_table[i]); + "We'll now try to work around this by loading the module...", + kmod_table[i]); - cmdline[3 + n++] = kmod_table[i]; - } + if (!ctx) { + ctx = kmod_new(NULL, NULL); + if (!ctx) { + log_error("Failed to allocate memory for kmod"); + return -ENOMEM; + } - if (n <= 0) - return 0; + kmod_set_log_fn(ctx, systemd_kmod_log, NULL); - cmdline[0] = "/sbin/modprobe"; - cmdline[1] = "-qab"; - cmdline[2] = "--"; - cmdline[3 + n] = NULL; + kmod_load_resources(ctx); + } - zero(command); - zero(context); - - command.path = (char*) cmdline[0]; - command.argv = (char**) cmdline; + err = kmod_module_new_from_name(ctx, kmod_table[i], &mod); + if (err < 0) { + log_error("Failed to load module '%s'", kmod_table[i]); + continue; + } - exec_context_init(&context); - r = exec_spawn(&command, NULL, &context, NULL, 0, NULL, false, false, false, false, NULL, NULL, &pid); - exec_context_done(&context); + err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST, NULL, NULL, NULL, NULL); + if (err == 0) + log_info("Inserted module '%s'", kmod_module_get_name(mod)); + else if (err == KMOD_PROBE_APPLY_BLACKLIST) + log_info("Module '%s' is blacklisted", kmod_module_get_name(mod)); + else + log_error("Failed to insert '%s'", kmod_module_get_name(mod)); - if (r < 0) { - log_error("Failed to spawn %s: %s", cmdline[0], strerror(-r)); - return r; + kmod_module_unref(mod); } - return wait_for_terminate_and_warn(cmdline[0], pid); + if (ctx) + ctx = kmod_unref(ctx); + + return 0; } |