]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * libkmod - interface to kernel module operations | |
3 | * | |
4 | * Copyright (C) 2011-2012 ProFUSION embedded systems | |
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 | |
8 | * License as published by the Free Software Foundation; either | |
9 | * version 2.1 of the License, or (at your option) any later version. | |
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 | |
17 | * License along with this library; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
20 | ||
21 | #ifndef _LIBKMOD_H_ | |
22 | #define _LIBKMOD_H_ | |
23 | ||
24 | #include <fcntl.h> | |
25 | #include <stdarg.h> | |
26 | #include <stdbool.h> | |
27 | #include <inttypes.h> | |
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; | |
40 | struct kmod_ctx *kmod_new(const char *dirname, const char * const *config_paths); | |
41 | struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx); | |
42 | struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx); | |
43 | void kmod_set_log_fn(struct kmod_ctx *ctx, | |
44 | void (*log_fn)(void *log_data, | |
45 | int priority, const char *file, int line, | |
46 | const char *fn, const char *format, | |
47 | va_list args), | |
48 | const void *data); | |
49 | int kmod_get_log_priority(const struct kmod_ctx *ctx); | |
50 | void kmod_set_log_priority(struct kmod_ctx *ctx, int priority); | |
51 | void *kmod_get_userdata(const struct kmod_ctx *ctx); | |
52 | void kmod_set_userdata(struct kmod_ctx *ctx, const void *userdata); | |
53 | int kmod_load_resources(struct kmod_ctx *ctx); | |
54 | void kmod_unload_resources(struct kmod_ctx *ctx); | |
55 | ||
56 | enum kmod_resources { | |
57 | KMOD_RESOURCES_OK = 0, | |
58 | KMOD_RESOURCES_MUST_RELOAD = 1, | |
59 | KMOD_RESOURCES_MUST_RECREATE = 2, | |
60 | }; | |
61 | ||
62 | int kmod_validate_resources(struct kmod_ctx *ctx); | |
63 | ||
64 | enum kmod_index { | |
65 | KMOD_INDEX_MODULES_DEP = 0, | |
66 | KMOD_INDEX_MODULES_ALIAS, | |
67 | KMOD_INDEX_MODULES_SYMBOL, | |
68 | /* Padding to make sure enum is not mapped to char */ | |
69 | _KMOD_INDEX_PAD = (1 << 31), | |
70 | }; | |
71 | ||
72 | int kmod_dump_index(struct kmod_ctx *ctx, enum kmod_index type, int fd); | |
73 | ||
74 | /* | |
75 | * kmod_list | |
76 | * | |
77 | * access to kmod generated lists | |
78 | */ | |
79 | struct kmod_list; | |
80 | struct kmod_list *kmod_list_next(const struct kmod_list *list, | |
81 | const struct kmod_list *curr); | |
82 | struct kmod_list *kmod_list_prev(const struct kmod_list *list, | |
83 | const struct kmod_list *curr); | |
84 | struct kmod_list *kmod_list_last(const struct kmod_list *list); | |
85 | ||
86 | #define kmod_list_foreach(list_entry, first_entry) \ | |
87 | for (list_entry = first_entry; \ | |
88 | list_entry != NULL; \ | |
89 | list_entry = kmod_list_next(first_entry, list_entry)) | |
90 | ||
91 | #define kmod_list_foreach_reverse(list_entry, first_entry) \ | |
92 | for (list_entry = kmod_list_last(first_entry); \ | |
93 | list_entry != NULL; \ | |
94 | list_entry = kmod_list_prev(first_entry, list_entry)) | |
95 | ||
96 | /* | |
97 | * kmod_config_iter | |
98 | * | |
99 | * access to configuration lists - it allows to get each configuration's | |
100 | * key/value stored by kmod | |
101 | */ | |
102 | struct kmod_config_iter; | |
103 | struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx); | |
104 | struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx); | |
105 | struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx); | |
106 | struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx); | |
107 | struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx); | |
108 | struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx); | |
109 | const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter); | |
110 | const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter); | |
111 | bool kmod_config_iter_next(struct kmod_config_iter *iter); | |
112 | void kmod_config_iter_free_iter(struct kmod_config_iter *iter); | |
113 | ||
114 | /* Removal flags */ | |
115 | enum kmod_remove { | |
116 | KMOD_REMOVE_FORCE = O_TRUNC, | |
117 | KMOD_REMOVE_NOWAIT = O_NONBLOCK, | |
118 | }; | |
119 | ||
120 | /* Insertion flags */ | |
121 | enum kmod_insert { | |
122 | KMOD_INSERT_FORCE_VERMAGIC = 0x1, | |
123 | KMOD_INSERT_FORCE_MODVERSION = 0x2, | |
124 | }; | |
125 | ||
126 | /* Flags to kmod_module_probe_insert_module() */ | |
127 | enum kmod_probe { | |
128 | KMOD_PROBE_FORCE_VERMAGIC = 0x00001, | |
129 | KMOD_PROBE_FORCE_MODVERSION = 0x00002, | |
130 | KMOD_PROBE_IGNORE_COMMAND = 0x00004, | |
131 | KMOD_PROBE_IGNORE_LOADED = 0x00008, | |
132 | KMOD_PROBE_DRY_RUN = 0x00010, | |
133 | KMOD_PROBE_STOP_ON_ALREADY_LOADED = 0x00020, | |
134 | ||
135 | /* codes below can be used in return value, too */ | |
136 | KMOD_PROBE_APPLY_BLACKLIST_ALL = 0x10000, | |
137 | KMOD_PROBE_APPLY_BLACKLIST = 0x20000, | |
138 | }; | |
139 | ||
140 | /* | |
141 | * kmod_module | |
142 | * | |
143 | * Operate on kernel modules | |
144 | */ | |
145 | struct kmod_module; | |
146 | int kmod_module_new_from_name(struct kmod_ctx *ctx, const char *name, | |
147 | struct kmod_module **mod); | |
148 | int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path, | |
149 | struct kmod_module **mod); | |
150 | int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *given_alias, | |
151 | struct kmod_list **list); | |
152 | int kmod_module_new_from_loaded(struct kmod_ctx *ctx, struct kmod_list **list); | |
153 | ||
154 | struct kmod_module *kmod_module_ref(struct kmod_module *mod); | |
155 | struct kmod_module *kmod_module_unref(struct kmod_module *mod); | |
156 | int kmod_module_unref_list(struct kmod_list *list); | |
157 | struct kmod_module *kmod_module_get_module(const struct kmod_list *entry); | |
158 | struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod); | |
159 | ||
160 | int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, const struct kmod_list *input, struct kmod_list **output); | |
161 | ||
162 | int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags); | |
163 | int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags, const char *options); | |
164 | int kmod_module_probe_insert_module(struct kmod_module *mod, | |
165 | unsigned int flags, const char *extra_options, | |
166 | int (*run_install)(struct kmod_module *m, const char *cmdline, void *data), | |
167 | const void *data, | |
168 | void (*print_action)(struct kmod_module *m, bool install, const char *options)); | |
169 | ||
170 | const char *kmod_module_get_name(const struct kmod_module *mod); | |
171 | const char *kmod_module_get_path(const struct kmod_module *mod); | |
172 | ||
173 | enum kmod_module_initstate { | |
174 | KMOD_MODULE_BUILTIN = 0, | |
175 | KMOD_MODULE_LIVE, | |
176 | KMOD_MODULE_COMING, | |
177 | KMOD_MODULE_GOING, | |
178 | /* Padding to make sure enum is not mapped to char */ | |
179 | _KMOD_MODULE_PAD = (1 << 31), | |
180 | }; | |
181 | const char *kmod_module_initstate_str(enum kmod_module_initstate state); | |
182 | int kmod_module_get_initstate(const struct kmod_module *mod); | |
183 | int kmod_module_get_refcnt(const struct kmod_module *mod); | |
184 | struct kmod_list *kmod_module_get_holders(const struct kmod_module *mod); | |
185 | ||
186 | struct kmod_list *kmod_module_get_sections(const struct kmod_module *mod); | |
187 | const char *kmod_module_section_get_name(const struct kmod_list *entry); | |
188 | unsigned long kmod_module_section_get_address(const struct kmod_list *entry); | |
189 | void kmod_module_section_free_list(struct kmod_list *list); | |
190 | ||
191 | long kmod_module_get_size(const struct kmod_module *mod); | |
192 | ||
193 | const char *kmod_module_get_options(const struct kmod_module *mod); | |
194 | const char *kmod_module_get_install_commands(const struct kmod_module *mod); | |
195 | const char *kmod_module_get_remove_commands(const struct kmod_module *mod); | |
196 | ||
197 | int kmod_module_get_softdeps(const struct kmod_module *mod, struct kmod_list **pre, struct kmod_list **post); | |
198 | ||
199 | int kmod_module_get_info(const struct kmod_module *mod, struct kmod_list **list); | |
200 | const char *kmod_module_info_get_key(const struct kmod_list *entry); | |
201 | const char *kmod_module_info_get_value(const struct kmod_list *entry); | |
202 | void kmod_module_info_free_list(struct kmod_list *list); | |
203 | ||
204 | int kmod_module_get_versions(const struct kmod_module *mod, struct kmod_list **list); | |
205 | const char *kmod_module_version_get_symbol(const struct kmod_list *entry); | |
206 | uint64_t kmod_module_version_get_crc(const struct kmod_list *entry); | |
207 | void kmod_module_versions_free_list(struct kmod_list *list); | |
208 | ||
209 | int kmod_module_get_symbols(const struct kmod_module *mod, struct kmod_list **list); | |
210 | const char *kmod_module_symbol_get_symbol(const struct kmod_list *entry); | |
211 | uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry); | |
212 | void kmod_module_symbols_free_list(struct kmod_list *list); | |
213 | ||
214 | enum kmod_symbol_bind { | |
215 | KMOD_SYMBOL_NONE = '\0', | |
216 | KMOD_SYMBOL_LOCAL = 'L', | |
217 | KMOD_SYMBOL_GLOBAL = 'G', | |
218 | KMOD_SYMBOL_WEAK = 'W', | |
219 | KMOD_SYMBOL_UNDEF = 'U' | |
220 | }; | |
221 | ||
222 | int kmod_module_get_dependency_symbols(const struct kmod_module *mod, struct kmod_list **list); | |
223 | const char *kmod_module_dependency_symbol_get_symbol(const struct kmod_list *entry); | |
224 | int kmod_module_dependency_symbol_get_bind(const struct kmod_list *entry); | |
225 | uint64_t kmod_module_dependency_symbol_get_crc(const struct kmod_list *entry); | |
226 | void kmod_module_dependency_symbols_free_list(struct kmod_list *list); | |
227 | ||
228 | #ifdef __cplusplus | |
229 | } /* extern "C" */ | |
230 | #endif | |
231 | #endif |