Features:
=========

* config: configs that do not need to be matched by fnmatch() could be using a
  vector instead of a list. This way we could search in it by calling
  bsearch().

* index: drop the "open(), seek(), read()" implementation and use another one
  with mmap(). When lookup() is called and the file is not mmaped, mmap it.

* create test-mock library to be LD_PRELOAD'ed before running the binaries
  so we're able to create unit tests

* review API, maybe unify all of these setters:
   - kmod_module_version_get_symbol()
   - kmod_module_version_get_crc()
   - kmod_module_symbol_get_symbol()
   - kmod_module_symbol_get_crc()
   - kmod_module_dependency_symbol_get_symbol()
   - kmod_module_dependency_symbol_get_crc()
   - kmod_module_versions_free_list()
   - kmod_module_symbols_free_list()
   - kmod_module_dependency_symbols_free_list()

* unify code from modprobe and libkmod:
   - remove kmod_module_probe_insert() and turn it into
     kmod_module_probe_get_list(); this way modprobe can use it too

* provide modules.archive, a cache file with all modules compressed
  and a fast access. It's like a tar.gz, but with each entry
  compressed as opposed to the whole tar compressed, easy to pick
  individual entries, that is, more like .gz.tar. As zlib compression
  does not store the uncompressed file size, this could provide
  it. The file format should be something like:
     MAGIC-ID
     DIRECTORY-ENTRY-SIZE
     DIRECTORY (hash-like format, points to file offset and size)
     ENTRIES (each is a compressed module)
  Helper binary to:
     kmod-archive list
     kmod-archive add path.ko
     kmod-archive rm path.ko
     kmod-archive get path.ko
     kmod-archive exists path.ko

* Stop using system() inside the library and use fork + exec instead

Known Bugs:
===========


Things to be added/removed in kernel (check what is really needed):
===================================================================

* list of currently loaded modules
	- readdir() in /sys/modules: dirs without a 'initstate' file mean the
	  modules is builtin.

* module's size should be available under /sys
	- DONE in 3.3: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commit;h=cca3e707301862ca9b9327e6a732463982f8cd1b

* kill /proc/modules ?
	- Unlikely, given other tools might depend on it

Things that are different from module-init-tools on purpose (!TODO)
===================================================================

modprobe
--------

* 'modprobe -l' was marked as deprecated and does not exist anymore

* 'modprobe -t' is gone, together with 'modprobe -l'

* there's and additional '--remove-dependencies' flags to kmod-modprobe so we
  can remove modules depending on that one

* kmod-modprobe doesn't parse configuration files whose name don't end on
  '.alias'  or '.conf'. modprobe used to warn about these files.

* kmod-modprobe doesn't parse 'config' and 'include' commands in configuration
  files.

* we don't use <module-dir>/modules.builtin{,.bin} indexes. Instead we rely on
  module appearing on /sys/modules/* without a initstate file to determine if
  it is builtin.

* modprobe from m-i-t does not honour softdeps for install commands. E.g.:
  config:

        install bli "echo bli"
	install bla "echo bla"
	softdep bla pre: bli

  With m-i-t, the output of 'modprobe --show-depends bla' will be:
        install "echo bla"

  While with kmod:
        install "echo bli"
        install "echo bla"

* kmod doesn't dump the configuration as is in the config files. Instead it
  dumps the configuration as it was parsed. Therefore, comments and file names
  are not dumped, but on the good side we know what the exact configuration
  kmod is using. We did this because if we only want to know the entire content
  of configuration files, it's enough to use find(1) in modprobe.d directories

depmod
------

* there's no 'depmod -m' option: legacy modules.*map files are gone

lsmod
-----

* information is parsed from /sys instead of /proc/modules
