2.2.4 - 2016-04-14
    * libmaxminddb 1.2.0+ compatibility, using the new interface.
    * Note that libmaxminddb's 1.2.0 release is a shared library runtime
      compatibility barrier for gdnsd; compiling gdnsd against <1.2.0 and
      running against >= 1.2.0 (or vice-versa) is not supported, and the
      daemon will exit with an error message indicating this if it happens.
      For distributions, you may simply want to make 1.2.0 a required
      minimum for gdnsd going forward.  This situation is unfortunate, but
      there's no clean way to avoid it given upstream broke the undocumented
      (but only!) database iteration interface's assumptions in 1.1.5, then
      broke them again in 1.2.0 while introducing the new interface.

2.2.3 - 2016-03-23
    * Workaround for libmaxminddb 1.1.5 compatibility
    * Added a Documentation= tag in the systemd unit file template
    * A few typo fixes in the documentation

2.2.2 - 2016-01-06
  *** Bugs fixed:
    * Fixed a bug (introduced in 2.2.1) in HTTP monitoring when using the
      "vhost" parameter.
    * The code now falls back from F_OFD_SETLK to F_SETLK at runtime if the
      runtime environment differs from the compile-time one.
    * Changed the binary "Build Info" string to make the build
      reproducible (do not include e.g. host or date information).
    * Several updates to qa scripts/tools to keep up with recent changes
    * A few trivial warning/analysis cleanups that should be no-op

2.2.1 - 2015-08-05
  *** Bugs fixed:
    * extfile plugin - if the addresses/CNAMEs for a given extfile
      service_type are not listed in natural sort order in the configuration,
      extfile will update the wrong items (sorting bug).
    * rfc1035 zonefile reloading - Directory scanning (SIGUSR1, or automatic
      periodic scanning on a non-inotify system) would treat all zonefiles as
      changed and reload them all, without first filtering them on whether
      their stat() data had changed since the previous scan.  Not really a
      functional issue, but certainly wasteful and noisy.
    * HTTP monitoring - was not sending any User-Agent string, now sends
      "User-Agent: gdnsd-monitor"

2.2.0 - 2014-12-30
  *** Bugfixes:
    * fix for zero-length configuration strings causing assertion failure
      in developer-debug builds
    * fix for crash/assertfail if admin_state file contents are
      defined by the user as an array instead of a hash
    * restored the logging of monitored state transitions, which was
      omitted in earlier 2.x releases but present in 1.x.

  *** Features:
    * If the admin_state file exists but doesn't parse correctly, that will
      now be a fatal error for startup or checkconf.  Previously the error was
      logged but startup/checkconf was successful.
    * plugin_geoip: Support for MaxMind GeoIP2 databases.  Requires
      libmaxminddb at build time to enable, which is a new optional build
      dependency.
    * plugin_geoip: Added v6->v4 translations for 64:ff9b::/96, the 'Well
      Known Prefix' from RFC6052 used for e.g. NAT64.
    * The http stats server now supports atomic flush-after-fetch behavior if
      given the query argument '?f=1', so that the stat counts are 'since last
      flush' instead of 'since startup'.  The flushed state is shared between
      all clients using the argument.  Does not affect stats for clients not
      using the argument.
    * New optional compile-time dependency on libunwind.  If available,
      dmn_assert() in developer builds and certain fatal errors in production
      builds will produce stack backtraces before terminating the process.
    * Security is a little tighter by default now on Linux due to prctl()
      PR_SET_NO_NEW_PRIVS, which may interfere with existing plugin_extmon
      configurations if they're running privileged binaries (set[ug]id,
      capabilities).  If this interferes with your configuration, it can be
      disabled via the global option 'weaker_security => true'.
    * The shipped gdnsd.service systemd unit file now defaults to more secure
      settings (e.g. private tmp, no homedir access, readonly system fs, no
      device access, etc).  These can be overridden by the user without
      editing the defaults in e.g. /etc/systemd/system/gdnsd.d/custom.conf.

  *** Other:
    * The range, default, and effects of the zones_rfc1035_quiesce option
      have changed.  The zones_rfc1035_min_quiesce option is now deprecated
      and useless and will generate a harmless warning on startup.  This
      shouldn't be a pragmatic issue for most users.
    * Related to the above: the code no longer makes heuristic attempts to
      determine the effective filesystem timestamp accuracy of the zones
      directory on startup by writing temporary test files to it.
    * A warning is now generated if the 'zones_rfc1035_auto' option is not set
      explicitly, because the default value is likely to change from 'true' to
      'false' in a future version.
    * The 'listen => scan' feature is now deprecated, but continues to
      function and issues a deprecation warning when used.  Please either
      migrate to 'listen => any' (the current default) or file a bug
      indicating why that doesn't work for your platform/use-case!
    * Ragel 6.x is now a hard build dependency for all builds.  Previously it
      was required for building from git, but not from tarballs.
    * Perl version dependency has been raised from 5.8.1 to 5.10.1
    * Testsuite now also requires JSON::PP (which comes with Perl 5.13.9+, but
      may need to be installed for older ones).
    * sysd/gdnsd.service is now always generated in the build tree from the
      template, even if --without-systemdsystemunitdir and/or no systemd
      detected at all, to give more options for how packagers handle things.
    * Minor plugin API updates (most would just need a recompile).
    * A number of less-visible refactorings for quality and/or performance.

