blob: 4d9db6bc78457d7e321116614cc7e7b78154f931 [file] [log] [blame]
Lucas De Marchie8fd8fe2012-07-18 10:19:48 -03001#pragma once
Lucas De Marchi586fc302011-11-21 14:35:35 -02002
3#include <stdbool.h>
Lucas De Marchi4462c4a2011-11-29 18:05:43 -02004#include <stdio.h>
Lucas De Marchi586fc302011-11-21 14:35:35 -02005#include <syslog.h>
Gustavo Sverzut Barbierid917f272011-12-10 21:00:19 -02006#include <limits.h>
Lucas De Marchi586fc302011-11-21 14:35:35 -02007
Lucas De Marchi576dd432014-10-02 22:03:19 -03008#include <shared/macro.h>
Lucas De Marchi8b7189b2014-10-02 22:08:47 -03009#include <shared/missing.h>
Lucas De Marchi576dd432014-10-02 22:03:19 -030010
Lucas De Marchi586fc302011-11-21 14:35:35 -020011#include "libkmod.h"
12
Lucas De Marchia70c1e72012-05-23 20:27:23 -030013static _always_inline_ _printf_format_(2, 3) void
Lucas De Marchi586fc302011-11-21 14:35:35 -020014 kmod_log_null(struct kmod_ctx *ctx, const char *format, ...) {}
15
16#define kmod_log_cond(ctx, prio, arg...) \
17 do { \
18 if (kmod_get_log_priority(ctx) >= prio) \
Jan Engelhardt87beacc2011-12-20 16:27:40 +010019 kmod_log(ctx, prio, __FILE__, __LINE__, __func__, ## arg);\
Lucas De Marchi586fc302011-11-21 14:35:35 -020020 } while (0)
21
22#ifdef ENABLE_LOGGING
23# ifdef ENABLE_DEBUG
Lucas De Marchiae6df842011-11-25 01:05:30 -020024# define DBG(ctx, arg...) kmod_log_cond(ctx, LOG_DEBUG, ## arg)
Lucas De Marchi586fc302011-11-21 14:35:35 -020025# else
Lucas De Marchiae6df842011-11-25 01:05:30 -020026# define DBG(ctx, arg...) kmod_log_null(ctx, ## arg)
Lucas De Marchi586fc302011-11-21 14:35:35 -020027# endif
Lucas De Marchiae6df842011-11-25 01:05:30 -020028# define INFO(ctx, arg...) kmod_log_cond(ctx, LOG_INFO, ## arg)
29# define ERR(ctx, arg...) kmod_log_cond(ctx, LOG_ERR, ## arg)
Lucas De Marchi586fc302011-11-21 14:35:35 -020030#else
Lucas De Marchiae6df842011-11-25 01:05:30 -020031# define DBG(ctx, arg...) kmod_log_null(ctx, ## arg)
32# define INFO(ctx, arg...) kmod_log_null(ctx, ## arg)
33# define ERR(ctx, arg...) kmod_log_null(ctx, ## arg)
Lucas De Marchi586fc302011-11-21 14:35:35 -020034#endif
35
36#define KMOD_EXPORT __attribute__ ((visibility("default")))
37
Lucas De Marchi1684e442011-12-14 17:19:19 -020038#define KCMD_LINE_SIZE 4096
39
Cristian Rodríguez41a51c22013-02-11 15:07:52 -030040#ifndef HAVE_SECURE_GETENV
41# ifdef HAVE___SECURE_GETENV
42# define secure_getenv __secure_getenv
43# else
44# warning neither secure_getenv nor __secure_getenv is available
45# define secure_getenv getenv
46# endif
47#endif
48
Gustavo Sverzut Barbieri1bdd9512011-12-08 13:47:55 -020049void kmod_log(const struct kmod_ctx *ctx,
Lucas De Marchi586fc302011-11-21 14:35:35 -020050 int priority, const char *file, int line, const char *fn,
Gustavo Sverzut Barbieri12d94192011-12-02 20:34:58 -020051 const char *format, ...) __attribute__((format(printf, 6, 7))) __attribute__((nonnull(1, 3, 5)));
Lucas De Marchi586fc302011-11-21 14:35:35 -020052
Lucas De Marchi6924e472011-11-22 05:38:28 -020053struct list_node {
54 struct list_node *next, *prev;
55};
56
57struct kmod_list {
58 struct list_node node;
59 void *data;
60};
61
Lucas De Marchia70c1e72012-05-23 20:27:23 -030062struct kmod_list *kmod_list_append(struct kmod_list *list, const void *data) _must_check_ __attribute__((nonnull(2)));
63struct kmod_list *kmod_list_prepend(struct kmod_list *list, const void *data) _must_check_ __attribute__((nonnull(2)));
64struct kmod_list *kmod_list_remove(struct kmod_list *list) _must_check_;
Lucas De Marchi6924e472011-11-22 05:38:28 -020065struct kmod_list *kmod_list_remove_data(struct kmod_list *list,
Lucas De Marchia70c1e72012-05-23 20:27:23 -030066 const void *data) _must_check_ __attribute__((nonnull(2)));
Lucas De Marchi62be7992011-12-01 15:27:42 -020067struct kmod_list *kmod_list_remove_n_latest(struct kmod_list *list,
Lucas De Marchia70c1e72012-05-23 20:27:23 -030068 unsigned int n) _must_check_;
Lucas De Marchi86e87882011-12-05 23:41:14 -020069struct kmod_list *kmod_list_insert_after(struct kmod_list *list, const void *data) __attribute__((nonnull(2)));
Lucas De Marchib91a1c62011-12-05 23:53:56 -020070struct kmod_list *kmod_list_insert_before(struct kmod_list *list, const void *data) __attribute__((nonnull(2)));
Lucas De Marchia70c1e72012-05-23 20:27:23 -030071struct kmod_list *kmod_list_append_list(struct kmod_list *list1, struct kmod_list *list2) _must_check_;
Lucas De Marchi86e87882011-12-05 23:41:14 -020072
Lucas De Marchicf915792011-12-05 11:33:15 -020073#undef kmod_list_foreach
74#define kmod_list_foreach(list_entry, first_entry) \
Lucas De Marchid2d648d2011-12-06 01:44:08 -020075 for (list_entry = ((first_entry) == NULL) ? NULL : (first_entry); \
Lucas De Marchicf915792011-12-05 11:33:15 -020076 list_entry != NULL; \
Lucas De Marchid2d648d2011-12-06 01:44:08 -020077 list_entry = (list_entry->node.next == &((first_entry)->node)) ? NULL : \
Lucas De Marchicf915792011-12-05 11:33:15 -020078 container_of(list_entry->node.next, struct kmod_list, node))
Lucas De Marchi60aa4d82011-11-30 18:57:38 -020079
Gustavo Sverzut Barbierid6b55b72011-12-16 22:33:08 -020080#undef kmod_list_foreach_reverse
81#define kmod_list_foreach_reverse(list_entry, first_entry) \
82 for (list_entry = (((first_entry) == NULL) ? NULL : container_of(first_entry->node.prev, struct kmod_list, node)); \
83 list_entry != NULL; \
84 list_entry = ((list_entry == first_entry) ? NULL : \
85 container_of(list_entry->node.prev, struct kmod_list, node)))
86
Lucas De Marchi60aa4d82011-11-30 18:57:38 -020087/* libkmod.c */
Gustavo Sverzut Barbieri12d94192011-12-02 20:34:58 -020088int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
89int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
90int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
91int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
Lucas De Marchi38052742012-02-16 20:43:16 -020092int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
Harish Jenny K Nfd44a982015-02-22 15:41:07 -030093bool kmod_lookup_alias_is_builtin(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1, 2)));
Lucas De Marchif4fc5522011-12-16 03:57:12 -020094int kmod_lookup_alias_from_commands(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
Lucas De Marchiece09aa2012-01-18 01:26:44 -020095void kmod_set_modules_visited(struct kmod_ctx *ctx, bool visited) __attribute__((nonnull((1))));
Michal Marek450bd1b2014-03-31 15:18:50 +020096void kmod_set_modules_required(struct kmod_ctx *ctx, bool required) __attribute__((nonnull((1))));
Lucas De Marchifd186ae2011-12-06 03:38:37 -020097
Lucas De Marchi671d4892011-12-05 20:23:05 -020098char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name) __attribute__((nonnull(1,2)));
Lucas De Marchi221631d2011-11-24 16:41:01 -020099
Lucas De Marchi8bdeca12011-12-15 13:11:51 -0200100struct kmod_module *kmod_pool_get_module(struct kmod_ctx *ctx, const char *key) __attribute__((nonnull(1,2)));
Lucas De Marchi1114e782013-04-30 12:34:55 -0300101void kmod_pool_add_module(struct kmod_ctx *ctx, struct kmod_module *mod, const char *key) __attribute__((nonnull(1, 2, 3)));
102void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod, const char *key) __attribute__((nonnull(1, 2, 3)));
Lucas De Marchifd186ae2011-12-06 03:38:37 -0200103
Lucas De Marchie7fc2c82012-06-12 01:43:46 -0300104const struct kmod_config *kmod_get_config(const struct kmod_ctx *ctx) __attribute__((nonnull(1)));
Lucas De Marchifd186ae2011-12-06 03:38:37 -0200105
Lucas De Marchi60aa4d82011-11-30 18:57:38 -0200106/* libkmod-config.c */
Lucas De Marchib6a4dfb2011-12-31 18:48:05 -0200107struct kmod_config_path {
108 unsigned long long stamp;
109 char path[];
110};
111
Lucas De Marchi7c2ab352011-11-29 18:07:43 -0200112struct kmod_config {
Gustavo Sverzut Barbierid13e6062011-12-02 21:40:22 -0200113 struct kmod_ctx *ctx;
Lucas De Marchi7c2ab352011-11-29 18:07:43 -0200114 struct kmod_list *aliases;
Lucas De Marchi81cf2062011-11-29 18:48:02 -0200115 struct kmod_list *blacklists;
Lucas De Marchi615c42b2011-12-07 03:18:57 -0200116 struct kmod_list *options;
Lucas De Marchia5cce6d2011-12-07 11:31:28 -0200117 struct kmod_list *remove_commands;
118 struct kmod_list *install_commands;
Gustavo Sverzut Barbieri1c522602011-12-16 21:18:10 -0200119 struct kmod_list *softdeps;
Lucas De Marchib6a4dfb2011-12-31 18:48:05 -0200120
121 struct kmod_list *paths;
Lucas De Marchi7c2ab352011-11-29 18:07:43 -0200122};
Lucas De Marchib6a4dfb2011-12-31 18:48:05 -0200123
Gustavo Sverzut Barbiericb8d4d32011-12-11 20:37:01 -0200124int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **config, const char * const *config_paths) __attribute__((nonnull(1, 2,3)));
Gustavo Sverzut Barbierid13e6062011-12-02 21:40:22 -0200125void kmod_config_free(struct kmod_config *config) __attribute__((nonnull(1)));
Lucas De Marchic1c9c442011-12-24 10:50:47 -0200126const char *kmod_blacklist_get_modname(const struct kmod_list *l) __attribute__((nonnull(1)));
Gustavo Sverzut Barbieri12d94192011-12-02 20:34:58 -0200127const char *kmod_alias_get_name(const struct kmod_list *l) __attribute__((nonnull(1)));
128const char *kmod_alias_get_modname(const struct kmod_list *l) __attribute__((nonnull(1)));
Gustavo Sverzut Barbieribd3f5532011-12-10 20:47:01 -0200129const char *kmod_option_get_options(const struct kmod_list *l) __attribute__((nonnull(1)));
130const char *kmod_option_get_modname(const struct kmod_list *l) __attribute__((nonnull(1)));
131const char *kmod_command_get_command(const struct kmod_list *l) __attribute__((nonnull(1)));
132const char *kmod_command_get_modname(const struct kmod_list *l) __attribute__((nonnull(1)));
133
Gustavo Sverzut Barbieri1c522602011-12-16 21:18:10 -0200134const char *kmod_softdep_get_name(const struct kmod_list *l) __attribute__((nonnull(1)));
135const char * const *kmod_softdep_get_pre(const struct kmod_list *l, unsigned int *count) __attribute__((nonnull(1, 2)));
136const char * const *kmod_softdep_get_post(const struct kmod_list *l, unsigned int *count);
137
Lucas De Marchi7c2ab352011-11-29 18:07:43 -0200138
Lucas De Marchi7636e722011-12-01 17:56:03 -0200139/* libkmod-module.c */
Lucas De Marchi6ad5f262011-12-13 14:12:50 -0200140int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias, const char *name, struct kmod_module **mod);
Lucas De Marchi671d4892011-12-05 20:23:05 -0200141int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__((nonnull(1, 2)));
Lucas De Marchif4fc5522011-12-16 03:57:12 -0200142void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
143void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
Lucas De Marchiece09aa2012-01-18 01:26:44 -0200144void kmod_module_set_visited(struct kmod_module *mod, bool visited) __attribute__((nonnull(1)));
Lucas De Marchi38052742012-02-16 20:43:16 -0200145void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) __attribute__((nonnull((1))));
Michal Marek450bd1b2014-03-31 15:18:50 +0200146void kmod_module_set_required(struct kmod_module *mod, bool required) __attribute__((nonnull(1)));
Harish Jenny K Nfd44a982015-02-22 15:41:07 -0300147bool kmod_module_is_builtin(struct kmod_module *mod) __attribute__((nonnull(1)));
Gustavo Sverzut Barbieri7db08652011-12-05 00:17:37 -0200148
Gustavo Sverzut Barbieri3d8226e2011-12-16 16:08:53 -0200149/* libkmod-file.c */
Lucas De Marchia70c1e72012-05-23 20:27:23 -0300150struct kmod_file *kmod_file_open(const struct kmod_ctx *ctx, const char *filename) _must_check_ __attribute__((nonnull(1,2)));
Lucas De Marchi1eff9422012-10-18 01:36:33 -0300151struct kmod_elf *kmod_file_get_elf(struct kmod_file *file) __attribute__((nonnull(1)));
Lucas De Marchia70c1e72012-05-23 20:27:23 -0300152void *kmod_file_get_contents(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1)));
153off_t kmod_file_get_size(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1)));
Kees Cook144d1822013-02-18 12:02:32 -0800154bool kmod_file_get_direct(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1)));
155int kmod_file_get_fd(const struct kmod_file *file) _must_check_ __attribute__((nonnull(1)));
Gustavo Sverzut Barbieri3d8226e2011-12-16 16:08:53 -0200156void kmod_file_unref(struct kmod_file *file) __attribute__((nonnull(1)));
157
Gustavo Sverzut Barbieri708624a2011-12-18 01:25:06 -0200158/* libkmod-elf.c */
159struct kmod_elf;
160struct kmod_modversion {
161 uint64_t crc;
Gustavo Sverzut Barbieri674f8592011-12-20 11:54:53 -0200162 enum kmod_symbol_bind bind;
Gustavo Sverzut Barbieri708624a2011-12-18 01:25:06 -0200163 char *symbol;
164};
165
Lucas De Marchia70c1e72012-05-23 20:27:23 -0300166struct kmod_elf *kmod_elf_new(const void *memory, off_t size) _must_check_ __attribute__((nonnull(1)));
Gustavo Sverzut Barbieri708624a2011-12-18 01:25:06 -0200167void kmod_elf_unref(struct kmod_elf *elf) __attribute__((nonnull(1)));
Lucas De Marchia70c1e72012-05-23 20:27:23 -0300168const void *kmod_elf_get_memory(const struct kmod_elf *elf) _must_check_ __attribute__((nonnull(1)));
169int kmod_elf_get_strings(const struct kmod_elf *elf, const char *section, char ***array) _must_check_ __attribute__((nonnull(1,2,3)));
170int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion **array) _must_check_ __attribute__((nonnull(1,2)));
171int kmod_elf_get_symbols(const struct kmod_elf *elf, struct kmod_modversion **array) _must_check_ __attribute__((nonnull(1,2)));
172int kmod_elf_get_dependency_symbols(const struct kmod_elf *elf, struct kmod_modversion **array) _must_check_ __attribute__((nonnull(1,2)));
173int kmod_elf_strip_section(struct kmod_elf *elf, const char *section) _must_check_ __attribute__((nonnull(1,2)));
174int kmod_elf_strip_vermagic(struct kmod_elf *elf) _must_check_ __attribute__((nonnull(1)));
Gustavo Sverzut Barbieri7db08652011-12-05 00:17:37 -0200175
Lucas De Marchiea17e2b2012-01-26 01:21:17 -0200176/*
177 * Debug mock lib need to find section ".gnu.linkonce.this_module" in order to
178 * get modname
179 */
Lucas De Marchia70c1e72012-05-23 20:27:23 -0300180int kmod_elf_get_section(const struct kmod_elf *elf, const char *section, const void **buf, uint64_t *buf_size) _must_check_ __attribute__((nonnull(1,2,3,4)));
Lucas De Marchiea17e2b2012-01-26 01:21:17 -0200181
Michal Marek8fe16812013-01-16 09:52:01 +0100182/* libkmod-signature.c */
183struct kmod_signature_info {
184 const char *signer;
185 size_t signer_len;
186 const char *key_id;
187 size_t key_id_len;
188 const char *algo, *hash_algo, *id_type;
189};
190bool kmod_module_signature_info(const struct kmod_file *file, struct kmod_signature_info *sig_info) _must_check_ __attribute__((nonnull(1, 2)));