kmod 34
=======

- Improvements

	- Drop pre-built .ko modules from git - distros/packages will need the
	  linux-headers to be able to run the testsuite. There was limited use
	  of the feature, while linters complained about "source-not-included"
	  or "source-contains-prebuilt-binary".

	- Switch build system to meson: autotools is still supported but slated
	  for removal on next release. This is the transition release to help
	  distros and integrators to move to the new build system. Default options
	  target distros while developers can use the build-dev.ini configuration
	  file.

	- Allow to load decompression libraries on demand: liblzma.so, libz.so
	  and libzstd.so can now be loaded on demand, only when there is
	  such a need. For use during early boot for loading modules, if
	  configured well it means none of these libraries are loaded: the
	  module loading logic via finit_module() will just hand over to kernel
	  the open file descriptor and kernel will use its own decompress routine.

	  If kernel doesn't handle decompression or if the module is compressed
	  with a different algorithm than the one configured in the kernel,
	  libkmod can still open the module by dynamically loading the
	  correspondent library.

	  Tools inspecting the module contents, like modinfo, will load that
	  single decompression library instead all of them.

	  For distros building with meson it's possible to choose the behavior
	  per library. Examples: a) -Ddlopen=all uses dlopen behavior for all
	  the libraries; b) -Ddlopen=xz, will make only xz to be dlopen'ed
	  while other enabled libraries will be linked in at build time.

	  The use of dlopen is annotated in the ELF file by using the ELF
	  Package Metadata spec as documented in
	  https://systemd.io/ELF_PACKAGE_METADATA/. Example:

	  $ dlopen-notes.py libkmod.so
	  # build/libkmod.so
	  [
	    {
	      "feature": "xz",
	      "description": "Support for uncompressing xz-compressed modules",
	      "priority": "recommended",
	      "soname": [
	        "liblzma.so.5"
	      ]
	    }
	  ]

	- Add -m / --moduledir to depmod to override in runtime the module
	  directory that was already possible to set on build time. Document
	  the interaction between the dir options: base, module and output.

	- Better error propagation in libkmod for its internal APIs and libc
	  functions up to the callers.

	- Improve libkmod API documentation by adding new sections, documenting
	  functions previously missing, rewording existing ones, adding version
	  information, cross-referencing, etc.

	- Remove deprecated arguments for depmod: --unresolved-error, --quiet,
	  --root and --map.

	- Remove deprecated arguments for rmmod: -w.

	- Remove deprecated arguments for insmod: -p and -s.

	- Add --syslog and --force for insmod to normalize it with other tools.

	- Add bash, fish and zsh shell-completion for insmod, rmmod and lsmod.

	- Remove depmod_module_directory_override from .pc as the kernel side
	  is not making use of it and will likely not need it.

	- Improve builtin module listing and retrieving information from its
	  modinfo index which reduces the amount of needed syscalls by 90%.

	- Improve zstd decompression by using streaming bufferless mode which
	  reduces the amount of syscalls by 65%.

	- Increase use of pread while parsing ELF and indexes in order to reduce
	  syscalls and improve performance.

	- Improve module sorting in depmod to speedup the use of the
	  modules.order index and support duplicate lines in it.

	- Avoid misaligned memory access while reading module signature in
	  libkmod.

	- Add more documentation for contributing to kmod. New developers are
	  welcome to look at the new README.md and CONTRIBUTING.md files for
	  information on process, coding style, build/installation, etc.

	- Overhaul man pages with multiple clarifications, section rewrites and
	  additional documentation.

	- Drop --with-rootlibdir as it's seldom used and was partially broken.

	- Drop strndupa() and alloca() for increased libc compatibility.

	- Better handling of LFS for increased compatibility with libc.

	- Protect kmod_get_dirname() and kmod_new() against NULL argument.

	- Normalize --version / --help output across all tools.

	- Always include log priority in messages, even when building with debug.

	- Optimize index reading by lazily reading nodes on demand, reducing
	  FILE overhead and reducing code duplication wrt FILE vs mmap
	  implementations, etc.

	- Switch index to pre-order to improve performance in both read and
	  write, meaning faster lookup and faster depmod. Some examples:
	  a) traversing all indexes via configuration dump shows a 9%
	  improvement on Raspberry Pi 2. b) writing the indexes takes 90% less
	  lseek() calls, leading to a performance gain of 13%.

	- Make symlink install locations more similar to what distros are
	  using: by default it installs the kmod binary as bin/kmod and the
	  symlinks are located in e.g. `sbin/depmod -> ../bin/kmod`. Changing
	  the sbin location is sufficient to move the symlinks to the
	  appropriate place, so distros using `--sbin /usr/bin` will have them
	  installed in that directory. This avoids distros having to remove the
	  symlink and add the symlinks by themselves. (meson only)

	- Install configuration directories,
	  /{etc,usr/lib}/{depmod,modprobe}.d/ as part of installation, matching
	  what several distros do during packaging. (meson only)

