chiark / gitweb /
manager: let manager_free() handle NULLs
[elogind.git] / src / core / kmod-setup.c
index 0791ae8eadb6e1065b2fb4f85c2fd213299d2845..fd0a0e06adcdff080d7af7512a216ebb25e4bca8 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"
 
+#ifdef HAVE_KMOD
 static void systemd_kmod_log(
                 void *data,
                 int priority,
@@ -46,14 +50,30 @@ static void systemd_kmod_log(
 
 static bool cmdline_check_kdbus(void) {
         _cleanup_free_ char *line = NULL;
+        const char *p;
+        int r;
 
-        if (proc_cmdline(&line) <= 0)
+        r = proc_cmdline(&line);
+        if (r < 0)
                 return false;
 
-        return strstr(line, "kdbus") != NULL;
+        p = line;
+        for (;;) {
+                _cleanup_free_ char *word = NULL;
+
+                r = unquote_first_word(&p, &word, true);
+                if (r <= 0)
+                        return false;
+
+                if (streq(word, "kdbus"))
+                        return true;
+        }
 }
+#endif
 
 int kmod_setup(void) {
+#ifdef HAVE_KMOD
+
         static const struct {
                 const char *module;
                 const char *path;
@@ -70,12 +90,15 @@ int kmod_setup(void) {
                 { "unix",    "/proc/net/unix",         true, NULL },
 
                 /* IPC is needed before we bring up any other services */
-                { "kdbus",   "/sys/bus/kdbus",         false, cmdline_check_kdbus },
+                { "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;
 
@@ -119,5 +142,6 @@ int kmod_setup(void) {
         if (ctx)
                 kmod_unref(ctx);
 
+#endif
         return 0;
 }