blob: f9e33c6cde90d713abb071c334100472c445ab18 [file] [log] [blame]
Lucas De Marchi586fc302011-11-21 14:35:35 -02001/*
2 * libkmod - interface to kernel module operations
3 *
Lucas De Marchie6b0e492013-01-16 11:27:21 -02004 * Copyright (C) 2011-2013 ProFUSION embedded systems
Lucas De Marchi586fc302011-11-21 14:35:35 -02005 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
Lucas De Marchicb451f32011-12-12 18:24:35 -02008 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
Lucas De Marchi586fc302011-11-21 14:35:35 -020010 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
Lucas De Marchidea2dfe2014-12-25 23:32:03 -020017 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
Lucas De Marchi586fc302011-11-21 14:35:35 -020018 */
19
Lucas De Marchie8fd8fe2012-07-18 10:19:48 -030020#pragma once
Lucas De Marchi6ad98302011-11-23 15:24:34 -020021#ifndef _LIBKMOD_H_
22#define _LIBKMOD_H_
Lucas De Marchi586fc302011-11-21 14:35:35 -020023
Lucas De Marchi6806a042011-11-23 16:10:58 -020024#include <fcntl.h>
Lucas De Marchi586fc302011-11-21 14:35:35 -020025#include <stdarg.h>
Lucas De Marchi00178622012-01-13 02:24:18 -020026#include <stdbool.h>
Lucas De Marchi53697972011-11-22 05:42:09 -020027#include <inttypes.h>
Lucas De Marchi586fc302011-11-21 14:35:35 -020028
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/*
34 * kmod_ctx
35 *
36 * library user context - reads the config and system
37 * environment, user variables, allows custom logging
38 */
39struct kmod_ctx;
Lucas De Marchi6a829212012-01-09 03:08:26 -020040struct kmod_ctx *kmod_new(const char *dirname, const char * const *config_paths);
Lucas De Marchi586fc302011-11-21 14:35:35 -020041struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx);
42struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx);
Lucas De Marchi586fc302011-11-21 14:35:35 -020043void kmod_set_log_fn(struct kmod_ctx *ctx,
Gustavo Sverzut Barbieri1bdd9512011-12-08 13:47:55 -020044 void (*log_fn)(void *log_data,
Lucas De Marchi9226dda2012-01-31 17:23:35 -020045 int priority, const char *file, int line,
46 const char *fn, const char *format,
47 va_list args),
Gustavo Sverzut Barbieri1bdd9512011-12-08 13:47:55 -020048 const void *data);
Lucas De Marchi6d177552011-11-23 11:52:30 -020049int kmod_get_log_priority(const struct kmod_ctx *ctx);
Lucas De Marchi586fc302011-11-21 14:35:35 -020050void kmod_set_log_priority(struct kmod_ctx *ctx, int priority);
Lucas De Marchi6d177552011-11-23 11:52:30 -020051void *kmod_get_userdata(const struct kmod_ctx *ctx);
Gustavo Sverzut Barbieri1ce08a52011-12-02 20:24:07 -020052void kmod_set_userdata(struct kmod_ctx *ctx, const void *userdata);
Lucas De Marchi9226dda2012-01-31 17:23:35 -020053
Laura Abbottb87d01d2015-09-28 15:39:11 -070054const char *kmod_get_dirname(const struct kmod_ctx *ctx);
Lucas De Marchi9226dda2012-01-31 17:23:35 -020055
56/*
57 * Management of libkmod's resources
58 */
Lucas De Marchi33bb69b2011-12-08 14:59:51 -020059int kmod_load_resources(struct kmod_ctx *ctx);
60void kmod_unload_resources(struct kmod_ctx *ctx);
Lucas De Marchi586fc302011-11-21 14:35:35 -020061
Lucas De Marchic4dc3ca2011-12-31 19:28:31 -020062enum kmod_resources {
63 KMOD_RESOURCES_OK = 0,
64 KMOD_RESOURCES_MUST_RELOAD = 1,
65 KMOD_RESOURCES_MUST_RECREATE = 2,
66};
Lucas De Marchic4dc3ca2011-12-31 19:28:31 -020067int kmod_validate_resources(struct kmod_ctx *ctx);
68
Lucas De Marchib08314f2012-01-16 12:01:48 -020069enum kmod_index {
70 KMOD_INDEX_MODULES_DEP = 0,
71 KMOD_INDEX_MODULES_ALIAS,
72 KMOD_INDEX_MODULES_SYMBOL,
Lucas De Marchi38052742012-02-16 20:43:16 -020073 KMOD_INDEX_MODULES_BUILTIN,
Lucas De Marchib08314f2012-01-16 12:01:48 -020074 /* Padding to make sure enum is not mapped to char */
75 _KMOD_INDEX_PAD = (1 << 31),
76};
Lucas De Marchi02244822012-01-16 16:43:47 -020077int kmod_dump_index(struct kmod_ctx *ctx, enum kmod_index type, int fd);
Lucas De Marchi758428a2012-01-16 15:56:17 -020078
Lucas De Marchi586fc302011-11-21 14:35:35 -020079/*
80 * kmod_list
81 *
82 * access to kmod generated lists
83 */
Lucas De Marchi6924e472011-11-22 05:38:28 -020084struct kmod_list;
Lucas De Marchi6a829212012-01-09 03:08:26 -020085struct kmod_list *kmod_list_next(const struct kmod_list *list,
86 const struct kmod_list *curr);
87struct kmod_list *kmod_list_prev(const struct kmod_list *list,
88 const struct kmod_list *curr);
89struct kmod_list *kmod_list_last(const struct kmod_list *list);
Gustavo Sverzut Barbierid5ec60b2011-12-16 22:32:33 -020090
Lucas De Marchi6924e472011-11-22 05:38:28 -020091#define kmod_list_foreach(list_entry, first_entry) \
Lucas De Marchi586fc302011-11-21 14:35:35 -020092 for (list_entry = first_entry; \
Lucas De Marchie4351b02011-11-21 14:59:23 -020093 list_entry != NULL; \
Lucas De Marchi6924e472011-11-22 05:38:28 -020094 list_entry = kmod_list_next(first_entry, list_entry))
Lucas De Marchi586fc302011-11-21 14:35:35 -020095
Gustavo Sverzut Barbierid6b55b72011-12-16 22:33:08 -020096#define kmod_list_foreach_reverse(list_entry, first_entry) \
97 for (list_entry = kmod_list_last(first_entry); \
98 list_entry != NULL; \
99 list_entry = kmod_list_prev(first_entry, list_entry))
100
Lucas De Marchi00178622012-01-13 02:24:18 -0200101/*
102 * kmod_config_iter
103 *
104 * access to configuration lists - it allows to get each configuration's
105 * key/value stored by kmod
106 */
107struct kmod_config_iter;
108struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx);
109struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx);
110struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx);
111struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx);
112struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx);
113struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx);
114const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter);
115const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter);
116bool kmod_config_iter_next(struct kmod_config_iter *iter);
117void kmod_config_iter_free_iter(struct kmod_config_iter *iter);
118
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200119/*
120 * kmod_module
121 *
122 * Operate on kernel modules
123 */
124struct kmod_module;
125int kmod_module_new_from_name(struct kmod_ctx *ctx, const char *name,
126 struct kmod_module **mod);
127int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path,
128 struct kmod_module **mod);
129int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *given_alias,
130 struct kmod_list **list);
131int kmod_module_new_from_loaded(struct kmod_ctx *ctx,
132 struct kmod_list **list);
133
134struct kmod_module *kmod_module_ref(struct kmod_module *mod);
135struct kmod_module *kmod_module_unref(struct kmod_module *mod);
136int kmod_module_unref_list(struct kmod_list *list);
137struct kmod_module *kmod_module_get_module(const struct kmod_list *entry);
138
139
Lucas De Marchif39dc702011-12-20 19:31:14 -0200140/* Removal flags */
Lucas De Marchi423f8562011-11-24 15:42:16 -0200141enum kmod_remove {
Lucas De Marchi6806a042011-11-23 16:10:58 -0200142 KMOD_REMOVE_FORCE = O_TRUNC,
Lucas De Marchi7ab88042013-09-20 01:30:07 -0500143 KMOD_REMOVE_NOWAIT = O_NONBLOCK, /* always set */
Lucas De Marchi6806a042011-11-23 16:10:58 -0200144};
145
Lucas De Marchif39dc702011-12-20 19:31:14 -0200146/* Insertion flags */
Lucas De Marchi8f788d52011-11-25 01:22:56 -0200147enum kmod_insert {
148 KMOD_INSERT_FORCE_VERMAGIC = 0x1,
149 KMOD_INSERT_FORCE_MODVERSION = 0x2,
Lucas De Marchi8f788d52011-11-25 01:22:56 -0200150};
151
Lucas De Marchiddbda022011-12-27 11:40:10 -0200152/* Flags to kmod_module_probe_insert_module() */
153enum kmod_probe {
Lucas De Marchid851e9a2012-01-30 16:37:57 -0200154 KMOD_PROBE_FORCE_VERMAGIC = 0x00001,
155 KMOD_PROBE_FORCE_MODVERSION = 0x00002,
156 KMOD_PROBE_IGNORE_COMMAND = 0x00004,
Lucas De Marchi7c10c692012-01-30 18:54:45 -0200157 KMOD_PROBE_IGNORE_LOADED = 0x00008,
Lucas De Marchi4c1ffb72012-01-30 19:00:58 -0200158 KMOD_PROBE_DRY_RUN = 0x00010,
Lucas De Marchi814a57b2012-02-06 12:46:39 -0200159 KMOD_PROBE_FAIL_ON_LOADED = 0x00020,
Lucas De Marchib1a51252012-01-29 01:49:09 -0200160
161 /* codes below can be used in return value, too */
Lucas De Marchid851e9a2012-01-30 16:37:57 -0200162 KMOD_PROBE_APPLY_BLACKLIST_ALL = 0x10000,
163 KMOD_PROBE_APPLY_BLACKLIST = 0x20000,
Lucas De Marchi68820172012-08-17 09:38:05 -0300164 KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY = 0x40000,
Lucas De Marchiddbda022011-12-27 11:40:10 -0200165};
166
Dave Reisnerd80b1032012-02-24 10:05:11 -0500167/* Flags to kmod_module_apply_filter() */
168enum kmod_filter {
169 KMOD_FILTER_BLACKLIST = 0x00001,
170 KMOD_FILTER_BUILTIN = 0x00002,
171};
172
Lucas De Marchi8f788d52011-11-25 01:22:56 -0200173int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags);
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200174int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags,
175 const char *options);
Lucas De Marchiddbda022011-12-27 11:40:10 -0200176int kmod_module_probe_insert_module(struct kmod_module *mod,
Lucas De Marchi6a829212012-01-09 03:08:26 -0200177 unsigned int flags, const char *extra_options,
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200178 int (*run_install)(struct kmod_module *m,
179 const char *cmdline, void *data),
Lucas De Marchi6bd07132012-01-30 17:02:06 -0200180 const void *data,
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200181 void (*print_action)(struct kmod_module *m, bool install,
182 const char *options));
183
Lucas De Marchi8f788d52011-11-25 01:22:56 -0200184
Gustavo Sverzut Barbieri1ce08a52011-12-02 20:24:07 -0200185const char *kmod_module_get_name(const struct kmod_module *mod);
186const char *kmod_module_get_path(const struct kmod_module *mod);
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200187const char *kmod_module_get_options(const struct kmod_module *mod);
188const char *kmod_module_get_install_commands(const struct kmod_module *mod);
189const char *kmod_module_get_remove_commands(const struct kmod_module *mod);
190struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod);
191int kmod_module_get_softdeps(const struct kmod_module *mod,
192 struct kmod_list **pre, struct kmod_list **post);
193int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx,
194 const struct kmod_list *input,
Dave Reisnerd80b1032012-02-24 10:05:11 -0500195 struct kmod_list **output) __attribute__ ((deprecated));
196int kmod_module_apply_filter(const struct kmod_ctx *ctx,
197 enum kmod_filter filter_type,
198 const struct kmod_list *input,
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200199 struct kmod_list **output);
200
201
202
203/*
204 * Information regarding "live information" from module's state, as returned
205 * by kernel
206 */
Lucas De Marchi6e869df2011-11-30 19:01:01 -0200207
Gustavo Sverzut Barbierif12ae3c2011-12-04 12:40:00 -0200208enum kmod_module_initstate {
209 KMOD_MODULE_BUILTIN = 0,
210 KMOD_MODULE_LIVE,
211 KMOD_MODULE_COMING,
Lucas De Marchi49b741d2011-12-05 11:42:12 -0200212 KMOD_MODULE_GOING,
213 /* Padding to make sure enum is not mapped to char */
214 _KMOD_MODULE_PAD = (1 << 31),
Gustavo Sverzut Barbierif12ae3c2011-12-04 12:40:00 -0200215};
Lucas De Marchi6a829212012-01-09 03:08:26 -0200216const char *kmod_module_initstate_str(enum kmod_module_initstate state);
Gustavo Sverzut Barbierif12ae3c2011-12-04 12:40:00 -0200217int kmod_module_get_initstate(const struct kmod_module *mod);
218int kmod_module_get_refcnt(const struct kmod_module *mod);
219struct kmod_list *kmod_module_get_holders(const struct kmod_module *mod);
Gustavo Sverzut Barbierif12ae3c2011-12-04 12:40:00 -0200220struct kmod_list *kmod_module_get_sections(const struct kmod_module *mod);
221const char *kmod_module_section_get_name(const struct kmod_list *entry);
222unsigned long kmod_module_section_get_address(const struct kmod_list *entry);
223void kmod_module_section_free_list(struct kmod_list *list);
Gustavo Sverzut Barbieri69f9dd42011-12-04 14:02:30 -0200224long kmod_module_get_size(const struct kmod_module *mod);
Gustavo Sverzut Barbierif12ae3c2011-12-04 12:40:00 -0200225
Gustavo Sverzut Barbieribd3f5532011-12-10 20:47:01 -0200226
Lucas De Marchi9226dda2012-01-31 17:23:35 -0200227
228/*
229 * Information retrieved from ELF headers and sections
230 */
Gustavo Sverzut Barbieri1c522602011-12-16 21:18:10 -0200231
Gustavo Sverzut Barbieri708624a2011-12-18 01:25:06 -0200232int kmod_module_get_info(const struct kmod_module *mod, struct kmod_list **list);
233const char *kmod_module_info_get_key(const struct kmod_list *entry);
234const char *kmod_module_info_get_value(const struct kmod_list *entry);
235void kmod_module_info_free_list(struct kmod_list *list);
236
237int kmod_module_get_versions(const struct kmod_module *mod, struct kmod_list **list);
238const char *kmod_module_version_get_symbol(const struct kmod_list *entry);
239uint64_t kmod_module_version_get_crc(const struct kmod_list *entry);
240void kmod_module_versions_free_list(struct kmod_list *list);
241
Gustavo Sverzut Barbieri45e6db92011-12-19 21:23:13 -0200242int kmod_module_get_symbols(const struct kmod_module *mod, struct kmod_list **list);
243const char *kmod_module_symbol_get_symbol(const struct kmod_list *entry);
244uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry);
245void kmod_module_symbols_free_list(struct kmod_list *list);
246
Gustavo Sverzut Barbieri674f8592011-12-20 11:54:53 -0200247enum kmod_symbol_bind {
248 KMOD_SYMBOL_NONE = '\0',
249 KMOD_SYMBOL_LOCAL = 'L',
250 KMOD_SYMBOL_GLOBAL = 'G',
251 KMOD_SYMBOL_WEAK = 'W',
252 KMOD_SYMBOL_UNDEF = 'U'
253};
254
255int kmod_module_get_dependency_symbols(const struct kmod_module *mod, struct kmod_list **list);
256const char *kmod_module_dependency_symbol_get_symbol(const struct kmod_list *entry);
257int kmod_module_dependency_symbol_get_bind(const struct kmod_list *entry);
258uint64_t kmod_module_dependency_symbol_get_crc(const struct kmod_list *entry);
259void kmod_module_dependency_symbols_free_list(struct kmod_list *list);
260
Lucas De Marchi2bd62992011-11-28 12:03:17 -0200261#ifdef __cplusplus
262} /* extern "C" */
263#endif
Lucas De Marchi586fc302011-11-21 14:35:35 -0200264#endif