- Bug fixes

	- Fix testsuite using when using configurable module dir.

	- Fix typos on documentation and source code.

	- Fix out of bound access in multiple places when using long paths,
	  synthetic huge files, or handling memory allocation errors, or
	  inconsistent variable types, particularly on 32b builds.

	- Fix internal array APIs, with better error checking: improve execution on
	  very memory-constrained scenarios or very long paths.

	- Fix absolute path handling in depmod.

	- Fix libkmod memory leaks on error handling when getting builtin
	  module list.

	- Do not crash on invalid modules.builtin.modinfo file.

	- Fix link with lld resulting in empty testsuite.

	- Fix testsuite build/execution with musl.

- Others

	- Adopt clang-format and editorconfig for coding style and setup CI
	  action to keep the codebase consistent.

	- Adopt codespell in CI.

	- Adopt CodeQL integration in CI.

	- Adopt Codecov in CI.

	- Adopt SPDX copyright and license identifiers throughout the project.

	- Add more distros to CI, 32b builds, clang as compiler and lld as
	  linker.

	- Add support for clang sanitizers and squelch warnings.

	- Add tests for builtin modules from modinfo index file.

	- Multiple testsuite refactors and fixes to make it simpler to write tests.

	- Add CI coverage for docs

	- Improve strbuf implementation with more error checks and generalize
	  it to cover the role of scratchbuf. This allows to remove the
	  scratchbuf implementation.

	- Use common array and strbuf code in depmod to remove duplication.

	- Add abstraction and use more compiler builtins for addition and
	  multiplication with overflow checking.

	- Normalize use of C attributes throughout the project.

kmod 33
=======

- Improvements

	- Allow to handle compressed modules even without decompression
	  libraries linked in. Previously we would detect if the kernel
	  supported the decompression algorithm and pass the module directly
	  through finit_module(). However it wouldn't consider the file if
	  the respective decompression library was compiled out. Now it's
	  possible to completely disable all libraries and still have module
	  load working with libkmod.

	  Tools that inspect module content themselves like modinfo and depmod
	  won't work if the decompression library is not enabled.

	- Add weak dependencies - these are similar to pre softdep, but they
	  don't cause the dependency to be loaded by libkmod: when a module has
	  a weak dependency, it is expected that module may or may not be used,
	  with decision happening in runtime by the kernel. It's purpose is to
	  be informational for other tools like ones used to create initramfs,
	  so the module is made available before switch_root(), but doesn't
	  imply it to be loaded when not needed.

	- Improve compatibility with non-gnu libc like musl and uClibc. Now it's
	  possible to build and use libkmod and tools without any additional compat
	  patches.

	- Move manpages from xsltproc to scdoc, which is now needed during build.

	- Improve documentation in manpages, fixing typos, rewording sentences,
	  detailing how configuration files are handled with precedence order
	  and making all the manpages more consistent on how to reference options,
	  environment variables, configuration, authors, etc.

	- Speed up zstd decompression, particularly when not using glibc.

	- Stop parsing .alias files from modprobe.d directories. Configuration files
	  were always documented as needing the .conf extension. For compatibility
	  reason with module-init-tools, kmod also parsed .alias files. However that
	  was also done in module-init-tools for compatibility reasons and not
	  documented anywhere. From inspection on what distros are using, none use
	  .alias files in practice, so stop parsing those files and follow what's
	  documented.

	- Adopt SPDX for license and cleanup comments on individual files.

	- Since kmod 29 there's a github mirror for the repository. Now it's
	  also used for issues and improvement tracking. With that, the old
	  TODO file has been removed and distros/users are encouraged to file
	  issues in github.

- Bug fixes

	- Move kmod.pc to the right dir, ${datadir}/pkgconfig, as it's related
	  to kmod, not libkmod.

	- Fix error handling while loading a file and mmap fails.

	- Fix error handling while handling errors from the decompression
	  libraries.

	- Add missing documentation for KMOD_INDEX_MODULES_BUILTIN that was
	  added in v27 breaking the ABI. A wide search has found one external
	  tool using it, which hasn't been updated in the past 12 years. It
	  was deemed safe to simply update the documentation to include the
	  missing enum.

	- Move kmod_module_new_from_name_lookup() to the correct symbol
	  version. It was added by mistake to @LIBKMOD_5 when v30 got released.
	  No external user of this API was found, so it was considered safe
	  to just move it.

- Others

	- Overwrite symlinks when installing tools.

	- General cleanup of how (de)compression libraries are integrated.

	- Add CI infrastructure to automatically test in several distros
	  before applying commit series. Currently the latest versions of
	  Alpine, Archlinux, Fedora and Ubuntu are covered. More distros are
	  easy to add as they are all containerized.

kmod 32
=======

