diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml new file mode 100644 index 0000000..24061aa --- /dev/null +++ b/.github/workflows/doc.yml @@ -0,0 +1,61 @@ +name: Publish docs + +on: + repository_dispatch: + types: [publish-doc] + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Echo + run: | + echo "Triggered by ${{ github.event.client_payload.source }}, version ${{ github.event.client_payload.version }}" + + - name: Checkout + uses: actions/checkout@v1 # V1 does it by git clone, other versions do it by calling REST APIs. + with: + ref: 'pages' + + - name: Generate frontpage + run: | + echo "# kmod API Document" > README.md + echo >> README.md + echo "- [master (development)](master/index.html)" >> README.md + ls -lr | awk '{print $1, $9}' | awk '/^d.* v/ {print "- ["$2"]("$2"/index.html)"}' >> README.md + + - name: Commit and push + uses: actions-js/push@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + author_name: 'github-actions[bot]' + author_email: '41898282+github-actions[bot]@users.noreply.github.com' + message: 'Auto-generating frontpage for ${{ github.event.client_payload.version }}' + branch: 'pages' + empty: true + + - name: Jekyll building + uses: actions/jekyll-build-pages@v1 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + permissions: + pages: write + id-token: write + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/README.md b/README.md index d8aa4c2..44b9d9f 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -Documentation website for kmod +# kmod API Document + +- [master (development)](master/index.html) +- [v33](v33/index.html) +- [v32](v32/index.html) diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..ce90419 --- /dev/null +++ b/_config.yml @@ -0,0 +1,5 @@ +title: kmod +description: kmod - Linux kernel module handling +show_downloads: false +google_analytics: +theme: jekyll-theme-hacker # For Open-Source Hackthon :) diff --git a/_includes/head-custom-google-analytics.html b/_includes/head-custom-google-analytics.html new file mode 100644 index 0000000..8a3ae5c --- /dev/null +++ b/_includes/head-custom-google-analytics.html @@ -0,0 +1,10 @@ +{% if site.google_analytics %} + +{% endif %} diff --git a/_includes/head-custom-theme-colors.html b/_includes/head-custom-theme-colors.html new file mode 100644 index 0000000..a30e708 --- /dev/null +++ b/_includes/head-custom-theme-colors.html @@ -0,0 +1,5 @@ + + + + + diff --git a/_includes/head-custom.html b/_includes/head-custom.html new file mode 100644 index 0000000..44cdb83 --- /dev/null +++ b/_includes/head-custom.html @@ -0,0 +1,12 @@ + + + +{% include head-custom-theme-colors.html %} + + +{% include head-custom-google-analytics.html %} + + + + + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..1c8c883 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,38 @@ + + +
+ + + + + {% include head-custom.html %} + +{% seo %} + + + + +by {{ page.author | default: site.author }}
+ +{{content}} + +{% if page.tags %} + tags: {{ page.tags | join: " - " }} +{% endif %} diff --git a/_sass/_default_colors.scss b/_sass/_default_colors.scss new file mode 100644 index 0000000..dee878d --- /dev/null +++ b/_sass/_default_colors.scss @@ -0,0 +1,15 @@ +$apple-blossom: #ac4142; +$alto: #d0d0d0; +$bouquet: #aa759f; +$chelsea-cucumber: #90a959; +$cod-grey: #151515; +$conifer: #b5e853; +$dove-grey: #666; +$gallery: #eaeaea; +$grey: #888; +$gulf-stream: #75b5aa; +$hippie-blue: #6a9fb5; +$potters-clay: #8f5536; +$rajah: #f4bf75; +$raw-sienna: #d28445; +$silver-chalice: #aaa; diff --git a/_sass/hacker.scss b/_sass/hacker.scss new file mode 100644 index 0000000..b535d24 --- /dev/null +++ b/_sass/hacker.scss @@ -0,0 +1,4 @@ +// Placeholder file. If your site uses +// @import "{{ site.theme }}"; +// Then using this theme with jekyll-remote-theme will work fine. +@import "jekyll-theme-hacker"; diff --git a/_sass/jekyll-theme-hacker.scss b/_sass/jekyll-theme-hacker.scss new file mode 100644 index 0000000..b3123a1 --- /dev/null +++ b/_sass/jekyll-theme-hacker.scss @@ -0,0 +1,268 @@ +@import "rouge-base16-dark"; +@import "default_colors"; + +$body-background: $cod-grey !default; +$body-foreground: $gallery !default; +$header: $conifer !default; +$blockquote-color: $silver-chalice !default; +$blockquote-border: $dove-grey !default; +$container-max-width: 1000px; + +@mixin media-max-width($max-width) { + @media (max-width: $max-width) { + @content; + } +} + +body { + margin: 0; + padding: 0; + background: $body-background url("../images/bkg.png") 0 0; + color: $body-foreground; + font-size: 16px; + line-height: 1.5; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; +} + +/* General & 'Reset' Stuff */ + +.container { + width: 90%; + max-width: $container-max-width; + margin: 0 auto; +} + +section { + display: block; + margin: 0 0 20px 0; +} + +h1, h2, h3, h4, h5, h6 { + margin: 0 0 20px; +} + +li { + line-height: 1.4 ; +} + +/* Header,| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
libkmod Reference Manual |
|---|
for libkmod version "34" +
| +Top + | +
| struct kmod_config_iter * + | ++kmod_config_get_blacklists () + | +
| struct kmod_config_iter * + | ++kmod_config_get_install_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_remove_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_aliases () + | +
| struct kmod_config_iter * + | ++kmod_config_get_options () + | +
| struct kmod_config_iter * + | ++kmod_config_get_softdeps () + | +
| struct kmod_config_iter * + | ++kmod_config_get_weakdeps () + | +
| const char * + | ++kmod_config_iter_get_key () + | +
| const char * + | ++kmod_config_iter_get_value () + | +
| +bool + | ++kmod_config_iter_next () + | +
| +void + | ++kmod_config_iter_free_iter () + | +
Access to configuration lists - it allows to get each configuration's +key/value stored by kmod.
+struct kmod_config_iter *
+kmod_config_get_blacklists (const struct kmod_ctx *ctx);
+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.
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_install_commands (const struct kmod_ctx *ctx);
+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.
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_remove_commands (const struct kmod_ctx *ctx);
+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.
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_aliases (const struct kmod_ctx *ctx);
+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.
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_options (const struct kmod_ctx *ctx);
+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.
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_softdeps (const struct kmod_ctx *ctx);
+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.
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_weakdeps (const struct kmod_ctx *ctx);
+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.
a new iterator over the weakdeps or NULL on failure. Free it with
+kmod_config_iter_free_iter().
Since: 33
+const char *
+kmod_config_iter_get_key (const struct kmod_config_iter *iter);
+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.
Since: 4
+const char *
+kmod_config_iter_get_value (const struct kmod_config_iter *iter);
+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.
Since: 4
+bool
+kmod_config_iter_next (struct kmod_config_iter *iter);
+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.
Since: 4
+void
+kmod_config_iter_free_iter (struct kmod_config_iter *iter);
+Free resources used by the iterator.
+ +Since: 4
+| +Top + | +
| #define | ++kmod_list_foreach() + | +
| #define | ++kmod_list_foreach_reverse() + | +
| struct kmod_list * + | ++kmod_list_last () + | +
| struct kmod_list * + | ++kmod_list_next () + | +
| struct kmod_list * + | ++kmod_list_prev () + | +
#define kmod_list_foreach_reverse(curr, list)+
Iterate in reverse over the list list
+.
struct kmod_list *
+kmod_list_last (const struct kmod_list *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()).
Since: 2
+struct kmod_list * +kmod_list_next (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
list |
+the head of the list |
++ |
curr |
+the current node in the list |
++ |
Since: 1
+struct kmod_list * +kmod_list_prev (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
list |
+the head of the list |
++ |
curr |
+the current node in the list |
++ |
node previous to curr
+or NULL if either this node is the head of
+the list or the list is empty.
Since: 1
+| +Top + | +
| +int + | ++kmod_module_new_from_loaded () + | +
| +int + | ++kmod_module_get_initstate () + | +
| const char * + | ++kmod_module_initstate_str () + | +
| +long + | ++kmod_module_get_size () + | +
| +int + | ++kmod_module_get_refcnt () + | +
| struct kmod_list * + | ++kmod_module_get_holders () + | +
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.
+int +kmod_module_new_from_loaded (+struct kmod_ctx *ctx, +struct kmod_list **list);
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.
ctx |
+kmod library context |
++ |
list |
+where to save the list of loaded modules |
++ |
Since: 1
+int
+kmod_module_get_initstate (const struct kmod_module *mod);
+Get the initstate of this mod
+, as returned by the kernel, by reading
+/sys filesystem.
< 0 on error or module state if module is found in the kernel, valid +states are kmod_module_initstate.
+Since: 1
+const char *
+kmod_module_initstate_str (enum kmod_module_initstate state);
+Translate a initstate to a string.
+ + the string associated to the state
+. This string is statically
+allocated, do not free it.
Since: 1
+long
+kmod_module_get_size (const struct kmod_module *mod);
+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.
+ + +Since: 1
+int
+kmod_module_get_refcnt (const struct kmod_module *mod);
+Get the ref count of this mod
+, as returned by the kernel, by reading
+/sys filesystem.
Since: 1
+struct kmod_list *
+kmod_module_get_holders (const struct kmod_module *mod);
+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().
Since: 1
+The module "live information" as reported by the kernel, see
+kmod_module_get_initstate().
| +Top + | +
| struct | +kmod_module | +
| enum | +kmod_insert | +
| enum | +kmod_probe | +
| enum | +kmod_remove | +
| enum | +kmod_filter | +
| enum | +kmod_symbol_bind | +
Wide range of function to operate on kernel modules - loading, unloading, +reference counting, retrieving a list of module dependencies and more.
+int +kmod_module_new_from_lookup (+struct kmod_ctx *ctx, +const char *given_alias, +struct kmod_list **list);
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.
ctx |
+kmod library context |
++ |
given_alias |
+alias to look for |
++ |
list |
+an empty list where to save the list of modules matching
+ |
++ |
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_name_lookup (+struct kmod_ctx *ctx, +const char *modname, +struct kmod_module **mod);
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;
+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.
ctx |
+kmod library context |
++ |
modname |
+module name to look for |
++ |
mod |
+returned module on success |
++ |
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 (+struct kmod_ctx *ctx, +const char *name, +struct kmod_module **mod);
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.
ctx |
+kmod library context |
++ |
name |
+name of the module |
++ |
mod |
+where to save the created struct kmod_module |
++ |
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_path (+struct kmod_ctx *ctx, +const char *path, +struct kmod_module **mod);
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.
ctx |
+kmod library context |
++ |
path |
+path where to find the given module |
++ |
mod |
+where to save the created struct kmod_module |
++ |
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
+struct kmod_module *
+kmod_module_ref (struct kmod_module *mod);
+Take a reference of the kmod module, incrementing its refcount.
+ + +Since: 1
+struct kmod_module *
+kmod_module_unref (struct kmod_module *mod);
+Drop a reference of the kmod module. If the refcount reaches zero, its +resources are released.
+ + NULL if mod
+is NULL or if the module was released. Otherwise it
+returns the passed mod
+with its refcount decremented.
Since: 1
+int
+kmod_module_unref_list (struct kmod_list *list);
+Drop a reference of each kmod module in list
+ and releases the resources
+taken by the list itself.
Since: 1
+int +kmod_module_insert_module (+struct kmod_module *mod, +unsigned int flags, +const char *options);
Insert a module in the kernel. It opens the file pointed by mod
+,
+mmap'ing it and passing to kernel.
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. |
++ |
Since: 1
+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));
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.
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 |
++ |
run_install |
+function to run when |
++ |
data |
+data to give back to |
++ |
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. |
++ |
Since: 3
+int +kmod_module_remove_module (+struct kmod_module *mod, +unsigned int flags);
Remove a module from the kernel.
+mod |
+kmod module |
++ |
flags |
+flags used when removing the module, valid flags are kmod_remove |
++ |
Since: 1
+struct kmod_module *
+kmod_module_get_module (const struct kmod_list *entry);
+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.
NULL on failure or the kmod_module contained in this list entry +with its refcount incremented.
+Since: 1
+struct kmod_list *
+kmod_module_get_dependencies (const struct kmod_module *mod);
+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.
NULL on failure. Otherwise it returns a list of kmod modules
+that can be released by calling kmod_module_unref_list().
Since: 1
+int +kmod_module_get_softdeps (+const struct kmod_module *mod, +struct kmod_list **pre, +struct kmod_list **post);
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().
mod |
+kmod module |
++ |
pre |
+where to save the list of preceding soft dependencies. |
++ |
post |
+where to save the list of post soft dependencies. |
++ |
Since: 2
+int +kmod_module_get_weakdeps (+const struct kmod_module *mod, +struct kmod_list **weak);
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().
mod |
+kmod module |
++ |
weak |
+where to save the list of weak dependencies. |
++ |
Since: 33
+int +kmod_module_apply_filter (+const struct kmod_ctx *ctx, +enum kmod_filter filter_type, +const struct kmod_list *input, +struct kmod_list **output);
Given a list input
+, this function filter it out by the filter mask
+and save it in output
+.
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 |
++ |
Since: 6
+int +kmod_module_get_filtered_blacklist (+const struct kmod_ctx *ctx, +const struct kmod_list *input, +struct kmod_list **output);
kmod_module_get_filtered_blacklist has been deprecated since version 6 and should not be used in newly-written code.
Use kmod_module_apply_filter instead.
+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
+.
ctx |
+kmod library context |
++ |
input |
+list of kmod_module to be filtered with blacklist |
++ |
output |
+where to save the new list |
++ |
Since: 1
+const char *
+kmod_module_get_install_commands (const struct kmod_module *mod);
+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.
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_remove_commands (const struct kmod_module *mod);
+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.
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_name (const struct kmod_module *mod);
+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).
Since: 1
+const char *
+kmod_module_get_options (const struct kmod_module *mod);
+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.
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_path (const struct kmod_module *mod);
+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.
+ + +Since: 1
+int +kmod_module_get_dependency_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module dependency_symbols |
++ |
Since: 3
+int
+kmod_module_dependency_symbol_get_bind
+ (const struct kmod_list *entry);
+Get the bind type of a kmod module dependency_symbol.
+ +the bind of this kmod module dependency_symbol on success, +or < 0 on failure. Valid bind types are kmod_symbol_bind.
+Since: 3
+uint64_t
+kmod_module_dependency_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module dependency_symbol.
+ + +Since: 3
+const char *
+kmod_module_dependency_symbol_get_symbol
+ (const struct kmod_list *entry);
+Get the dependency symbol of a kmod module
+entry |
+a list entry representing a kmod module dependency_symbols |
++ |
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
+void
+kmod_module_dependency_symbols_free_list
+ (struct kmod_list *list);
+Release the resources taken by list
+
Since: 3
+struct kmod_list *
+kmod_module_get_sections (const struct kmod_module *mod);
+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().
Since: 1
+unsigned long
+kmod_module_section_get_address (const struct kmod_list *entry);
+Get the address of a kmod module section.
+ + +Since: 1
+const char *
+kmod_module_section_get_name (const struct kmod_list *entry);
+Get the name of a kmod module section.
+ +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
+void
+kmod_module_section_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 1
+int +kmod_module_get_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module symbols |
++ |
Since: 3
+uint64_t
+kmod_module_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module symbol.
+ + +Since: 3
+const char *
+kmod_module_symbol_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module symbols.
+ +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
+void
+kmod_module_symbols_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 3
+int +kmod_module_get_versions (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module versions |
++ |
Since: 2
+uint64_t
+kmod_module_version_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module version.
+ + +Since: 2
+const char *
+kmod_module_version_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module versions.
+ +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
+void
+kmod_module_versions_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 2
+int +kmod_module_get_info (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module information |
++ |
Since: 2
+const char *
+kmod_module_info_get_key (const struct kmod_list *entry);
+Get the key of a kmod module info.
+ +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_value (const struct kmod_list *entry);
+Get the value of a kmod module info.
+ +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
+void
+kmod_module_info_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 2
+Bitmask which defines the behaviour of kmod_module_probe_insert_module().
| + |
+ ignore kernel version magic + |
++ |
| + |
+ ignore symbol version hashes + |
++ |
| + |
+ ignore install commands and softdeps configured +in the system + |
++ |
| + |
+ do not check whether the module is already +live in the kernel or not + |
++ |
| + |
+ dry run, do not insert module, just call the +associated callback function + |
++ |
| + |
+ probe will fail if KMOD_PROBE_IGNORE_LOADED is +not specified and the module is already live in the kernel + |
++ |
| + |
+ 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 + |
++ |
| + |
+ probe will return early with this enum, if the +module is blacklisted + |
++ |
| + |
+ probe will return early with this +enum, if the module is an alias and is blacklisted + |
++ |
Removal flags, used by kmod_module_remove_module().
| + |
+ force remove module regardless if it's still in +use by a kernel subsystem or other process; passed directly to the kernel + |
++ |
| + |
+ always set, pass O_NONBLOCK to delete_module(2); +passed directly to the kernel + |
++ |
| + |
+ when module removal fails, do not log anything; not +passed to the kernel + |
++ |
The symbol bind type, see kmod_module_dependency_symbol_get_bind().
| +Top + | +
| struct kmod_ctx * + | ++kmod_new () + | +
| struct kmod_ctx * + | ++kmod_ref () + | +
| struct kmod_ctx * + | ++kmod_unref () + | +
| +int + | ++kmod_load_resources () + | +
| +void + | ++kmod_unload_resources () + | +
| +int + | ++kmod_validate_resources () + | +
| +int + | ++kmod_dump_index () + | +
| +void + | ++kmod_set_log_priority () + | +
| +int + | ++kmod_get_log_priority () + | +
| +void + | ++kmod_set_log_fn () + | +
| +void * + | ++kmod_get_userdata () + | +
| +void + | ++kmod_set_userdata () + | +
| const char * + | ++kmod_get_dirname () + | +
| struct | +kmod_ctx | +
| enum | +kmod_resources | +
| enum | +kmod_index | +
The context contains the default values for the library user, +and is passed to all library operations.
+struct kmod_ctx * +kmod_new (+const char *dirname, +const char *const *config_paths);
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.
+dirname |
+what to consider as linux module's directory, if NULL
+defaults to $MODULE_DIRECTORY/ |
++ |
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. |
++ |
Since: 1
+struct kmod_ctx *
+kmod_ref (struct kmod_ctx *ctx);
+Take a reference of the kmod library context.
+ + +Since: 1
+struct kmod_ctx *
+kmod_unref (struct kmod_ctx *ctx);
+Drop a reference of the kmod library context. If the refcount +reaches zero, the resources of the context will be released.
+ + +Since: 1
+int
+kmod_load_resources (struct kmod_ctx *ctx);
+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.
+ + +Since: 1
+void
+kmod_unload_resources (struct kmod_ctx *ctx);
+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().
Since: 1
+int
+kmod_validate_resources (struct kmod_ctx *ctx);
+Check if indexes and configuration files changed on disk and the current +context is not valid anymore.
+ + +Since: 3
+int +kmod_dump_index (+struct kmod_ctx *ctx, +enum kmod_index type, +int fd);
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.
ctx |
+kmod library context |
++ |
type |
+index to dump, valid indexes are kmod_index |
++ |
fd |
+file descriptor to dump index to |
++ |
Since: 4
+void +kmod_set_log_priority (+struct kmod_ctx *ctx, +int priority);
Set the current logging priority, as defined in syslog.h(0P). The value +controls which messages are logged.
+ctx |
+kmod library context |
++ |
priority |
+the new logging priority |
++ |
Since: 1
+int
+kmod_get_log_priority (const struct kmod_ctx *ctx);
+Get the current logging priority, as defined in syslog.h(0P).
+ + +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);
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.
+ctx |
+kmod library context |
++ |
log_fn |
+function to be called for logging messages |
++ |
data |
+data to pass to log function |
++ |
Since: 1
+void *
+kmod_get_userdata (const struct kmod_ctx *ctx);
+Retrieve stored data pointer from library context. This might be useful +to access from callbacks.
+ + +Since: 1
+void +kmod_set_userdata (+struct kmod_ctx *ctx, +const void *userdata);
Store custom userdata
+ in the library context.
Since: 1
+const char *
+kmod_get_dirname (const struct kmod_ctx *ctx);
+Retrieve the absolute path used for linux modules in this context. The path
+is computed from the arguments to kmod_new().
Since: 22
+The validity state of the current libkmod resources, returned by
+kmod_validate_resources().
| + |
+ resources are valid + |
++ |
| + |
+ resources are not valid; to resolve call
+ |
++ |
| + |
+ resources are not valid; to resolve |
++ |
The (module) index type, used by kmod_dump_index().
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
| + |
libkmod Reference Manual |
|---|
for libkmod version "34" +
| +Top + | +
| struct kmod_config_iter * + | ++kmod_config_get_blacklists () + | +
| struct kmod_config_iter * + | ++kmod_config_get_install_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_remove_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_aliases () + | +
| struct kmod_config_iter * + | ++kmod_config_get_options () + | +
| struct kmod_config_iter * + | ++kmod_config_get_softdeps () + | +
| struct kmod_config_iter * + | ++kmod_config_get_weakdeps () + | +
| const char * + | ++kmod_config_iter_get_key () + | +
| const char * + | ++kmod_config_iter_get_value () + | +
| +bool + | ++kmod_config_iter_next () + | +
| +void + | ++kmod_config_iter_free_iter () + | +
Access to configuration lists - it allows to get each configuration's +key/value stored by kmod.
+struct kmod_config_iter *
+kmod_config_get_blacklists (const struct kmod_ctx *ctx);
+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.
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_install_commands (const struct kmod_ctx *ctx);
+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.
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_remove_commands (const struct kmod_ctx *ctx);
+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.
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_aliases (const struct kmod_ctx *ctx);
+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.
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_options (const struct kmod_ctx *ctx);
+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.
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_softdeps (const struct kmod_ctx *ctx);
+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.
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_weakdeps (const struct kmod_ctx *ctx);
+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.
a new iterator over the weakdeps or NULL on failure. Free it with
+kmod_config_iter_free_iter().
Since: 33
+const char *
+kmod_config_iter_get_key (const struct kmod_config_iter *iter);
+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.
Since: 4
+const char *
+kmod_config_iter_get_value (const struct kmod_config_iter *iter);
+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.
Since: 4
+bool
+kmod_config_iter_next (struct kmod_config_iter *iter);
+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.
Since: 4
+void
+kmod_config_iter_free_iter (struct kmod_config_iter *iter);
+Free resources used by the iterator.
+ +Since: 4
+| +Top + | +
| #define | ++kmod_list_foreach() + | +
| #define | ++kmod_list_foreach_reverse() + | +
| struct kmod_list * + | ++kmod_list_last () + | +
| struct kmod_list * + | ++kmod_list_next () + | +
| struct kmod_list * + | ++kmod_list_prev () + | +
#define kmod_list_foreach_reverse(curr, list)+
Iterate in reverse over the list list
+.
struct kmod_list *
+kmod_list_last (const struct kmod_list *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()).
Since: 2
+struct kmod_list * +kmod_list_next (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
list |
+the head of the list |
++ |
curr |
+the current node in the list |
++ |
Since: 1
+struct kmod_list * +kmod_list_prev (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
list |
+the head of the list |
++ |
curr |
+the current node in the list |
++ |
node previous to curr
+or NULL if either this node is the head of
+the list or the list is empty.
Since: 1
+| +Top + | +
| +int + | ++kmod_module_new_from_loaded () + | +
| +int + | ++kmod_module_get_initstate () + | +
| const char * + | ++kmod_module_initstate_str () + | +
| +long + | ++kmod_module_get_size () + | +
| +int + | ++kmod_module_get_refcnt () + | +
| struct kmod_list * + | ++kmod_module_get_holders () + | +
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.
+int +kmod_module_new_from_loaded (+struct kmod_ctx *ctx, +struct kmod_list **list);
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.
ctx |
+kmod library context |
++ |
list |
+where to save the list of loaded modules |
++ |
Since: 1
+int
+kmod_module_get_initstate (const struct kmod_module *mod);
+Get the initstate of this mod
+, as returned by the kernel, by reading
+/sys filesystem.
< 0 on error or module state if module is found in the kernel, valid +states are kmod_module_initstate.
+Since: 1
+const char *
+kmod_module_initstate_str (enum kmod_module_initstate state);
+Translate a initstate to a string.
+ + the string associated to the state
+. This string is statically
+allocated, do not free it.
Since: 1
+long
+kmod_module_get_size (const struct kmod_module *mod);
+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.
+ + +Since: 1
+int
+kmod_module_get_refcnt (const struct kmod_module *mod);
+Get the ref count of this mod
+, as returned by the kernel, by reading
+/sys filesystem.
Since: 1
+struct kmod_list *
+kmod_module_get_holders (const struct kmod_module *mod);
+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().
Since: 1
+The module "live information" as reported by the kernel, see
+kmod_module_get_initstate().
| +Top + | +
| struct | +kmod_module | +
| enum | +kmod_insert | +
| enum | +kmod_probe | +
| enum | +kmod_remove | +
| enum | +kmod_filter | +
| enum | +kmod_symbol_bind | +
Wide range of function to operate on kernel modules - loading, unloading, +reference counting, retrieving a list of module dependencies and more.
+int +kmod_module_new_from_lookup (+struct kmod_ctx *ctx, +const char *given_alias, +struct kmod_list **list);
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.
ctx |
+kmod library context |
++ |
given_alias |
+alias to look for |
++ |
list |
+an empty list where to save the list of modules matching
+ |
++ |
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_name_lookup (+struct kmod_ctx *ctx, +const char *modname, +struct kmod_module **mod);
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;
+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.
ctx |
+kmod library context |
++ |
modname |
+module name to look for |
++ |
mod |
+returned module on success |
++ |
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 (+struct kmod_ctx *ctx, +const char *name, +struct kmod_module **mod);
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.
ctx |
+kmod library context |
++ |
name |
+name of the module |
++ |
mod |
+where to save the created struct kmod_module |
++ |
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_path (+struct kmod_ctx *ctx, +const char *path, +struct kmod_module **mod);
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.
ctx |
+kmod library context |
++ |
path |
+path where to find the given module |
++ |
mod |
+where to save the created struct kmod_module |
++ |
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
+struct kmod_module *
+kmod_module_ref (struct kmod_module *mod);
+Take a reference of the kmod module, incrementing its refcount.
+ + +Since: 1
+struct kmod_module *
+kmod_module_unref (struct kmod_module *mod);
+Drop a reference of the kmod module. If the refcount reaches zero, its +resources are released.
+ + NULL if mod
+is NULL or if the module was released. Otherwise it
+returns the passed mod
+with its refcount decremented.
Since: 1
+int
+kmod_module_unref_list (struct kmod_list *list);
+Drop a reference of each kmod module in list
+ and releases the resources
+taken by the list itself.
Since: 1
+int +kmod_module_insert_module (+struct kmod_module *mod, +unsigned int flags, +const char *options);
Insert a module in the kernel. It opens the file pointed by mod
+,
+mmap'ing it and passing to kernel.
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. |
++ |
Since: 1
+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));
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.
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 |
++ |
run_install |
+function to run when |
++ |
data |
+data to give back to |
++ |
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. |
++ |
Since: 3
+int +kmod_module_remove_module (+struct kmod_module *mod, +unsigned int flags);
Remove a module from the kernel.
+mod |
+kmod module |
++ |
flags |
+flags used when removing the module, valid flags are kmod_remove |
++ |
Since: 1
+struct kmod_module *
+kmod_module_get_module (const struct kmod_list *entry);
+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.
NULL on failure or the kmod_module contained in this list entry +with its refcount incremented.
+Since: 1
+struct kmod_list *
+kmod_module_get_dependencies (const struct kmod_module *mod);
+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.
NULL on failure. Otherwise it returns a list of kmod modules
+that can be released by calling kmod_module_unref_list().
Since: 1
+int +kmod_module_get_softdeps (+const struct kmod_module *mod, +struct kmod_list **pre, +struct kmod_list **post);
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().
mod |
+kmod module |
++ |
pre |
+where to save the list of preceding soft dependencies. |
++ |
post |
+where to save the list of post soft dependencies. |
++ |
Since: 2
+int +kmod_module_get_weakdeps (+const struct kmod_module *mod, +struct kmod_list **weak);
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().
mod |
+kmod module |
++ |
weak |
+where to save the list of weak dependencies. |
++ |
Since: 33
+int +kmod_module_apply_filter (+const struct kmod_ctx *ctx, +enum kmod_filter filter_type, +const struct kmod_list *input, +struct kmod_list **output);
Given a list input
+, this function filter it out by the filter mask
+and save it in output
+.
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 |
++ |
Since: 6
+int +kmod_module_get_filtered_blacklist (+const struct kmod_ctx *ctx, +const struct kmod_list *input, +struct kmod_list **output);
kmod_module_get_filtered_blacklist has been deprecated since version 6 and should not be used in newly-written code.
Use kmod_module_apply_filter instead.
+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
+.
ctx |
+kmod library context |
++ |
input |
+list of kmod_module to be filtered with blacklist |
++ |
output |
+where to save the new list |
++ |
Since: 1
+const char *
+kmod_module_get_install_commands (const struct kmod_module *mod);
+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.
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_remove_commands (const struct kmod_module *mod);
+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.
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_name (const struct kmod_module *mod);
+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).
Since: 1
+const char *
+kmod_module_get_options (const struct kmod_module *mod);
+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.
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_path (const struct kmod_module *mod);
+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.
+ + +Since: 1
+int +kmod_module_get_dependency_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module dependency_symbols |
++ |
Since: 3
+int
+kmod_module_dependency_symbol_get_bind
+ (const struct kmod_list *entry);
+Get the bind type of a kmod module dependency_symbol.
+ +the bind of this kmod module dependency_symbol on success, +or < 0 on failure. Valid bind types are kmod_symbol_bind.
+Since: 3
+uint64_t
+kmod_module_dependency_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module dependency_symbol.
+ + +Since: 3
+const char *
+kmod_module_dependency_symbol_get_symbol
+ (const struct kmod_list *entry);
+Get the dependency symbol of a kmod module
+entry |
+a list entry representing a kmod module dependency_symbols |
++ |
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
+void
+kmod_module_dependency_symbols_free_list
+ (struct kmod_list *list);
+Release the resources taken by list
+
Since: 3
+struct kmod_list *
+kmod_module_get_sections (const struct kmod_module *mod);
+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().
Since: 1
+unsigned long
+kmod_module_section_get_address (const struct kmod_list *entry);
+Get the address of a kmod module section.
+ + +Since: 1
+const char *
+kmod_module_section_get_name (const struct kmod_list *entry);
+Get the name of a kmod module section.
+ +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
+void
+kmod_module_section_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 1
+int +kmod_module_get_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module symbols |
++ |
Since: 3
+uint64_t
+kmod_module_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module symbol.
+ + +Since: 3
+const char *
+kmod_module_symbol_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module symbols.
+ +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
+void
+kmod_module_symbols_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 3
+int +kmod_module_get_versions (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module versions |
++ |
Since: 2
+uint64_t
+kmod_module_version_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module version.
+ + +Since: 2
+const char *
+kmod_module_version_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module versions.
+ +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
+void
+kmod_module_versions_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 2
+int +kmod_module_get_info (+const struct kmod_module *mod, +struct kmod_list **list);
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().
mod |
+kmod module |
++ |
list |
+where to return list of module information |
++ |
Since: 2
+const char *
+kmod_module_info_get_key (const struct kmod_list *entry);
+Get the key of a kmod module info.
+ +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_value (const struct kmod_list *entry);
+Get the value of a kmod module info.
+ +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
+void
+kmod_module_info_free_list (struct kmod_list *list);
+Release the resources taken by list
+
Since: 2
+Bitmask which defines the behaviour of kmod_module_probe_insert_module().
| + |
+ ignore kernel version magic + |
++ |
| + |
+ ignore symbol version hashes + |
++ |
| + |
+ ignore install commands and softdeps configured +in the system + |
++ |
| + |
+ do not check whether the module is already +live in the kernel or not + |
++ |
| + |
+ dry run, do not insert module, just call the +associated callback function + |
++ |
| + |
+ probe will fail if KMOD_PROBE_IGNORE_LOADED is +not specified and the module is already live in the kernel + |
++ |
| + |
+ 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 + |
++ |
| + |
+ probe will return early with this enum, if the +module is blacklisted + |
++ |
| + |
+ probe will return early with this +enum, if the module is an alias and is blacklisted + |
++ |
Removal flags, used by kmod_module_remove_module().
| + |
+ force remove module regardless if it's still in +use by a kernel subsystem or other process; passed directly to the kernel + |
++ |
| + |
+ always set, pass O_NONBLOCK to delete_module(2); +passed directly to the kernel + |
++ |
| + |
+ when module removal fails, do not log anything; not +passed to the kernel + |
++ |
The symbol bind type, see kmod_module_dependency_symbol_get_bind().
| +Top + | +
| struct kmod_ctx * + | ++kmod_new () + | +
| struct kmod_ctx * + | ++kmod_ref () + | +
| struct kmod_ctx * + | ++kmod_unref () + | +
| +int + | ++kmod_load_resources () + | +
| +void + | ++kmod_unload_resources () + | +
| +int + | ++kmod_validate_resources () + | +
| +int + | ++kmod_dump_index () + | +
| +void + | ++kmod_set_log_priority () + | +
| +int + | ++kmod_get_log_priority () + | +
| +void + | ++kmod_set_log_fn () + | +
| +void * + | ++kmod_get_userdata () + | +
| +void + | ++kmod_set_userdata () + | +
| const char * + | ++kmod_get_dirname () + | +
| struct | +kmod_ctx | +
| enum | +kmod_resources | +
| enum | +kmod_index | +
The context contains the default values for the library user, +and is passed to all library operations.
+struct kmod_ctx * +kmod_new (+const char *dirname, +const char *const *config_paths);
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.
+dirname |
+what to consider as linux module's directory, if NULL
+defaults to $MODULE_DIRECTORY/ |
++ |
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. |
++ |
Since: 1
+struct kmod_ctx *
+kmod_ref (struct kmod_ctx *ctx);
+Take a reference of the kmod library context.
+ + +Since: 1
+struct kmod_ctx *
+kmod_unref (struct kmod_ctx *ctx);
+Drop a reference of the kmod library context. If the refcount +reaches zero, the resources of the context will be released.
+ + +Since: 1
+int
+kmod_load_resources (struct kmod_ctx *ctx);
+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.
+ + +Since: 1
+void
+kmod_unload_resources (struct kmod_ctx *ctx);
+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().
Since: 1
+int
+kmod_validate_resources (struct kmod_ctx *ctx);
+Check if indexes and configuration files changed on disk and the current +context is not valid anymore.
+ + +Since: 3
+int +kmod_dump_index (+struct kmod_ctx *ctx, +enum kmod_index type, +int fd);
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.
ctx |
+kmod library context |
++ |
type |
+index to dump, valid indexes are kmod_index |
++ |
fd |
+file descriptor to dump index to |
++ |
Since: 4
+void +kmod_set_log_priority (+struct kmod_ctx *ctx, +int priority);
Set the current logging priority, as defined in syslog.h(0P). The value +controls which messages are logged.
+ctx |
+kmod library context |
++ |
priority |
+the new logging priority |
++ |
Since: 1
+int
+kmod_get_log_priority (const struct kmod_ctx *ctx);
+Get the current logging priority, as defined in syslog.h(0P).
+ + +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);
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.
+ctx |
+kmod library context |
++ |
log_fn |
+function to be called for logging messages |
++ |
data |
+data to pass to log function |
++ |
Since: 1
+void *
+kmod_get_userdata (const struct kmod_ctx *ctx);
+Retrieve stored data pointer from library context. This might be useful +to access from callbacks.
+ + +Since: 1
+void +kmod_set_userdata (+struct kmod_ctx *ctx, +const void *userdata);
Store custom userdata
+ in the library context.
Since: 1
+const char *
+kmod_get_dirname (const struct kmod_ctx *ctx);
+Retrieve the absolute path used for linux modules in this context. The path
+is computed from the arguments to kmod_new().
Since: 22
+The validity state of the current libkmod resources, returned by
+kmod_validate_resources().
| + |
+ resources are valid + |
++ |
| + |
+ resources are not valid; to resolve call
+ |
++ |
| + |
+ resources are not valid; to resolve |
++ |
The (module) index type, used by kmod_dump_index().
| + |
| + |
libkmod Reference Manual |
|---|
for libkmod version 32 +
| +Top + | +
| struct kmod_config_iter * + | ++kmod_config_get_blacklists () + | +
| struct kmod_config_iter * + | ++kmod_config_get_install_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_remove_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_aliases () + | +
| struct kmod_config_iter * + | ++kmod_config_get_options () + | +
| struct kmod_config_iter * + | ++kmod_config_get_softdeps () + | +
| const char * + | ++kmod_config_iter_get_key () + | +
| const char * + | ++kmod_config_iter_get_value () + | +
| +bool + | ++kmod_config_iter_next () + | +
| +void + | ++kmod_config_iter_free_iter () + | +
struct kmod_config_iter *
+kmod_config_get_blacklists (const struct kmod_ctx *ctx);
+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.
a new iterator over the blacklists or NULL on failure. Free it
+with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_install_commands (const struct kmod_ctx *ctx);
+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.
a new iterator over the install commands or NULL on failure. Free
+it with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_remove_commands (const struct kmod_ctx *ctx);
+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.
a new iterator over the remove commands or NULL on failure. Free
+it with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_aliases (const struct kmod_ctx *ctx);
+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.
a new iterator over the aliases or NULL on failure. Free it with
+kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_options (const struct kmod_ctx *ctx);
+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.
a new iterator over the options or NULL on failure. Free it with
+kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_softdeps (const struct kmod_ctx *ctx);
+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.
a new iterator over the softdeps or NULL on failure. Free it with
+kmod_config_iter_free_iter().
const char *
+kmod_config_iter_get_key (const struct kmod_config_iter *iter);
+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.
const char *
+kmod_config_iter_get_value (const struct kmod_config_iter *iter);
+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.
bool
+kmod_config_iter_next (struct kmod_config_iter *iter);
+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.
| +Top + | +
| #define | ++kmod_list_foreach() + | +
| #define | ++kmod_list_foreach_reverse() + | +
| struct kmod_list * + | ++kmod_list_last () + | +
| struct kmod_list * + | ++kmod_list_next () + | +
| struct kmod_list * + | ++kmod_list_prev () + | +
struct kmod_list *
+kmod_list_last (const struct kmod_list *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()).
struct kmod_list * +kmod_list_next (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
struct kmod_list * +kmod_list_prev (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
| +Top + | +
| +int + | ++kmod_module_new_from_loaded () + | +
| +int + | ++kmod_module_get_initstate () + | +
| const char * + | ++kmod_module_initstate_str () + | +
| +long + | ++kmod_module_get_size () + | +
| +int + | ++kmod_module_get_refcnt () + | +
| struct kmod_list * + | ++kmod_module_get_holders () + | +
Information about currently loaded modules, as reported by Linux kernel. +These information are not cached by libkmod and are always read from /sys +and /proc/modules.
+int +kmod_module_new_from_loaded (+struct kmod_ctx *ctx, +struct kmod_list **list);
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.
int
+kmod_module_get_initstate (const struct kmod_module *mod);
+Get the initstate of this mod
+, as returned by Linux Kernel, by reading
+/sys filesystem.
const char *
+kmod_module_initstate_str (enum kmod_module_initstate state);
+Translate a initstate to a string.
+ + +long
+kmod_module_get_size (const struct kmod_module *mod);
+Get the size of this kmod module as returned by Linux 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.
+ + +int
+kmod_module_get_refcnt (const struct kmod_module *mod);
+Get the ref count of this mod
+, as returned by Linux Kernel, by reading
+/sys filesystem.
struct kmod_list *
+kmod_module_get_holders (const struct kmod_module *mod);
+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().
| +Top + | +
int +kmod_module_new_from_lookup (+struct kmod_ctx *ctx, +const char *given_alias, +struct kmod_list **list);
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.
int +kmod_module_new_from_name_lookup (+struct kmod_ctx *ctx, +const char *modname, +struct kmod_module **mod);
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 succesful, this always resolves
+to one and only one module.
The search order is: 1. module names in modules.dep index;
+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.
int +kmod_module_new_from_name (+struct kmod_ctx *ctx, +const char *name, +struct kmod_module **mod);
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.
int +kmod_module_new_from_path (+struct kmod_ctx *ctx, +const char *path, +struct kmod_module **mod);
Create a new struct kmod_module using the module path. path
+ must be an
+existent file with in 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.
struct kmod_module *
+kmod_module_ref (struct kmod_module *mod);
+Take a reference of the kmod module, incrementing its refcount.
+ + +struct kmod_module *
+kmod_module_unref (struct kmod_module *mod);
+Drop a reference of the kmod module. If the refcount reaches zero, its +resources are released.
+ + +int
+kmod_module_unref_list (struct kmod_list *list);
+Drop a reference of each kmod module in list
+ and releases the resources
+taken by the list itself.
int +kmod_module_insert_module (+struct kmod_module *mod, +unsigned int flags, +const char *options);
Insert a module in Linux kernel. It opens the file pointed by mod
+,
+mmap'ing it and passing to kernel.
mod |
+kmod module |
++ |
flags |
+flags are not passed to Linux Kernel, but instead they dictate the +behavior of this function, valid flags are +KMOD_INSERT_FORCE_VERMAGIC: ignore kernel version magic; +KMOD_INSERT_FORCE_MODVERSION: ignore symbol version hashes. |
++ |
options |
+module's options to pass to Linux Kernel. |
++ |
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));
Insert a module in Linux 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.
mod |
+kmod module |
++ |
flags |
+flags are not passed to Linux Kernel, but instead they dictate the +behavior of this function, valid flags are +KMOD_PROBE_FORCE_VERMAGIC: ignore kernel version magic; +KMOD_PROBE_FORCE_MODVERSION: ignore symbol version hashes; +KMOD_PROBE_IGNORE_COMMAND: whether the probe should ignore install +commands and softdeps configured in the system; +KMOD_PROBE_IGNORE_LOADED: do not check whether the module is already +live in kernel or not; +KMOD_PROBE_DRY_RUN: dry run, do not insert module, just call the +associated callback function; +KMOD_PROBE_FAIL_ON_LOADED: if KMOD_PROBE_IGNORE_LOADED is not specified +and the module is already live in kernel, the function will fail if this +flag is specified; +KMOD_PROBE_APPLY_BLACKLIST_ALL: probe will apply KMOD_FILTER_BLACKLIST +filter to this module and its dependencies. If any of the dependencies (or +the module) is blacklisted, the probe will fail, unless the blacklisted +module is already live in kernel; +KMOD_PROBE_APPLY_BLACKLIST: probe will fail if the module is blacklisted; +KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY: probe will fail if the module is an +alias and is blacklisted. |
++ |
extra_options |
+module's options to pass to Linux Kernel. It applies only
+to |
++ |
run_install |
+function to run when |
++ |
data |
+data to give back to |
++ |
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. |
++ |
int +kmod_module_remove_module (+struct kmod_module *mod, +unsigned int flags);
Remove a module from Linux kernel.
+mod |
+kmod module |
++ |
flags |
+flags used when removing the module. +KMOD_REMOVE_FORCE: force remove module regardless if it's still in +use by a kernel subsystem or other process; passed directly to Linux kernel +KMOD_REMOVE_NOWAIT: is always enforced, causing us to pass O_NONBLOCK to +delete_module(2). +KMOD_REMOVE_NOLOG: when module removal fails, do not log anything as the +caller may want to handle retries and log when appropriate. |
++ |
struct kmod_module *
+kmod_module_get_module (const struct kmod_list *entry);
+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.
struct kmod_list *
+kmod_module_get_dependencies (const struct kmod_module *mod);
+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.
NULL on failure. Otherwise it returns a list of kmod modules
+that can be released by calling kmod_module_unref_list().
int +kmod_module_get_softdeps (+const struct kmod_module *mod, +struct kmod_list **pre, +struct kmod_list **post);
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().
int +kmod_module_apply_filter (+const struct kmod_ctx *ctx, +enum kmod_filter filter_type, +const struct kmod_list *input, +struct kmod_list **output);
Given a list input
+, this function filter it out by the filter mask
+and save it in output
+.
ctx |
+kmod library context |
++ |
filter_type |
+bitmask to filter modules out, valid types are +KMOD_FILTER_BLACKLIST: filter modules in blacklist out; +KMOD_FILTER_BUILTIN: filter builtin modules out. |
++ |
input |
+list of kmod_module to be filtered |
++ |
output |
+where to save the new list |
++ |
int +kmod_module_get_filtered_blacklist (+const struct kmod_ctx *ctx, +const struct kmod_list *input, +struct kmod_list **output);
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
+.
const char *
+kmod_module_get_install_commands (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_remove_commands (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_name (const struct kmod_module *mod);
+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).
const char *
+kmod_module_get_options (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_path (const struct kmod_module *mod);
+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.
+ + +int +kmod_module_get_dependency_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section ".symtab" or "__ksymtab_strings".
+After use, free the list
+ by calling
+kmod_module_dependency_symbols_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module dependency_symbols. Use
+ |
++ |
int
+kmod_module_dependency_symbol_get_bind
+ (const struct kmod_list *entry);
+Get the bind type of a kmod module dependency_symbol.
+ + +uint64_t
+kmod_module_dependency_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module dependency_symbol.
+ + +const char *
+kmod_module_dependency_symbol_get_symbol
+ (const struct kmod_list *entry);
+Get the dependency symbol of a kmod module
+ + +void
+kmod_module_dependency_symbols_free_list
+ (struct kmod_list *list);
+Release the resources taken by list
+
struct kmod_list *
+kmod_module_get_sections (const struct kmod_module *mod);
+Get a list of kmod sections of this mod
+, as returned by Linux Kernel. The
+structure contained in this list is internal to libkmod and their 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().
void
+kmod_module_section_free_list (struct kmod_list *list);
+Release the resources taken by list
+
unsigned long
+kmod_module_section_get_address (const struct kmod_list *entry);
+Get the address of a kmod module section.
+After use, free the list
+ by calling kmod_module_section_free_list().
const char *
+kmod_module_section_get_name (const struct kmod_list *entry);
+int +kmod_module_get_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section ".symtab" or "__ksymtab_strings".
+After use, free the list
+ by calling kmod_module_symbols_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module symbols. Use
+ |
++ |
uint64_t
+kmod_module_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module symbol.
+ + +const char *
+kmod_module_symbol_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module symbols.
+ + +void
+kmod_module_symbols_free_list (struct kmod_list *list);
+Release the resources taken by list
+
int +kmod_module_get_versions (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section "__versions".
+After use, free the list
+ by calling kmod_module_versions_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module versions. Use
+ |
++ |
uint64_t
+kmod_module_version_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module version.
+ + +const char *
+kmod_module_version_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module versions.
+ + +void
+kmod_module_versions_free_list (struct kmod_list *list);
+Release the resources taken by list
+
int +kmod_module_get_info (+const struct kmod_module *mod, +struct kmod_list **list);
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.
+After use, free the list
+ by calling kmod_module_info_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module information. Use
+ |
++ |
void
+kmod_module_info_free_list (struct kmod_list *list);
+Release the resources taken by list
+
const char *
+kmod_module_info_get_key (const struct kmod_list *entry);
+Get the key of a kmod module info.
+ + +| +Top + | +
| struct kmod_ctx * + | ++kmod_new () + | +
| struct kmod_ctx * + | ++kmod_ref () + | +
| struct kmod_ctx * + | ++kmod_unref () + | +
| +int + | ++kmod_load_resources () + | +
| +void + | ++kmod_unload_resources () + | +
| +int + | ++kmod_validate_resources () + | +
| +int + | ++kmod_dump_index () + | +
| +void + | ++kmod_set_log_priority () + | +
| +int + | ++kmod_get_log_priority () + | +
| +void + | ++kmod_set_log_fn () + | +
| +void * + | ++kmod_get_userdata () + | +
| +void + | ++kmod_set_userdata () + | +
| const char * + | ++kmod_get_dirname () + | +
The context contains the default values for the library user, +and is passed to all library operations.
+struct kmod_ctx * +kmod_new (+const char *dirname, +const char * const *config_paths);
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.
+dirname |
+what to consider as linux module's directory, if NULL
+defaults to $MODULE_DIRECTORY/ |
++ |
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. |
++ |
struct kmod_ctx *
+kmod_ref (struct kmod_ctx *ctx);
+Take a reference of the kmod library context.
+ + +struct kmod_ctx *
+kmod_unref (struct kmod_ctx *ctx);
+Drop a reference of the kmod library context. If the refcount +reaches zero, the resources of the context will be released.
+ + +int
+kmod_load_resources (struct kmod_ctx *ctx);
+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 bootup issues hundreds of calls to lookup the index, calling +this function will speedup the searches.
+ + +void
+kmod_unload_resources (struct kmod_ctx *ctx);
+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().
int
+kmod_validate_resources (struct kmod_ctx *ctx);
+Check if indexes and configuration files changed on disk and the current +context is not valid anymore.
+ + KMOD_RESOURCES_OK if resources are still valid,
+KMOD_RESOURCES_MUST_RELOAD if it's sufficient to call
+kmod_unload_resources() and kmod_load_resources() or
+KMOD_RESOURCES_MUST_RECREATE if ctx
+must be re-created.
int +kmod_dump_index (+struct kmod_ctx *ctx, +enum kmod_index type, +int fd);
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.
ctx |
+kmod library context |
++ |
type |
+index to dump, valid indexes are +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: index of builtin module. |
++ |
fd |
+file descriptor to dump index to |
++ |
void +kmod_set_log_priority (+struct kmod_ctx *ctx, +int priority);
Set the current logging priority. The value controls which messages +are logged.
+ +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);
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.
+ +void *
+kmod_get_userdata (const struct kmod_ctx *ctx);
+Retrieve stored data pointer from library context. This might be useful +to access from callbacks.
+ + +void +kmod_set_userdata (+struct kmod_ctx *ctx, +const void *userdata);
Store custom userdata
+ in the library context.
const char *
+kmod_get_dirname (const struct kmod_ctx *ctx);
+Retrieve the absolute path used for linux modules in this context. The path
+is computed from the arguments to kmod_new().
| + |
| + |
libkmod Reference Manual |
|---|
for libkmod version 33 +
| +Top + | +
| struct kmod_config_iter * + | ++kmod_config_get_blacklists () + | +
| struct kmod_config_iter * + | ++kmod_config_get_install_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_remove_commands () + | +
| struct kmod_config_iter * + | ++kmod_config_get_aliases () + | +
| struct kmod_config_iter * + | ++kmod_config_get_options () + | +
| struct kmod_config_iter * + | ++kmod_config_get_softdeps () + | +
| struct kmod_config_iter * + | ++kmod_config_get_weakdeps () + | +
| const char * + | ++kmod_config_iter_get_key () + | +
| const char * + | ++kmod_config_iter_get_value () + | +
| +bool + | ++kmod_config_iter_next () + | +
| +void + | ++kmod_config_iter_free_iter () + | +
struct kmod_config_iter *
+kmod_config_get_blacklists (const struct kmod_ctx *ctx);
+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.
a new iterator over the blacklists or NULL on failure. Free it
+with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_install_commands (const struct kmod_ctx *ctx);
+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.
a new iterator over the install commands or NULL on failure. Free
+it with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_remove_commands (const struct kmod_ctx *ctx);
+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.
a new iterator over the remove commands or NULL on failure. Free
+it with kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_aliases (const struct kmod_ctx *ctx);
+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.
a new iterator over the aliases or NULL on failure. Free it with
+kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_options (const struct kmod_ctx *ctx);
+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.
a new iterator over the options or NULL on failure. Free it with
+kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_softdeps (const struct kmod_ctx *ctx);
+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.
a new iterator over the softdeps or NULL on failure. Free it with
+kmod_config_iter_free_iter().
struct kmod_config_iter *
+kmod_config_get_weakdeps (const struct kmod_ctx *ctx);
+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.
a new iterator over the weakdeps or NULL on failure. Free it with
+kmod_config_iter_free_iter().
const char *
+kmod_config_iter_get_key (const struct kmod_config_iter *iter);
+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.
const char *
+kmod_config_iter_get_value (const struct kmod_config_iter *iter);
+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.
bool
+kmod_config_iter_next (struct kmod_config_iter *iter);
+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.
| +Top + | +
| #define | ++kmod_list_foreach() + | +
| #define | ++kmod_list_foreach_reverse() + | +
| struct kmod_list * + | ++kmod_list_last () + | +
| struct kmod_list * + | ++kmod_list_next () + | +
| struct kmod_list * + | ++kmod_list_prev () + | +
struct kmod_list *
+kmod_list_last (const struct kmod_list *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()).
struct kmod_list * +kmod_list_next (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
struct kmod_list * +kmod_list_prev (+const struct kmod_list *list, +const struct kmod_list *curr);
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.
| +Top + | +
| +int + | ++kmod_module_new_from_loaded () + | +
| +int + | ++kmod_module_get_initstate () + | +
| const char * + | ++kmod_module_initstate_str () + | +
| +long + | ++kmod_module_get_size () + | +
| +int + | ++kmod_module_get_refcnt () + | +
| struct kmod_list * + | ++kmod_module_get_holders () + | +
Information about currently loaded modules, as reported by Linux kernel. +These information are not cached by libkmod and are always read from /sys +and /proc/modules.
+int +kmod_module_new_from_loaded (+struct kmod_ctx *ctx, +struct kmod_list **list);
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.
int
+kmod_module_get_initstate (const struct kmod_module *mod);
+Get the initstate of this mod
+, as returned by Linux Kernel, by reading
+/sys filesystem.
const char *
+kmod_module_initstate_str (enum kmod_module_initstate state);
+Translate a initstate to a string.
+ + +long
+kmod_module_get_size (const struct kmod_module *mod);
+Get the size of this kmod module as returned by Linux 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.
+ + +int
+kmod_module_get_refcnt (const struct kmod_module *mod);
+Get the ref count of this mod
+, as returned by Linux Kernel, by reading
+/sys filesystem.
struct kmod_list *
+kmod_module_get_holders (const struct kmod_module *mod);
+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().
| +Top + | +
int +kmod_module_new_from_lookup (+struct kmod_ctx *ctx, +const char *given_alias, +struct kmod_list **list);
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.
int +kmod_module_new_from_name_lookup (+struct kmod_ctx *ctx, +const char *modname, +struct kmod_module **mod);
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 succesful, this always resolves
+to one and only one module.
The search order is: 1. module names in modules.dep index;
+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.
int +kmod_module_new_from_name (+struct kmod_ctx *ctx, +const char *name, +struct kmod_module **mod);
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.
int +kmod_module_new_from_path (+struct kmod_ctx *ctx, +const char *path, +struct kmod_module **mod);
Create a new struct kmod_module using the module path. path
+ must be an
+existent file with in 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.
struct kmod_module *
+kmod_module_ref (struct kmod_module *mod);
+Take a reference of the kmod module, incrementing its refcount.
+ + +struct kmod_module *
+kmod_module_unref (struct kmod_module *mod);
+Drop a reference of the kmod module. If the refcount reaches zero, its +resources are released.
+ + +int
+kmod_module_unref_list (struct kmod_list *list);
+Drop a reference of each kmod module in list
+ and releases the resources
+taken by the list itself.
int +kmod_module_insert_module (+struct kmod_module *mod, +unsigned int flags, +const char *options);
Insert a module in Linux kernel. It opens the file pointed by mod
+,
+mmap'ing it and passing to kernel.
mod |
+kmod module |
++ |
flags |
+flags are not passed to Linux Kernel, but instead they dictate the +behavior of this function, valid flags are +KMOD_INSERT_FORCE_VERMAGIC: ignore kernel version magic; +KMOD_INSERT_FORCE_MODVERSION: ignore symbol version hashes. |
++ |
options |
+module's options to pass to Linux Kernel. |
++ |
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));
Insert a module in Linux 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.
mod |
+kmod module |
++ |
flags |
+flags are not passed to Linux Kernel, but instead they dictate the +behavior of this function, valid flags are +KMOD_PROBE_FORCE_VERMAGIC: ignore kernel version magic; +KMOD_PROBE_FORCE_MODVERSION: ignore symbol version hashes; +KMOD_PROBE_IGNORE_COMMAND: whether the probe should ignore install +commands and softdeps configured in the system; +KMOD_PROBE_IGNORE_LOADED: do not check whether the module is already +live in kernel or not; +KMOD_PROBE_DRY_RUN: dry run, do not insert module, just call the +associated callback function; +KMOD_PROBE_FAIL_ON_LOADED: if KMOD_PROBE_IGNORE_LOADED is not specified +and the module is already live in kernel, the function will fail if this +flag is specified; +KMOD_PROBE_APPLY_BLACKLIST_ALL: probe will apply KMOD_FILTER_BLACKLIST +filter to this module and its dependencies. If any of the dependencies (or +the module) is blacklisted, the probe will fail, unless the blacklisted +module is already live in kernel; +KMOD_PROBE_APPLY_BLACKLIST: probe will fail if the module is blacklisted; +KMOD_PROBE_APPLY_BLACKLIST_ALIAS_ONLY: probe will fail if the module is an +alias and is blacklisted. |
++ |
extra_options |
+module's options to pass to Linux Kernel. It applies only
+to |
++ |
run_install |
+function to run when |
++ |
data |
+data to give back to |
++ |
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. |
++ |
int +kmod_module_remove_module (+struct kmod_module *mod, +unsigned int flags);
Remove a module from Linux kernel.
+mod |
+kmod module |
++ |
flags |
+flags used when removing the module. +KMOD_REMOVE_FORCE: force remove module regardless if it's still in +use by a kernel subsystem or other process; passed directly to Linux kernel +KMOD_REMOVE_NOWAIT: is always enforced, causing us to pass O_NONBLOCK to +delete_module(2). +KMOD_REMOVE_NOLOG: when module removal fails, do not log anything as the +caller may want to handle retries and log when appropriate. |
++ |
struct kmod_module *
+kmod_module_get_module (const struct kmod_list *entry);
+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.
struct kmod_list *
+kmod_module_get_dependencies (const struct kmod_module *mod);
+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.
NULL on failure. Otherwise it returns a list of kmod modules
+that can be released by calling kmod_module_unref_list().
int +kmod_module_get_softdeps (+const struct kmod_module *mod, +struct kmod_list **pre, +struct kmod_list **post);
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().
int +kmod_module_get_weakdeps (+const struct kmod_module *mod, +struct kmod_list **weak);
int +kmod_module_apply_filter (+const struct kmod_ctx *ctx, +enum kmod_filter filter_type, +const struct kmod_list *input, +struct kmod_list **output);
Given a list input
+, this function filter it out by the filter mask
+and save it in output
+.
ctx |
+kmod library context |
++ |
filter_type |
+bitmask to filter modules out, valid types are +KMOD_FILTER_BLACKLIST: filter modules in blacklist out; +KMOD_FILTER_BUILTIN: filter builtin modules out. |
++ |
input |
+list of kmod_module to be filtered |
++ |
output |
+where to save the new list |
++ |
int +kmod_module_get_filtered_blacklist (+const struct kmod_ctx *ctx, +const struct kmod_list *input, +struct kmod_list **output);
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
+.
const char *
+kmod_module_get_install_commands (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_remove_commands (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_name (const struct kmod_module *mod);
+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).
const char *
+kmod_module_get_options (const struct kmod_module *mod);
+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.
const char *
+kmod_module_get_path (const struct kmod_module *mod);
+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.
+ + +int +kmod_module_get_dependency_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section ".symtab" or "__ksymtab_strings".
+After use, free the list
+ by calling
+kmod_module_dependency_symbols_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module dependency_symbols. Use
+ |
++ |
int
+kmod_module_dependency_symbol_get_bind
+ (const struct kmod_list *entry);
+Get the bind type of a kmod module dependency_symbol.
+ + +uint64_t
+kmod_module_dependency_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module dependency_symbol.
+ + +const char *
+kmod_module_dependency_symbol_get_symbol
+ (const struct kmod_list *entry);
+Get the dependency symbol of a kmod module
+ + +void
+kmod_module_dependency_symbols_free_list
+ (struct kmod_list *list);
+Release the resources taken by list
+
struct kmod_list *
+kmod_module_get_sections (const struct kmod_module *mod);
+Get a list of kmod sections of this mod
+, as returned by Linux Kernel. The
+structure contained in this list is internal to libkmod and their 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().
void
+kmod_module_section_free_list (struct kmod_list *list);
+Release the resources taken by list
+
unsigned long
+kmod_module_section_get_address (const struct kmod_list *entry);
+Get the address of a kmod module section.
+After use, free the list
+ by calling kmod_module_section_free_list().
const char *
+kmod_module_section_get_name (const struct kmod_list *entry);
+int +kmod_module_get_symbols (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section ".symtab" or "__ksymtab_strings".
+After use, free the list
+ by calling kmod_module_symbols_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module symbols. Use
+ |
++ |
uint64_t
+kmod_module_symbol_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module symbol.
+ + +const char *
+kmod_module_symbol_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module symbols.
+ + +void
+kmod_module_symbols_free_list (struct kmod_list *list);
+Release the resources taken by list
+
int +kmod_module_get_versions (+const struct kmod_module *mod, +struct kmod_list **list);
Get a list of entries in ELF section "__versions".
+After use, free the list
+ by calling kmod_module_versions_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module versions. Use
+ |
++ |
uint64_t
+kmod_module_version_get_crc (const struct kmod_list *entry);
+Get the crc of a kmod module version.
+ + +const char *
+kmod_module_version_get_symbol (const struct kmod_list *entry);
+Get the symbol of a kmod module versions.
+ + +void
+kmod_module_versions_free_list (struct kmod_list *list);
+Release the resources taken by list
+
int +kmod_module_get_info (+const struct kmod_module *mod, +struct kmod_list **list);
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.
+After use, free the list
+ by calling kmod_module_info_free_list().
mod |
+kmod module |
++ |
list |
+where to return list of module information. Use
+ |
++ |
void
+kmod_module_info_free_list (struct kmod_list *list);
+Release the resources taken by list
+
const char *
+kmod_module_info_get_key (const struct kmod_list *entry);
+Get the key of a kmod module info.
+ + +| +Top + | +
| struct kmod_ctx * + | ++kmod_new () + | +
| struct kmod_ctx * + | ++kmod_ref () + | +
| struct kmod_ctx * + | ++kmod_unref () + | +
| +int + | ++kmod_load_resources () + | +
| +void + | ++kmod_unload_resources () + | +
| +int + | ++kmod_validate_resources () + | +
| +int + | ++kmod_dump_index () + | +
| +void + | ++kmod_set_log_priority () + | +
| +int + | ++kmod_get_log_priority () + | +
| +void + | ++kmod_set_log_fn () + | +
| +void * + | ++kmod_get_userdata () + | +
| +void + | ++kmod_set_userdata () + | +
| const char * + | ++kmod_get_dirname () + | +
The context contains the default values for the library user, +and is passed to all library operations.
+struct kmod_ctx * +kmod_new (+const char *dirname, +const char * const *config_paths);
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.
+dirname |
+what to consider as linux module's directory, if NULL
+defaults to $MODULE_DIRECTORY/ |
++ |
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. |
++ |
struct kmod_ctx *
+kmod_ref (struct kmod_ctx *ctx);
+Take a reference of the kmod library context.
+ + +struct kmod_ctx *
+kmod_unref (struct kmod_ctx *ctx);
+Drop a reference of the kmod library context. If the refcount +reaches zero, the resources of the context will be released.
+ + +int
+kmod_load_resources (struct kmod_ctx *ctx);
+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 bootup issues hundreds of calls to lookup the index, calling +this function will speedup the searches.
+ + +void
+kmod_unload_resources (struct kmod_ctx *ctx);
+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().
int
+kmod_validate_resources (struct kmod_ctx *ctx);
+Check if indexes and configuration files changed on disk and the current +context is not valid anymore.
+ + KMOD_RESOURCES_OK if resources are still valid,
+KMOD_RESOURCES_MUST_RELOAD if it's sufficient to call
+kmod_unload_resources() and kmod_load_resources() or
+KMOD_RESOURCES_MUST_RECREATE if ctx
+must be re-created.
int +kmod_dump_index (+struct kmod_ctx *ctx, +enum kmod_index type, +int fd);
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.
ctx |
+kmod library context |
++ |
type |
+index to dump, valid indexes are +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. |
++ |
fd |
+file descriptor to dump index to |
++ |
void +kmod_set_log_priority (+struct kmod_ctx *ctx, +int priority);
Set the current logging priority. The value controls which messages +are logged.
+ +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);
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.
+ +void *
+kmod_get_userdata (const struct kmod_ctx *ctx);
+Retrieve stored data pointer from library context. This might be useful +to access from callbacks.
+ + +void +kmod_set_userdata (+struct kmod_ctx *ctx, +const void *userdata);
Store custom userdata
+ in the library context.
const char *
+kmod_get_dirname (const struct kmod_ctx *ctx);
+Retrieve the absolute path used for linux modules in this context. The path
+is computed from the arguments to kmod_new().