| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| /* |
| * Copyright (C) 2011-2013 ProFUSION embedded systems |
| */ |
| |
| #pragma once |
| #ifndef _LIBKMOD_H_ |
| #define _LIBKMOD_H_ |
| |
| #include <fcntl.h> |
| #include <stdarg.h> |
| #include <stdbool.h> |
| #include <inttypes.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * SECTION:libkmod |
| * @short_description: libkmod context |
| * |
| * The context contains the default values for the library user, |
| * and is passed to all library operations. |
| */ |
| |
| /** |
| * kmod_ctx: |
| * |
| * Opaque object representing the library context. |
| */ |
| struct kmod_ctx; |
| |
| /** |
| * kmod_new: |
| * @dirname: what to consider as linux module's directory, if NULL |
| * defaults to $MODULE_DIRECTORY/`uname -r`. If it's relative, |
| * it's treated as relative to the current working directory. |
| * Otherwise, give an absolute dirname. |
| * @config_paths: ordered array of paths (directories or files) where |
| * to load from user-defined configuration parameters such as |
| * alias, blacklists, commands (install, remove). If NULL |
| * defaults to /etc/modprobe.d, /run/modprobe.d, |
| * /usr/local/lib/modprobe.d, DISTCONFDIR/modprobe.d, and |
| * /lib/modprobe.d. Give an empty vector if configuration should |
| * not be read. This array must be null terminated. |
| * |
| * Create kmod library context. This reads the kmod configuration |
| * and fills in the default values. |
| * |
| * The initial refcount is 1, and needs to be decremented to |
| * release the resources of the kmod library context. |
| * |
| * Returns: a new kmod library context |
| * |
| * Since: 1 |
| */ |
| struct kmod_ctx *kmod_new(const char *dirname, const char *const *config_paths); |
| |
| /** |
| * kmod_ref: |
| * @ctx: kmod library context |
| * |
| * Take a reference of the kmod library context. |
| * |
| * Returns: the passed kmod library context |
| * |
| * Since: 1 |
| */ |
| struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_unref: |
| * @ctx: kmod library context |
| * |
| * Drop a reference of the kmod library context. If the refcount |
| * reaches zero, the resources of the context will be released. |
| * |
| * Returns: the passed kmod library context or NULL if it's freed |
| * |
| * Since: 1 |
| */ |
| struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_load_resources: |
| * @ctx: kmod library context |
| * |
| * Load indexes and keep them open in @ctx. This way it's faster to lookup |
| * information within the indexes. If this function is not called before a |
| * search, the necessary index is always opened and closed. |
| * |
| * If user will do more than one or two lookups, insertions, deletions, most |
| * likely it's good to call this function first. Particularly in a daemon like |
| * udev that on boot issues hundreds of calls to lookup the index, calling |
| * this function will speedup the searches. |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 1 |
| */ |
| int kmod_load_resources(struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_unload_resources: |
| * @ctx: kmod library context |
| * |
| * Unload all the indexes. This will free the resources to maintain the index |
| * open and all subsequent searches will need to open and close the index. |
| * |
| * User is free to call kmod_load_resources() and kmod_unload_resources() as |
| * many times as wanted during the lifecycle of @ctx. For example, if a daemon |
| * knows that when starting up it will lookup a lot of modules, it could call |
| * kmod_load_resources() and after the first burst of searches is gone, it |
| * could free the resources by calling kmod_unload_resources(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 1 |
| */ |
| void kmod_unload_resources(struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_resources: |
| * @KMOD_RESOURCES_OK: resources are valid |
| * @KMOD_RESOURCES_MUST_RELOAD: resources are not valid; to resolve call |
| * kmod_unload_resources() and kmod_load_resources() |
| * @KMOD_RESOURCES_MUST_RECREATE: resources are not valid; to resolve @ctx must |
| * be re-created. |
| * |
| * The validity state of the current libkmod resources, returned by |
| * kmod_validate_resources(). |
| */ |
| enum kmod_resources { |
| KMOD_RESOURCES_OK = 0, |
| KMOD_RESOURCES_MUST_RELOAD = 1, |
| KMOD_RESOURCES_MUST_RECREATE = 2, |
| }; |
| |
| /** |
| * kmod_validate_resources: |
| * @ctx: kmod library context |
| * |
| * Check if indexes and configuration files changed on disk and the current |
| * context is not valid anymore. |
| * |
| * Returns: the resources state, valid states are #kmod_resources. |
| * |
| * Since: 3 |
| */ |
| int kmod_validate_resources(struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_index: |
| * @KMOD_INDEX_MODULES_DEP: index of module dependencies |
| * @KMOD_INDEX_MODULES_ALIAS: index of module aliases |
| * @KMOD_INDEX_MODULES_SYMBOL: index of symbol aliases |
| * @KMOD_INDEX_MODULES_BUILTIN_ALIAS: index of builtin module aliases |
| * @KMOD_INDEX_MODULES_BUILTIN: index of builtin module |
| * @_KMOD_INDEX_PAD: DO NOT USE; padding to make sure enum is not mapped to char |
| * |
| * The (module) index type, used by kmod_dump_index(). |
| */ |
| enum kmod_index { |
| KMOD_INDEX_MODULES_DEP = 0, |
| KMOD_INDEX_MODULES_ALIAS, |
| KMOD_INDEX_MODULES_SYMBOL, |
| KMOD_INDEX_MODULES_BUILTIN_ALIAS, |
| KMOD_INDEX_MODULES_BUILTIN, |
| _KMOD_INDEX_PAD = 1U << 31, |
| }; |
| |
| /** |
| * kmod_dump_index: |
| * @ctx: kmod library context |
| * @type: index to dump, valid indexes are #kmod_index |
| * @fd: file descriptor to dump index to |
| * |
| * Dump index to file descriptor. Note that this function doesn't use stdio.h |
| * so call fflush() before calling this function to be sure data is written in |
| * order. |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 4 |
| */ |
| int kmod_dump_index(struct kmod_ctx *ctx, enum kmod_index type, int fd); |
| |
| /** |
| * kmod_set_log_priority: |
| * @ctx: kmod library context |
| * @priority: the new logging priority |
| * |
| * Set the current logging priority, as defined in syslog.h(0P). The value |
| * controls which messages are logged. |
| * |
| * Since: 1 |
| */ |
| void kmod_set_log_priority(struct kmod_ctx *ctx, int priority); |
| |
| /** |
| * kmod_get_log_priority: |
| * @ctx: kmod library context |
| * |
| * Get the current logging priority, as defined in syslog.h(0P). |
| * |
| * Returns: the current logging priority |
| * |
| * Since: 1 |
| */ |
| int kmod_get_log_priority(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_set_log_fn: |
| * @ctx: kmod library context |
| * @log_fn: function to be called for logging messages |
| * @data: data to pass to log function |
| * |
| * The built-in logging writes to stderr. It can be |
| * overridden by a custom function, to plug log messages |
| * into the user's logging functionality. |
| * |
| * Since: 1 |
| */ |
| void kmod_set_log_fn(struct kmod_ctx *ctx, |
| void (*log_fn)(void *log_data, int priority, const char *file, |
| int line, const char *fn, const char *format, |
| va_list args), |
| const void *data); |
| |
| /** |
| * kmod_set_userdata: |
| * @ctx: kmod library context |
| * @userdata: data pointer |
| * |
| * Store custom @userdata in the library context. |
| * |
| * Since: 1 |
| */ |
| void kmod_set_userdata(struct kmod_ctx *ctx, const void *userdata); |
| |
| /** |
| * kmod_get_userdata: |
| * @ctx: kmod library context |
| * |
| * Retrieve stored data pointer from library context. This might be useful |
| * to access from callbacks. |
| * |
| * Returns: stored userdata |
| * |
| * Since: 1 |
| */ |
| void *kmod_get_userdata(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_get_dirname: |
| * @ctx: kmod library context |
| * |
| * Retrieve the absolute path used for linux modules in this context. The path |
| * is computed from the arguments to kmod_new(). |
| * |
| * Since: 22 |
| */ |
| const char *kmod_get_dirname(const struct kmod_ctx *ctx); |
| |
| /** |
| * SECTION:libkmod-list |
| * @short_description: general purpose list |
| * |
| * Access to kmod generated lists. |
| */ |
| |
| /** |
| * kmod_list: |
| * |
| * Opaque object for a circular (doubly linked) list. |
| */ |
| struct kmod_list; |
| |
| /** |
| * kmod_list_foreach: |
| * @curr: the current node in the list |
| * @list: the head of the list |
| * |
| * Iterate over the list @list. |
| */ |
| #define kmod_list_foreach(curr, list) \ |
| for (curr = list; curr != NULL; curr = kmod_list_next(list, curr)) |
| |
| /** |
| * kmod_list_foreach_reverse: |
| * @curr: the current node in the list |
| * @list: the head of the list |
| * |
| * Iterate in reverse over the list @list. |
| */ |
| #define kmod_list_foreach_reverse(curr, list) \ |
| for (curr = kmod_list_last(list); curr != NULL; curr = kmod_list_prev(list, curr)) |
| |
| /** |
| * kmod_list_last: |
| * @list: the head of the list |
| * |
| * Get the last element of the @list. As @list is a circular list, |
| * this is a cheap operation O(1) with the last element being the |
| * previous element. |
| * |
| * If the list has a single element it will return the list itself (as |
| * expected, and this is what differentiates from kmod_list_prev()). |
| * |
| * Returns: last node at @list or NULL if the list is empty. |
| * |
| * Since: 2 |
| */ |
| struct kmod_list *kmod_list_last(const struct kmod_list *list); |
| |
| /** |
| * kmod_list_next: |
| * @list: the head of the list |
| * @curr: the current node in the list |
| * |
| * Get the next node in @list relative to @curr as if @list was not a circular |
| * list. I.e. calling this function in the last node of the list returns |
| * NULL.. It can be used to iterate a list by checking for NULL return to know |
| * when all elements were iterated. |
| * |
| * Returns: node next to @curr or NULL if either this node is the last of or |
| * list is empty. |
| * |
| * Since: 1 |
| */ |
| struct kmod_list *kmod_list_next(const struct kmod_list *list, |
| const struct kmod_list *curr); |
| |
| /** |
| * kmod_list_prev: |
| * @list: the head of the list |
| * @curr: the current node in the list |
| * |
| * Get the previous node in @list relative to @curr as if @list was not a |
| * circular list. I.e.: the previous of the head is NULL. It can be used to |
| * iterate a list by checking for NULL return to know when all elements were |
| * iterated. |
| * |
| * Returns: node previous to @curr or NULL if either this node is the head of |
| * the list or the list is empty. |
| * |
| * Since: 1 |
| */ |
| struct kmod_list *kmod_list_prev(const struct kmod_list *list, |
| const struct kmod_list *curr); |
| |
| /** |
| * SECTION:libkmod-config |
| * @short_description: retrieve current libkmod configuration |
| * |
| * Access to configuration lists - it allows to get each configuration's |
| * key/value stored by kmod. |
| */ |
| |
| /** |
| * kmod_config_iter: |
| * |
| * Opaque object for iterating and retrieving configuration information. |
| */ |
| struct kmod_config_iter; |
| |
| /** |
| * kmod_config_get_blacklists: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the blacklist maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the blacklists or NULL on failure. Free it |
| * with kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_blacklists(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_install_commands: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the install commands maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the install commands or NULL on failure. Free |
| * it with kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_install_commands(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_remove_commands: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the remove commands maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the remove commands or NULL on failure. Free |
| * it with kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_remove_commands(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_aliases: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the aliases maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the aliases or NULL on failure. Free it with |
| * kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_aliases(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_options: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the options maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the options or NULL on failure. Free it with |
| * kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_options(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_softdeps: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the softdeps maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the softdeps or NULL on failure. Free it with |
| * kmod_config_iter_free_iter(). |
| * |
| * Since: 4 |
| */ |
| struct kmod_config_iter *kmod_config_get_softdeps(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_get_weakdeps: |
| * @ctx: kmod library context |
| * |
| * Retrieve an iterator to deal with the weakdeps maintained inside the |
| * library. See kmod_config_iter_get_key(), kmod_config_iter_get_value() and |
| * kmod_config_iter_next(). At least one call to kmod_config_iter_next() must |
| * be made to initialize the iterator and check if it's valid. |
| * |
| * Returns: a new iterator over the weakdeps or NULL on failure. Free it with |
| * kmod_config_iter_free_iter(). |
| * |
| * Since: 33 |
| */ |
| struct kmod_config_iter *kmod_config_get_weakdeps(const struct kmod_ctx *ctx); |
| |
| /** |
| * kmod_config_iter_get_key: |
| * @iter: iterator over a certain configuration |
| * |
| * When using a new allocated iterator, user must perform a call to |
| * kmod_config_iter_next() to initialize iterator's position and check if it's |
| * valid. |
| * |
| * Returns: the key of the current configuration pointed by @iter. |
| * |
| * Since: 4 |
| */ |
| const char *kmod_config_iter_get_key(const struct kmod_config_iter *iter); |
| |
| /** |
| * kmod_config_iter_get_value: |
| * @iter: iterator over a certain configuration |
| * |
| * When using a new allocated iterator, user must perform a call to |
| * kmod_config_iter_next() to initialize iterator's position and check if it's |
| * valid. |
| * |
| * Returns: the value of the current configuration pointed by @iter. |
| * |
| * Since: 4 |
| */ |
| const char *kmod_config_iter_get_value(const struct kmod_config_iter *iter); |
| |
| /** |
| * kmod_config_iter_next: |
| * @iter: iterator over a certain configuration |
| * |
| * Make @iter point to the next item of a certain configuration. It's an |
| * automatically recycling iterator. When it reaches the end, false is |
| * returned; then if user wants to iterate again, it's sufficient to call this |
| * function once more. |
| * |
| * Returns: true if next position of @iter is valid or false if its end is |
| * reached. |
| * |
| * Since: 4 |
| */ |
| bool kmod_config_iter_next(struct kmod_config_iter *iter); |
| |
| /** |
| * kmod_config_iter_free_iter: |
| * @iter: iterator over a certain configuration |
| * |
| * Free resources used by the iterator. |
| * |
| * Since: 4 |
| */ |
| void kmod_config_iter_free_iter(struct kmod_config_iter *iter); |
| |
| /** |
| * SECTION:libkmod-module |
| * @short_description: operate on kernel modules |
| * |
| * Wide range of function to operate on kernel modules - loading, unloading, |
| * reference counting, retrieving a list of module dependencies and more. |
| */ |
| |
| /** |
| * kmod_module: |
| * |
| * Opaque object representing a module. |
| */ |
| struct kmod_module; |
| |
| /** |
| * kmod_module_new_from_lookup: |
| * @ctx: kmod library context |
| * @given_alias: alias to look for |
| * @list: an empty list where to save the list of modules matching |
| * @given_alias |
| * |
| * Create a new list of kmod modules using an alias or module name and lookup |
| * libkmod's configuration files and indexes in order to find the module. |
| * Once it's found in one of the places, it stops searching and create the |
| * list of modules that is saved in @list. |
| * |
| * The search order is: 1. aliases in configuration file; 2. module names in |
| * modules.dep index; 3. symbol aliases in modules.symbols index; 4. aliases |
| * from install commands; 5. builtin indexes from kernel. |
| * |
| * The initial refcount is 1, and needs to be decremented to release the |
| * resources of the kmod_module. The returned @list must be released by |
| * calling kmod_module_unref_list(). Since libkmod keeps track of all |
| * kmod_modules created, they are all released upon @ctx destruction too. Do |
| * not unref @ctx before all the desired operations with the returned list are |
| * completed. |
| * |
| * Returns: 0 on success or < 0 otherwise. It fails if any of the lookup |
| * methods failed, which is basically due to memory allocation fail. If module |
| * is not found, it still returns 0, but @list is an empty list. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_new_from_lookup(struct kmod_ctx *ctx, const char *given_alias, |
| struct kmod_list **list); |
| |
| /** |
| * kmod_module_new_from_name_lookup: |
| * @ctx: kmod library context |
| * @modname: module name to look for |
| * @mod: returned module on success |
| * |
| * Lookup by module name, without considering possible aliases. This is similar |
| * to kmod_module_new_from_lookup(), but don't consider as source indexes and |
| * configurations that work with aliases. When successful, this always resolves |
| * to one and only one module. |
| * |
| * The search order is: 1. module names in modules.dep index; |
| * 2. builtin indexes from kernel. |
| * |
| * The initial refcount is 1, and needs to be decremented to release the |
| * resources of the kmod_module. Since libkmod keeps track of all |
| * kmod_modules created, they are all released upon @ctx destruction too. Do |
| * not unref @ctx before all the desired operations with the returned list are |
| * completed. |
| * |
| * Returns: 0 on success or < 0 otherwise. It fails if any of the lookup |
| * methods failed, which is basically due to memory allocation failure. If |
| * module is not found, it still returns 0, but @mod is left untouched. |
| * |
| * Since: 30 |
| */ |
| int kmod_module_new_from_name_lookup(struct kmod_ctx *ctx, const char *modname, |
| struct kmod_module **mod); |
| |
| /** |
| * kmod_module_new_from_name: |
| * @ctx: kmod library context |
| * @name: name of the module |
| * @mod: where to save the created struct kmod_module |
| * |
| * Create a new struct kmod_module using the module name. @name can not be an |
| * alias, file name or anything else; it must be a module name. There's no |
| * check if the module exists in the system. |
| * |
| * This function is also used internally by many others that return a new |
| * struct kmod_module or a new list of modules. |
| * |
| * The initial refcount is 1, and needs to be decremented to release the |
| * resources of the kmod_module. Since libkmod keeps track of all |
| * kmod_modules created, they are all released upon @ctx destruction too. Do |
| * not unref @ctx before all the desired operations with the returned |
| * kmod_module are done. |
| * |
| * Returns: 0 on success or < 0 otherwise. It fails if name is not a valid |
| * module name or if memory allocation failed. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_new_from_name(struct kmod_ctx *ctx, const char *name, |
| struct kmod_module **mod); |
| |
| /** |
| * kmod_module_new_from_path: |
| * @ctx: kmod library context |
| * @path: path where to find the given module |
| * @mod: where to save the created struct kmod_module |
| * |
| * Create a new struct kmod_module using the module path. @path must be an |
| * existent file within the filesystem and must be accessible to libkmod. |
| * |
| * The initial refcount is 1, and needs to be decremented to release the |
| * resources of the kmod_module. Since libkmod keeps track of all |
| * kmod_modules created, they are all released upon @ctx destruction too. Do |
| * not unref @ctx before all the desired operations with the returned |
| * kmod_module are done. |
| * |
| * If @path is relative, it's treated as relative to the current working |
| * directory. Otherwise, give an absolute path. |
| * |
| * Returns: 0 on success or < 0 otherwise. It fails if file does not exist, if |
| * it's not a valid file for a kmod_module or if memory allocation failed. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_new_from_path(struct kmod_ctx *ctx, const char *path, |
| struct kmod_module **mod); |
| |
| /** |
| * kmod_module_ref: |
| * @mod: kmod module |
| * |
| * Take a reference of the kmod module, incrementing its refcount. |
| * |
| * Returns: the passed @module with its refcount incremented. |
| * |
| * Since: 1 |
| */ |
| struct kmod_module *kmod_module_ref(struct kmod_module *mod); |
| |
| /** |
| * kmod_module_unref: |
| * @mod: kmod module |
| * |
| * Drop a reference of the kmod module. If the refcount reaches zero, its |
| * resources are released. |
| * |
| * Returns: NULL if @mod is NULL or if the module was released. Otherwise it |
| * returns the passed @mod with its refcount decremented. |
| * |
| * Since: 1 |
| */ |
| struct kmod_module *kmod_module_unref(struct kmod_module *mod); |
| |
| /** |
| * kmod_module_unref_list: |
| * @list: list of kmod modules |
| * |
| * Drop a reference of each kmod module in @list and releases the resources |
| * taken by the list itself. |
| * |
| * Returns: 0 |
| * |
| * Since: 1 |
| */ |
| int kmod_module_unref_list(struct kmod_list *list); |
| |
| /** |
| * kmod_insert: |
| * @KMOD_INSERT_FORCE_VERMAGIC: ignore kernel version magic |
| * @KMOD_INSERT_FORCE_MODVERSION: ignore symbol version hashes |
| * |
| * Insertion flags, used by kmod_module_insert_module(). |
| */ |
| enum kmod_insert { |
| KMOD_INSERT_FORCE_VERMAGIC = 0x1, |
| KMOD_INSERT_FORCE_MODVERSION = 0x2, |
| }; |
| |
| /** |
| * kmod_module_insert_module: |
| * @mod: kmod module |
| * @flags: flags are not passed to the kernel, but instead they dictate the |
| * behavior of this function, valid flags #kmod_insert |
| * @options: module's options to pass to the kernel. |
| * |
| * Insert a module in the kernel. It opens the file pointed by @mod, |
| * mmap'ing it and passing to kernel. |
| * |
| * Returns: 0 on success or < 0 on failure. If module is already loaded it |
| * returns -EEXIST. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_insert_module(struct kmod_module *mod, unsigned int flags, |
| const char *options); |
| |
| /** |
| * kmod_probe: |
| * @KMOD_PROBE_FORCE_VERMAGIC: ignore kernel version magic |
| * @KMOD_PROBE_FORCE_MODVERSION: ignore symbol version hashes |
| * @KMOD_PROBE_IGNORE_COMMAND: ignore install commands and softdeps configured |
| * in the system |
| * @KMOD_PROBE_IGNORE_LOADED: do not check whether the module is already |
| * live in the kernel or not |
| * @KMOD_PROBE_DRY_RUN: dry run, do not insert module, just call the |
| * associated callback function |
| * @KMOD_PROBE_FAIL_ON_LOADED: probe will fail if KMOD_PROBE_IGNORE_LOADED is |
| * not specified and the module is already live in the kernel |
| * @KMOD_PROBE_APPLY_BLACKLIST_ALL: prior to probe, apply KMOD_FILTER_BLACKLIST |
| * filter to this module and its dependencies. If any of them are blacklisted |
| * and the blacklisted module is not live in the kernel, the function returns |
| * early with thus enum |
| * @KMOD_PROBE_APPLY_BLACKLIST: probe will return early with this enum, if the |
| * module is blacklisted |
| * @KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY: probe will return early with this |
| * enum, if the module is an alias and is blacklisted |
| * |
| * Bitmask which defines the behaviour of kmod_module_probe_insert_module(). |
| */ |
| enum kmod_probe { |
| KMOD_PROBE_FORCE_VERMAGIC = 0x00001, |
| KMOD_PROBE_FORCE_MODVERSION = 0x00002, |
| KMOD_PROBE_IGNORE_COMMAND = 0x00004, |
| KMOD_PROBE_IGNORE_LOADED = 0x00008, |
| KMOD_PROBE_DRY_RUN = 0x00010, |
| KMOD_PROBE_FAIL_ON_LOADED = 0x00020, |
| |
| /* codes below can be used in return value, too */ |
| KMOD_PROBE_APPLY_BLACKLIST_ALL = 0x10000, |
| KMOD_PROBE_APPLY_BLACKLIST = 0x20000, |
| KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY = 0x40000, |
| }; |
| |
| /** |
| * kmod_module_probe_insert_module: |
| * @mod: kmod module |
| * @flags: flags are not passed to the kernel, but instead they dictate the |
| * behavior of this function, valid flags are #kmod_probe |
| * @extra_options: module's options to pass to the kernel. It applies only |
| * to @mod, not to its dependencies. |
| * @run_install: function to run when @mod is backed by an install command. |
| * @data: data to give back to @run_install callback |
| * @print_action: function to call with the action being taken (install or |
| * insmod). It's useful for tools like modprobe when running with verbose |
| * output or in dry-run mode. |
| * |
| * Insert a module in the kernel resolving dependencies, soft dependencies, |
| * install commands and applying blacklist. |
| * |
| * If @run_install is NULL, this function will fork and exec by calling |
| * system(3). Don't pass a NULL argument in @run_install if your binary is |
| * setuid/setgid (see warning in system(3)). If you need control over the |
| * execution of an install command, give a callback function instead. |
| * |
| * Returns: 0 on success, > 0 if stopped by a reason given in @flags or < 0 on |
| * failure. |
| * |
| * Since: 3 |
| */ |
| int kmod_module_probe_insert_module( |
| struct kmod_module *mod, unsigned int flags, const char *extra_options, |
| int (*run_install)(struct kmod_module *m, const char *cmdline, void *data), |
| const void *data, |
| void (*print_action)(struct kmod_module *m, bool install, const char *options)); |
| |
| /** |
| * kmod_remove: |
| * @KMOD_REMOVE_FORCE: force remove module regardless if it's still in |
| * use by a kernel subsystem or other process; passed directly to the kernel |
| * @KMOD_REMOVE_NOWAIT: always set, pass O_NONBLOCK to delete_module(2); |
| * passed directly to the kernel |
| * @KMOD_REMOVE_NOLOG: when module removal fails, do not log anything; not |
| * passed to the kernel |
| * |
| * Removal flags, used by kmod_module_remove_module(). |
| */ |
| enum kmod_remove { |
| KMOD_REMOVE_FORCE = O_TRUNC, |
| KMOD_REMOVE_NOWAIT = O_NONBLOCK, |
| KMOD_REMOVE_NOLOG = 1, |
| }; |
| |
| /** |
| * kmod_module_remove_module: |
| * @mod: kmod module |
| * @flags: flags used when removing the module, valid flags are #kmod_remove |
| * |
| * Remove a module from the kernel. |
| * |
| * Returns: 0 on success or < 0 on failure. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_remove_module(struct kmod_module *mod, unsigned int flags); |
| |
| /** |
| * kmod_module_get_module: |
| * @entry: an entry in a list of kmod modules. |
| * |
| * Get the kmod module of this @entry in the list, increasing its refcount. |
| * After it's used, unref it. Since the refcount is incremented upon return, |
| * you still have to call kmod_module_unref_list() to release the list of kmod |
| * modules. |
| * |
| * Returns: NULL on failure or the kmod_module contained in this list entry |
| * with its refcount incremented. |
| * |
| * Since: 1 |
| */ |
| struct kmod_module *kmod_module_get_module(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_get_dependencies: |
| * @mod: kmod module |
| * |
| * Search the modules.dep index to find the dependencies of the given @mod. |
| * The result is cached in @mod, so subsequent calls to this function will |
| * return the already searched list of modules. |
| * |
| * Returns: NULL on failure. Otherwise it returns a list of kmod modules |
| * that can be released by calling kmod_module_unref_list(). |
| * |
| * Since: 1 |
| */ |
| struct kmod_list *kmod_module_get_dependencies(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_softdeps: |
| * @mod: kmod module |
| * @pre: where to save the list of preceding soft dependencies. |
| * @post: where to save the list of post soft dependencies. |
| * |
| * Get soft dependencies for this kmod module. Soft dependencies come |
| * from configuration file and are not cached in @mod because it may include |
| * dependency cycles that would make we leak kmod_module. Any call |
| * to this function will search for this module in configuration, allocate a |
| * list and return the result. |
| * |
| * Both @pre and @post are newly created list of kmod_module and |
| * should be unreferenced with kmod_module_unref_list(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 2 |
| */ |
| int kmod_module_get_softdeps(const struct kmod_module *mod, struct kmod_list **pre, |
| struct kmod_list **post); |
| |
| /** |
| * kmod_module_get_weakdeps: |
| * @mod: kmod module |
| * @weak: where to save the list of weak dependencies. |
| * |
| * Get weak dependencies for this kmod module. Weak dependencies come |
| * from configuration file and are not cached in @mod because it may include |
| * dependency cycles that would make we leak kmod_module. Any call |
| * to this function will search for this module in configuration, allocate a |
| * list and return the result. |
| * |
| * @weak is newly created list of kmod_module and |
| * should be unreferenced with kmod_module_unref_list(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 33 |
| */ |
| int kmod_module_get_weakdeps(const struct kmod_module *mod, struct kmod_list **weak); |
| |
| /** |
| * kmod_filter: |
| * @KMOD_FILTER_BLACKLIST: filter modules in blacklist out |
| * @KMOD_FILTER_BUILTIN: filter builtin modules out |
| * |
| * Bitmask defining what gets filtered out, used by kmod_module_apply_filter(). |
| */ |
| enum kmod_filter { |
| KMOD_FILTER_BLACKLIST = 0x00001, |
| KMOD_FILTER_BUILTIN = 0x00002, |
| }; |
| |
| /** |
| * kmod_module_apply_filter: |
| * @ctx: kmod library context |
| * @filter_type: bitmask to filter modules out, valid types are #kmod_filter |
| * @input: list of kmod_module to be filtered |
| * @output: where to save the new list |
| * |
| * Given a list @input, this function filter it out by the filter mask |
| * and save it in @output. |
| * |
| * Returns: 0 on success or < 0 otherwise. @output is saved with the updated |
| * list. |
| * |
| * Since: 6 |
| */ |
| int kmod_module_apply_filter(const struct kmod_ctx *ctx, enum kmod_filter filter_type, |
| const struct kmod_list *input, struct kmod_list **output); |
| |
| /** |
| * kmod_module_get_filtered_blacklist: |
| * @ctx: kmod library context |
| * @input: list of kmod_module to be filtered with blacklist |
| * @output: where to save the new list |
| * |
| * This function should not be used. Use kmod_module_apply_filter instead. |
| * |
| * Given a list @input, this function filter it out with config's blacklist |
| * and save it in @output. |
| * |
| * Returns: 0 on success or < 0 otherwise. @output is saved with the updated |
| * list. |
| * |
| * Since: 1 |
| * Deprecated: 6: Use #kmod_module_apply_filter instead. |
| */ |
| int kmod_module_get_filtered_blacklist(const struct kmod_ctx *ctx, |
| const struct kmod_list *input, |
| struct kmod_list **output) |
| __attribute__((deprecated)); |
| |
| /** |
| * kmod_module_get_install_commands: |
| * @mod: kmod module |
| * |
| * Get install commands for this kmod module. Install commands come from the |
| * configuration file and are cached in @mod. The first call to this function |
| * will search for this module in configuration and subsequent calls return |
| * the cached string. The install commands are returned as they were in the |
| * configuration, concatenated by ';'. No other processing is made in this |
| * string. |
| * |
| * Returns: a string with all install commands separated by semicolons. This |
| * string is owned by @mod, do not free it. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_get_install_commands(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_remove_commands: |
| * @mod: kmod module |
| * |
| * Get remove commands for this kmod module. Remove commands come from the |
| * configuration file and are cached in @mod. The first call to this function |
| * will search for this module in configuration and subsequent calls return |
| * the cached string. The remove commands are returned as they were in the |
| * configuration, concatenated by ';'. No other processing is made in this |
| * string. |
| * |
| * Returns: a string with all remove commands separated by semicolons. This |
| * string is owned by @mod, do not free it. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_get_remove_commands(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_name: |
| * @mod: kmod module |
| * |
| * Get the name of this kmod module. Name is always available, independently |
| * if it was created by kmod_module_new_from_name() or another function and |
| * it's always normalized (dashes are replaced with underscores). |
| * |
| * Returns: the name of this kmod module. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_get_name(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_options: |
| * @mod: kmod module |
| * |
| * Get options of this kmod module. Options come from the configuration file |
| * and are cached in @mod. The first call to this function will search for |
| * this module in configuration and subsequent calls return the cached string. |
| * |
| * Returns: a string with all the options separated by spaces. This string is |
| * owned by @mod, do not free it. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_get_options(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_path: |
| * @mod: kmod module |
| * |
| * Get the path of this kmod module. If this kmod module was not created by |
| * path, it can search the modules.dep index in order to find out the module |
| * under context's dirname. |
| * |
| * Returns: the path of this kmod module or NULL if such information is not |
| * available. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_get_path(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_dependency_symbols: |
| * @mod: kmod module |
| * @list: where to return list of module dependency_symbols |
| * |
| * Get a list of entries in ELF section ".symtab" or "__ksymtab_strings". |
| * |
| * The structure contained in this list is internal to libkmod and its fields |
| * can be obtainsed by calling kmod_module_dependency_symbol_get_crc() and |
| * kmod_module_dependency_symbol_get_symbol(). |
| * |
| * After use, free the @list by calling |
| * kmod_module_dependency_symbols_free_list(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 3 |
| */ |
| int kmod_module_get_dependency_symbols(const struct kmod_module *mod, |
| struct kmod_list **list); |
| |
| /** |
| * kmod_symbol_bind: |
| * @KMOD_SYMBOL_NONE: no or unknown symbol type |
| * @KMOD_SYMBOL_LOCAL: local symbol, accessible only within the module |
| * @KMOD_SYMBOL_GLOBAL: global symbol, accessible by all modules |
| * @KMOD_SYMBOL_WEAK: weak symbol, a lower precedence global symbols |
| * @KMOD_SYMBOL_UNDEF: undefined or not yet resolved symbol |
| * |
| * The symbol bind type, see kmod_module_dependency_symbol_get_bind(). |
| */ |
| enum kmod_symbol_bind { |
| KMOD_SYMBOL_NONE = '\0', |
| KMOD_SYMBOL_LOCAL = 'L', |
| KMOD_SYMBOL_GLOBAL = 'G', |
| KMOD_SYMBOL_WEAK = 'W', |
| KMOD_SYMBOL_UNDEF = 'U', |
| }; |
| |
| /** |
| * kmod_module_dependency_symbol_get_bind: |
| * @entry: a list entry representing a kmod module dependency_symbol |
| * |
| * Get the bind type of a kmod module dependency_symbol. |
| * |
| * Returns: the bind of this kmod module dependency_symbol on success, |
| * or < 0 on failure. Valid bind types are #kmod_symbol_bind. |
| * |
| * Since: 3 |
| */ |
| int kmod_module_dependency_symbol_get_bind(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_dependency_symbol_get_crc: |
| * @entry: a list entry representing a kmod module dependency_symbol |
| * |
| * Get the crc of a kmod module dependency_symbol. |
| * |
| * Returns: the crc of this kmod module dependency_symbol if available, otherwise default to 0. |
| * |
| * Since: 3 |
| */ |
| uint64_t kmod_module_dependency_symbol_get_crc(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_dependency_symbol_get_symbol: |
| * @entry: a list entry representing a kmod module dependency_symbols |
| * |
| * Get the dependency symbol of a kmod module |
| * |
| * Returns: the symbol of this kmod module dependency_symbols on success or NULL |
| * on failure. The string is owned by the dependency_symbols, do not free it. |
| * |
| * Since: 3 |
| */ |
| const char *kmod_module_dependency_symbol_get_symbol(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_dependency_symbols_free_list: |
| * @list: kmod module dependency_symbols list |
| * |
| * Release the resources taken by @list |
| * |
| * Since: 3 |
| */ |
| void kmod_module_dependency_symbols_free_list(struct kmod_list *list); |
| |
| /** |
| * kmod_module_get_sections: |
| * @mod: kmod module |
| * |
| * Get a list of kmod sections of this @mod, as returned by the kernel. |
| * |
| * The structure contained in this list is internal to libkmod and its fields |
| * can be obtained by calling kmod_module_section_get_name() and |
| * kmod_module_section_get_address(). |
| * |
| * After use, free the @list by calling kmod_module_section_free_list(). |
| * |
| * Returns: a new list of kmod module sections on success or NULL on failure. |
| * |
| * Since: 1 |
| */ |
| struct kmod_list *kmod_module_get_sections(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_section_get_address: |
| * @entry: a list entry representing a kmod module section |
| * |
| * Get the address of a kmod module section. |
| * |
| * Returns: the address of this kmod module section on success or ULONG_MAX |
| * on failure. |
| * |
| * Since: 1 |
| */ |
| unsigned long kmod_module_section_get_address(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_section_get_name: |
| * @entry: a list entry representing a kmod module section |
| * |
| * Get the name of a kmod module section. |
| * |
| * Returns: the name of this kmod module section on success or NULL on |
| * failure. The string is owned by the section, do not free it. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_section_get_name(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_section_free_list: |
| * @list: kmod module section list |
| * |
| * Release the resources taken by @list |
| * |
| * Since: 1 |
| */ |
| void kmod_module_section_free_list(struct kmod_list *list); |
| |
| /** |
| * kmod_module_get_symbols: |
| * @mod: kmod module |
| * @list: where to return list of module symbols |
| * |
| * Get a list of entries in ELF section ".symtab" or "__ksymtab_strings". |
| * |
| * The structure contained in this list is internal to libkmod and its fields |
| * can be obtainsed by calling kmod_module_symbol_get_crc() and |
| * kmod_module_symbol_get_symbol(). |
| * |
| * After use, free the @list by calling kmod_module_symbols_free_list(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 3 |
| */ |
| int kmod_module_get_symbols(const struct kmod_module *mod, struct kmod_list **list); |
| |
| /** |
| * kmod_module_symbol_get_crc: |
| * @entry: a list entry representing a kmod module symbol |
| * |
| * Get the crc of a kmod module symbol. |
| * |
| * Returns: the crc of this kmod module symbol if available, otherwise default to 0. |
| * |
| * Since: 3 |
| */ |
| uint64_t kmod_module_symbol_get_crc(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_symbol_get_symbol: |
| * @entry: a list entry representing a kmod module symbols |
| * |
| * Get the symbol of a kmod module symbols. |
| * |
| * Returns: the symbol of this kmod module symbols on success or NULL |
| * on failure. The string is owned by the symbols, do not free it. |
| * |
| * Since: 3 |
| */ |
| const char *kmod_module_symbol_get_symbol(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_symbols_free_list: |
| * @list: kmod module symbols list |
| * |
| * Release the resources taken by @list |
| * |
| * Since: 3 |
| */ |
| void kmod_module_symbols_free_list(struct kmod_list *list); |
| |
| /** |
| * kmod_module_get_versions: |
| * @mod: kmod module |
| * @list: where to return list of module versions |
| * |
| * Get a list of entries in ELF section "__versions". |
| * |
| * The structure contained in this list is internal to libkmod and its fields |
| * can be obtainsed by calling kmod_module_version_get_crc() and |
| * kmod_module_version_get_symbol(). |
| * |
| * After use, free the @list by calling kmod_module_versions_free_list(). |
| * |
| * Returns: 0 on success or < 0 otherwise. |
| * |
| * Since: 2 |
| */ |
| int kmod_module_get_versions(const struct kmod_module *mod, struct kmod_list **list); |
| |
| /** |
| * kmod_module_version_get_crc: |
| * @entry: a list entry representing a kmod module version |
| * |
| * Get the crc of a kmod module version. |
| * |
| * Returns: the crc of this kmod module version if available, otherwise default to 0. |
| * |
| * Since: 2 |
| */ |
| uint64_t kmod_module_version_get_crc(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_version_get_symbol: |
| * @entry: a list entry representing a kmod module versions |
| * |
| * Get the symbol of a kmod module versions. |
| * |
| * Returns: the symbol of this kmod module versions on success or NULL |
| * on failure. The string is owned by the versions, do not free it. |
| * |
| * Since: 2 |
| */ |
| const char *kmod_module_version_get_symbol(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_versions_free_list: |
| * @list: kmod module versions list |
| * |
| * Release the resources taken by @list |
| * |
| * Since: 2 |
| */ |
| void kmod_module_versions_free_list(struct kmod_list *list); |
| |
| /** |
| * kmod_module_get_info: |
| * @mod: kmod module |
| * @list: where to return list of module information |
| * |
| * Get a list of entries in ELF section ".modinfo", these contain |
| * alias, license, depends, vermagic and other keys with respective |
| * values. If the module is signed (CONFIG_MODULE_SIG), information |
| * about the module signature is included as well: signer, |
| * sig_key and sig_hashalgo. |
| * |
| * The structure contained in this list is internal to libkmod and its fields |
| * can be obtainsed by calling kmod_module_info_get_key() and |
| * kmod_module_info_get_value(). |
| * |
| * After use, free the @list by calling kmod_module_info_free_list(). |
| * |
| * Returns: number of entries in @list on success or < 0 otherwise. |
| * |
| * Since: 2 |
| */ |
| int kmod_module_get_info(const struct kmod_module *mod, struct kmod_list **list); |
| |
| /** |
| * kmod_module_info_get_key: |
| * @entry: a list entry representing a kmod module info |
| * |
| * Get the key of a kmod module info. |
| * |
| * Returns: the key of this kmod module info on success or NULL on |
| * failure. The string is owned by the info, do not free it. |
| * |
| * Since: 2 |
| */ |
| const char *kmod_module_info_get_key(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_info_get_value: |
| * @entry: a list entry representing a kmod module info |
| * |
| * Get the value of a kmod module info. |
| * |
| * Returns: the value of this kmod module info on success or NULL on |
| * failure. The string is owned by the info, do not free it. |
| * |
| * Since: 2 |
| */ |
| const char *kmod_module_info_get_value(const struct kmod_list *entry); |
| |
| /** |
| * kmod_module_info_free_list: |
| * @list: kmod module info list |
| * |
| * Release the resources taken by @list |
| * |
| * Since: 2 |
| */ |
| void kmod_module_info_free_list(struct kmod_list *list); |
| |
| /** |
| * SECTION:libkmod-loaded |
| * @short_description: currently loaded modules |
| * |
| * Information about currently loaded modules, as reported by the kernel. |
| * These information are not cached by libkmod and are always read from /sys |
| * and /proc/modules. |
| */ |
| |
| /** |
| * kmod_module_new_from_loaded: |
| * @ctx: kmod library context |
| * @list: where to save the list of loaded modules |
| * |
| * Create a new list of kmod modules with all modules currently loaded in |
| * kernel. It uses /proc/modules to get the names of loaded modules and to |
| * create kmod modules by calling kmod_module_new_from_name() in each of them. |
| * They are put in @list in no particular order. |
| * |
| * The initial refcount is 1, and needs to be decremented to release the |
| * resources of the kmod_module. The returned @list must be released by |
| * calling kmod_module_unref_list(). Since libkmod keeps track of all |
| * kmod_modules created, they are all released upon @ctx destruction too. Do |
| * not unref @ctx before all the desired operations with the returned list are |
| * completed. |
| * |
| * Returns: 0 on success or < 0 on error. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_new_from_loaded(struct kmod_ctx *ctx, struct kmod_list **list); |
| |
| /** |
| * kmod_module_initstate: |
| * @KMOD_MODULE_BUILTIN: module is builtin |
| * @KMOD_MODULE_LIVE: module is live in the kernel |
| * @KMOD_MODULE_COMING: module is being loaded |
| * @KMOD_MODULE_GOING: module is being unloaded |
| * @_KMOD_MODULE_PAD: DO NOT USE; padding to make sure enum is not mapped to char |
| * |
| * The module "live information" as reported by the kernel, see |
| * kmod_module_get_initstate(). |
| */ |
| enum kmod_module_initstate { |
| KMOD_MODULE_BUILTIN = 0, |
| KMOD_MODULE_LIVE, |
| KMOD_MODULE_COMING, |
| KMOD_MODULE_GOING, |
| _KMOD_MODULE_PAD = 1U << 31, |
| }; |
| |
| /** |
| * kmod_module_get_initstate: |
| * @mod: kmod module |
| * |
| * Get the initstate of this @mod, as returned by the kernel, by reading |
| * /sys filesystem. |
| * |
| * Returns: < 0 on error or module state if module is found in the kernel, valid |
| * states are #kmod_module_initstate. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_get_initstate(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_initstate_str: |
| * @state: the state as returned by kmod_module_get_initstate() |
| * |
| * Translate a initstate to a string. |
| * |
| * Returns: the string associated to the @state. This string is statically |
| * allocated, do not free it. |
| * |
| * Since: 1 |
| */ |
| const char *kmod_module_initstate_str(enum kmod_module_initstate state); |
| |
| /** |
| * kmod_module_get_size: |
| * @mod: kmod module |
| * |
| * Get the size of this kmod module as returned by the kernel. If supported, |
| * the size is read from the coresize attribute in /sys/module. For older |
| * kernels, this falls back on /proc/modules and searches for the specified |
| * module to get its size. |
| * |
| * Returns: the size of this kmod module. |
| * |
| * Since: 1 |
| */ |
| long kmod_module_get_size(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_refcnt: |
| * @mod: kmod module |
| * |
| * Get the ref count of this @mod, as returned by the kernel, by reading |
| * /sys filesystem. |
| * |
| * Returns: the reference count on success or < 0 on failure. |
| * |
| * Since: 1 |
| */ |
| int kmod_module_get_refcnt(const struct kmod_module *mod); |
| |
| /** |
| * kmod_module_get_holders: |
| * @mod: kmod module |
| * |
| * Get a list of kmod modules that are holding this @mod, as returned by Linux |
| * Kernel. After use, free the @list by calling kmod_module_unref_list(). |
| * |
| * Returns: a new list of kmod modules on success or NULL on failure. |
| * |
| * Since: 1 |
| */ |
| struct kmod_list *kmod_module_get_holders(const struct kmod_module *mod); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |
| #endif |