Posted on So 16 Oktober 2005

Avahi Gains Compatibility Layers for Apple Bonjour and HOWL

A short while ago I checked in to SVN two API/ABI compatibility modules which implement the HOWL and the Apple Bonjour (dns_sd.h) DNS-SD/mDNS APIs on top of Avahi's native API. Effectively this means that you can run *all* Zeroconf-enabled software that is available for free operating systems seamlessly on top of Avahi. Or at least the software that uses the limited subset of API functions we support. Missing functions will be implemented on an on-demand basis. Gnome-VFS/Nautilus works perfectly, as does Gobby, which are the only real-world applications we tested until now.

The list of supported/unsupported functions is available from SVN for HOWL and for dns-sd.h.

The compatibility layers are actually pretty interesting pieces of code: for compatibility with the way HOWL/Bonjour integrates with event loops we had to hook up the timeout and I/O watches D-BUS depends on to a single file descriptor. This involves all kinds of ugly things like threading and "creative" ways to use the event loop abstraction Avahi provides. Some might call this "cracktastic", but it actually works pretty well.

The compatibility layers are not intended to be long term solutions. For every session object we create a background thread that polls for events and a DBUS session object. This is an utter waste of resources, especially on dns_sd.h where every basic operation uses a session object of its own. In addition, our compatibility layers are incomplete. We do not offer the full set of functions or the full semantics. Our compatibility is just good enough to make most Zeroconf-aware programs work with Avahi right now.

We consider neither dns_sd.h nor the HOWL API a "well designed" API and encourage people to port their programs to our more powerful native API. To stress this the two modules will warn the user about their usage and write a warning line to STDERR and syslog. Hopefully this will annoy people sufficiently that Avahi adoption speeds up a little.

To our own surprise we actually support at least one API function more than each of the reference implementations! From dns_sd.h we support DNSServiceEnumerateDomains() which is actually unsupported by Apple Bonjour on POSIX/Linux systems. The documented HOWL function sw_ipv4_address_decompose() is actually a NOOP in the reference implementation, but isn't in our compatibility layer.

Since dns_sd.h is the only file licensed under a BSD license in the otherwise APSL-licensed mDNSResponder distribution, we were able to copy it into our sources untouched.

Here's a screenshot of Nautilus and Gobby running on top of Avahi through the HOWL compatibility layers.

© Lennart Poettering. Built using Pelican. Theme by Giulio Fidente on github. .