Avahi 0.6.31
============

This is a bugfix release.

 * Fix compatibility with newest autoconf

This release is backwards compatible with Avahi 0.6.x with x < 31.

Avahi 0.6.30
============

This is a bugfix release.

 * Make IPv6 work again
 * i18n updates
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 30.

Avahi 0.6.29
============

This is a bugfix release.

 * Updates regarding systemd integration
 * Compatibility with newer gtk3 and gobject introspection
 * i18n updates
 * Minor other updates
 * Fix CVE-2011-1002, fixing the fix for CVE-2010-2244

This release is backwards compatible with Avahi 0.6.x with x < 29.

Avahi 0.6.28
============

This is a bugfix release.

 * Updates regarding systemd integration
 * Properly avoid bus activation on non-systemd systems
 * Compatibility with newer gtk3 and gobject introspection
 * i18n updates
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 28.

Avahi 0.6.27
============

This is a bugfix release.

 * Various updates to the systemd integration
 * Reset all signal handlers and the signal mask on initialization
 * Don't trip over SIGPIPE
 * i18n updates
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 27.

Avahi 0.6.26
============

This is mostly a bugfix release but also fixes a low risk security issue and
adds a couple of minor new features.

 * Fix CVE-2010-2244 (Ludwig Nussel)
 * Support for Gtk+ 3 and Gtk+ Introspection
 * Native systemd socket activation support
 * Add systemd service files
 * Add various resource control options, for traffic rate limiting as well as
   cache size and D-Bus client object limits.
 * i18n updates
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 26.

Avahi 0.6.25
============

This is mostly a bugfix release but also fixes a low risk security issue.

 * Fix CVE-2009-0758 (Rob Leslie)
 * i18n updates
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 25.

Avahi 0.6.24
============

This is mostly a bugfix release.

 * A huge number of bug fixes, including a security relavant one (low
   risk)
 * Add two new configuration directives "allow-interfaces" and
   "deny-interfaces" which can be used to make Avahi ignore certain
   network interfaces or only use certain network interfaces.
 * A lot of translation updates

This release is backwards compatible with Avahi 0.6.x with x < 24.

Avahi 0.6.23
============

This is an bugfix release.

 * A lot of translation updates
 * Beef up bnvc quite a bit, including passing a domain to browse in
   (patch from lkundrak)
 * Increase numer of open files resource limit to 300 so that we can
   deal with more clients simultaneously.
 * Rework 'poof' algorithm a bit to reduce traffic load on noisy links.
 * Build fixes
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 23.

Please note that Avahi's SVN has been converted to GIT and is now
available on git://git.0pointer.de/avahi.

Avahi 0.6.22
============

This is an important bugfix release, and adds a couple of new
features.

 * i18n support
 * Documentation and example code updates
 * Support for registering the Avahi documentation in devhelp (needs
   manual setup)
 * Added a new component libavahi-gobject, which is a GObjectified
   version of the Avahi API, contributed by Sjoerd Simons
 * Major BSD compatibility improvements, contributed by "zml"
 * avahi-ui: Allow overwriting of pretty service name by the
   application
 * Service type database updates
 * Add new option --parsable to avahi-browse
 * Minor other updates

This release is backwards compatible with Avahi 0.6.x with x < 22.

Avahi 0.6.21
============

This is an important bugfix release.

 * Make avahi-autoipd actually produce correct ARP packets
   (Identified and patched by Pauline Yeung)
 * Add FreeBSD kqueue support for watching /etc/avahi/services
   (Contributed by Marcus Clarke)
 * Use search domain from /etc/resolv.conf as additional browse
   domains.
 * No longer return a conflict error when two local applications
   register identical RRs.
 * Properly find alternative service/host names for very long names
 * DNS name compression fix (Sjoerd Simons)
 * Fedora init script order fix
 * Several fixes to make gcc produce less warnings
 * Minor documentation and build fixes

This release is backwards compatible with Avahi 0.6.x with x < 21.

Avahi 0.6.20
============