- Improvements

	- Use any hash algo known by kernel/openssl instead of keep needing
	  to update the mapping

	- Teach kmod to load modprobe.d/depmod.d configuration from ${prefix}/lib
	  and allow it to be overridden during build with --with-distconfdir=DIR

	- Make kernel modules directory configurable. This allows distro to
	  make kmod use only files from /usr regardless of having a compat
	  symlink in place.

	- Install kmod.pc containing the features selected at build time.

	- Install all tools and symlinks by default. Previously kmod relied on
	  distro packaging to set up the symlinks in place like modprobe,
	  depmod, lsmod, etc. Now those symlinks are created by kmod itself
	  and they are always placed in $bindir.

- Bug Fixes

	- Fix warnings due to -Walloc-size

- Others

	- Drop python bindings. Those were not update in ages and not compatible
	  with latest python releases.

	- Cleanup test infra, dropping what was not used anymore

	- Drop experimental tools `kmod insert` / `kmod remove`. Building those
	  was protected by a configure option never set by distros. They also
	  didn't gain enough traction to replace the older interfaces via
	  modprobe/insmod/rmmod.

kmod 31
=======

- Improvements

	- Allow passing a path to modprobe so the module is loaded from
	  anywhere from the filesystem, but still handling the module
	  dependencies recorded in the indexes. This is mostly intended for kernel
	  developers to speedup testing their kernel modules without having to load the
	  dependencies manually or override the module in /usr/lib/modules/.
	  Now it's possible to do:

		# modprobe ./drivers/gpu/drm/i915/i915.ko

	  As long as the dependencies didn't change, this should do the right thing

	- Use in-kernel decompression if available. This will check the runtime support
	  in the kernel for decompressing modules and use it through finit_module().
	  Previously kmod would fallback to the older init_module() when using
	  compressed modules since there wasn't a way to instruct the kernel to
	  uncompress it on load or check if the kernel supported it or not.
	  This requires a recent kernel (>= 6.4) to have that support and
	  in-kernel decompression properly working in the kernel.

	- Make modprobe fallback to syslog when stderr is not available, as was
	  documented in the man page, but not implemented

	- Better explaining `modprobe -r` and how it differentiates from rmmod

	- depmod learned a `-o <dir>` option to allow using a separate output
	  directory. With this, it's possible to split the output files from
	  the ones used as input from the kernel build system

	- Add compat with glibc >= 2.32.9000 that dropped __xstat

	- Improve testsuite to stop skipping tests when sysconfdir is something
	  other than /etc

	- Build system improvements and updates

	- Change a few return codes from -ENOENT to -ENODATA to avoid confusing output
	  in depmod when the module itself lacks a particular ELF section due to e.g.
	  CONFIG_MODVERSIONS=n in the kernel.


- Bug Fixes

	- Fix testsuite using uninitialized memory when testing module removal
	  with --wait

	- Fix testsuite not correctly overriding the stat syscall on 32-bit
	  platforms. For most architectures this was harmless, but for MIPS it
	  was causing some tests to fail.

	- Fix handling unknown signature algorithm

	- Fix linking with a static liblzma, libzstd or zlib

	- Fix memory leak when removing module holders

	- Fix out-of-bounds access when using very long paths as argument to rmmod

	- Fix warnings reported by UBSan

kmod 30
=======

- Improvements
	- Stop adding duplicate information on modules.builtin.alias.bin, just use
	  the modules.builtin.bin index

	- Speedup depmod, particularly under qemu with emulated arch, by
	  avoiding a lot of open/read/close of modules.alias.bin. On an
	  emulated ARM rootfs, depmod with only 2 modules was taking ~32s
	  vs ~0.07s now.

	- Add kmod_module_new_from_name_lookup() which allows doing a lookup by
	  module name, without considering the aliases. Other than that search
	  order is similar to kmod_module_new_from_lookup().

	- modinfo learned the --modname option to explicitly show information
	  about the module, even if there is an alias with the same name. This
	  allows showing information about e.g. kernel/lib/crc32.ko, even if
	  kernel also exports a crc32 alias in modules.alias:

		alias crc32 crc32_pclmul
		alias crc32 crc32_generic

	  Same behavior will be used to other modules and to aliases provided
	  by user/distro.

	- depmod.conf learned a new "excludedir" directive so distro/user can
	  configure more directories to be excluded from its search, besides
	  the hardcoded values "build" and "source".

	- Better group modprobe options on help output under "Management, Query and General".

	- modprobe learned a --wait <MSEC> option to be used together with -r
	  when removing a module. This allows modprobe to keep trying the
	  removal if it fails because the module is still in use. An exponential backoff
	  time is used for further retries.

	  The wait behavior provided by the kernel when not passing O_NONBLOCK
	  to delete_module() was removed in v3.13 due to not be used and the
	  consequences of having to support it in the kernel. However there may
	  be some users, particularly on testsuites for individual subsystems, that
	  would want that. So provide a userspace implementation inside modprobe for
	  such users. "rmmod" doesn't have a --wait as it remains a bare minimal over
	  the API provided by the kernel. In future the --wait behavior can be added
	  to libkmod for testsuites not exec'ing modprobe for module removal.

	- kmod_module_remove_module() learned a new flag to silence output when
	  caller wants to handle them - this is particularly important for the
	  --wait flag to modprobe, as it's not desired to keep seeing error messages
	  while waiting for the module to be unused.

	- Add SM3 hash algo support to modinfo output, as already available in the kernel.

