Years ago while looking for a fast init replacement for work, I found Finit. Originally written by Claudio Matsuoka to act as a drop-in replacement for the Asus EeePC fastinit, “gaps filled with frog DNA …"
Until I found Finit I had always been in awe of those venturing into the realm of PID 1. However, learning from the simplicity of Claudio’s code I realized that although PID 1 at times is indistinguishable from magic, it is really not that hard to master. My version of Finit is available on GitHub.
The code is open sourced under the very liberal MIT/X11 license, and much of its frog DNA has proven very useful to me over the years. This blog post is about how that frog DNA can help you fill gaps in your projects …
Recently I broke out the most generic pieces from Finit into a separate
library, which I call libite (because it looks awesome linking to
-lite :) I complemented it with a few pieces of my own and some
from the OpenBSD project, most notably their famous string API:
strlcpy(3) and strlcat(3). Also included is the very useful
*BSD linked list API sys/queue.h, which is a much more up to date
version than GLIBC carries. For example, the new
_SAFE macros are
missing, which you want to use while traversing lists to delete/free
To make use of
-lite and its APIs you can either build it as a
separate library and install
libite.so.1 to your system,
libite as a GIT submodule to your project and use only the
parts you need from the archive:
git submodule add https://github.com/troglobit/libite.git
You then need to add
#include "libite/lite.h" to the source and adapt
your Makefile slightly to call the
libite/Makefile before linking your
application to the
all: $(EXEC) libite/libite.a libite/libite.a: Makefile @$(MAKE) -C libite $(EXEC): $(OBJS) libite/libite.a @gcc -o $@ $^
For an example of how this can look, see the uftpd project, which
-luev. The latter is my small event library,
libuEv. For help using
-lite with the GNU configure and build
system, see inadyn.
Libite builds in “silent mode” by default, use
make V=1 (like the
kernel) to get a more verbose output, usable for autobuilders etc.