2.1.1 - 2014-12-30
  *** Bugfixes backported from master branch:
    * Fixed incorrect error-handling code for the sendmmsg() syscall, which
      could have caused an unecessary additional dropped packet and/or
      bad error messages after failing to send one or more packets from a set.
    * The per-address level udp_recv_width option is now correctly limited to
      a value of 64 (previously it was being incorrectly limited to 32).
    * plugin_multifo no longer pointlessly limits to 64 addrs per family
    * plugin_extmon bugfix for bad timeout/interval behavior if either >255s
    * if the stats http socket failed to bind() on startup, the daemon
      could carry on anyways, causing it to bind to a different, arbitrary
      port number
    * Fixed autoconf 2.63 compat when running autoreconf (broken in 2.1.0)

2.1.0 - 2014-10-14
  *** Bugfixes:
    * Fixed JSON stats output (was malformed; missing commas
      in the service state portion of the output).
    * Several relatively-benign deficiencies related to
      daemonization, logging, and/or process control were fixed
      throughout the source tree.
    * Path MTU Discovery is now properly disabled on UDPv6 sockets
    * Syslog output was not being generated if compiled using
      --with-systemd, but not actually running under systemd.
      (obviated/fixed by the changes below)

  *** Systemd build/install changes:
    * The --with-systemd configure flag no longer exists,
      there is no dependency on systemd libraries or headers,
      and all Linux builds inherently support detecting systemd
      and being compatible with it.
    * Support for systemd watchdog timers was removed as the
      gdnsd implementation served zero functional purpose
      other than to add more systemd-related code bloat.
    * A (path-templated) unit file for gdnsd is now generated
      and installed on applicable systems.  If gdnsd will be
      run as a systemd service, this unit file *must* be used!
      Some of the settings within are critical to the proper
      operation of gdnsd under systemd.  The installation
      path can be overriden from the pkg-config-based default
      via --with-systemdsystemunitdir=DIR.  Generation and
      installation can be avoided on systems which have
      systemd installed via --without-systemdsystemunitdir.

  *** syslog/stdio behavior (relevant mostly for initscripts):
    * New commandline flag "-x" suppresses syslog output completely.
      (This is intended for testsuites and linting invocations of
      checkconf and such, not for runtime use).
    * When the gdnsd binary hasn't fully daemonized yet (meaning the
      initial process has not yet exited, regardless of command/mode),
      Info- and Debug- level messages are output to stdout, while
      messages of severity Warning and higher are output to stderr
      (unless we're running under systemd, in which case we stop using
      stdio as soon as syslog is open to avoid journal duplicates).
      Everything is mirrored to syslog regardless unless the -x cmdline
      flag is used.
    * If you don't want any gdnsd command output interfering with e.g.
      your consistent ANSI-colored init system output, redirect both to
      /dev/null.  If you'd rather not have "normal" noise, but would
      still like errors and serious issues to show through to the user,
      just direct stdout to /dev/null.
    * (The previous behavior was nothing to stdout, warning+ to stderr
      and sometimes info and debug to stderr as well, but sometimes
      nothing was output to any stdio anywhere, and was inconsistent
      depending on flags/command/situation).

  *** Misc changes:
    * Documentation added for log_stats option
    * Final stats output at daemon shutdown restored; was removed during a
      refactor some time ago and I forgot to get it working again.
    * Lots of misc improvements to the build and qa stuff.  Notably the
      default build will now use aggressive security-hardening flags on
      modern GNU(-like) toolchains which support them.

  *** The canonical HTTP and git-clone URL locations for the project
      have changed to http://github.com/gdnsd/gdnsd .  The old URLs
      and git remotes will work correctly for some time, but not
      indefinitely.

