chiark / gitweb /
core: output unit status output strings to console, only if we actually are changing...
[elogind.git] / src / core / kmod-setup.c
index bc3460a698b3e73b41c1ae0e5722933339d7d302..c0a05b97aac87b7bf74fed1993d2517b82fe40bf 100644 (file)
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
+
+#ifdef HAVE_KMOD
 #include <libkmod.h>
+#endif
 
 #include "macro.h"
 #include "execute.h"
-
+#include "capability.h"
 #include "kmod-setup.h"
 
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wformat-nonliteral"
-
+#ifdef HAVE_KMOD
 static void systemd_kmod_log(
                 void *data,
                 int priority,
@@ -42,21 +43,19 @@ static void systemd_kmod_log(
                 va_list args) {
 
         /* library logging is enabled at debug only */
-        log_metav(LOG_DEBUG, file, line, fn, format, args);
+        DISABLE_WARNING_FORMAT_NONLITERAL;
+        log_internalv(LOG_DEBUG, 0, file, line, fn, format, args);
+        REENABLE_WARNING;
 }
 
-#pragma GCC diagnostic pop
-
-static bool kmod_check_cmdline(void) {
-        _cleanup_free_ char *line = NULL;
-
-        if (proc_cmdline(&line) < 0)
-                return false;
-
-        return strstr(line, "kdbus") == 0;
+static bool cmdline_check_kdbus(void) {
+        return get_proc_cmdline_key("kdbus", NULL) > 0;
 }
+#endif
 
 int kmod_setup(void) {
+#ifdef HAVE_KMOD
+
         static const struct {
                 const char *module;
                 const char *path;
@@ -64,28 +63,31 @@ int kmod_setup(void) {
                 bool (*condition_fn)(void);
         } kmod_table[] = {
                 /* auto-loading on use doesn't work before udev is up */
-                { "autofs4", "/sys/class/misc/autofs", true, NULL },
+                { "autofs4", "/sys/class/misc/autofs", true, NULL                 },
 
                 /* early configure of ::1 on the loopback device */
-                { "ipv6",    "/sys/module/ipv6",       true, NULL },
+                { "ipv6",    "/sys/module/ipv6",       true, NULL                 },
 
                 /* this should never be a module */
-                { "unix",    "/proc/net/unix",         true, NULL },
+                { "unix",    "/proc/net/unix",         true, NULL                 },
 
                 /* IPC is needed before we bring up any other services */
-                { "kdbus",   "/sys/bus/kdbus",         false, kmod_check_cmdline },
+                { "kdbus",   "/sys/fs/kdbus",          false, cmdline_check_kdbus },
         };
         struct kmod_ctx *ctx = NULL;
         unsigned int i;
         int r;
 
+        if (have_effective_cap(CAP_SYS_MODULE) == 0)
+                return 0;
+
         for (i = 0; i < ELEMENTSOF(kmod_table); i++) {
                 struct kmod_module *mod;
 
-                if (kmod_table[i].condition_fn && kmod_table[i].condition_fn())
+                if (kmod_table[i].path && access(kmod_table[i].path, F_OK) >= 0)
                         continue;
 
-                if (access(kmod_table[i].path, F_OK) >= 0)
+                if (kmod_table[i].condition_fn && !kmod_table[i].condition_fn())
                         continue;
 
                 if (kmod_table[i].warn)
@@ -113,7 +115,7 @@ int kmod_setup(void) {
                         log_info("Inserted module '%s'", kmod_module_get_name(mod));
                 else if (r == KMOD_PROBE_APPLY_BLACKLIST)
                         log_info("Module '%s' is blacklisted", kmod_module_get_name(mod));
-                else
+                else if (kmod_table[i].warn)
                         log_error("Failed to insert module '%s'", kmod_module_get_name(mod));
 
                 kmod_module_unref(mod);
@@ -122,5 +124,6 @@ int kmod_setup(void) {
         if (ctx)
                 kmod_unref(ctx);
 
+#endif
         return 0;
 }