Since we copy dirname + "/" + path to a fixed buffer of size PATH_MAX, we need to check that the buffer cannot overflow.
"apt-cache depends --recurse -i ..." on Ubuntu 12.04 (apt 0.8.16~exp12ubuntu3) outputs duplicate entries which broke the code that checks whether all package files have been successfully downloaded. I am not sure if this is a bug in apt.
This works around this Fedora problem: https://bugzilla.redhat.com/show_bug.cgi?id=733117#c4
Yet Another Bug caused by lack of strong typing and nullable types in this sad excuse for a programming language.
If there is no --use-installed option, then it didn't download all the packages (only the ones not installed). But this failed later when it tried to unpack the packages that hadn't been downloaded. Thus download all the packages if !use_installed.
Use the Debian ph_init handler to get the list of installed packages.
use_installed is a global variable (defined in febootstrap_cmdline.mli) so there's not much point in passing it around to every function that needs it. This commit removes the optional argument in favour of just using the global variable in each package handler. However we still need a place where we can bail if the --use-installed flag is used for package handlers which don't support this yet. Thus add a ph_init function is called after the right package handler has been detected but before it is used. This is a convenient place to put the --use-installed checking and any other initialization that is required.
Delay calling this until after debian_detect() has been called and we've decided to use the Debian backend. Otherwise this breaks non-dpkg backends. This fixes commit b8cea46.
Since the pactree utility only accepts one package name, we must iterate through the packages rather than specify them all on the command line. To avoid errors when febootstrap is run on a system with outdated packages, use ls and awk on the febootstrap package cache directory rather than using the host's outdated pacman database.
ArchLinux used to keep its kernel in /boot/vmlinuz26 but, with Linux 3.0, now uses /boot/vmlinuz-linux. Instead of just changing the kernel filename and module directory, this change removes the ArchLinux specific code, lets febootstrap find a kernel, and then computes the module directory from the version string extracted from the actual kernel file.
Detect libz and, if present, define HAS_LIBZ and add -lz to Makefile's LIBS variable. Add entry on optional zlib package requirement. Detect both uncompressed and gzipped kernel modules. Some Linux distros (like ArchLinux) use gzipped kernel modules with filenames like ext2.ko.gz. This change modifies the filename pattern from (e.g.) "ext2.ko" to "ext2.ko*". When available, use libz to read the module. The init_module system call requires uncompressed kernel module bytes. On some systems (e.g. ArchLinux) the modules are gzipped on disk. Libz is used to read and uncompress gzipped disk files (*.ko.gz) or transparently read uncompressed modules (*.ko).
This saves over 5 seconds during the slow path construction of the appliance. The ext2fs_close2 API is present in the e2fsprogs 'next' branch and will be in a later e2fsprogs release (thanks Ted Ts'o).