2.0.0 - 2014-10-02
  *** Commandline / Signal changes:
    * The signal for zone data reloads is now SIGUSR1, not SIGHUP.
    * The action "reload" has been renamed to "reload-zones",
      and sends the new SIGUSR1 signal.
    * The action "force-reload" has been removed.  Replace it
      with invocations of "restart" if that's what you need.
    * The point of the above changes is to free up SIGHUP and
      "reload" for future reuse for a new reload behavior, but
      get the compatibility breaking out of the way now with
      the major version bump.

  *** Other
    * The hacky support for attempting fast reloads under systemd
      has been removed completely.  It's not worth the pain, and
      better ideas are coming in the long run.
    * UDP requests with a source port of zero will now count
      as UDP "recvfail" in stats and will not be processed for reply.
      Previously we tried to reply to these and ended up failing
      the related sendmsg call and incrementing "sendfail".
    * Default 'max_edns_response' raised from 1280 to 1410.
    * UDP socket buffer default negotiation improvements
    * Various perf tweaks and code cleanups

  *** Please read the 2.0.0-beta news below for everything
      else that's changed since 1.x.

2.0.0-beta - 2014-09-10
  *** This is a beta release to get more people to try it in
      tarball form prior to the official 2.0.0 release.
      Please do not release stable distro packages based on this
      release!

  *** General feature changes:
    * Static address RR-sets in zonefiles are no longer limited
      to 256 RRs per-family
    * Dynamic address RR-sets from plugins are no longer limited
      to 64 RRs per-family.
    * The default 'listen' setting is now 'any', which listens on
      the IPv4 and IPv6 (if available) ANY-addresses 0.0.0.0 and
      [::].  The previous interface-scanning mode can be enabled
      via 'listen = scan'.
    * New TTL-related options: max_ttl, min_ttl, and max_ncache_ttl
      cause clamping (and warning) of zone TTL values.  There is
      a hard maximum on max_ttl of 268435455 (2^28-1, ~8.5 years).
    * New config option 'max_edns_response' to cap edns0 response
      sizes to a value smaller than that advertised by clients,
      defaults to 1280.
    * The timeout parameter of a service_type now defaults to
      half of the specified interval.
    * New service_types plugin "extfile" - allows for the consumption
      of outside monitoring data via disk file in vscf format.
    * Experimental support for djbdns zonefiles
    * IPv6 runtime support is now a requirement, and the related
      option monitor_force_v6_up was removed.
    * Output data from the stats http listener has changed, please
      update any parsers.

  *** Dynamic address resolution changes:
    * The 'DYNC' rr-type can now dynamically return address or
      CNAME data at the plugin's discretion.
    * The zonefile syntax for the TTLs of DYNA and DYNC RRs has changed.
      It now accepts the form MAX[/MIN], where MIN defaults to half
      of MAX.
    * The TTL behavior for DYNA/DYNC has changed substantially:
      Previously the zonefile TTL would be served as-is for 'UP'
      resources, and cut in half for 'DANGER' or 'DOWN' resources.
      Now, an internal TTL is calculated based on the minimum time
      to the next state change between 'UP' and 'DOWN' according to
      the normal monitoring intervals and anti-flap code.
      This internal TTL is then clamped to the maximum and minimum
      TTL values from the relevant zonefile RR.
    * In cases where multiple monitored resources participate in a
      plugin's decision and/or response (e.g. multifo), the internal
      TTL will generally be the minimum of all involved internal
      monitoring TTLs.

  *** Service monitoring changes:
    * CNAMEs can now be monitored entities in the general sense.
      Note that this does not imply resolving external CNAMEs
      for direct service checks, at least not with any current
      plugins.  It just means things like extmon/extfile can
      provide custom monitor feedback, and they can be administrated
      through the admin_state interface described below.
    * plugin_static now also acts as a monitoring plugin.  It sets a
      fixed up/down value and optionally a fixed internal TTL value.
    * The extmon, extfile, static, and null plugins support the
      monitoring of CNAME resources.
    * The metafo, geoip, and weighted plugins make use of CNAME
      monitoring for their CNAME-based resources.
    * Monitored service states are now labeled with just their
      service_type and address (or CNAME), but not the plugin
      and/or resource name which (first) configured them.
    * Empty service_types ('service_types = []') is now legal,
      and suppresses the use of the default 'up' service_type.
    * The 'DANGER' state no longer exists in the built-in monitoring
      system.  A resource is either 'UP' or 'DOWN' at any given
      time.  The monitoring algorithms and thresholds haven't
      changed; 'DANGER' just isn't exposed as a separate state
      from 'UP'.
    * plugin_extmon: the value 'fail_once' for the option
      'helper_failure_action' no longer exists, as it no longer
      makes sense without a visible DANGER state.  The new default
      is 'stasis'.
    * The special service_type 'danger' no longer exists.
    * The special service_type 'none' as an alias for 'up' no
      longer exists.  Use 'up' instead.
    * The special default service_type 'default' (which used
      plugin_http) no longer exists.  The new default is 'up'.

  *** Administrative state-forcing:
    * All monitored entities can be administratively forced
      UP or DOWN (optionally, with a specific monitored TTL) at
      runtime.
    * Additionally, plugins can register virtual entities which
      have no separate real monitoring, but can be administratively
      forced into a non-default state.
    * The current virtual entities in use are the datacenters of
      plugin_metafo and plugin_geoip.  In the plugin_geoip case,
      there are two levels of state-forcing for datacenters: at
      the per-resource level or the map level.  The more-specific
      per-resource level state takes precedence over the map-
      level state, and both override any state from lower-level
      monitored (or forced) resources within a datacenter.
    * The mechanism for forcing state is via writing to a file
      named e.g. /var/lib/gdnsd/admin_state in vscf format
      with lines like "192.0.2.*/http => DOWN/300", or
      "geoip/map3/dc-us => UP".  As shown in the first example,
      glob patterns are allowed for matching entity names.

  *** Daemonization changes:
    * The argument "-d <rootdir>" has been replaced by "-c <cfgdir>",
      e.g. "gdnsd -c /etc/gdnsd start", with a default of
      ${sysconfdir}/gdnsd.
    * Two new configuration options for run_dir and state_dir to
      override the autoconf-based defaults of e.g. [/var]/run/gdnsd
      and /var/lib/gdnsd, respectively.  It's probably better to
      change these via ./configure args in the normal case; this
      is mostly for testsuite-like stuff or multiple instances on
      a single machine.
    * Direct, inbuilt support for chroot() has been removed.  There
      are much better security container options out there today that
      can be configured externally to wrap gdnsd and/or limit its
      privileges.  Use them!
    * debug-mode is now enabled on the commandline via "-D",
      and even production builds now produce some level of
      debug log output.
    * "startfg" has been replaced with the flag "-f", which can
      be used with any of the start or restart -like actions
      to remain in the foreground.
    * initgroups() is now called during privdrop operations,
      allowing the daemon to have the secondary group permissions
      assigned to its user in /etc/group or equivalent.
    * Foreground daemons participate fully in all other aspects
      of daemonization (e.g. privdrop and pidfile locking)
    * It is possible to properly restart a daemon instance from
      background to foreground and back again; meaning "-f restart"
      can take over from a regular daemon into the foreground,
      and then a regular "restart" in another terminal can replace
      the foreground daemon with a new background one.
    * Restarts are now even more seamless than they were before.
      All expensive operations are completed before attempting to
      kill the previous daemon instance (even monitor initialization),
      leaving only the timing gap of waiting for the old daemon to
      exit in response to its death signal before binding the
      listening sockets in the new daemon, however:
    * In cases where SO_REUSEPORT works, the new daemon's listeners
      will be bound just *before* sending that death signal to reduce
      lost requests even further.  Note that you'll probably
      still lose a handful of requests that were in the old daemon's
      socket buffers at the time of its death.

  *** Trivial, previously-deprecated incompatibilities:
    * plugin_weighted: no longer allows 'cnames' alongside
      'addrs_v4' or 'addrs_v6' in the same resource.
    * plugin_weighted: the pointless 'cnames' singleton substanza is
      no longer supported; just place the entries directly in the
      top level of the resource.
    * The 'late_bind_secs' option was removed.
    * The 'tcp_clients_per_socket' option is removed. Use
      'tcp_clients_per_thread' instead.
    * The 'disble_tcp' option is removed. Use 'tcp_threads = 0' instead.
    * The 'zones_rfc1035_strict_startup' option is removed.  Use
      'zones_strict_startup' instead.
    * plugin_extmon: %%IPADDR%% replaced by %%ITEM%%
    * Direct support for the SPF RR-type (99) has been removed.

  *** Other misc incompatibilities
    * The plugin API has changed substantially; any third-party
      plugins will need substantial source-level updates.  See the
      gdnsd-plugin-api docs.
    * Support for the old, experimental edns-client-subnet option code
      0x50fa has been removed; gdnsd now only supports the official,
      IANA-assigned option code 0x0008.

  *** Build changes
    * libcap is no longer used on Linux
    * --without-libcap doesn't exist anymore
    * --with-rootdir doesn't exist anymore
    * Perl 5.8.1+ and "perldoc" is required for building
    * Preliminary systemd support via --with-systemd

