chiark / gitweb /
kmod-setup: add conditional module loading callback
[elogind.git] / src / core / kmod-setup.c
index debf87130db4c1a877797944292a120b6d2cff9d..383a6b22be72f4ca6c793d3b63b78473884f3efc 100644 (file)
@@ -6,16 +6,16 @@
   Copyright 2010 Lennart Poettering
 
   systemd is free software; you can redistribute it and/or modify it
-  under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
+  under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
   (at your option) any later version.
 
   systemd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
+  Lesser General Public License for more details.
 
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with systemd; If not, see <http://www.gnu.org/licenses/>.
 ***/
 
 
 #include "kmod-setup.h"
 
-static const char * const kmod_table[] = {
-        "autofs4", "/sys/class/misc/autofs",
-        "ipv6",    "/sys/module/ipv6",
-        "unix",    "/proc/net/unix"
+typedef struct Kmodule {
+        const char *name;
+        const char *directory;
+        bool (*condition_fn)(void);
+} KModule;
+
+static const KModule kmod_table[] = {
+        { "autofs4",  "/sys/class/misc/autofs",    NULL } ,
+        { "ipv6",     "/sys/module/ipv6",          NULL },
+        { "efivarfs", "/sys/firmware/efi/efivars", NULL },
+        { "unix",     "/proc/net/unix",            NULL } ,
 };
 
 #pragma GCC diagnostic push
@@ -41,7 +48,8 @@ static const char * const kmod_table[] = {
 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);
+        /* library logging is enabled at debug only */
+        log_metav(LOG_DEBUG, file, line, fn, format, args);
 }
 #pragma GCC diagnostic pop
 
@@ -52,13 +60,15 @@ int kmod_setup(void) {
         int err;
 
         for (i = 0; i < ELEMENTSOF(kmod_table); i += 2) {
+                if (kmod_table[i].condition_fn && !kmod_table[i].condition_fn())
+                        continue;
 
-                if (access(kmod_table[i+1], F_OK) >= 0)
+                if (access(kmod_table[i].directory, F_OK) >= 0)
                         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 loading the module...",
-                          kmod_table[i]);
+                          kmod_table[i].name);
 
                 if (!ctx) {
                         ctx = kmod_new(NULL, NULL);
@@ -68,13 +78,12 @@ int kmod_setup(void) {
                         }
 
                         kmod_set_log_fn(ctx, systemd_kmod_log, NULL);
-
                         kmod_load_resources(ctx);
                 }
 
-                err = kmod_module_new_from_name(ctx, kmod_table[i], &mod);
+                err = kmod_module_new_from_name(ctx, kmod_table[i].name, &mod);
                 if (err < 0) {
-                        log_error("Failed to load module '%s'", kmod_table[i]);
+                        log_error("Failed to lookup module '%s'", kmod_table[i].name);
                         continue;
                 }
 
@@ -84,7 +93,7 @@ int kmod_setup(void) {
                 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));
+                        log_error("Failed to insert module '%s'", kmod_module_get_name(mod));
 
                 kmod_module_unref(mod);
         }