- Bug Fixes
	- Fix modinfo output when showing information for a .ko module when running
	  on a kernel that has that module as builtin.

	- Fix kmod_module_new_from_lookup() returning > 0 rather than 0
	  when it matches an alias.

	- Fix modinfo segfault when module doesn't exist.

	- Add missing function in the html documentation: kmod_get_dirname().

	- Fix modprobe incorrectly handling number of arguments when prepending values from
	  MODPROBE_OPTIONS environment variable.

	- Fix modprobe -r --remove-dependencies and since "dependencies" was a
	  misnomer, add the preferred argument option: "--remove-holders". This
	  is the same name used by the kernel. It allows users to also remove
	  other modules holding the one that is being removed.

	- Fix off-by-one in max module name length in depmod.

- Infra/internal
	- Start some changes in the out-of-tree test modules in kmod so they are useful
	  for being really inserted in the kernel rather than relying on kmod's mock
	  interface. This helps manual testing and may be used to exercise to test
	  changes in the kernel.

kmod 29
=======

- Improvements
	- Add support to use /usr/local as a place for configuration files. This makes it easier
	  to install locally without overriding distro files.

- Bug fixes
	- Fix `modinfo -F` when module is builtin: when we asked by a specific field from modinfo,
	  it was not working correctly if the module was builtin

	- Documentation fixes on precedence order of /etc and /run: the correct order is
	  /etc/modprobe.d, /run/modprobe.d, /lib/modprobe.d

	- Fix the priority order that we use for searching configuration files. The
	  correct one is /etc, /run, /usr/local/lib, /lib, for both modprobe.d
	  and depmo.d

	- Fix kernel command line parsing when there are quotes present. Grub
	  mangles the command line and changes it from 'module.option="val with
	  spaces"' to '"module.option=val with spaces"'. Although this is weird
	  behavior and grub could have been fixed, the kernel understands it
	  correctly for builtin modules. So change libkmod to also parse it
	  correctly. This also brings another hidden behavior from the kernel:
	  newline in the kernel command line is also allowed and can be used to
	  separate options.

	- Fix a memory leak, overflow and double free on error path

	- Fix documentation for return value from kmod_module_get_info(): we
	  return the number of entries we added to the list

	- Fix output of modules.builtin.alias.bin index: we were writing an empty file due to
	  the misuse of kmod_module_get_info()

- Infra/internal
	- Retire integration with semaphoreci

	- Declare the github mirror also as an official upstream source: now besides accepting
	  patches via mailing list, PRs on github are also acceptable

	- Misc improvements to testsuite, so we can use it reliably regardless
	  of the configuration used: now tests will skip if we don't have the
	  build dependencies)

kmod 28
=======

- Improvements
	- Add Zstandard to the supported compression formats using libzstd
	  (pass --with-zstd to configure)

- Bug fixes
	- Ignore ill-formed kernel command line, e.g. with "ivrs_acpihid[00:14.5]=AMD0020:0"
	  option in it
	- Fix some memory leaks
	- Fix 0-length builtin.alias.bin: it needs at least the index header

kmod 27
=======

- Improvements
	- Link to libcrypto rather than requiring openssl

	- Print a better error message when kernel doesn't support module unload

	- Use PKCS#7 instead of CMS for parsing module signature to be
	  compatible with LibreSSL and OpenSSL < 1.1.0

	- Teach modinfo to parse modules.builtin.modinfo. When using Linux kernel
	  >= v5.2-rc1 it's possible to get module information from this new file. Now
	  modinfo is able to show it instead of an error message that the module is
	  built-in:

	  Before:
	  $ modinfo ext4
	  modinfo: ERROR: Module ext4 not found.

	  After:
	  $ modinfo ext4
	  name:           ext4
	  filename:       (builtin)
	  softdep:        pre: crc32c
	  license:        GPL
	  description:    Fourth Extended Filesystem
	  author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
	  alias:          fs-ext4
	  alias:          ext3
	  alias:          fs-ext3
	  alias:          ext2
	  alias:          fs-ext2

- Bug fixes
	- Do not link python bindings with libpython to be compatible with
	  python3.8

	- Fix module removal with `modprobe -r` when a dependency is built-in.
	  Now it properly ignores them and proceed with removal of other
	  dependencies

	- Fix propagation of return code from install/remove commands to the
	  the probe function. The return values of kmod_module_probe_insert_module()
	  have very specific meanings, do not confuse the caller by return codes
	  from system()

	- Fix softdep config parsing leading to buffer overflow