This is a bugfix release and contains a fix for a low risk security
vulnerability.

 * Fix a local DoS vulnerability, where an assert() could be hit by
   passing empty TXT data over D-Bus to the Avahi daemon. (Low Risk)
 * Solaris/dbm portability fixes
 * Close all open file descriptors when daemonizing. Is generally
   safer and fixes a few issues with broken init systems of several
   distributions.
 * avahi-autoipd: allow passing the path of the action script on the
   command line.
 * Several minor build fixes and other cleanups

This release is backwards compatible with Avahi 0.6.x with x < 20.

Avahi 0.6.19
============

This is a bugfix release, but also adds a new component "avahi-ui-sharp".

 * Rename zssh/zvnc to bssh/bvnc to avoid a name collision with another
   free software tool, on request of the Debian developers. I hope
   this name change early in the life of bssh/bvnc won't be too
   difficult to handle by the distributors.
 * Add man page for bssh/bvnc
 * avahi-ui: fix segfault when browsing in empty domains
 * avahi-ui: allow GTK_RESPONSE_OK, _YES and _APPLY besides _ACCEPT as
   positive dialog response codes
 * avahi-ui-sharp: Add Mono/C# API wrapper for avahi-ui
 * Don't pick the first and the last 256 IP addresses from the IPV4LL
   range in avahi-autoipd, as required by RC3927 section 2.1
 * No longer publish the Avahi service identification cookie anymore
   by default. It was a bad idea in the first place. A better
   replacement will hopefully be made available in Avahi eventually.
 * Properly set umask before writing to /var/lib/avahi-autoipd
 * Update .deskop files to work around KDE menu issue
 * Various build fixes and other minor fixes and updates

This release is backwards compatible with Avahi 0.6.x with x < 19.

Avahi 0.6.18
============

This is a bugfix release, adds a few new features and includes a new
component.

 * Add a new library libavahi-ui which contains a standard Gtk dialog
   for browsing for services, and a new tool "zssh" that makes use of
   it, which allows browsing for SSH and VNC servers and starts ssh or
   xvncviewer if one item is selected.
 * avahi-autoipd has been ported to FreeBSD (original patch from Bruce M Simpson)
 * Improve OpenBSD, Solaris, MacOS X compatibility
 * Linux inotify support for monitoring /etc/avahi/services/ and
   /etc/avahi/hosts for changes. (Original patch from "behanw")
 * Add the ability to dump the service type database from avahi-browse
   with the new option "-b".
 * Enable GCC stack smashing protection if available and working (Patch from tedp)
 * Improve compatibility with Bonjour's libdns_sd (patch from Chris Rivera)
 * Various updates to the service type database (based on patches from uws)
 * Fix a local DoS vulnerability (very low priority, all you can do is
   make Avahi hit an assert()); problem identified by "jamesh"
 * Fix a problem when constantly generating conflict events for an RR
 * Fix registration of very large RRs (original patch from Sjoerd Simons)
 * Various minor fixes

This release is backwards compatible with Avahi 0.6.x with x < 18.

Avahi 0.6.17
============

This is a bugfix release.

 * Don't accept "localhost" as a local mDNS host name
 * Allow running avahi-bookmarks as CGI script
 * Improve libdns_sd compatibility
 * Stability: libdns_sd mutex locking order fix
 * Publish IPv6 addresses via IPv4 and vice versa
 * IA64 fixes
 * A lot of minor cleanups and fixes

This release is backwards compatible with Avahi 0.6.x with x < 17.

Avahi 0.6.16
============