1.11.5 - 2014-09-10
    Bugfixes:
      Remove F_PURE from rfc1035 out-of-zone check
        This was causing out-of-zone data checks during
        the loading of rfc1035 zonefiles to be skipped
        sometimes, depending on compiler/optimizations.
      Change down_thresh min value from 1 to 2.
        The value "1" leads to buggy behavior, and was
        never intended to be possible in the state
        machine's design.
      Only use EPROTO if it's available.
        Build-time bugfix for OpenBSD support.
      Fix Linux version detection for initial 3.x kernels
        Runtime checks of the Linux kernel version
        for feature support were failing on 3.x.0 kernel
        versions which do not include the ".0" in the
        version string.
    Deprecations:
      extmon: add %%ITEM%%, deprecate %%IPADDR%%
      plugin_weighted: deprecate "cnames" stanza
        (both of these are to smooth out the 2.x transition)

1.11.4 - 2014-07-18
    Major bugfix: The SOA record returned in the auth section of
      negative responses (NXDOMAIN and NODATA) had an incorrect TTL.
        RFC 2308 says that auth servers should set the SOA record's
      own TTL to the minimum of the real SOA TTL and the SOA
      "minimum" field (aka ncache field), but gdnsd was simply using
      the real SOA TTL and assuming caches looked at the
      minimum/ncache field directly (which they do not).
        The fallout is that if you specified a minimum/ncache
      value of 3H but the TTL of the SOA record itself
      was 24H, your negative answers to caches would indicate
      that the answer should be cached for 24H.  Luckily
      many caches limit ncache durations (e.g. BIND9 defaults to
      a limit of 3H), mitigating the issue somewhat, but
      it's still a pretty big deal.

    Bugfix: plugin_geoip was not correctly runtime-reloading
      geoip databases from geoip_db_v4_overlay due to a simple
      code error, which is now fixed.