kmod 26
=======

- Improvements
	- Add more error-checking in library functions and remove warnings on newer
	  toolchains

	- Depmod now handles parallel invoctions better by protecting the temporary
	  files being used

	- Improvements to testsuite and added tests to check the our behavior
	  regardless of the features enabled in the kernel, or libraries we link to

	- Teach the --show-exports option to modprobe. This works similarly to
	  --show-modversions, but it reports the exported symbols from that module.
	  Under the hood this reads the .symtab and .strtab section rather than
	  __versions so it shows useful data even if kernel is configured without
	  modversions (CONFIG_MODVERSIONS)

	- Teach pkcs7 parsing to modinfo by using openssl. This allows modinfo to
	  correctly parse the signature appended to a module by the kernel build
	  system when configured with CONFIG_MODULE_SIG_ALL, or when externally
	  signed by the distro. Traditionally modules were signed and a struct
	  was appended together with the signature to the end of the module.
	  This has changed on the kernel for pkcs#7 and now the structure isn't
	  filled out with useful information.  So we have to parse the signature
	  block in order to return useful data to the user.

	  If kmod is linked with openssl we parse the signature and return the
	  fields as we do for other signatures. An example of the relevant part
	  on the output of modinfo is below:

	  Before:
		  sig_id:         PKCS#7
		  signer:
		  sig_key:
		  sig_hashalgo:   md4
	  After:
		  sig_id:         PKCS#7
		  signer:         Fedora kernel signing key
		  sig_key:        51:C4:0C:6D:7E:A5:6C:D8:8F:B4:3A:DF:91:78:4F:18:BC:D5:E4:C5
		  sig_hashalgo:   sha256

	  If kmod is not linked to openssl we just start printing "unknown" in the
	  sig_hashalgo field rather than the bogus value.


kmod 25
=======

- Improvements
	- Add module signature to modinfo output

	- Add support for external directories in depmod: now there's a new
	  "external" keyword parsed by depmod when calculating the dependencies.
	  It allows to add modules to other directories which are not relative
	  to where the modules are commonly installed.  This results in
	  modules.dep and friends now understanding absolute paths rather than
	  relative paths only. For more information see depmod.d(1).

	- Add support for CONFIG_MODULE_REL_CRCS

	- Add missing documentation references in man pages

	- Handle the case in which module has a .TOC symbol already while
	  calculating dependencies

	- Improve testsuite and allow to use mkosi to run testsuite in different
	  distros

kmod 24
=======

- Improvements:
	- Add more information on dependency loop

	- Sanitize use of strcpy and allow to grow from small strings on stack
	  (common case) to bigger strings on heap when needed

- Bug fixes
	- Fix wrong dependency loops being reported by depmod

	- Fix crashes when reporting dependency loops

	- Fix parsing kernel command line containing quotes

	- Fix leaks on error paths

kmod 23
=======

- Improvements:
	- Don't add comment to modules.devname if it would otherwise be empty
	  to play nice with tools detecting empty files

	- Allow building with BSD sed, that doesn't have -E flag

	- Ignore .TOC. symbols in depmod parsing as it's for PPC64 the
	  equivalent of _GLOBAL_OFFSET_TABLE_

	- Teach modinfo about PKCS#7 module signatures: it doesn't add any
	  other info besides telling the user the module is signed since
	  kernel doesn't add other info on the module section

- Bug fixes

	- Fix -s and -p compat options to insmod triggering force flag

	- Fix long lines from /proc/modules not being handled correctly by
	  kmod_module_new_from_loaded() and kmod_module_get_size() and several
	  other library functions that use them

	- Fix crash on modinfo while checking for available signature of
	  unknown type

	- Fix documentation generation with gtk-doc

kmod 22
=======

- Tools:
	- Change default log level for tools to WARNING rather than ERROR and update
	  some log levels for current messages

	- depmod doesn't fallback to uname if a bad version is passed in the command
	  line anymore. We just exit with an error.

	- insmod was taught the -f flag, just like in modprobe. It was previously
	  silently ignoring it.

- libkmod
	- New kmod_get_dirname() API to get the module directory set in the
	  context

- Bug fixes:
	- Fix return code in error path of kmod_module_insert_module(). We were
	  previously returning ENOSYS rather than ENOENT.

kmod 21
=======

- New features:
	- kmod tool started to learn the "insert" and "remove" commands that
	  are the simplified versions of the older modprobe tool.  These
	  commands are still work in progress so they are hidden behind a
	  --enable-experimental flag during build.  It should not be enabled
	  unless you know what you're doing.
	- kmod tool now prints the relevant configuration options it was built
	  with when the "--version" argument is passed. This helps to mitigate
	  problems for example when the user is trying to load a compressed
	  module but kmod was built without support for the compression method.

