]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/kmod-setup.c
Update TODO
[thirdparty/systemd.git] / src / core / kmod-setup.c
CommitLineData
d6c9574f 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
11c3a4ee
LP
2
3/***
4 This file is part of systemd.
5
6 Copyright 2010 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11c3a4ee
LP
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 16 Lesser General Public License for more details.
11c3a4ee 17
5430f7f2 18 You should have received a copy of the GNU Lesser General Public License
11c3a4ee
LP
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
11c3a4ee
LP
22#include <unistd.h>
23#include <string.h>
f84f9974
LP
24
25#ifdef HAVE_KMOD
728beb28 26#include <libkmod.h>
f84f9974 27#endif
11c3a4ee
LP
28
29#include "macro.h"
c47fc1f0 30#include "capability.h"
11c3a4ee
LP
31#include "kmod-setup.h"
32
f84f9974 33#ifdef HAVE_KMOD
b4b87964
LP
34static void systemd_kmod_log(
35 void *data,
36 int priority,
37 const char *file, int line,
38 const char *fn,
39 const char *format,
40 va_list args) {
41
10223732 42 /* library logging is enabled at debug only */
bcfce235 43 DISABLE_WARNING_FORMAT_NONLITERAL;
79008bdd 44 log_internalv(LOG_DEBUG, 0, file, line, fn, format, args);
bcfce235 45 REENABLE_WARNING;
728beb28 46}
b4b87964 47
b43b8f7a 48static bool cmdline_check_kdbus(void) {
3da44ef5 49 return get_proc_cmdline_key("kdbus", NULL) > 0;
7491e6e7 50}
f84f9974 51#endif
b4b87964 52
7491e6e7 53int kmod_setup(void) {
f84f9974 54#ifdef HAVE_KMOD
c47fc1f0 55
7491e6e7
KS
56 static const struct {
57 const char *module;
58 const char *path;
59 bool warn;
60 bool (*condition_fn)(void);
61 } kmod_table[] = {
62 /* auto-loading on use doesn't work before udev is up */
68d4c452 63 { "autofs4", "/sys/class/misc/autofs", true, NULL },
7491e6e7
KS
64
65 /* early configure of ::1 on the loopback device */
68d4c452 66 { "ipv6", "/sys/module/ipv6", true, NULL },
7491e6e7
KS
67
68 /* this should never be a module */
68d4c452 69 { "unix", "/proc/net/unix", true, NULL },
7491e6e7
KS
70
71 /* IPC is needed before we bring up any other services */
63cc4c31 72 { "kdbus", "/sys/fs/kdbus", false, cmdline_check_kdbus },
7491e6e7 73 };
728beb28 74 struct kmod_ctx *ctx = NULL;
7491e6e7 75 unsigned int i;
b4b87964 76 int r;
11c3a4ee 77
c47fc1f0
LP
78 if (have_effective_cap(CAP_SYS_MODULE) == 0)
79 return 0;
80
7491e6e7 81 for (i = 0; i < ELEMENTSOF(kmod_table); i++) {
b4b87964 82 struct kmod_module *mod;
11c3a4ee 83
b43b8f7a 84 if (kmod_table[i].path && access(kmod_table[i].path, F_OK) >= 0)
7491e6e7
KS
85 continue;
86
b43b8f7a 87 if (kmod_table[i].condition_fn && !kmod_table[i].condition_fn())
11c3a4ee
LP
88 continue;
89
7491e6e7
KS
90 if (kmod_table[i].warn)
91 log_debug("Your kernel apparently lacks built-in %s support. Might be "
92 "a good idea to compile it in. We'll now try to work around "
93 "this by loading the module...", kmod_table[i].module);
11c3a4ee 94
728beb28
TG
95 if (!ctx) {
96 ctx = kmod_new(NULL, NULL);
b4b87964
LP
97 if (!ctx)
98 return log_oom();
11c3a4ee 99
728beb28 100 kmod_set_log_fn(ctx, systemd_kmod_log, NULL);
728beb28
TG
101 kmod_load_resources(ctx);
102 }
11c3a4ee 103
7491e6e7 104 r = kmod_module_new_from_name(ctx, kmod_table[i].module, &mod);
b4b87964 105 if (r < 0) {
7491e6e7 106 log_error("Failed to lookup module '%s'", kmod_table[i].module);
728beb28
TG
107 continue;
108 }
11c3a4ee 109
b4b87964
LP
110 r = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST, NULL, NULL, NULL, NULL);
111 if (r == 0)
728beb28 112 log_info("Inserted module '%s'", kmod_module_get_name(mod));
b4b87964 113 else if (r == KMOD_PROBE_APPLY_BLACKLIST)
728beb28 114 log_info("Module '%s' is blacklisted", kmod_module_get_name(mod));
b43b8f7a 115 else if (kmod_table[i].warn)
10223732 116 log_error("Failed to insert module '%s'", kmod_module_get_name(mod));
11c3a4ee 117
728beb28 118 kmod_module_unref(mod);
11c3a4ee
LP
119 }
120
728beb28 121 if (ctx)
34a35ece 122 kmod_unref(ctx);
728beb28 123
f84f9974 124#endif
728beb28 125 return 0;
11c3a4ee 126}