1.11.3 - 2014-05-14
    Important code fixes: ----------------------------------
      GeoIP country code support for South Sudan
        (SS) added, to support newer upstream GeoIP data.
      GeoIP country code routines updated to handle
        unknown country codes more gracefully.

    Trivial code fixes: ------------------------------------
      Avoid listening on a random pointless socket
        when bind() fails on an address from interface scan.
      Improved pathname formatting in various error
        and warning log outputs.
      Fixed two small leaks on failed reloads of plugin_geoip
        'nets' database files.
      Fixed another small leak on bad resource values
        for geoip/metafo RR's in failed zonefiles.
      Fixed some bad libev state assertions related to
        timers, which may have caused racy failures in rare
        cases in debug builds.
      Fixed a crash-on-startup when loading certain forms of
        invalid configuration input to the meta-plugins.

    Build process fixes: -----------------------------------
      autoconf detection of pthreads flags on newer
        versions of clang improved.
      automake use of objects in subdirectories has
        been removed, hopefully increasing compatibility.
      directory creation during "make install" cleaned up

    New deprecations: -------------------------------------
      The SPF RR-type has been deprecated and will generate
        a warning on zonefile loading.

    *** This really will be the very last release of 1.x
        before 2.0.0, barring the necessity of serious
        bugfixes in the 1.x code.  Please pay attention
        to the deprecation warnings in your log output;
        all of those things will become real issues when
        you upgrade to 2.x.