- Improvements to testsuite:
	- Cache built modules so it is easier to run "make check" on build
	  servers by distro maintainers. If kmod is configured with
	  --disable-test-modules the modules from cache will be used by
	  "make check". No changes to the tests are needed and all of them
	  can run fine.

kmod 20
=======
- Bug fixes:
	- Handle bogus values from ELF, making sure they don't overflow while
	  parsing the file
	- Fix leak in depmod when -b flag is passed multiple times
	- Multiple minor fixes from static analysis by coverity and
	  clang-analyze
	- Fix race between loading modules and checking if it's loaded in the
	  kernel

- New features:
	- There's a change in behavior regarding builtin modules: we now only
	  consider as builtin those that are present in modules.builtin index.
	  Previously we were also checking the presence of
	  /sys/module/<module-name>, but this is racy and only modules that
	  contain parameters are the ones creating a directory in sysfs.

	  Now some commands will start to fail, e.g. "modprobe vt". Since vt
	  can't be compiled as a module it's not present in modules.builtin
	  index. Previously we would report at as builtin, but now we fail
	  because we couldn't find the module.

- Improvements:
	- Integration of gcov into the build. Currently libkmod is at ~70%
	  covered and tools at ~50% by tests in the testsuite. Utility
	  functions and structures in shared have more than 90% of coverage.
	- Upload build to coverity

- Improvements to testsuite:
	- Fix parsing return codes of init_module() calls
	- Add tests for utility functions in shared/
	- Add tests for kmod_module_remove_module()
	- Add playground, in which our own modules are compiled
	- Port all tests to use modules from module-playground instead of
	  copying prebuilt modules to the repository
	- Properly handle binaries that exit with no output
	- Besides comparing the output of commands, allow to copy to
	  stdout/stderr

kmod 19
=======

- Bug fixes:
	- Fix missing CLOEXEC in library
	- Fix error message while opening kmod's index

- New features:
	- Add kmod(8) man page
	- Allow to build with libc's without be32toh()
	- Move code around separating common code and data structures into a
	  shared directory. This allows to share more code between library and
	  tools, making the binary size of tools smaller.
	- Clarify tools vs library licenses
	- static-nodes: when writing in tmpfiles format, indicate that
	  creation of static nodes should only happen at boot. This is used and
	  required by systemd-217+.

- Improvements to testsuite:
	- Add tests for newly created shared/ code
	- Improve how tests are declared so there's less boilerplate code for
	  each test.

kmod 18
=======

- Bug fixes:
	- Fix leaks in error paths
	- Fix use-after-free in hash implementation causing a wrong index to be
	  generated by depmod with out-of-tree modules

- New features:
	- Calling depmod with modules creating a dependency loop will now make
	  depmod return an error and not update the indexes. This is to protect
	  the current index not being overridden by another index that may cause
	  a boot failure, depending on the buggy module. It's a necessary
	  change in behavior regarding previous kmod releases and
	  module-init-tools. The error message was also improved to output
	  the modules that caused the dependency cycle.

- Improvements to testsuite:
	- Fix and improve expected-fail test
	- Add tests for hashmap implementation

kmod 17
=======

- Bug fixes:
	- Fix matching a "." in kernel cmdline, making garbage in the command
	  line be parsed as kmod options
	- Fix man pages to clarify we don't fallback to parsing modules.dep
	  but instead we depend on modules.dep.bin (generated by depmod) to
	  be present
	- Fix ELF parsing on 32 bit systems assigning the wrong class.
	- Fix partial matches of search directives in depmod. Previously having
	  a line in depmod.conf such as "search foo foobar built-in" would cause
	  unpretictable results because foo is a partial match of foobar as well.
	- Fix unaligned access in modinfo when getting the signature from a
	  module
	- Make sure softdeps are treated as optional dependencies

