1.10.0 - 2013-09-04
    Features:
      The configuration syntax now supports include files.
    Bugfixes:
      Responses to type=ANY queries on CNAME RRs were incorrect
        per the relevant RFCs.  Now they're correct.  I don't
        believe the broken cases were broken in ways that would
        matter for most users in production queries, though.
      When the final line of a zonefile contained a data record
        with no terminating newline, the unterminated data was
        silently ignored.  This now produces a proper parse error.
      Made testsuite more likely to succeed when run as root,
        which is still a bad idea.  Also warns loudly in an
        effort to reduce bug reports about testsuite failures
        when running as root.
      Several smaller bugfixes - minor code issues never seen in
        the wild, found via valgrind, clang-analyzer, and/or Coverity.
    Meta-stuff:
      Travis (http://travis-ci.org) support added to automatically
        run the build+test process for incoming pull requests
        and new pushes to the main branches as well.
      Started using Coverity's free scan tool for open source
        projects, which has helped spot additional defects.
      Moved general info out of README.md and into http://gdnsd.org
        hosted on github pages or the INSTALL file as appropriate.
        Tarball downloads are now at http://downloads.gdnsd.org as
        well, but the old downloads.gdnsd.net URLs will redirect there.
      Removed the pkg/ subdirectory and RPM specfiles.  I'm not
        really using or maintaining these personally anymore, and
        they really don't belong in the upstream source anyways, as
        there are too many distro/version differences to account for.
        Leave that stuff to the distro packagers.

1.9.0 - 2013-07-09
    Added support for the new IANA-assigned edns-client-subnet option
      code, while keeping backwards compatibility with the deprecated
      experimental option code as well.
    JSON output format added to the HTTP stats stuff at /json (Tom Walsh)
    Autotools dependencies lowered (ac-2.63, am-1.11.1, lt-2.2.6)
    Bugfixes:
      Weighted plugin didn't always do whole-datacenter failover correctly
        when used as a sub-plugin for e.g. metafo/geoip (Alexander Clouter)
      RPM specfiles updated for various package bugs (Matthias Saou)

1.8.3 - 2013-05-30
    Bugfix: bad default rootdir; did not start without explicit "-d".
      This bug was introduced in 1.8.2, and breaks most normal use-cases,
      but unfortunately didn't break the testsuite since it always uses -d.
      If 1.8.2 was failing to start for you and complaining about a failed
      mkdir(), this was why.
    Added t/README-NETDNS to the tarballs, was missing due to oversight.

1.8.2 - 2013-05-06
    Syslog output improvements on startup, to reduce confusion:
      The location of the config file is always logged
      Whether the config file was found or not is always logged
      The location of the rfc1035 zones directory is always logged
      The count of zonefiles loaded from that directory is always logged
      The log messages about failures related to ".mtime_test" have
        been expanded to be clearer about how unimportant this is.
    If the (existing) IPv6 basic socket test peformed at startup fails,
      which tends to indicate that IPv6 has been disabled somehow or
      other on the host as a whole, the default getifaddrs()-based
      interface scanner will now skip over any detected IPv6 interfaces
      and log a warning about the condition exactly once.  Previously
      it would try to bring these up, usually resulting in a fatal error.
    Illegal (according to the docs and intent) "listen" option
      strings of the form ":port" were succeeding with some
      implementations of getaddrinfo(), which would translate
      the empty address to "::1".  These are now rejected correctly.
      The correct way to change the default port while still using
      the default interface scanning is to use the "dns_port" option.
    Fixed a 64-bit unaligned access issue which cropped up in the
      Debian sparc64 port.
    Meta-changes (not runtime code):
      Various build/test deps improved:
        Ragel dep changed from 6.[67] to 6.x
        autoconf lowered from 2.69 to 2.68
        automake lowered from 1.11.6 to 1.11.3
      Tarballs now include autogen.sh and qa/ from the repo
      Testsuite made somewhat more resilient against timing
        failures on very slow or overloaded hosts
      Testsuite now bundles Net::DNS 0.68, and the external
        dependency is removed.  This solves major compatibility
        problems with installed later versions of Net::DNS.
      "make install" now creates various empty subdirectories
        that might be useful to (or required by) the runtime daemon
      "make install" warns if the default privdrop user "gdnsd"
        doesn't yet exist.

1.8.1 - 2013-03-14
    Bugfix: extmon configurations with more than 255 specific commands
      should no longer fail on startup.
    Bugfix: code should now work correctly on targets that do not allow
      unaligned memory access (e.g. Sparc).  1.8.0 detected this early
      in the configure process and aborted the build.  Note that the
      new solution relies on the non-standard gcc "packed" structure
      attribute, which at least some other useful/compatible compilers
      support.  Patches welcome if this is an issue on others.
    A few small doc updates, most notably that our versioning policy
      going forward will follow http://semver.org/ , at least for
      user-level changes (not necessarily the plugin API very strictly
      at this time, due to its documented state of flux).

1.8.0 - 2013-02-04

    Start of new stable series, 1.8.x will mostly be just bugfixes.
    This entry is just a highlight of the changes from 1.6.x -> 1.8.x.

   User-visible stuff:

     The packet error logging facility (lpe_on/lpe_off commands, SIGUSR[12],
       etc) is gone, and its messages have either been upgraded to full
       warnings or eliminated as appropriate.
     A new monitoring plugin "extmon" allows gathering monitor results
       via external commands.
     The previous commandline option "-c <configfile>" has been replaced
       with "-d <rootdir>".  In a normal build with no "-d" option supplied,
       the config file location is fixed at compile-time to
       "/etc/gdnsd/config", where the leading "/etc" is whatever autoconf's
       $sysconfdir is.  When the "-d <rootdir>" option is used, the daemon
       chroots to the specified directory and all config and zone data is
       located within it.  It is possible to default to a chroot directory
       at compile-time, in which case "-d system" is used to operate in
       non-chroot mode.  See the primary gdnsd(8) manpage for more detail.
     The entire config file is optional now.  With a missing or empty config
       file, gdnsd will listen on port 53 of all interfaces with default
       options and serve any zones that appear in the zones directory.
     The previous config options "pidfile", "chroot_dir", and "zones_dir"
       no longer exist, as these paths are always either fixed system paths
       or fixed subpaths relative to the compiled-in or commandline-provided
       chroot directory.

     Dynamic zonefile processing and the Zones Directory:
       The "zones" stanza in the primary config file no longer exists.
       The set of zonefiles is determined by scanning the Zones Directory,
          which would commonly be "/etc/gdnsd/zones" or "etc/zones" within
          a chroot execution environment.
       Each zonefile must be named for the zone it represents.  Trailing
          dots are ignored.  The transformation "s,@,/," is performed
          when converting filenames to zone names, to make RFC2137
          in-addr.arpa zones easier.
       The zones directory cannot contain subdirectories, symlinks, or
          other non-normal files (e.g. sockets).  Filenames beginning with
          "." are ignored.
       Any changes to the contents of the zones directory (file updates,
          new files, deleted files) will be processed automatically at
          runtime by default.  The frequency and timing of processing
          these changes can be tuned in the config options, or turned
          off completely.  Linux systems with kernel 2.6.36 or higher
          will use inotify() to greatly improve the speed and efficiency
          of detecting changes.
       SIGHUP or "gdnsd reload" will trigger a manual update of the zones
          directory data, regardless of whether automatic reloading is
          enabled or disabled.

     Zonefile parsing/data changes:
       Zonefiles are now completely independent of each other.  There are
         no internal references between them, and a lookup on a name in
         one zone will not, for example, automatically construct glue
         records from other locally-available zonefiles, or include
         any cross-zone portions of a chain of CNAME results.
       DYNA records can now be used for NS glue.
       The "strict_data" option no longer exists, and its more-important
         messages have been downgraded to mere warnings.
       $INCLUDE is no longer supported.

     plugin_geoip changes:
       The "nets" stanza can now be replaced with an external CSV-format
         file which is dynamically reloaded as it changes on disk, for
         constructing complex mappings based on e.g. BGP data.
       Data from the "nets" stanza or file is now fully and optimally
         merged with any other data sources for generating optimal
         edns-client-subnet masks.
       All database sources (GeoIPv4, GeoIPv6, nets) are now reloaded
         independently when they change on disk, and the GeoIP loading
         code has been significantly sped up.
       All database sources are now optional.  It is possible to operate
         from just a nets file and no GeoIP database, or pointlessly with
         no input databases or nets stanza data at all.
       The auto_dc_coords option allows the omission of datacenters now,
         with the result being that those datacenters will not be used
         in city-auto-mode resultsets, but will still be available for
         use in manual map entries.

   Less-user-visible stuff (builders/packagers/etc):

     Daemonization/initscript-related code is much more robust than
       in previous versions.
     Distro packagers can use --with-rundir=/run where applicable
       for the platform in question, instead of the default
       $localstatedir/run.
     Libev 4.x is now an external dependency rather than bundled
       with gdnsd's source code.
     New optional (but highly recommended) dependency on liburcu,
       aka userspace-rcu, for significant efficiency improvements.
     A number of API changes for any external 3rd party plugins,
       detailed in the gdnsd-plugin-api docs.  Notably, installed
       headers are now moved from <gdnsd-foo.h> to <gdnsd/foo.h>.
     Many other less-notable small changes and fixes...

1.7.8 - 2013-01-30
    Linux inotify() support in the zonefile scanner now no longer depends
      on glibc 2.13 headers (still requires runtime kernel >= 2.6.36).
    Failure to bind() to an address picked up by default getifaddrs()
      interface scanning due to EADDRNOTAVAIL is no longer fatal.
    The functional de-duplication of monitored resources no longer
      removes redundant entries from the HTML/CSV outputs.
    Plugin API version bumped to ensure plugin binaries built during
      the unstable development period can't be loaded without at least
      a recompile.
    Improved UDP buffer size negotation with the kernel, fixes testsuite
      failure on GNU/kFreeBSD.
    Testsuite *can* be run as root now.
    Better configure-time checks for sendmmsg() on Linux
    Runtime ENOSYS checks for sendmmsg() and inotify_init1() on Linux
    Removed all accept4() use, none of it was critical enough to
      warrant more compatibility work.
    Fail during configure on CPUs that require aligned access
    Various minor code/doc fixups

1.7.7 - 2013-01-22
    Testsuite bugfix for hosts without a GeoIP database installed
      in the usual location
    Linux sendmmsg() compatibility stuff, for hosts with 3.x
      kernels paired with an older glibc.
    RPM specfiles updated
    Various minor code/doc fixups

1.7.6 - 2013-01-17
    Fix for gdnsd_geoip_test breakage (1.7.5 system paths stuff)
    In system paths mode, we no longer attempt to create a missing
      config dir or subdirectories thereof.  In chroot mode we still
      do.  In both modes, the .mtime_test write is still attempted
      in the zones subdirectory, but it fails gracefully in readonly
      or missing-subdir scenarios and the only fallout is a longer
      delay on loading zonefile changes in some scenarios.
    plugin_geoip:
      Fixed a small bug that could cause a crash on invalid
        input from a binary GeoIP database.
      Fixed a small but rather ugly and confusing bug with the code's
        understanding of the GeoIP header format for identifying
        the database type.  It worked before on most MaxMind
        databases just by luck and circumstance.
    A few other small bugfixes, docfixes, quality stuff.

1.7.5 - 2013-01-10
    The forced chroot mode that has been the default for most of
      1.7.x has now been made optional.  The default default
      is now "-d system", which triggers the use of system paths
      (e.g. /etc/gdnsd/config), and this can be overriden at
      configure-time via --with-rootdir=/srv/gdnsd for the old
      behavior, or at runtime via "-d /srv/gdnsd".  Regardless
      of the configure/build-time setting, all builds can operate
      in both modes at runtime if given the appropriate "-d" argument.
    A new configure argument "--with-rundir=/run" is available for
      distributions that want the pidfile under e.g. /run instead of
      the default /var/run ($localstatedir/run in autoconf terms).
      This only affects the default "system"-style invocation, and
      the actual pidfile ends up in e.g. /run/gdnsd/gdnsd.pid, or
      /usr/local/var/run/gdnsd/gdnsd.pid if no alternate prefix,
      localstatedir, or with-rundir is specified.
      In the chroot case the pidfile still lives within the chroot.
    Due to the pidfile moving above, running instances from before
      this change won't be stopped by the new code properly, you'll
      have to shutdown before upgrading, or manually kill the old one.
    Tons of minor code quality fixups, distribution compatibility
      fixups, packaging/autoconf fixups, etc.
    A few key changes for external plugins, mostly that the include
      file paths are now of the form <gdnsd/plugin.h> rather than
      <gdnsd-plugin.h>.

1.7.4 - 2012-11-30
    Embedded libev removed.  Libev is now an external pre-requisite.
    DOS-style line endings (\r\n) are now accepted when parsing
      configuration and zone files.
    URCU (userspace-rcu) can be explicitly disabled via autoconf
    plugin_extmon: a couple of small bugfixes
    plugin_geoip:
      Code heavily refactored
      pointless city_no_city feature removed
      Now uses URCU (if avail) instead of pthread rwlock for updates.
      GeoIP databases are now optional; one can choose to use only
        "nets" data (or none at all, resulting in everyone getting
        the default).
      GeoIP database runtime reloading is now more efficient and
        doesn't trigger a re-scan of other unchanged database files.
      "nets" can be specified as the pathname of an external file of
        arbitrary size.  This file will be runtime-reloaded on
        change just like the GeoIP databases are.
      "nets" is now properly and optimally merged onto the baseline
        GeoIP data rather than hacked on top of it.
      "nets" now allows most of the IPv6 address space to be
        specified.  Most of the "v4-compatible" IPv6 areas are still
        illegal other than v4compat.  Previously any supernet of
        those areas was also illegal.
      The dubious and ill-defined fallback behavior from an
        edns-client-subnet lookup that produced questionable results
        to a cache IP lookup has been removed.  If edns-client-subnet
        information is available with any netmask greater than zero,
        it will be used for results.  The cache's IP is only checked
        when edns-client-subnet data isn't available.

1.7.3 - 2012-09-18
    New monitoring plugin "extmon", which can run external commands
      for status updates.

1.7.2 - 2012-09-11
    The zones_rfc1035_* config options changed in name and function
      a bit, see the docs.
    A lot of new tests were added for the new runtime zone
      (re-)loading code
    A bunch of syslog output was added to help document what's
      happening with the zone (re-)loading and unloading process
      at runtime as it's happening.
    The data root directory (as well as its basic subdirectories)
      will now be created on startup if missing.  The parent of
      the data root must already exist, though.  When data root
      is created for you, you're on a completely default
      configuration with no authoritative zones being served
      (all queries REFUSED), but it will automatically load
      and begin serving any zonefiles you drop into the etc/zones
      subdir while it's running.
    Several bugfixes over 1.7.1

1.7.1 - 2012-09-01
    Changes from 1.6.x are fairly dramatic, just covering the
      user-visible highlights here:
    Commandline "-c /etc/gdnsd/config" replaced with "-d /srv/gdnsd"
      "-d" means data root directory, it's the base directory under
        which gdnsd finds all config/data input, etc...
      When chroot() is used, it always uses the "-d" data root dir
      Regardless, all data input (config, zones, geoip data, etc)
        as well as the daemon's pidfile are restricted to live
        within the data root dir, with the following standardized
        layout:
          main config -> /etc/config
          zones dir -> /etc/zones/
          geoip data -> /etc/geoip/
          pidfile -> /var/gdnsd.pid
    Dropped related config options: pidfile, chroot_path, zones_dir
    The "zones" stanza in the main config file doesn't exist anymore;
      the set of zones is determined by scanning /etc/zones
    The zones directory has many restrictions to make scanning
      more reliable and sane:
        All files must be named for the zone they represent
        No $INCLUDE statements
        No subdirectories
        No symlinks
        Filenames starting with "." are ignored
        Daemon does s,@,/, to make RFC2137 in-addr.arpa zones easier
    Since everything in the config file is now optional, the config
       file itself is now optional as well.
    Added configure argument --with-def-rootdir, which defaults
      to /srv/gdnsd to basically comply with the FHS.
    By default, zonefiles are now automatically reloaded when they
      change on disk.  On recent Linux this happens quickly via
      inotify(), on others it happens eventually via periodic
      directory scanning.  No need to restart the daemon because the
      zone data changed anymore.  It's best (but not necessary) to
      manage the zones directory with atomic rename()/unlink() (mv/rm).
    Automatic scan/reload of data at runtime can be disable
      via config option "zones_rfc1035_auto".
    SIGHUP now triggers a zone data reload regardless of auto setting.
    The "reload" commandline/initscript action sends SIGHUP.
    Several deprecated things in 1.6.x were killed, mostly
      plugin-related things (e.g. service_type vs service_types).
    The "log_pkterr" stuff was removed (lpe_on/off, SIGUSR1),
      these messages were replaced with debug or warning
      messages as appropriate.
    The "strict_data" option doesn't exist anymore, and all
      such errors were downgraded to warnings.
    In general, zones are much more isolated from each other, and
      no queries use cross-zonefile data in their results.
    DYNA now works for out-of-zone NS glue targets.
    New optional dependency on liburcu.  If detected at configure
      time, it will make zone data reloads more efficient.
    plugin_geoip: GeoIP databases should load considerably faster
      than before thanks to Timo's speedup patch.
    plugin_geoip: auto_dc_coords can now omit datacenters from its
      list of coordinates.  Omitted datacenters can still be returned
      via specific map entries or net entries, but will not be returned
      for automatic results.
    Innumerable smaller fixes and updates...

1.6.9 - 2012-09-11
    Slight improvements to daemonization: better syslog/stderr
      messages in some cases, and all messages related to
      any immediate failure on daemon startup attempt
      should be reflected in stderr (before, sometimes they
      would only go to syslog, even though the outer
      process exited non-zero correctly to indicate the
      problem).
    Fixed a testsuite compatibility bug with Net::DNS 0.68

1.6.8 - 2012-08-17
    Pidfile/Initscript/Daemonization bugfixes (many thanks
      to Timo Teräs for bringing them up and walking me
      through the proper solution).
    Note that while the behavior is improved in this version,
      it still has some corner-case bugs required for
      compatibility with previous 1.6.x instances (e.g. for
      restart on upgrade), which will be removed in post-1.6.x
      releases.
    Various text/link updates from the move to Github hosting.

1.6.7 - 2012-05-07
    This release is just to fix up packaging issues and expand
      the self-init-script code a bit, no real functional code
      changes.
    An official specfile and initscript are now included under
      the pkg/rpm/ subdirectory for building RPMs.  My primary
      target with these is currently Amazon Linux, but they
      should work for other Redhat-ish distros.  The specfile
      is based on Matthias Saou's earlier work for Fedora.

1.6.6 - 2012-05-04
    Bugfix: Issue 15: When using the meta-plugins geoip and/or
      metafo, if one misconfigured things such that a DYNC record
      tries to resolve through a plugin that only supports DYNA
      (or vice-versa) the daemon would segfault during checkconf
      or startup phase instead of giving a clean error message.
    Bugfix: MacOS Lion IPv6-related build-time bugfix (./configure
      would fail on this platform).
    Bugfix: If "service_types" was defined, but completely unused
      by definition (no plugins making using of monitoring), an
      incorrect fatal config error would be triggered on startup
      indicating that "service_types" was not a legal config
      stanza.

1.6.5 - 2012-03-28
   plugin_geoip: if auto_dc_limit was set to the explicit value
     of zero, most queries would return no results due to the
     code taking the zero very literally.  The expected, sane
     behavior would be to interpret zero as "unlimited", and
     the code and docs have been updated to that behavior now.
     (Issue #14 on googlecode)
   A minor efficiency fixup for plugins: the core code would
     indicate a larger iothread count than really existed when
     TCP was disabled for any sockets, resulting in some wasted
     initialization.  Fixed in master for correctness, in case
     it causes fallout bugs for 3rd-party plugin-specific code.

1.6.4 - 2012-03-11
   Bugfix: The zonefile parser did not correctly handle the case
     where the left-hand domainname was left blank (indicating
     repetition of the previous name) and the zonefile contained
     no previous name.  This resulted in a segfault on startup
     in production builds and an assertion failure in debug builds.
     This case is now handled by making the current origin the
     implicit default previous name.
   Bugfix: The deprecation warning message for subzones (added
     in 1.6.3) was not properly formatting its arguments for
     terminal display.
   A few small fixups to the autotools infrastructure, including
     one that should make life easier for distribution packaging
     tools that make use of "make install DESTDIR=..."
   Bugfix: The lpe_on and lpe_off commands were sending pointless
     signals to the shell if the daemon wasn't running.

1.6.3 - 2012-02-17
   Minor docs fixes
   Compile fix for non-gcc compilers
   Added a deprecation warning when explicit subzones are loaded, as
     this (undocumented) feature will be dropped in 1.7.x and beyond.
   A minor bugfix related to the nature of the failure and/or error
     message when one erroneously defines a CNAME inside a delegation.
   Fixed an AAAA logic error in the zonefile parser, which
     fixes a pair of related bugs:
   Out-of-zone NS->AAAA glue was being ignored completely.
   AAAA records which overlapped subzones loaded separately were
     being included in the subzone's data when they should have
     been ignored.

1.6.2 - 2012-02-10
   Lots of documentation fixes
   Two plugin_geoip bugs fixed:
     The address conversion logic for Teredo (Microsoft IPv6 tunneling
       stuff) had a bug that would cause incorrect geographic mapping
       for some Teredo client IPs.
     City-auto-mode's automatic mapping was basically always broken
       unless "auto_dc_coords" was specified in the exact same order as
       the primary "datacenters" list.  (Issue #11 on googlecode)

1.6.1 - 2012-02-07
    Various small documentation edits
    plugin_simplefo: fixed a crash-on-startup (as opposed to clean
      exit with appropriate error message) that could occur with
      certain invalid configurations.
    Four interrelated CNAME bugfixes:
    Fixed a runtime issue with cross-zone CNAME -> CNAME chains between
      pairs of local zones: in production builds additional pointless
      answer-section records were being returned, and in debug builds
      the daemon would die from an assertion failure.
    Fixed the zonefile loader to not throw strict_data warnings on
      cross-zone dangling CNAMEs, because the runtime doesn't chase
      these regardless and it's more consistent with how we treat
      other RR-types (e.g. MX, PTR).
    Fixed the zonefile loader to no longer error out on configurations
      that contain cross-zone CNAME chains which exceed max_cname_depth,
      because the runtime code doesn't chase these regardless.
    Previously if the runtime resolver detected a local CNAME chain
      exceeding max_cname_depth (which can only happen with
      DYNC-handling plugins), it returned a packet with a dangling CNAME
      in the answer section.  This behavior turned out to be
      unacceptable, because if the source of the problem is an infinite
      CNAME loop, the client might continuously query us chasing the
      infinite loop of dangling CNAMEs.  Behavior was changed to return
      an empty NXDOMAIN response with a loud syslog() error message
      about fixing the configuration instead.

1.6.0 - 2012-02-03
    Start of new stable series, 1.6.x will be bugfix-only.
    weighted, multifo, simplefo plugins:
      Added "ipv4" or "ipv6" indicator to the descriptive text
        displayed in monitored status outputs, to differentiate.
    Added core daemon deprecation warning when plugin_geoip is loaded
    Some internal refactoring and updates for cleanliness, correctness,
      portability, validation, debugability, and/or efficiency.
    Repository migrated to git
    Many thanks to Paul Dekkers and Anton Tolchanov for all the
      design discussions and code input during the 1.5.x cycle, and
      thanks to everyone for being patient through a development
      cycle that carried on far longer than it should have.

1.5.13 - 2012-01-30
    The last-minute geoip+weighted work evolved into a lot more
      than I expected, hopefully for the better...
    This release is considered fully complete for 1.6.0 features,
      just needs a little testing and verification first.
    New special built-in service type names: 'up', 'danger'
      'down', and 'none'.  Each suppresses actual monitoring
      and forces a monitored resource addresses's state
      to a single value permanently.  'none' is simply an
      alias for 'up'.
    Plugin API bumped, see plugin api docs.
    plugin_geoip:------------------------
      Everything but the 'maps' handling code significantly
        re-written to delegate per-datacenter work to other
        plugins relatively painlessly.  The default address
        delegation plugin is multifo.
      Will break existing configs, but they shouldn't be hard
        to upgrade. For the most part, replace 'addrs' or 'cnames'
        with 'dcmap' to get existing config working, see the docs
        for more details
      geoip+weighting is now handled the obvious way: by using the
        weighted plugin to do weight work within a geoip datacenter.
    plugin_metafo:-----------------------
      New plugin: does failover between delegated and/or
        synthesized resources just like geoip, but the
        failover order is static and there is no geoip
        functionality.
      Shares most of its code with the relevant bits of
        plugin_geoip, and thus config/behavior between the two
        is as closesly-matched as possible.
      metafo cannot synthesize geoip resources, but geoip can synthesize
        metafo resources, and both can use direct-reference to
        other resources defined by themselves or each other.
    plugin_weighted:-----------------------
      imported from Anton's existing code, remaining changes below
        are vs 0.01 release:
      IPv6 support
      'addrs' config stanza now deprecated
      One resource can have (independent of each other) weighted
        IPv4, IPv6, and CNAME results using 'addrs_v4', 'addrs_v6',
        and/or 'cnames'.
      Single result-type can be autodetected directly at the top
        level; addrs_v4, addrs_v6, and cnames sub-stanzas only
        necessary when including multiple types in one resource.
      group-weight work imported/reworked, allowing address groups to
        be weighted against each other whole.
      address and grouped-address modes now support 'multi'-mode for
        returning more than one item from the weighted set per response
        in various ways...
      up_thresh now supported, used as up_weight/total_weight ratio
        to determine upstream up/down retval for geoip/metafo use.
      TTL cutting like multifo: if any addr in a resource is not UP,
        TTL is cut in half.
      up_thresh, multi, and service_types now do cascading inheritance,
        can be specified/overridden at plugin-level, resource-level, and
        addrs_vN level.
    plugin_multifo:-----------------------
      'addrs' config stanza now deprecated
      IPv4 and IPv6 addresses can no longer be freely mixed; you can
        use one or the other at the top level of a resource (or in
        deprecated 'addrs' stanza), or split them into 'addrs_v4' and
        'addrs_v6' stanzas.
      up_thresh parameter added.
      up_thresh and service_types now do cascading inheritance all the
        way through and can be overridden at any level: plugin-level,
        resource-level, and addrs_vN level.
      Resources or addrs_vN stanzas can be shortcut-configured with
        just an array of IP addresses, if no params override necc at
        that layer and you don't care about the labels.
    plugin_simplefo:---------------------
      deprecated 'resources' stanza in favor of direct config
      IPv6 support as same-family failover pairs, supports dual
        families in one resource via optional sub-stanzas 'addrs_v4'
        and 'addrs_v6'.
      service_types inheritance all the way through as w/ multifo.
      Undocumented periodic stats syslog output removed.  Was just
        a plugin+libev code example, no longer necc.

1.5.12 - 2012-01-10
    This is intended to be feature-complete for a 1.6.0
      release in the near future, with the exception
      of adding some weighting support to plugin_geoip,
      which will require at least one more 1.5.x release...
    Listener port numbers are now part of the listen address
      in the config again, using ip:port form, with the port
      optional, and support for [ipv6]:port to work around
      the ambiguities.
    UDP recvmsg() failures now have a stats output
    Bugfix: UDP wasn't using control messages properly in the
      recvmmsg() (Linux 3.0+) case, which might have lead to
      incorrect response source addresses/interfaces in some
      rare configurations in the IPv6 case (or IPv4 any-addr case)
    plugin_geoip: 'map' location keys are now case-insensitive
    plugin_geoip: Multiple bugfixes for memory errors related
      to DYNC resources.
    plugin_static: Also needed DYNC memory error fixes
    Various small efficiency/correctness fixups

1.5.11 - 2012-01-03
    DYNA addresses now allowed for RHS of NS records
    New monitoring plugin "tcp_connect" added, which only checks
      for connect() success to a given port number.
    New global option "monitor_force_v6_up", to force permanent
      success for all monitored IPv6 resources, in a pinch if one
      of your DNS servers has no v6 access..
    Bugfix: gdnsd now displays IPv4 addresses correctly in
      syslog/stderr output on FreeBSD (and probably others that
      expect the user to use sa_len in a similar fashion).
    Plugin binary API version bumped to 8 due to a change to the
      anysin_t data type.  Plugins which were creating anysin_t
      data should read the update at the bottom of the
      gdnsd-plugin-api docs and set anysin_t.len correctly...
    Hopefully, there will be no need to run ldconfig on Linux
      after installation now.
    plugin_geoip changes:--------
    top-level "default" entry in map is now
      optional, was previously required.  Top-level default
      static ordering defaults to the original "datacenters" list.
    "map" now optional, defaults to an empty map
      with just the default default in place.
    new mode of operation dubbed "city-auto-mode",
      does automatic distance-based mapping somewhat like the
      old georeg plugin did.  Enabled via new map option
      "auto_dc_coords", requires City-level GeoIP data,
      allows special datacenter list "auto", which is the default
      top-level "default" entry in this mode.
    new map stanza 'nets' allows custom network
      mapping overrides by-address
    empty datacenter lists in maps/nets entries
      now allowed, which gives a nodata/noerror response.
    new map parameter 'geoip_db_v4_overlay', allows
      a separate IPv4 database to overlay the v4-like spaces of
      a primary IPv6 database (e.g. commercial Cityv4 for accuracy
      layered over GeoLiteCityv6 for v6 coverage).
    new per-resource option 'combined_failover'
      ensures v4+v6 answers always come from the same datacenter.
    removed unnec 254 limit on unique dclists per map
    GeoIP loading code optimized considerably

1.5.10 - 2011-12-22
    plugin_geoip: will now throw an error at config time if a map
      contains invalid country or continent codes (previously
      they would just be ignored and ineffective).
    edns-client-subnet scope masks will now be correct in the case
      of multiple dynamic lookups to different plugins/resources
      for the same request (smallest scope of the set).
    Core dnspacket code for additional-section rrsets refactored
      to fix some key deficiencies wrt rrs supplied by dynamic
      plugins.  Fixes several possible bugs related to multiple
      dynamic lookups in one request and/or dynamic additional-
      section rrsets.
    Delegations can now use out-of-bailiwick glue addresses.
      They're treated as fake data: never available for direct
      lookup, only supplied as part of glue additional data.
    Out-of-bailiwick glue information available to the server
      from other zonefiles will now also be included in NS
      responses, but only as optional additional records, not
      requiring TC if they don't fit.
    NAPTR no longer gets SRV additional-section rrs when the
      S-flag is present.  Both NAPTR (with the A-flag) and SRV
      still generate additional-section address records.  The
      complexity cost of supporting it has gotten too high and
      it's kind of a ridiculous thing to begin with.
    Fixed broken "make installcheck"
    The limit on additional-section rrsets that could possibly be
      added to a response packet used to be fixed at 256.  It is
      now configurable in the range 16-256, defaulting to 64, via
      the parameter "max_addtl_rrsets".
    The limit on a delegated subzone's glue NS rrsets used to
      be fixed at 32.  It now shares the same configurable limit
      as all other additional-section records (max_addtl_rrsets).

1.5.9 - 2011-12-20
    Service_type monitoring is now pluggable for additional/custom
      protocol support.  Existing service type defs will continue
      to work exactly as they did before with no changes.  Existing
      plugin API was extended to support this; all plugins can
      optionally do either or both roles (answer requests using
      resources monitored by any plugin, and/or monitor resources for
      any plugin).  Existing plugins should be updated to cleanly
      error on NULL argument to _load_config() to prevent startup crash
      if erroneously used as an auto-loaded monitoring plugin.
    New plugin "http_status" contains the previous functionality,
      and is the default if no monitoring plugin is specified.
    plugin_http_status: new service type parameter "ok_codes"
      allows an array of zero or more acceptable HTTP status codes.
      default is [ 200 ], which was the existing behavior.
    plugin_multifo: added service type to descriptive monitoring strings
    plugin_multifo: now supports multiple service_types per resource
    plugin_simplefo: added service type to descriptive monitoring strings
    plugin_simplefo: now supports multiple service_types per resource
    plugin_simplefo: bugfix: would crash near the end of "checkconf"
      due to other recent changes.
    plugin_geoip changes since 0.01-20111212:
      moved to main distribution
      Test infrastructure added to main test suite
      Handles corrupt databases more elegantly
      DYNC lookups that result in unqualified names should work now
      Now automatically synthesizes virtual resources for single-datacenter
        subsets.  In zonefiles, simply append "/dcname" to the resource name
        to get results only from the given datacenter (which still follow
        local_up_threshold rules).
      Support for multiple service types per resource (pessimistic: the worst
        status of the set is used for decision-making)
      String descriptions for monitored resource status now include service
        type information.

1.5.8 - 2011-12-12
    Mostly just backwards-compatible expansions of the plugin
      API to support further work on the geoip plugin.

1.4.x
    Bugfix: monitored IPv6 addresses were not being de-duplicated
      correctly.  Not critical, just causes extra monitoring queries.

1.5.7 - 2011-12-06
    edns-client-subnet support now defaults to on.
    Dropped experimental DNSCurve code.  Use a forwarder or an older
      release if you need it.  Adoption progress just isn't at a level
      where I want to keep the complexity for it in gdnsd's source code
      for 1.6.x+.
    The const-related source compatibility change noted in 1.5.6
      turned out to be the result of me misunderstanding my own code,
      and has been reverted.  There were no new source-level compat
      changes with API version 7 (so long as we all ignore 1.5.6, which
      only lasted a few days).
    Also, the plugin headers and API docs are updated to better explain
      dealing with the edns stuff.  Basically: plugins that previously
      paid attention to the DNS source address, even if they have no
      new code to explicitly handle edns-client-subnet, need an additional
      line of code under API V6 and higher to set result->edns_scope_mask
      from cinfo->edns_client_mask.

1.5.6 - 2011-12-03
    Make failure to set IPTOS_LOWDELAY non-fatal
    Plugin API version bumped to 7.  The changes are trivial vs previous
      dev release: just remove "const" from the cinfo argument of
      the resolve callbacks to clear up a minor source-level compat
      change, and rebuild against the new headers to fix a
      log_debug() binary incompatibility.

1.4.6 - 2011-12-03
    Fix per-listen-address "port" option parsing

1.5.5 - 2011-11-18
    Added sendmmsg() support for Linux 3.0+.  recvmmsg() is now only enabled
      alongside sendmmsg(), not separately for 2.6.34+ as before.
    edns_client_subnet option renamed to edns_client_subnet_DO_NOT_USE, to
      further discourage anyone using it other than for short-term testing.

1.4.5 - 2011-11-15
    Fixes for Issues 8 & 9, related to dynamic CNAME handling.  Issue
      8 in particular probably could have affected some scenarios
      with static CNAMEs as well, although there were no reports of it.

1.5.4 - 2011-06-03
    Bugfix for edns-client-subnet-00: misunderstood the spec, the "address" field
      is not always full-width, it is truncated to the source mask length, rounded
      to the nearest larger octet.
    Bugfix: formerr was incrementing the notimp stats counter instead of its own

1.5.3 - 2011-06-03
    getifaddrs() results for default interface scanning are now de-duplicated.
    IPv6 correctness tweak to support UDPv6 clients using Flow Labels (not
      sure if that ever happens in the real world, but this seems to be the
      RFC-correct thing to do here).
    msg_controllen is now reset to full buffer size between sendmsg()
      and subsequent recvmsg().
    Add --without-libcap configure argument to explicitly allow lack of libcap
      on Linux.  Fatal config error if not found on Linux otherwise.
    Add recvmmsg() status to configure summary.
    Supports draft edns-client-subnet-00 spec, disabled by default, enable
      with config option "edns_client_subnet => true".  Static responses
      set scope mask to zero, dynamic responses have full control of the
      response scope mask.  Only the "reflect" plugin takes advantage of
      the information so far.
    Plugin API:
      Prototype for the two resolve_dyn* functions updated to pass additional
        information from edns-client-subnet-00 draft or similar.
      Version bumped, external plugins must be modified and rebuilt
    Trivial plugins updated to match above:
      reflect plugin now accepts 4 different fixed "resource name" arguments
        at the zonefile level (dns, edns, best, both) for different reflection
        behaviors related to the above (default is "best").
    Stats tracking/logging/formatting:
      DNSCurve stats no longer output for non-DNSCurve builds
      "udp_edns" stat replaced by "edns" stat (includes TCP EDNS queries)
      "edns_clientsub" stat added
      "formerr" stat added

1.5.2 - 2011-05-18
    Bugfixes for multifo and IPv6 monitoring in general
    Change fatal late-bind errors to only kill the affected listening
      thread (with a long error message), not the rest of the daemon.
    Use IP_PKTINFO/IPV6_RECVPKTINFO/IP_RECVDSTADDR to fix any-address
      UDP listening on most platforms, make explicit any-address config
      fatal on platforms that don't have the applicable sockopt.

1.5.1 - 2011-05-17
    Start of a new development/testing series
    Debug builds now send assert() failures to syslog when daemonized
    Stderr logging output now contains gettid() thread id on Linux
    New zonefile directives: $ADDR_LIMIT_V4 and $ADDR_LIMIT_V6
    plugin_multifo: support IPv6 addresses
    Listen-address config changes:
      new top-level options "dns_port" and "http_port" set the default
        port numbers (default 53 ane 3506 as before).
      per-listener "port" option changes the DNS port at that level
      "@NNNNN" suffix on listen addresses to specify port number
        is no longer supported/allowed.
      Addresses can be in any numeric format supported by the
        getaddrinfo() interface on your host (including IPv6
        interface suffixes).
      Compile-time IPv6 support can no longer be disabled.
      With no explicit listen addresses specified, the default
        behavior is to enumerate all configured IPv4 and IPv6
        network interfaces via getifaddrs() and spawn separate
        listeners for each.
      Optional late binding support for listening on addresses which
        are not available at start time, via the new config option
        "late_bind_secs".  Note this comes with some privileges
        caveats, and support for overcoming them automatically on
        Linux hosts with libcap available at configure time.

trunk (released there as part of 1.4.5):
    plugin_multifo: if no "addrs" config was present for a given
      resource, gdnsd would crash on startup with a NULL pointer
      deref.  Fixed to give a fatal error instead.

1.4.4 - 2011-02-16
    Embedded libev upgraded to 4.04
    The code that wipes per-iothread secret keys for DNSCurve
      on shutdown wasn't wiping enough data, which leaves a small
      chance a local attacker could recover partial secret key
      data from those memory pages after a daemon restart somehow
      (probably pretty impractical on most systems though).  Only
      affects DNSCurve testers obviously.

1.4.3 - 2011-02-06
    Fixed a possible bug (wrong error msg and/or crash) on startup
      in some long CNAME chain scenarios
    Fixed a bug in the multifo plugin that probably broke it pretty
      badly for multiple resource definitions.
    Enabled automake "silent-mode" build output by default (makes
      it less likely to miss warnings in the line noise)

1.4.2 - 2011-02-03
    Fix for Issue #3: When IPv6 support is compiled in but disabled
      at the operating system level at runtime, and no explicit
      listen-address has been specified, failure to create default
      v6 sockets should not prevent a successful start.

1.4.1 - 2011-01-28
    Fixed a small buffer size bug for the html stats output buffer.
    Monitored resources are now de-duplicated based on service type
      and address.  This was always intended, but the lack of it
      slipped through the cracks unnoticed until recently.
    Added new trivial plugin "multifo" for multi-address all-active
      failover groups.

1.4.0 - 2011-01-21
    Add "debug" option to enable debugging log output in debugging
      builds of the daemon (previously, the debug output was
      unconditional, now it defaults off).
    Add "priority" option for setting process priority, defaults
      to -11 if started as root, or no-op if not.
    Fixed a small memory bug found by valgrind (probably would
      have never been noticed on real machines).
    Embedded libev upgraded to 4.03

1.3.6 - 2011-01-06
    Removed bundled NaCl source from gdnsd.  DNSCurve users will
      need to fetch/build/install NaCl on their own.
    Some internal refactoring related to daemonization, logging,
      and security.  Little to no practical runtime impact.
    Added example initscript for CentOS/RHEL from Scott Cameron
    Various trivialities.

1.3.5 - 2010-12-28
    Merged in dynamic CNAME support for plugins, from Jay Reitz
    Plugin API upgraded in light of the above, version bumped,
      some changes require at least minor source tweaks in any
      existing plugins.  A lot of serious refactoring and expansion
      of the API happened since 1.3.4, includes adding a suite of
      support funcs for dealing with the internal "dname" domainname
      data type.
    Various dname-related code in the core (zonefile scanning, config
      parsing, etc) refactored to re-use the new dname API functions
      available to plugin code from libgdnsd, reducing code
      size/complexity and probably squashing a few unknown bugs.
    New user-level config parameter max_cname_depth, enforced at
      config-time and run-time as applicable (static vs dynamic).
    Fixed the protoent-caching (/etc/protocols vs chroot) stuff once
      and for all correctly.
    Various optimizations and correctness tweaks for the TCP DNS code.
      None of the fixes are production-critical enough to warrant a
      backport.
    Raise the default response buffer to 16K.  This is still a reasonably
      small value, but makes it even less likely anyone will need to futz
      with response buffer config for unusual datasets.
    A, AAAA, NS, and PTR RRsets are now rotated to a new pseudo-random
      starting point for each response packet.
    Autotools/libtool upgraded to latest.
    Embedded libev upgraded to 4.01.
    Various trivial improvements.

1.3.4 - 2010-06-28
    Trivial bugfix related to recvmmsg(), probably broke compiles on most
      platforms other than Linux 2.6.33+.
    Improved keycache eviction algorithm
    Major internal change: gdnsd no longer attempts to auto-size the packet
      buffers to the size of your largest RR-set(s).  It simply defaults the
      buffer to 4K, which is fine for just about everyone.  There's a new
      config option "max_response" if you need to increase it in order to
      do something (probably something silly).  This removes a lot of
      needless complexity and startup delay for everyone that has normal,
      sane DNS data, and makes some new features easier to implement.  See
      the gdnsd.config manpage for more details.

1.3.3 - 2010-06-22
    recvmmsg() support for Linux 2.6.34+
    New global and per-listen-address options: udp_recv_width, udp_rcvbuf,
      udp_sndbuf.
    Bugfix: The documented options udp_keycache_bits and tcp_keycache_bits
      weren't being accepted by the config code, now they are.
    Bugfix: a really bad bug in the keycache code, which would eventually
      throw an I/O thread into an infinite loop after enough unique client
      keys had been seen.  Thanks to whoever pointed this out by spamming my
      public test instances with random keys :).

1.3.2 - 2010-06-21
    Fixed a memory bug in the noncex generator code.  Effect was
      writing 4 bytes past the end of a malloc and sub-par noncex
      generation.

1.3.1 - 2010-06-20
    DNSCurve, with multiple keys, per-address keys, nonce separation,
      and caching of precomputed secrets with recurring clients.  A
      new helper program, gdnsd-curvekey, generates new private keys
      and displays public key labels for private keys.  DNSCurve is
      disabled by default.  The configure argument --with-nacl enables
      it.
    Plugin API changes: gdnsd_monio_add() has gone away, and the
      function prototype for the load_config() callback has changed.
      If your plugin wasn't using gdnsd_monio_add() before, you simply
      need to update the load_config() return value and return NULL.  If
      you were - the data you were passing to gdnsd_monio_add() is now
      passed to gdnsd via load_config()'s return value.
    Per-address listener options for TCP parameters (max clients, timeout).
    New option to disable TCP DNS completely (globally and/or per-address).
    New configure flag --enable-lowmem switches a few tradeoffs in
      the source around, resulting in a smaller binary and lower memory
      usage at runtime.  This is mostly intended for embedded targets.
    Lack of IPv6 socket support is no longer autodetected at configure time.
      If you wish to disable IPv6 socket support (for compatibility
      or other reasons), do so explicitly with --disable-ipv6
    Our autotools stuff now supports the cross-compilation of gdnsd.
      Successfully tested with an x86_64 -> mips32r2 cross-compile.
      Note that because of the NaCl library, DNSCurve support cannot
      be cross-compiled at this time.
    libvscf was folded back into the main gdnsd source, and is no
      longer a separate dependency.
    Slight config syntax change for listen and http_listen:
      The default (if no listen specs at all) is still the same, which
      is to listen on both v4 and v6 any-addresses at the default port.
      However, the IP part of an explicit listen spec is no longer
      optional.  Previously, @1234 would listen to port 1234 on
      both 0.0.0.0 and ::.  Now it's a configuration error, and you must
      explicitly use the list [ 0.0.0.0@1234, "::@1234" ] to get the
      same effect.
    Many smaller (in some cases, larger but less noteworthy) improvements.

1.2.x trunk unreleased (no need yet)...
    A few error messages updated for clarity
    Some minor fixups to the HTML stats output

1.2.0 - 2010-05-29
    Start of a new stable release series.
    No real change from 1.1.2.

1.1.2 - 2010-05-24
    Work around a libtool bug that was causing the trivial plugins
      to link against the dlopen lib when they shouldn't.
    A few more minor internal optimizations and changes.  Traded
      a small memory size increase (2-3%) for better cache locality,
      among other things.
    A few changes to the plugin API, some source-incompatible with
      previous versions.  API version bumped to 3.
    Some plugin API documentation added as gdnsd-plugin-api(3).
    The trivial "simplefo" plugin's config syntax has changed slightly,
      and its code now provides a good example of full API use.

1.1.1 - 2010-05-08
    Several portability improvements. Works for FreeBSD, OpenBSD,
      OSX (Snow Leopard), OpenSolaris.  Works with at least some
      gcc3 versions, works on Sun's C compiler as well.
    The listen, http_listen, and plugin_search_path config options
      now accept single values directly (you don't have to make an
      array of size one).
    Explicit support for the NAPTR resource record.
    Generic support for all other types via RFC3597-style RRs.
    New config option "strict_data".  If set to false, many zone data
      validation errors which aren't critical to functioning correctly
      will generate only warnings.  If set to true (the default), they
      will generate fatal errors.  All warnings/error output generated by
      checks which are controlled by "strict_data" have a "strict_data:"
      prefix in the message itself, so that you know you can control
      the behavior of these.
    Subzones are now allowed in the general case, which means you can
      serve separate zones from separate files with their own SOAs for
      both example.com and foo.example.com.  This interacts correctly
      with delegations, but any overlap in the parent will be ignored.
    In cases where a daemon is being started, any initial stderr output
      will now be duplicated to syslog as well, so that the
      post-daemonization syslog messages have correct leading context.
    The listen queue backlog for the TCP DNS code now scales with the
      user-supplied tcp_clients_per_socket.
    The embedded stats http server has had a few fixes: it now sends
      Content-Length and lingers properly to avoid server-side TIME_WAIT,
      and it now sends proper 404's for URLs other than /csv and /.  It
      still only supports the GET method and will return 404's for any
      other method as if they were failed GETs.
    The version requirements for the testsuite's perl module dependencies
      have been lowered.
    The arbitrary 16KB packet size limit beyond which we elided all
      non-glue additional records has been lifted.
    Various testsuite improvements
    Various efficiency/performance improvements
    Various configure/build process improvements

1.0.4 - 2010-05-01
    bugfix: removed accidental "static" keyword from a function-scope
      variable in dnspacket.c, which caused unintended storage sharing
      between multiple DNS threads and could have lead to incorrect
      responses if the threads stepped on each other here.  Probably a
      minor thread performance issue as well.  Never observed the bug
      in practice AFAIK, but it could happen for someone with lots of
      traffic over two or more sockets.
    bugfix: in the case of a delegation with a glued NS record at the
      delegation point iself (e.g. "subzone NS subzone"), the delegation
      point would be completely ignored, returning NXDOMAIN instead of
      delegation responses.  It now returns the correct responses.

1.0.3 - 2010-04-18
    Fixed a minor TCP DNS bug that could, under certain circumstances,
      cause conns to needlessly time out instead of sending response data.
      Triggering this bug to begin with is considered unlikely.
    Server was refusing to start (complaining of a possible internal bug,
      which was true) when a zone had a CNAME which pointed to a non-
      existent name in the same zone (NXDOMAIN).  This case is now fixed,
      and allowed with just a warning.

1.0.2 - 2010-04-08
    Corrected the text of an error message
    Fixed a possible server<->server DoS attack (between gdnsd and other
        vendors, probably hurting them more than us) triggered by spoofed
        traffic that Scott Cameron found.  Bottom line: don't send error
        responses to "requests" that have the QR bit set.

1.0.1 - 2010-04-04
    Some updates to documentation, fixes to broken examples
    Two minor startup-time memory leaks fixed (neither grew at runtime).
    Some minor updates to the test suite infrastructure to (a) fix
        a bug with improper shutdowns of the daemon being tested, and (b)
        cope better with running the testsuite under tools like valgrind.

1.0.0 - 2010-04-02
    First stable release of the new code.
        - All 1.0.x follow-ons will be bugfix-only and come from trunk.
        - branches/current is where new dev happens (1.1.x unstable series).
    One more trivial sprintf() args fix, extra argument, no real impact.

0.9.2 - 2010-04-01
    One more sprintf() args bugfix
    Fixed a bug where if there was no "options" statement in the config
        file at all, the default listeners would not be started.

0.9.1 - 2010-03-30
    A number of sprintf() format/args bugs cleaned up.  All of the ones
        that were capable of causing a crash were in log_fatal() messages
        that occur during startup though, which are abort() branches anyways.
    Several other minor source cleanups that have little real world effect

0.9.0 - 2010-03-28
    Version scheme changed! Always 3 parts: X.Y.Z
        If Y is odd, this is an unstable development series
        If Y is even, this is a stable release series
        All stable series releases with Z > 0 contain only bugfixes
    0.9.Z will be used to finish this beta series off, with the
        first stable release becoming 1.0.0
    Now uses accept4() if available
    Various error message improvements
    Various docs updates

0.67b - 2010-03-26
    Fourth beta release...
    Initialize the uninitialized msghdr fields for recvmsg()/sendmsg()
    Some changes to the content and level of some error / warning messages
    Some small optimizations

0.66b - 2010-03-25
    Third beta release...
    Some minor efficiency improvements in the UDP network code.
    Another layer of chroot()+syslog() timezone fixups for some
        versions/vendors of glibc, with docs on how to workaround
        any such issue that still remains.
    Various insignificant doc/errmsg/comment fixups.

0.65b - 2010-03-23
    Second beta release...
    Fixed a bug that lead to erroneous and ignorable error messages when using
        the lpe_on/lpe_off arguments.
    Server now advertises a buffer of 4096 instead of 512 in EDNS0 responses.
    Create the default chroot directory at install time.
    Directory perms for the chroot directory relaxed slightly, doesn't change
        security, prevents arguing over perms with system management tools in
        some cases.
    The libev API is now correctly exported to the plugins at runtime.
    The trivial http server used by the monio parts of the testsuite now
        correctly ignores SIGPIPE.
    configure.ac: check for Test::More and Perl IPv6 modules for the testsuite.
    Test suite now checks at runtime for Perl IPv6 support.

0.64b - 2010-03-21
    First beta release of the new refactor.
    Remove sorting of MX/SRV records based on priority, etc.
        They now appear in answer sections in zonefile order.
    Stats served over HTTP are now only recalculated at most once
        per second by default, regardless of query rate.  This can
        be changed via the new bool config option "realtime_stats".
    Added reporting of server type as a TXT record containing
        just "gdnsd" in response to any CHAOS-class query.
    Numerous improvements to the testsuite infrastructure.
    Test coverage of the core DNS query parsing and response
        generation code is now 100% for all practical purposes.
        There are two uncovered branch destinations according to
        gcov, but they are currently logically unreachable via
        any combination of zonefile/network input.

0.63a - 2010-03-16
    Fourth alpha release.
    Removed config option "warn_512" (was broken, too expensive to fix)
    Removed config options "udp_threads_per_socket" and "tcp_threads".
       Both varieties are now fixed at one thread per socket, after much
       testing and internal debate.
    Various smaller fixups, none terribly critical.

0.62a - 2010-03-12
    Third alpha release.
    Bugfix: syslog() output was not working when daemonized
    Bugfix: monio code was not supplying default port 80 for
      user-defined service_types
    Fix a bug related to getprotobyname() in the monio code when
      chroot()-ing.
    Fix a bug that broke building on hosts without runtime
      IPv6 listening support

0.61a - 2010-03-12
    Some docs cleanups (and a doc-related "make clean" bugfix)
    Fix a bug with syslog() output timezone reverting to UTC
      after the daemon chroot()'s (we now tzset() before chroot()).

0.60a - 2010-03-11
    Large refactor, first alpha tarball release

0.10 - 2009-06-09
    Quick testsuite fixup, stupid error using SO_REUSEPORT,
      which broke testing on Linux

0.09 - 2009-06-09
    added DNS client IP reflection feature for debugging
      real-world issues with client location info.
    fixed obscure testsuite issue with http port reuse
    libev updated to 3.6

0.08 - 2009-03-12
    libev updated to 3.53
    cfgdnsd was failing to enforce a correct (complete)
        datacenter list for location override specifications
    Docs updates
    Fixed a bug in the dnsdb hash statistics reported at
        startup (max/avg bucket depths wrong).

0.07 - 2009-01-12
    Fix a cfgdnsd bug triggered in the case of a resource
        existing at less than all datacenters.
    Don't SHUT_WR on monitoring sockets when done writing,
        confuses some servers.
    Fix a build-time issue that would break building on macos
        with default case-sensitive FS.
    Some makefile fixups
    Removed pidfile from chroot dir, made chroot dir root-owned
        and read-only, moved pidfile unlink to initscript

0.06 - 2008-12-22
    Fixed a bug in the geodns address selection code that would
        have resulted in the wrong datacenter returned in many
        cases (and added a related test).
    Support HTTP/1.1 responses to HTTP/1.0 requests when monitoring
        HTTP resources.
    -m (disable mlockall()) commandline option replaced with
        -M (enable mlockall()), changing the default behavior.
    Docs updated to remind about mlockall + ulimits, and code added
        to die on very small memlock ulimit, or log info otherwise.
    libev updated to 3.49

0.05 - 2008-07-08
    fixed a bug where gdnsd would fail an assertion (or crash in
       NDEBUG builds) due to the code's failure to anticipate non-alpha
       chars in GeoIP country codes (A1 and A2 special "country" codes)
    fixed a warning on Mac
    fixed a warning w/ gcc-4.1

0.04 - 2008-06-16
    changed "max_tcp_clients_per_thread" option to "max_tcp_clients"
    removed num_{udp|tcp}_threads options
    changed tcp to one fixed thread for all sockets
    changed udp threads to blocking thread-per-socket

0.03 - 2008-06-11
    some minor efficiency tweaks
    added the ability to have multiple glue addresses for a given NS RR
    fixed pathologically slow cfgdnsd execution with large delegation zones
    fixed a bug with PTR RRsets that have more than one RR
    fixed a bug in the hash table statistics reported at daemon startup
    libev updated

0.02 - 2008-06-09
    Initial public release