1.11.2 - 2014-02-27
    Bugfix: HTTP stats output network send code was horribly
      broken in theory, but the bugs were difficult to hit
      in practice.  Triggering required the combination of
      a large-enough set of monitored services and smallish
      TCP send buffers, such that the data wouldn't be
      completely sent by the first writev() call.  Was finally
      noticed by someone monitoring 50+ services on a certain
      type of VM instance (thanks YTS for the report!)
    Bugfix: Stats output buffer calculations made more-robust.
      They were too small in some very corner cases, but I
      don't believe anyone ever hit this bug; it was found
      via source analysis.
    Bugfix: plugin_simplefo now works correctly with no
      service_types specified (default http checks).  This
      has been broken for years.  Apparently nobody uses it
      this way, if at all.
    *** This is a good time to re-iterate that v2.0.0 is due
      sometime "soon".  2.x will have some substantial
      backwards-compatibility breaks with 1.x, especially for
      any 3rd party plugin.  Anything that currently gives a
      deprecation notice in 1.x will be removed/changed in 2.x
      for sure, so look out for those in your log output.  The
      branch is available as it progresses at:
             https://github.com/blblack/gdnsd/tree/2.x

1.11.1 - 2014-02-11
    Bugfix for plugin_geoip's normalization of "nets" input data.
      This bug affected some forms of un-normalized "nets" inputs,
      resulting in incorrect responses (or assertfail in debug builds).
      The replacement code is much simpler and more reliable, but
      also slower.
    Build Bugfix: plugins' dependencies on libm were being met
      indirectly via libgdnsd's library deps in automake/libtool
      terms.  However, due to platform variances as to which
      math functions are inlined, combined with the "--as-needed"
      linker flag, sometimes libm was not linked for libgdnsd,
      which could result in plugins not finding math symbols.
      This has caused build problems on at least Ubuntu/i386 and
      Ubuntu/ppc64el.  The fix moved the libm deps to their
      proper places in the respective Makefile.am's.
    The official tarball download URLs are moving back to github
      at https://github.com/blblack/gdnsd/releases/ .  The old
      location will continue to host the tarballs that exist
      there for a while, so as not to disrupt automated things,
      and this bugfix release will also be published in both
      places just in case.

