Don't check for NULL-pointers before calling free().
Fix compilation errors when --enable-uml is used.
Const correctness.
Support autoconf's --runstatedir option. Put the PID file in @runstatedir@ instead of @localstatedir@/run. This requires autoconf 2.70, which is not released yet, so add a fallback to use @localstatedir@/run if @runstatedir@ is not set.
Reformat all code using astyle.
Convert sizeof foo to sizeof(foo). While technically sizeof is an operator and doesn't need the parentheses around expressions it operates on, except if they are type names, code formatters don't seem to handle this very well.
Update all header guards. Don't start with underscores, as those are reserved for system libraries. Make sure all start with TINC_, and that they appear at the top of the file.
Set FD_CLOEXEC flag on all sockets. Scripts called by tinc would inherit its open filedescriptors. This could be a problem if other long-running daemons are started from those scripts, if those daemons would not close all filedescriptors before going into the background. Problem found and solution suggested by Nick Hibma.
Allow linking with multiple device drivers. Apart from the platform specific tun/tap driver, link with the dummy and raw_socket devices, and optionally with support for UML and VDE devices. At runtime, the DeviceType option can be used to select which driver to use.