]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/kmod-setup.c
systemd-sleep: it is not an error if the config file is missing
[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
22#include <sys/wait.h>
23#include <unistd.h>
24#include <string.h>
25#include <errno.h>
728beb28 26#include <libkmod.h>
11c3a4ee
LP
27
28#include "macro.h"
29#include "execute.h"
30
31#include "kmod-setup.h"
32
10223732
KS
33typedef struct Kmodule {
34 const char *name;
35 const char *directory;
36 bool (*condition_fn)(void);
37} KModule;
38
39static const KModule kmod_table[] = {
40 { "autofs4", "/sys/class/misc/autofs", NULL } ,
41 { "ipv6", "/sys/module/ipv6", NULL },
10223732 42 { "unix", "/proc/net/unix", NULL } ,
11c3a4ee
LP
43};
44
cdb454f2
LP
45#pragma GCC diagnostic push
46#pragma GCC diagnostic ignored "-Wformat-nonliteral"
728beb28
TG
47static void systemd_kmod_log(void *data, int priority, const char *file, int line,
48 const char *fn, const char *format, va_list args)
49{
10223732
KS
50 /* library logging is enabled at debug only */
51 log_metav(LOG_DEBUG, file, line, fn, format, args);
728beb28 52}
cdb454f2 53#pragma GCC diagnostic pop
728beb28 54
11c3a4ee 55int kmod_setup(void) {
728beb28
TG
56 unsigned i;
57 struct kmod_ctx *ctx = NULL;
58 struct kmod_module *mod;
59 int err;
11c3a4ee
LP
60
61 for (i = 0; i < ELEMENTSOF(kmod_table); i += 2) {
10223732
KS
62 if (kmod_table[i].condition_fn && !kmod_table[i].condition_fn())
63 continue;
11c3a4ee 64
10223732 65 if (access(kmod_table[i].directory, F_OK) >= 0)
11c3a4ee
LP
66 continue;
67
be11c12e 68 log_debug("Your kernel apparently lacks built-in %s support. Might be a good idea to compile it in. "
728beb28 69 "We'll now try to work around this by loading the module...",
10223732 70 kmod_table[i].name);
11c3a4ee 71
728beb28
TG
72 if (!ctx) {
73 ctx = kmod_new(NULL, NULL);
74 if (!ctx) {
75 log_error("Failed to allocate memory for kmod");
76 return -ENOMEM;
77 }
11c3a4ee 78
728beb28 79 kmod_set_log_fn(ctx, systemd_kmod_log, NULL);
728beb28
TG
80 kmod_load_resources(ctx);
81 }
11c3a4ee 82
10223732 83 err = kmod_module_new_from_name(ctx, kmod_table[i].name, &mod);
728beb28 84 if (err < 0) {
10223732 85 log_error("Failed to lookup module '%s'", kmod_table[i].name);
728beb28
TG
86 continue;
87 }
11c3a4ee 88
728beb28
TG
89 err = kmod_module_probe_insert_module(mod, KMOD_PROBE_APPLY_BLACKLIST, NULL, NULL, NULL, NULL);
90 if (err == 0)
91 log_info("Inserted module '%s'", kmod_module_get_name(mod));
92 else if (err == KMOD_PROBE_APPLY_BLACKLIST)
93 log_info("Module '%s' is blacklisted", kmod_module_get_name(mod));
94 else
10223732 95 log_error("Failed to insert module '%s'", kmod_module_get_name(mod));
11c3a4ee 96
728beb28 97 kmod_module_unref(mod);
11c3a4ee
LP
98 }
99
728beb28 100 if (ctx)
34a35ece 101 kmod_unref(ctx);
728beb28
TG
102
103 return 0;
11c3a4ee 104}