This is a bugfix release, it fixes one DoS (100% CPU Usage) and a regression
from the last release

 * Revert previous patch to check nlmsg_pid as it is bogus and breaks in
   many cases, notably when using NetworkManager (Closes: #72)
 * Replace with new SO_PASSCRED-based check of the sending UID, which
   seems to work better (Closes: #72)
 * Handle some errors in libdns_sd more gracefully the way the real
   libdns_sd does (Closes: #64)
 * Apply fix for Linux 2.6.19+ where IFA_RTA / IFLA_RTA is no longer
   defined (Closes: #86)
 * Fix doxygen comments for avahi watch, thanks to tedp (Closes: #77)
 * Make d-bus version detection work for >= 1.0 (Closes: #71)
 * Dont dbus_connection_close on shared dbus connections (Closes: #68)
 * Fix potential endless loop in dns label unpacking code (Closes: #84)
 * Fix bogus assertion in client-publish-service.c example
 * Mild fix to some doxygen docs for avahi-common/address.h
 * Fix passing in custom privileged group (previously ignored setting)
   (Closes: #85)

This release is backwards compatible with Avahi 0.6.x with x < 16.

Avahi 0.6.15
============

This is a bugfix release, this bug is potentially security sensitive

 * Check that netlink messages actually originate from the kernel
   and not another process.
 * Fix build on NetBSD (thanks to Daniel S. Haischt)
 * Fix dbus_service_browser not setting AVAHI_LOOKUP_RESULT_OUR_OWN.

This release is backwards compatible with Avahi 0.6.x with x < 15.

Avahi 0.6.14
============

This release fixes some bugs and includes a new component.

Changes:

  * Add new daemon "avahi-autoipd" which is an implementation of
    IPv4LL as defined in RFC3927, a technology for assigning link-local IP
    addresses without DHCP server. The same functionality has been available on
    Windows under the name APIPA. While it is not the first implemenatation of
    this technology for Free operating systems it is clearly the most powerful
    and hopefully even the most secure. (Because it chroot()s and drops
    privileges and suchlike) For more information, especially about packaging
    this new tool for distributions, please make sure to read:
    http://avahi.org/wiki/AvahiAutoipd
    and of course the man page included in the tarball.  For the rationale for
    adding this program to the Avahi toolset please read this mailing list
    thread:
    http://lists.freedesktop.org/archives/avahi/2006-September/000863.html
  * Fix a segfault in the code handling static host name registrations
  * Add a few new entries to the service type database
  * s/D-?BUS/D-Bus/g
  * Documentation updates
  * Fix service type database building on Solaris
  * Make use of newer D-Bus APIs
  * Fix random seed initialization
  * Install SFTP static service file by default
  * Other minor code cleanups

This release is backwards compatible with Avahi 0.6.x with x < 14.

Please note that this version doesn't compile on NetBSD, patches
welcome.

Please note that avahi-autoipd is available on Linux only for
now. Patches welcome. It is recommended to pass --disable-autoipd to
"configure" on non-Linux operating systems, otherwise the build will
fail.

Avahi 0.6.13
============

This release fixes some bugs and includes minor enhancements.

Changes:
  * Add a new D-Bus method for changing the mDNS host name during
    runtime. This functionality is only available to members of the
    UNIX group "netdev", which is the same access group that is
    enforced by GNOME's NetworkManager daemon. Since NM will probably
    be the most prominent user of this new method, we decided to limit
    access to the same group. The access group can be set by passing
    --with-avahi-priv-access-group= to "configure". If you need more
    sophisticated access control you can freely edit
    /etc/dbus/system.d/avahi-dbus.conf.
  * Add a new utility "avahi-set-host-name" which is a command line
    wrapper around the aforementioned SetHostName() method.
  * Bonjour API compatibility library:
        * Implement DNSServiceUpdateRecord()
        * Allow passing NULL as callback function for
          DNSServiceRegister()
        * Implement subtype registration in DNSServiceRegister() in a
          way that is compatible with Bonjour.
	* Update to newer copy of dns_sd.h
  * If the host name changes update names of static services wich
    contain wildcards.
  * Don't build documentation about embedding the Avahi mDNS stack into
    other programs by default. This is a feature used only by embedded
    developers. Pass --enable-core-docs to "configure" to enable
    building these docs, like in Avahi <= 0.6.12.
  * Build Qt documentation only when Qt support is enabled in
    the configuration. Same for GLib.
  * Change algorithm used to find a new host name on conflict. In
    Avahi <= 0.6.12 a conflicting host name of "foobar" would be
    changed to the new name "foobar2". With 0.6.13 "foobar-2" will be
    picked instead. This follows Bonjour's behaviour and has the
    advantage not confusing people with regular host names ending in
    digits.
  * Don't disable all static services when SIGHUP is received.
  * Fix build when Avahi is configured without Gtk+ but with Python
    support
  * Fix build on MacOS X
  * Support using Solaris DBM instead of gdbm for the service type
    database. The latter is still recommended
  * Minor other fixes and documentation updates

This release is backwards compatible with Avahi 0.6.x with x < 13.

Avahi 0.6.12
============

This is a bugfix and general cleanups release.

Changes:
  * Compatibility with newer D-Bus releases (0.9x)
  * Compatibility with DBUS builds with --disable-checks
  * Fix an error in the DBUS event loop wrapping which
    caused the avahi client libraries to dispatch some events
    too late when used with D-BUS 0.62 and newer.
  * avahi-daemon: fix a minor memory leak in the DBUS code.
  * avahi-glib: some GLIB adapter cleanups
  * avahi-dnsconfd: fix segfault when passing an invalid command
    line option
  * avahi-test: portability patches for Solaris
  * avahi-browse: flush STDOUT after each line, making it useful
    in shell scripts.
  * update service type database

This release is backwards compatible with Avahi 0.6.x with x < 12.

Avahi 0.6.11
============

This is a bugfix and portability release.

Changes:
  * Ported to Solaris
  * avahi-sharp: fix a fatal error in object disposal code
  * add a few new entries to the servivce type database
  * fix potential crash when the daemon shuts down
  * compatibility with newer autoconf versions

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.9 and 0.6.10.

Avahi 0.6.10
============

This is mostly a bugfix release. Two of the bugs fixed are security
sensitive: a remote denial-of-service vulnerability and a buffer
overflow that can allow local users to become the 'avahi' user. We do
not consider either of them major security threats.

The DoS vulnerability can be exploited from a local network only. It
is not worth much, though, since mDNS can easily be flooded with
nonsense anyway. It is easy to kick remote mDNS/DNS-SD services by
provoking a name conflict in perfect accordance with the specs.

The buffer overflow is hard to exploit remotely, only local users can
become the 'avahi' user. In addition the user is trapped inside a
chroot() environment (at least on Linux).

Anyhow, our security assessments are possibly as buggy as our
code. Hence:

     *** PLEASE UPDATE YOUR INSTALLATION ASAP! ***

Changes:
 * Fix a buffer overflow in avahi-core
 * Refuse to process invalid UTF8 data
 * Automatically reconnect to the DBUS if we're kicked. (Works only if
   chroot() is disabled)
 * Don't hit an assert() in the client libs when the Avahi daemon is
   terminated
 * Enumerate all service types in the database in the Service
   Discovery Applet for Gnome
 * Improve the Bonjour compatibility layer to make it survive
   GnomeMeeting's broken usage
 * Deal properly with local non-ASCII hostnames
 * AMD64 and FreeBSD portability fixes
 * Filter double DNS server entries in avahi-dnsconfd
 * Fix a locking bug in avahi-sharp's EntryGroup.AddService()
 * Ported to Solaris (incomplete)
 * Add _airport._tcp to our service type database

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8 and 0.6.9.

Avahi 0.6.9
===========

This release fixes some bugs and includes minor enhancements.

 * Don't allow registration of address records with invalid host names
 * Clean up argument validity checking for AvahiHostNameResolver and
   AvahiAddressResolver
 * Fix Avahi builds without DBUS

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4, 0.6.5, 0.6.6, 0.6.7 and 0.6.8.

Avahi 0.6.8
===========

This release fixes some bugs and adds a few new features. Users of 0.6.7,
please update ASAP!

 * Fix broken parsing of static hosts file
 * Improve out-of-the-box Debian support
 * Add configuration option to allow mDNS over POINTOPOINT links.
   This is a potential security hole and YMMV. See man page for details.
 * Create $(localstatedir)/run on installation

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4, 0.6.5, 0.6.6 and 0.6.7.

Avahi 0.6.7
===========

This release fixes some bugs and adds a few new features

 * Add static hosts name mappings
 * Work around kernel bugs regarding multicast group membership
 * ia64 portability fixes
 * Don't require X11 to run avahi-bookmarks
 * API: Return AVAHI_ERR_IS_EMPTY when the user tries to commit an
   empty entry group.
 * Improved Slackware and Fedora suppport

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4, 0.6.5 and 0.6.6.

Avahi 0.6.6
===========

This release fixes some bugs and includes some documentation updates

 * Add a bunch of new types to the service type database
 * Return errors of avahi_entry_group_commit() properly
 * Many doxygen documentation improvements
 * Fix destruction of AvahiEntryGroup objects using
   avahi_entry_group_free().
 * Don't allow commiting of empty entry groups
 * Use a little less memory in avahi-qt
 * Don't accept empty TXT strings
 * Update example "client-publish-service.c" to show how to modify an
   existing service

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3, 0.6.4 and 0.6.5.

Avahi 0.6.5
===========

This release fixes some bugs and adds a new API function.

 * avahi-browse: properly show services that are removed from the
   network
 * fix build on bi-arch platforms, on GNU/kFreeBSD, on MIPS and
   for non-DBUS builds
 * add new API function avahi_nss_support() and DBUS function
   IsNSSSupportAvailable() which may be used to detect whether
   libc's gethostbyname() supports mDNS domain names.
 * patch avahi-bookmarks to make use of
   IsNSSSupportAvailable(). avahi-bookmarks will now generate links
   with real hostnames instead of numeric IP addresses if mDNS support
   is detected for gethostbyname().
 * add init script for Mandriva Linux
 * speed up avahi_client_free()
 * man page updates
 * install missing header thread-watch.h
 * fix avahi-bookmarks to work with certain twisted versions
 * fix record updating
 * Use pkg-config's Requires.private directive where it makes sense

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2,
0.6.3 and 0.6.4.

Avahi 0.6.4
===========

This is a bugfix release and adds a new event loop implementation to
avahi-common's public interface.

 * avahi-common: add new AvahiThreadedPool event loop implementation
 * avahi-sharp: compatibility with newer mono versions
 * avahi-publish-service: don't ignore the port number specified
 * avahi-sharp: correct some flags definitions

This release is backwards compatible with Avahi 0.6, 0.6.1, 0.6.2 and
0.6.3.

A quick introduction how to use the new AvahiThreadedPool interface is
available in our Wiki:

          http://avahi.org/wiki/RunningAvahiClientAsThread

Avahi 0.6.3
===========

This is a bugfix release. Everyone should update ASAP!

 * avahi-sharp: make sure to append a trailing NUL byte to all C strings
 * avahi-core: fix a double free() which occurs when wide area lookups timeout

This release is fully compatible with Avahi 0.6, 0.6.1 and 0.6.2.

Avahi 0.6.2
===========

This is mostly a bugfix release.

 * Compatibility with DBUS 0.60 (Full compatibility with DBUS 0.3x and
   0.5 is retained)
 * Fix introspection for some auxiliary DBUS objects
 * Miscellaneous documentation updates
 * Improve Autoconf support for detecting PTHREADS library
 * Fix avahi-publish --help
 * Workaround a DBUS limitation which might cause Avahi to die when a
   user sends an empty TXT entry over DBUS
 * Increase number of resolver/browser objects a DBUS client may create
 * Remove fprintf() call in avahi_client_new()
 * Other minor fixes

This release is both up and downwards compatible with Avahi 0.6 and 0.6.1.

Avahi now has its own Domain (http://avahi.org) and a new Website!

And, most importantly, we now have a Logo:
      http://avahi.org/chrome/site/avahi-trac.png

Avahi 0.6.1
===========

This is mostly a bugfix release.

 * Fix a segfault when shutting down the daemon. Please note that this
   issue was not security sensitive in any way but had the ugly side
   effect that the daemon's PID file was not removed properly.
 * Added init scripts for ArchLinux and FreeBSD
 * Add DBUS API versioning through the new method GetAPIVersion()
 * Build the HOWL compatibility library as "libhowl.so", instead of
   "libavahi-compat-howl.so". This will help distributors to ensure
   full API/ABI compatibility with HOWL out-of-the-box.
 * Same for the Bonjour compatibility library
 * Other fixes

We encourage Linux users to update to libdaemon 0.10 since logging
does not work from a chroot() environment with older versions.

This release is fully API and ABI compatible with Avahi 0.6. This is
true for both the C libraries and the DBUS interface.

Packagers should read the new documentation file doc/COMPAT-LAYERS
which contains some information about maintaining full build system
compatibility in addition to ABI/API compatibility.

Avahi 0.6, the "Goddag" release
===============================

 * Support for (read-only) wide area support. (i.e. DNS-SD over unicast DNS)
 * Ported to FreeBSD, NetBSD, Darwin/MacOSX and to some extent OpenBSD
 * Portability fixes for ARM CPUs
 * Compatibility layers for the HOWL and Bonjour APIs
 * Support for registering/browsing arbitrary records
 * Proper support for DNS-SD service subtypes
 * Native C implementations of the client utilities
 * Now passes the Bonjour conformance test suite without any exceptions
 * "Passive observation of failures"
 * chroot() support
 * Many traffic reduction improvements
 * Bugfixes, cleanups

This release is not API/ABI compatible with Avahi 0.5. Please see
docs/API-CHANGES-0.6 for a rough overview over the changes.

Avahi 0.5.2
===========

 * Bug fix release.
 * Fix browing in QT applications (was totally broken)
 * Minor documentation update.

Avahi 0.5.1
===========

 * This is a bug fix release, before the big changes coming in 0.6
 * Fix reporting of the NO_DAEMON error
 * Fix commit throttling algorithm for entry groups
 * Fix counting of the number of resources in an entry group

Avahi 0.5, the 'Bom Dia' release
================================

 * New Mono bindings, allowing you to use Avahi from
   any CLI language such as C#
 * Attempt auto-detection of the D-BUS system bus address
 * Include a 'cookie' in all published records which allows us
   to reliably determine if a service is the same as another.
 * Add API to determine if services are local
 * Better support for threading with AvahiSimplePoll
 * Add some new StringList functions to help binding to it in
   other languages
 * Various build and run-time bug fixes

Avahi 0.4, the 'Hyvää päivää' release
=====================================

 * Renamed the include dirs for the Qt bindings to include the
   version number, as they may diverge in future.
 * Fix a critical bug in avahi-daemon triggered by configuring an interface
   with various DHCP clients when you have no other active addresses which
   caused avahi-daemon to abort.
 * Move to using python-gdbm exclusivly for the service type database.
 * Add support for SUSE
 * Various fixes to the build system

Avahi 0.3, the 'Buenos Días' release
====================================

 * New integration library for QT main-loop applications.
 * Fix a crash in avahi-dnsconfd
 * Documentation Updates
 * Fix building when you don't want Python DBUS or GTK
 * avahi-bookmarks
   - Add new help option
   - Fix handling of paths not starting with a /
   - You can now specify the port and IP to bind to
   - Add option to generate links with hostnames instead of IPs

Avahi 0.2, the 'Dzień Dobry' release
====================================

 * Unfortunately this release broke the API/ABI of libavahi-client
   with the following function removals

   Removal of these functions may affect users of the 0.1 API
    - avahi_service_resolver_block()

   The following functions were simply for debugging information
   and their removal should not affect anyone
    - avahi_entry_group_get_dbus_path()
    - avahi_domain_browser_get_dbus_path()
    - avahi_service_type_browser_get_dbus_path()
    - avahi_service_browser_get_dbus_path()

   Note that while the libavahi-client API changed slightly, the DBUS
   API itself has only had additions and no existing definitions
   have changed.

 * avahi-daemon will now ignore local IP addresses with the "link" scope
   unless it is the only IP address on the interface.
 * avahi-daemon will no longer fail to start if D-BUS is not
   available (if configured with enable-dbus=warn)
 * Fixed a potential crasher when resolving things in libavahi-core.
 * New example demonstrating integration into glib applications
 * Addtion of a set of convenience functions for AvahiStringList
   avahi_string_list_find()
   avahi_string_list_get_pair()
   avahi_string_list_add_pair()
   avahi_string_list_add_pair_arbitrary()
 * Fixed a typo in avahi-glib.pc that stopped programs using
   the GLIB api from compiling correctly
 * A critical bug in the reflector was fixed where it may go into a
   state of constantly flooding queries out to the network.
 * Introduced new asynchronous resolver API
 * libavahi-client gained an API for resolving HostNames and Addresses
   in addition to the ServiceResolver provided in 0.1
 * Added support for Arch and Gentoo linux distributions.
 * Allowed configuration on non-supported distributions
 * Fixed a critical bug where you cannot use more than one AvahiClient
   or use it in an application already using D-BUS
 * Fixed assembly of empty string lists to RFC compliant TXT records
 * Added a new service type description database with human
   understandable descriptions of services with translations.
 * Fixed various minor memory corruption bugs
 * Fixed an issue where Avahi might think it encountered a conflict
   if the process or machine has been suspended
 * Fixed compilation and runtime issues on 64-bit distributions
 * ...
 * PROFIT!!!

Avahi 0.1, the "Guten Tag" release
==================================

The Avahi team would like to announce the immediate availability of
Avahi 0.1 "Guten Tag".

Avahi is a fully LGPL framework for Multicast DNS Service Discovery.
It allows programs to publish and discover services and hosts
running on a local network with no specific configuration.  For
example you can plug into a network and instantly find printers to
print to, files to look at and people to talk to.

Avahi is designed to be compatible with the mDNS/DNS-SD specification
and boasts the following features

 * Fully open source and freely available under the LGPL
 * Full IPv4 and IPv6 support
 * An embeddable mDNS stack
 * Dynamic adjustment to network reconfiguration
 * Daemon with DBUS API for desktop applications
 * C library to interface with the DBUS API
 * Compatible with other mDNS/DNS-SD implementations such as
   Howl and Apple Bonjour (previously Rendezvous)
 * Ability to correctly "reflect" mDNS between two or more LAN segments
 * Ability to configure DNS servers based on mDNS/DNS-SD published
   information, a feature that is very usefull on IPv6
   which has no other mechanism for this.
 * Combined with nss-mdns, allows hostname lookup such as
   'laptop.local' without the configuration of a DNS server.
   http://0pointer.de/lennart/projects/nss-mdns/
 * Easy integration into GLIB, GTK other mainloop applications.
 * Documentation and examples of both developer APIs and utilities.

mDNS/DNS-SD is part of a larger set of specifications for easy
configuration of networking known as "ZeroConf"
(http://www.zeroconf.org/), with the aim of allowing you to plug into
a network and instantly be able to interact with its services.

Avahi was designed to be a fully free implementation, and is
available under the LGPL.  Many other implementations of the mDNS/DNS-SD
specification were previously non-free, restricting their use in many
platforms such as the GNOME desktop and many distributions.

While Avahi is a 0.1 release, we feel it is feature complete and
available for immediate use, developers can make use of the Avahi
client library to provide above mentioned functionality in their
programs.

We unfortunately do not have a logo yet! We would love if someone
could suggest ideas for a logo or even design us one.  If you think
you can help us out, you can contact us on our mailing list or by
emailing Trent Lloyd on lathiat@bur.st.

If you would like more information or help, you can subscribe
to our mailinglist, goto
    http://lists.freedesktop.org/mailman/listinfo/avahi

You can download Avahi 0.1 here
    http://www.freedesktop.org/~lennart/avahi-0.1.tar.gz

You can also find out more information from our homepage
    http://www.freedesktop.org/Software/Avahi

We would like to thank the following people for their
contribution to Avahi 0.1.
    Lennart Poeterring
    Trent Lloyd
    Sebastien Estienne
    Ross Burton
    Tommi Vainikainen
    Joe Shaw
    Ikke
    Steev

Cheers,
The Avahi Team
