]>
Commit | Line | Data |
---|---|---|
586fc304 LDM |
1 | /* |
2 | * libkmod - interface to kernel module operations | |
3 | * | |
e6b0e49b | 4 | * Copyright (C) 2011-2013 ProFUSION embedded systems |
586fc304 LDM |
5 | * |
6 | * This library is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU Lesser General Public | |
cb451f35 LDM |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. | |
586fc304 LDM |
10 | * |
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 | |
dea2dfee | 17 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
586fc304 LDM |
18 | */ |
19 | ||
e8fd8fec | 20 | #pragma once |
6ad98307 LDM |
21 | #ifndef _LIBKMOD_H_ |
22 | #define _LIBKMOD_H_ | |
586fc304 | 23 | |
6806a043 | 24 | #include <fcntl.h> |
586fc304 | 25 | #include <stdarg.h> |
00178629 | 26 | #include <stdbool.h> |
5369797d | 27 | #include <inttypes.h> |
586fc304 LDM |
28 | |
29 | #ifdef __cplusplus | |
30 | extern "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 | */ | |
39 | struct kmod_ctx; | |
6a829211 | 40 | struct kmod_ctx *kmod_new(const char *dirname, const char * const *config_paths); |
586fc304 LDM |
41 | struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx); |
42 | struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx); | |
586fc304 | 43 | void kmod_set_log_fn(struct kmod_ctx *ctx, |
1bdd951e | 44 | void (*log_fn)(void *log_data, |
9226ddad LDM |
45 | int priority, const char *file, int line, |
46 | const char *fn, const char *format, | |
47 | va_list args), | |
1bdd951e | 48 | const void *data); |
6d177553 | 49 | int kmod_get_log_priority(const struct kmod_ctx *ctx); |
586fc304 | 50 | void kmod_set_log_priority(struct kmod_ctx *ctx, int priority); |
6d177553 | 51 | void *kmod_get_userdata(const struct kmod_ctx *ctx); |
1ce08a56 | 52 | void kmod_set_userdata(struct kmod_ctx *ctx, const void *userdata); |
9226ddad | 53 | |
b87d01d6 | 54 | const char *kmod_get_dirname(const struct kmod_ctx *ctx); |
9226ddad LDM |
55 | |
56 | /* | |
57 | * Management of libkmod's resources | |
58 | */ | |
33bb69b9 LDM |
59 | int kmod_load_resources(struct kmod_ctx *ctx); |
60 | void kmod_unload_resources(struct kmod_ctx *ctx); | |
586fc304 | 61 | |
c4dc3ca8 LDM |
62 | enum kmod_resources { |
63 | KMOD_RESOURCES_OK = 0, | |
64 | KMOD_RESOURCES_MUST_RELOAD = 1, | |
65 | KMOD_RESOURCES_MUST_RECREATE = 2, | |
66 | }; | |
c4dc3ca8 LDM |
67 | int kmod_validate_resources(struct kmod_ctx *ctx); |
68 | ||
b08314f7 LDM |
69 | enum kmod_index { |
70 | KMOD_INDEX_MODULES_DEP = 0, | |
71 | KMOD_INDEX_MODULES_ALIAS, | |
72 | KMOD_INDEX_MODULES_SYMBOL, | |
b866b216 | 73 | KMOD_INDEX_MODULES_BUILTIN_ALIAS, |
3805274b | 74 | KMOD_INDEX_MODULES_BUILTIN, |
b08314f7 | 75 | /* Padding to make sure enum is not mapped to char */ |
867da6fc | 76 | _KMOD_INDEX_PAD = 1U << 31, |
b08314f7 | 77 | }; |
0224482e | 78 | int kmod_dump_index(struct kmod_ctx *ctx, enum kmod_index type, int fd); |
758428a7 | 79 | |
586fc304 LDM |
80 | /* |
81 | * kmod_list | |
82 | * | |
83 | * access to kmod generated lists | |
84 | */ | |
6924e47a | 85 | struct kmod_list; |
6a829211 LDM |
86 | struct kmod_list *kmod_list_next(const struct kmod_list *list, |
87 | const struct kmod_list *curr); | |
88 | struct kmod_list *kmod_list_prev(const struct kmod_list *list, | |
89 | const struct kmod_list *curr); | |
90 | struct kmod_list *kmod_list_last(const struct kmod_list *list); | |
d5ec60bc | 91 | |
6924e47a | 92 | #define kmod_list_foreach(list_entry, first_entry) \ |
586fc304 | 93 | for (list_entry = first_entry; \ |
e4351b05 | 94 | list_entry != NULL; \ |
6924e47a | 95 | list_entry = kmod_list_next(first_entry, list_entry)) |
586fc304 | 96 | |
d6b55b7d GSB |
97 | #define kmod_list_foreach_reverse(list_entry, first_entry) \ |
98 | for (list_entry = kmod_list_last(first_entry); \ | |
99 | list_entry != NULL; \ | |
100 | list_entry = kmod_list_prev(first_entry, list_entry)) | |
101 | ||
00178629 LDM |
102 | /* |
103 | * kmod_config_iter | |
104 | * | |
105 | * access to configuration lists - it allows to get each configuration's | |
106 | * key/value stored by kmod | |
107 | */ | |
108 | struct kmod_config_iter; | |
109 | struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx); | |
110 | struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx); | |
111 | struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx); | |
112 | struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx); | |
113 | struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx); | |
114 | struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx); | |
115 | const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter); | |
116 | const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter); | |
117 | bool kmod_config_iter_next(struct kmod_config_iter *iter); | |
118 | void kmod_config_iter_free_iter(struct kmod_config_iter *iter); | |
119 | ||
9226ddad LDM |
120 | /* |
121 | * kmod_module | |
122 | * | |
123 | * Operate on kernel modules | |
124 | */ | |
125 | struct kmod_module; | |
126 | int kmod_module_new_from_name(struct kmod_ctx *ctx, const char *name, | |
127 | struct kmod_module **mod); | |
128 | int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path, | |
129 | struct kmod_module **mod); | |
130 | int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *given_alias, | |
131 | struct kmod_list **list); | |
132 | int kmod_module_new_from_loaded(struct kmod_ctx *ctx, | |
133 | struct kmod_list **list); | |
134 | ||
135 | struct kmod_module *kmod_module_ref(struct kmod_module *mod); | |
136 | struct kmod_module *kmod_module_unref(struct kmod_module *mod); | |
137 | int kmod_module_unref_list(struct kmod_list *list); | |
138 | struct kmod_module *kmod_module_get_module(const struct kmod_list *entry); | |
139 | ||
140 | ||
f39dc70e | 141 | /* Removal flags */ |
423f856a | 142 | enum kmod_remove { |
6806a043 | 143 | KMOD_REMOVE_FORCE = O_TRUNC, |
7ab88044 | 144 | KMOD_REMOVE_NOWAIT = O_NONBLOCK, /* always set */ |
6806a043 LDM |
145 | }; |
146 | ||
f39dc70e | 147 | /* Insertion flags */ |
8f788d58 LDM |
148 | enum kmod_insert { |
149 | KMOD_INSERT_FORCE_VERMAGIC = 0x1, | |
150 | KMOD_INSERT_FORCE_MODVERSION = 0x2, | |
8f788d58 LDM |
151 | }; |
152 | ||
ddbda022 LDM |
153 | /* Flags to kmod_module_probe_insert_module() */ |
154 | enum kmod_probe { | |
d851e9a1 LDM |
155 | KMOD_PROBE_FORCE_VERMAGIC = 0x00001, |
156 | KMOD_PROBE_FORCE_MODVERSION = 0x00002, | |
157 | KMOD_PROBE_IGNORE_COMMAND = 0x00004, | |
7c10c69c | 158 | KMOD_PROBE_IGNORE_LOADED = 0x00008, |
4c1ffb75 | 159 | KMOD_PROBE_DRY_RUN = 0x00010, |
814a57ba | 160 | KMOD_PROBE_FAIL_ON_LOADED = 0x00020, |
b1a51256 LDM |
161 | |
162 | /* codes below can be used in return value, too */ | |
d851e9a1 LDM |
163 | KMOD_PROBE_APPLY_BLACKLIST_ALL = 0x10000, |
164 | KMOD_PROBE_APPLY_BLACKLIST = 0x20000, | |
6882017f | 165 | KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY = 0x40000, |
ddbda022 LDM |
166 | }; |
167 | ||
d80b103c DR |
168 | /* Flags to kmod_module_apply_filter() */ |
169 | enum kmod_filter { | |
170 | KMOD_FILTER_BLACKLIST = 0x00001, | |
171 | KMOD_FILTER_BUILTIN = 0x00002, | |
172 | }; | |
173 | ||
8f788d58 | 174 | int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags); |
9226ddad LDM |
175 | int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags, |
176 | const char *options); | |
ddbda022 | 177 | int kmod_module_probe_insert_module(struct kmod_module *mod, |
6a829211 | 178 | unsigned int flags, const char *extra_options, |
9226ddad LDM |
179 | int (*run_install)(struct kmod_module *m, |
180 | const char *cmdline, void *data), | |
6bd0713d | 181 | const void *data, |
9226ddad LDM |
182 | void (*print_action)(struct kmod_module *m, bool install, |
183 | const char *options)); | |
184 | ||
8f788d58 | 185 | |
1ce08a56 GSB |
186 | const char *kmod_module_get_name(const struct kmod_module *mod); |
187 | const char *kmod_module_get_path(const struct kmod_module *mod); | |
9226ddad LDM |
188 | const char *kmod_module_get_options(const struct kmod_module *mod); |
189 | const char *kmod_module_get_install_commands(const struct kmod_module *mod); | |
190 | const char *kmod_module_get_remove_commands(const struct kmod_module *mod); | |
191 | struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod); | |
192 | int kmod_module_get_softdeps(const struct kmod_module *mod, | |
193 | struct kmod_list **pre, struct kmod_list **post); | |
194 | int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, | |
d80b103c DR |
195 | const struct kmod_list *input, |
196 | struct kmod_list **output) __attribute__ ((deprecated)); | |
197 | int kmod_module_apply_filter(const struct kmod_ctx *ctx, | |
198 | enum kmod_filter filter_type, | |
9226ddad LDM |
199 | const struct kmod_list *input, |
200 | struct kmod_list **output); | |
201 | ||
202 | ||
203 | ||
204 | /* | |
205 | * Information regarding "live information" from module's state, as returned | |
206 | * by kernel | |
207 | */ | |
6e869df7 | 208 | |
f12ae3c4 GSB |
209 | enum kmod_module_initstate { |
210 | KMOD_MODULE_BUILTIN = 0, | |
211 | KMOD_MODULE_LIVE, | |
212 | KMOD_MODULE_COMING, | |
49b741d0 LDM |
213 | KMOD_MODULE_GOING, |
214 | /* Padding to make sure enum is not mapped to char */ | |
867da6fc | 215 | _KMOD_MODULE_PAD = 1U << 31, |
f12ae3c4 | 216 | }; |
6a829211 | 217 | const char *kmod_module_initstate_str(enum kmod_module_initstate state); |
f12ae3c4 GSB |
218 | int kmod_module_get_initstate(const struct kmod_module *mod); |
219 | int kmod_module_get_refcnt(const struct kmod_module *mod); | |
220 | struct kmod_list *kmod_module_get_holders(const struct kmod_module *mod); | |
f12ae3c4 GSB |
221 | struct kmod_list *kmod_module_get_sections(const struct kmod_module *mod); |
222 | const char *kmod_module_section_get_name(const struct kmod_list *entry); | |
223 | unsigned long kmod_module_section_get_address(const struct kmod_list *entry); | |
224 | void kmod_module_section_free_list(struct kmod_list *list); | |
69f9dd43 | 225 | long kmod_module_get_size(const struct kmod_module *mod); |
f12ae3c4 | 226 | |
bd3f5535 | 227 | |
9226ddad LDM |
228 | |
229 | /* | |
230 | * Information retrieved from ELF headers and sections | |
231 | */ | |
1c522600 | 232 | |
708624a4 GSB |
233 | int kmod_module_get_info(const struct kmod_module *mod, struct kmod_list **list); |
234 | const char *kmod_module_info_get_key(const struct kmod_list *entry); | |
235 | const char *kmod_module_info_get_value(const struct kmod_list *entry); | |
236 | void kmod_module_info_free_list(struct kmod_list *list); | |
237 | ||
238 | int kmod_module_get_versions(const struct kmod_module *mod, struct kmod_list **list); | |
239 | const char *kmod_module_version_get_symbol(const struct kmod_list *entry); | |
240 | uint64_t kmod_module_version_get_crc(const struct kmod_list *entry); | |
241 | void kmod_module_versions_free_list(struct kmod_list *list); | |
242 | ||
45e6db9c GSB |
243 | int kmod_module_get_symbols(const struct kmod_module *mod, struct kmod_list **list); |
244 | const char *kmod_module_symbol_get_symbol(const struct kmod_list *entry); | |
245 | uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry); | |
246 | void kmod_module_symbols_free_list(struct kmod_list *list); | |
247 | ||
674f8590 GSB |
248 | enum kmod_symbol_bind { |
249 | KMOD_SYMBOL_NONE = '\0', | |
250 | KMOD_SYMBOL_LOCAL = 'L', | |
251 | KMOD_SYMBOL_GLOBAL = 'G', | |
252 | KMOD_SYMBOL_WEAK = 'W', | |
253 | KMOD_SYMBOL_UNDEF = 'U' | |
254 | }; | |
255 | ||
256 | int kmod_module_get_dependency_symbols(const struct kmod_module *mod, struct kmod_list **list); | |
257 | const char *kmod_module_dependency_symbol_get_symbol(const struct kmod_list *entry); | |
258 | int kmod_module_dependency_symbol_get_bind(const struct kmod_list *entry); | |
259 | uint64_t kmod_module_dependency_symbol_get_crc(const struct kmod_list *entry); | |
260 | void kmod_module_dependency_symbols_free_list(struct kmod_list *list); | |
261 | ||
2bd6299d LDM |
262 | #ifdef __cplusplus |
263 | } /* extern "C" */ | |
264 | #endif | |
586fc304 | 265 | #endif |