- New features:
	- Accept special files given to "-C" switch in modprobe. This way it's
	  possible to skip system configuration with "modprobe -C /dev/null"
	- Do not require xsltproc on released tarballs
	- Don't use Werror anymore
	- Add experimental python bindings, merged from python-kmod repository
	  (https://github.com/agrover/python-kmod)
	- Parse softdeps exported by the kernel as
	  /lib/modules/`uname -r`/modules.softdep

- Improvements to testsuite:
	- Check the list of loaded modules after a test

kmod 16
=======

- Bug fixes:
	- Fix usage of readdir_r()
	- Add some missing checks for memory allocation errors

- New features:
	- Remove option from libkmod to allow waiting on module removal if
	  the module is being used. It's dangerous since it can block the
	  caller indefinitely.
	- Improve compatibility with musl libc
	- Add fallback implementation for compilers without _Static_assert(),
	  e.g. gcc < 4.6
	- Minor optimizations to the hash table
	- Make depmod warn if a module has incorrect devname specification
	- Use cleanup attribute

kmod 15
=======

- Bug fixes:
	- kmod static-nodes doesn't fail if modules.devname isn't available
	- Fix getting boolean parameter from kernel cmdline in case the value
	  is omitted
	- Fix some mkdir_p() corner cases (used in testsuite and static-nodes)

- New features:
	- kmod static-nodes creates parent directories if given a -o option
	- kmod binary statically links to libkmod - if distro is only interested
	  in the kmod tool (for example in an initrd) it can refrain from
	  installing the library
	- Add shell completion for kmod tool

kmod 14
=======

- Bug fixes:
	- Fix some format strings
	- Protect against NULL being passed around to index
	- Avoid calling syscall() with -1 when finit_module() is not available,
	  since this doesn't always work
	- Fix not being able to remove alias due to checking the module's
	  refcount
	- Minor fixes and refactors

- New features:
	- Improve libkmod documentation, particularly on how flags are dealt
	  with.
	- Remove ability to build a static libkmod
	- Add static-nodes command to kmod that parses modules.devname
	  generating output in useful formats

kmod 13
=======

- Bug fixes:
	- Add the long option --symbol-prefix option to depmod (it was absent)
	  and fix its behavior
	- Don't abort if there's a bogus line in configuration file like "alias
	  psmouse off". Some distros are carrying this since the days of
	  modutils

- New features:
	- Add support for finit_module(2). If the module is load straight from
	  the disk and without compression we use finit_module() syscall when
	  available, falling back to init_module() otherwise
	- kmod_module_get_info() also returns the signature if the module is
	  signed and modinfo uses it
	- Use secure_getenv if available
	- rmmod understands builtin modules, just like modprobe does
	- Improve compatibility with musl-libc
	- Test cases exit with success when receiving a signal if they are
	  xfail tests

kmod 12
=======

- Bug fixes:
	- Fix removing vermagic from module when told to force load a module
	- Fix removing __versions section when told to force load a module: we
	  need to mangle the section header, not the section.
	- modinfo no longer fails while loading a module from file when path
	  contains ".ko" substring

kmod 11
=======

- Improvements to testsuite:
	- Fix testsuite defining symbols twice on 32 bit systems
	- Allow to check generated files against correct ones

- New features:
	- libkmod now keeps a file opened after the first call to
	  kmod_module_get_{info,versions,symbols,dependency_symbols}. This
	  reduces significantly the amount of time depmod tool takes to
	  execute. Particularly if compressed modules are used.
	- Remove --with-rootprefix from build system. It was not a great idea
	  after all and should not be use since it causes more harm then
	  benefits.
	- Hide --wait option on rmmod. This feature is being targeted for
	  removal from kernel. rmmod still accepts this option, but it's hidden
	  now: man page and usage() say nothing about it and if it's used,
	  user will get a 10s sleep. This way we can check and help if anyone
	  is using this feature.
	- Refactor message logging on all tools, giving proper prefix, routing
	  everything to syslog when asked for, etc.

- Bug fixes:
	- Fix parsing of modules.order when using compressed modules
	- Usage messages go to stdout instead of stderr
	- Fix memory leak in hash implementation

kmod 10
=======

- New features:
	- Read coresize from /sys if supported

	- Add flag to kmod_module_probe_insert() to apply blacklisting during
	  probe only if mod is an alias. Now modprobe uses this flag by default.
	  This is needed to fix a change in behavior regarding module-init-tools
	  and ultimately makes us loading a blacklisted module.

- Better formatting in man pages

- Add option to disable building man pages at build time

- Fixes in the testsuite and refactoring of LDPRELOAD'ed libraries

- Re-licensing testsuite as LGPL

kmod 9
======

- Improvements to the testsuite:
	- Check for correct handling of softdep loops
	- Check for correct handling of install command loops

- Bug fixes:
	- Fix build with compilers that don't support --gc-sections
	- Handle errors when dealing with gzipped modules
	- depmod now handles errors while writing indices, so it doesn't end up
	  with a corrupted index without telling the user

kmod 8
======

- No new features, small bug fixes only.
	- Fix a bug in "modprobe -c" output: be compatible with
	  module-init-tools

	- Give a useful error message when init_module fails due to bad
	  parameter or unknown symbols

	- Fix doc generation

kmod 7
======

- Re-order dirs for configuration files to match the change in systemd and
  udev: now the priority is:
	1. /etc/modprobe.d
	2. /run/modprobe.d
	3. /lib/modprobe.d

- Fix setting CFLAGS/LDFLAGS in build system. This prevented us from not
  allowing the user to set his preferences.

- Bug fixes:
	- Return same error codes of module-init-tools when removing modules
	  with modprobe
	- Fix builtin output in "--show-depends" when target kernel is not the
	  same of the running kernel
	- 'modprobe -r' always look at all command line arguments
	- Fix '-q' usage in modprobe

kmod 6
======

- New API in libkmod:
	- kmod_module_apply_filter(): a generic function to apply filters in a
	  list of modules. This deprecates the use of
	  kmod_module_get_filtered_blacklist()

- More tests in testsuite

- Add compatibility with uClibc again

- Lookup modules.builtin.bin to decide if a module is built in kernel

- Downgrade some log messages so we don't annoy people with useless messages

- Bug fixes:
	- Flag --ignore-loaded was not being properly handled
	- Infinite loop with softdeps
	- Infinite loop with dumb user configuration with install commands
	- Fix leak in index when there's a partial match

- Move repository and tarballs to kernel.org

kmod 5
======

- Break libkmod's API to insert a module like modprobe does. It now accepts
  extra an extra argument to print its action and acceptable flags were
  sanitized.

- Share more code between modprobe and libkmod: using the new version of
  kmod_module_probe_insert_module() it's possible to share a great amount of
  code between modprobe and libkmod

- modprobe no longer works with paths: it only accepts module names and/or
  aliases now.

- testsuite was added to repository, allowing automated tests to be run and
  easing the way bugs are reproduced.

- modprobe: when dumping configuration ('-c' option) separate config
  and indexes by adding a commented line between them.

- Fix bugs wrt normalizing aliases and module names

- Fix bug wrt inserting an alias that resolves to multiple modules: we should
  not stop on the first error, but rather continue to try loading other
  modules.

- Fix unaligned memory access in hash function, causing depmod to output wrong
  information in ARMv5

- Fix man page build and install: now they are only installed if tools are
  enabled

kmod 4
======

- New APIs in libkmod to:
	- Get configuration lists: blacklists, install commands, remove
	  commands, aliases, options and softdeps
	- Dump indexes

- Several bugs fixed in libkmod, modprobe, depmod and modinfo

- API documentation: if configure with run with --enable-gtk-doc, the API doc
  will be generated by make. Gtk-doc is required for that.

- Man pages are built, which replace man pages from module-init-tools

- 'include' and 'config' options in *.conf files were deprecated

- configure is not run by autogen.sh. Instead, a common set of options is
  printed. If you are hacking on kmod, consider using bootstrap-configure
  script.

- 'modprobe -c' works as expected now. As opposed to module-init-tools, it
  dumps the parsed configuration, not only the file contents.

kmod 3
======

- New APIs in libkmod to:
	- Get symbols from module, parsing the ELF section
	- Get dependency symbols
	- Check if resources are still valid or if libkmod must be reloaded
	- Insert module like modprobe, checking (soft-)dependencies, commands,
	  blacklist. It can run commands by itself and to call a callback
	  function.

- Support to load modules compressed with xz

- Tools are now bundled together in a single tool called kmod. It can be
  called using symlinks with the same names as tools from module-init-tools.
  E.g: /usr/bin/lsmod -> /usr/bin/kmod. With this we are aiming to complete a
  1:1 replacement of module-init-tools.

- The only missing tool, depmod, was added to kmod together with the necessary
  APIs in libkmod.

- If a program using libkmod runs for a long time, as for example udev, it must
  check if it doesn't have to re-load libkmod. A new helper function was added
  in libkmod to check if context is still valid and udev is already using it.

- An 'unaligned access' bug was fixed. So those architecture that does not
  handle unaligned access can use kmod, too.

kmod 2
======

Some bugs fixed: the worst of them was with an infinite loop when an alias
matched more than one module.

- New APIs in libkmod to:
	- Get soft dependencies
	- Get info from module files parsing ELF
	- Get modversions from files parsing ELF

- Support to load gzipped kernel modules: kmod can be compiled with support to
  gzipped modules by giving the --enable-zlib flag

- Support to forcefully load modules, both vermagic and modversion

- Support to force and nowait removal flags

- Configuration files are parsed in the same order as modprobe: files are
  sorted alphabetically (independently of their dir) and files with the same
  name obey a precedence order

- New tool: kmod-modinfo

- kmod-modprobe gained several features to be a 1:1 replacement for modprobe.
  The only missing things are the options '--showconfig' and '-t / -l'. These
  last ones have been deprecated long ago and they will be removed from
  modprobe. A lot of effort has been put on kmod-modprobe to ensure it
  maintains compatibility with modprobe.

- linux-modules@vger.kernel.org became the official mailing list for kmod

kmod 1
======

First version of kmod and its library, libkmod.

In the libkmod it's currently possible to:
	- List modules currently loaded
	- Get information about loaded modules such as initstate, refcount,
	  holders, sections, address and size
	- Lookup modules by alias, module name or path
	- Insert modules: options from configuration and extra options can be
	  passed, but flags are not implemented, yet
	- Remove modules
	- Filter list of modules using blacklist
	- For each module, get the its list of options and install/remove
	  commands
	- Indexes can be loaded on startup to speedup lookups later

Tools provided with the same set of options as in module-init-tools:
	- kmod-lsmod
	- kmod-insmod
	- kmod-rmmod
	- kmod-modprobe, with some functionality still missing (use of softdep,
	  dump configuration, show modversions)