1.11.0 - 2013-12-06
    Bugfixes:-----------
      fixed edns-client-subnet issue with configurations that
        enclose a geoip resource within a metafo resource: the
        metafo plugin would clear the edns scope mask set by
        the geoip plugin in this case, but no longer does so.
      fixed a segfault that could occur when parsing an illegal
        configuration for the metafo and geoip plugins.
      misc improvements to warning/error outputs
      misc doc fixups
    Features/Changes:---
      New options 'udp_threads' and 'tcp_threads' (global or
        per-listen-address).  Both default to 1, which is
        the previous behavior.  If increased, SO_REUSEPORT
        is set on the affected listening sockets, and multiple
        sockets are bound to the same address with separate
        listening threads.  If SO_REUSEPORT is not available
        (as is the case for Linux kernels < 3.9), the options
        will be forced down to 1.
      New option 'zones_strict_data', similar to the old
        'strict_data' option, upgrades zone data warnings to
        full errors.  Defaults false.
      New commandline option '-S' temporarily enables
        'zones_strict_data' regardless of config-file setting,
        mostly useful for 'checkconf'
      New commandline option '-s', as above for 'zones_strict_startup'
      'listen' option: new values 'any' and 'scan'.  'any' uses
        the ANY-addresses (IPv4 + v6 as applicable), and 'scan'
        scans the interface list via getifaddrs() and configures
        each valid address as a separate listener, which is still
        the default behavior.  A warning has been added when using
        the implicit default 'scan' behavior, indicating that the
        default will change to the 'any' behavior in a future
        release.
      PTR records no longer do additional-section processing, as
        per the RFCs (not that any practical config ever made use
        of it anyways)
    Deprecations:-------
      The use of 'cnames' in the same resource as 'addrs_v[46]'
        in the 'weighted' plugin is deprecated.  Please migrate
        away from this by placing the cnames in a separate
        resource.
      'late_bind_secs' feature is deprecated, and should be
        unnecessary now that we fallback to attempting
        IP_FREEBIND (or the BSD equivalent) on initial bind()
        failure.
      'zones_rfc1035_strict_startup' option was renamed to
        'zones_strict_startup' with deprecated support for
        the old name.
      'tcp_clients_per_socket' option was renamed to
        'tcp_clients_per_thread' with deprecated support
        for the old name.
      'tcp_disabled' option deprecated in favor of setting
        the new 'tcp_threads' option to zero.
    *** NOTE *** Version 2.0.0 will be coming up soon, it could
       even potentially be the very next release.  2.0.0 will contain
       major feature work related to plugins, and (as the bump of
       the leading version number indicates) it won't be a fully
       backwards-compatible release.
     Most things that have become "deprecated" over the past
       several releases will have their backwards-compatibility
       removed in 2.0.0, and notably the plugin API will have
       substantial changes for any 3rd-party plugin code to
       accomodate.  You have been warned!

1.10.1 - 2013-10-04
    Bugfixes:
      A faulty assert() was removed from the plugin_geoip code:
        This assert failure could be triggered in a debug build
          of the daemon by a carefully crafted request packet, but a
          normal cache would never generate such a packet intentionally.
        No known problems for non-debug builds (which should include all
          "normal" builds from debs/rpms, etc), but if you're running
          a debug build on the internet, it can be DoS'd with this.
      plugin_geoip "nets" data normalization was buggy when presented
        with certain odd sets of un-normalized networks which had
        overlapping and/or mergeable subnets in the data.  All known cases
        are now handled correctly. In the case of a complete conflict
        (exact same subnet/mask mapped to two different results explicitly),
        the choice between the two variants is arbitrary and a warning is
        issued (before, this resulted in load failure).
      Removed debugging and gdnsd_geoip_test text output length limitations
        on very long dclists.
      Fixed a testsuite bug which resulted in a false failure if
        the system's /usr/share/GeoIP/ contained database
        formats other Country, Region, and City.

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
