Avahi provides three programming APIs for integration of mDNS/DNS-SD features into your C progams:
All three APIs are very similar, however avahi-core is the most powerful.
In addition to the three APIs described above Avahi supports two compatibility libraries:
Please note that these compatibility layers are incomplete and generally a waste of resources. We strongly encourage everyone to use our native APIs for newly written programs and to port older programs to avahi-client!
The native APIs (avahi-client and avahi-core) can be integrated into external event loops. We provide adapters for the following event loop implementations:
Finally, we provide a high-level Gtk+ GUI dialog called avahi-ui for user-friendly browsing for services.
The doxygen-generated API documentation covers avahi-client (including its auxiliary APIs), the event loop adapters and avahi-ui. For the other APIs please consult the original documentation (for the compatibility APIs) or the header files.
Please note that the doxygen-generated API documentation of the native Avahi API is not complete. A few definitions that are part of the Avahi API have been removed from this documentation, either because they are only relevant in a very few low-level applications or because they are considered obsolete. Please consult the C header files for all definitions that are part of the Avahi API. Please note that these hidden definitions are considered part of the Avahi API and will stay available in the API in the future.
Some notes on the Avahi error handling:
Avahi uses a simple event loop abstraction layer. A table AvahiPoll which contains function pointers for user defined timeout and I/O condition event source implementations needs to be passed to avahi_client_new(). An adapter for this abstraction layer is available for the GLib main loop in the object AvahiGLibPoll. A simple stand-alone implementation is available under the name AvahiSimplePoll. An adpater for the Qt main loop is available from avahi_qt_poll_get().
With Avahi it is possible to write client applications that can deal with Avahi daemon restarts. To accomplish that make sure to pass AVAHI_CLIENT_NO_FAIL to avahi_client_new()'s flags parameter. That way avahi_client_new() will succeed even when the daemon is not running. In that case the object will enter AVAHI_CLIENT_CONNECTING state. As soon as the daemon becomes available the object will enter one of the AVAHI_CLIENT_S_xxx states. Make sure to not create browsers or entry groups before the client object has entered one of those states. As usual you will be informed about state changes with the callback function supplied to avahi_client_new(). If the client is forced to disconnect from the server it will enter AVAHI_CLIENT_FAILURE state with avahi_client_errno() == AVAHI_ERR_DISCONNECTED. Free the AvahiClient object in that case (and all its associated objects such as entry groups and browser objects prior to that) and reconnect to the server anew - again with passing AVAHI_CLIENT_NO_FAIL to avahi_client_new().
We encourage implementing this in all software where service discovery is not an integral part of application. e.g. use it in all kinds of background daemons, but not necessarily in software like iChat compatible IM software.
For now AVAHI_CLIENT_NO_FAIL cannot deal with D-Bus daemon restarts.
Due to the introduction of wide-area DNS-SD the correct handling of domains becomes more important for Avahi enabled applications. All applications that offer the user a list of services discovered with Avahi should offer some kind of editable drop down box where the user can either enter his own domain or select one of those offered by AvahiDomainBrowser. The default domain to browse should be the one returned by avahi_client_get_domain_name(). The list of domains returned by AvahiDomainBrowser is assembled by the browsing domains configured in the daemon's configuration file, the domains announced inside the default domain, the domains set with the environment variable $AVAHI_BROWSE_DOMAINS (colon-seperated) on the client side and the domains set in the XDG configuration file ~/.config/avahi/browse-domains on the client side (seperated by newlines). File managers offering some kind of "Network Neighborhood" folder should show the entries of the default domain right inside that and offer subfolders for the browsing domains returned by AvahiDomainBrowser.