1.0.3  2010-12-23

	* Support for passing file descriptors over D-Bus added to
	  nih-dbus-tool.  Due to code limitations, to avoid leaking the
	  file descriptor in case of error it must be the last input
	  argument to any method being implemented and within your
	  function you are responsible for closing it on error.

1.0.2  2010-04-27

	* AC_COPYRIGHT wrapper renamed to NIH_COPYRIGHT.  (Bug: #519278)

	* Serial added to libnih.m4 to stop aclocal overwriting a local
	  copy with an older installed copy.

	* NIH_WITH_LOCAL_LIBNIH macro added that can be used by external
	  sources to add a --with-local-libnih configure argument.

1.0.1  2010-02-04

	* Add missing __nih_* symbols to the linker version script,
	  otherwise software using TEST_ALLOC_FAIL cannot be compiled (like
	  Upstart).

	* The glibc __abort_msg symbol is now only linked as a weak
	  reference, if your C library does not have the symbol, libnih
	  will still work.

1.0.0  2009-11-28

	* libnih is no longer intended to be copied into an application
	  source tree and linked statically, but is now installed onto the
	  system and dynamically linked normally.  The nihify script has
	  been removed accordingly.

	* Future 1.0.x versions will contain bug fixes, but no API or ABI
	  changes.  Future 1.x.0 versions may introduce new things to the
	  API or ABI but will be backwards compatible with previous
	  versions.  Future x.0.0 versions will not be backwards compatible.

	* The NIH_INIT macro has been removed, to check for libnih or
	  libnih-dbus you should now use pkg-config, e.g.:

		PKG_CHECK_MODULES([NIH], [libnih >= 1.0.0])

	  any other checks should be added as necessary instead of
	  relying on that macro to do them for you.

	* An external pre-built nih-dbus-tool may be used instead of the
	  built copy by passing NIH_DBUS_TOOL to configure.  If you are
	  cross-compiling, this will be automatically searched for in the
	  PATH and a warning output if it doesn't exist and you fail to
	  specify it.  (Bug: #426740)


	* nih_alloc() has been fixed to work on platforms with alignment
	  greater than 4 bytes.  (Bug: #436758)

	* nih_alloc() no longer permits objects to have zero references,
	  passing NULL for the parent now creates a special reference from
	  a NULL parent.

	* nih_discard() removes this special reference before checking
	  whether remaining references free the object.

	* nih_ref() and nih_unref() may have NULL as the parent reference
	  and add or remove the special reference respectively.

	* nih_ref() does not remove the NULL reference, you must now use
	  nih_discard() or nih_local to construct floating objects.

	* Since nih_ref() may be used when parent is NULL, there's no reason
	  for an nih_unref_only() function so it has been dropped; the
	  following code is now perfectly safe:

		nih_ref (obj, new_parent);
		nih_unref (object, old_parent);

	* nih_alloc_parent() has changed again, now when passed NULL it
	  only returns TRUE if the object has the special NULL parent.

	* TEST_ALLOC_PARENT() has likewise changed, restoring the previous
	  behaviour that TEST_ALLOC_PARENT(ptr, NULL) tests whether it has
	  the NULL parent.

	* The TEST_ALLOC_ORPHAN() macro has been dropped, objects may no
	  longer have no parents.

	* A new TEST_ALLOC_NOT_PARENT() macro has been added that is the
	  exact inverse of TEST_ALLOC_PARENT()

	* These changes solve the problem where the object "obj" in the
	  following code would be freed, even though it was intended that
	  it be a top-level object:

		obj = nih_new (NULL, Obj);

		nih_ref (obj, tmp_obj);
		nih_unref (obj, tmp_obj);

	  This comes at a cost of breaking the previous behaviour where
	  a NULL-parented object could be considered floating and
	  ignored once referenced.  This kind of code was brittle anyway
	  and nih_local far better solves it, e.g. replace code such as:

		Obj *obj;

		obj = nih_new (NULL, Obj);
		func_that_will_ref (obj);

	  with:

		nih_local Obj *obj = NULL;

		obj = nih_new (NULL, Obj);
		func_that_will_ref (obj);

	* nih_log_message() will set the glibc __abort_msg variable to any
	  log message of NIH_LOG_FATAL priority or greater, this means that
	  should you call abort() core dump analysers can retrieve the
	  message; especially useful for nih_assert().  (Bug: #429411)


	* nih-dbus-tool generated code has been fixed so that when a
	  method call function is called on a disconnected connection
	  it returns a raised DBUS_ERROR_DISCONNECTED rather than causing
	  an assertion error.  (Bug: #477116)

0.3.2  2009-08-02

	* D-Bus 1.2.16 is now required.

	* Fixed compilation on ia64.

	* nih-dbus-tool(1) manpage will not be installed, since the binary
	  is not.  (Bug: #403103)

0.3.1  2009-07-09

	* The licence for libnih has been changed back to version 2 of the
	  GNU GPL.

	* D-Bus 1.2.15 is now required, this is the current GIT HEAD
	  pending a 1.2.16 release.

	* TEST_EXPECTED_STR and TEST_EXPECTED_FILE added.  These compare the
	  contents of a string and file respectively against the contents
	  of a given filename relative to the "expected" directory alongside
	  the test binary, e.g.:

		TEST_EXPECTED_STR (code, "foo.c");

	  in tests/test_foo will be TRUE if the contents of the C string
	  "code" match the contents of the file tests/expected/foo.c

	* NihFileFilter (the function type passed to nih_dir_walk and
	  nih_watch_new) now has an extra is_dir argument, this is set
	  without calling stat()

	* NihTimer now uses a monotonic clock, so is unaffected by changes
	  in the system clock; this means that you'll need to use
	  clock_gettime (CLOCK_MONOTONIC) when manually adjusting the due
	  time rather than time ().  (Bug: #389589)

	* NihError may now be directly embedded into other structures with
	  the NIH_ERROR_MEMBERS macro.

	* NihDBusError now directly embeds the members of NihError, there
	  is no longer an "error" member, instead you can directly access
	  "number" and "message" members.

	* NihDBusProxy has gained an auto_start member, TRUE by default.
	  If you do not want method calls to automatically start a service,
	  you may set this to FALSE after creating the proxy.  nih-dbus-tool
	  generated method calls will respect this flag.

	* nih_dbus_proxy_connect() no longer has both a parent and proxy
	  argument, it now only takes the proxy and is always a child of it.

	* NihDBusProxySignal no longer has connection, name or path members
	  and instead has a proxy member from which the values can be found.

	* nih_dbus_proxy_new() will now begin tracking any name given, even
	  if there is no lost_handler passed.  This (and the above changes)
	  allows signal handlers to compare the sender of a signal (which is
	  always a unique name) against the owner of the associated proxy.

	* Attempting to read from a D-Bus property that is write-only, or
	  attempting to write to a D-Bus property that is read-only will now
	  return the DBUS_ERROR_ACCESS_DENIED error rather than
	  DBUS_ERROR_UNKNOWN_METHOD.

	* An empty com.netsplit.Nih.Symbol annotation is no longer permitted
	  for D-Bus interfaces.  Instead use the new --default-interface
	  option to nih-dbus-tool.

	* nih-dbus-tool now properly supports structures, including arrays of
	  structures and arrays of dictionary entries.  The default naming
	  of the structure is derived from the method or signal name and
	  argument or the property name; the default naming of the members
	  is "item0".."itemN".  Structure definitions appear in the
	  generated header file.

	* nih-dbus-tool now generates prefix_interface_get_all() and
	  prefix_interface_get_all_sync() methods for each interface, these
	  get the values of all of the properties and store them in a
	  PrefixInterfaceProperties structure defined in the header file.

	* A side-effect of the above is that it's no longer possible to
	  name properties after C keywords.

0.3.0  2009-06-17

	* The licence for libnih has been changed to MIT/X11.

	* The --enable-compiler-warnings configure option has been
	  extended to add -Wextra, but turns off a few of the more extreme
	  warnings

	* TEST_FILE_MATCH() added to allow matching of a line in a file
	  against a wildcard string

	* NIH_MUST(), NIH_ZERO() and NIH_SHOULD() now expand to an
	  expression with the value of the expression inside.  This means
	  that the code like the following is now valid:

		ret = NIH_SHOULD (some_function_call ());
		if (ret < 0)
			...

	  This style is preferred to the previous way of doing it (set ret
	  inside the macro call) and the code has been updated.

	* nih_option_parser() fixed to not eat an argument containing a
	  lone dash.

	* nih_error_raise_again() renamed to nih_error_raise_error().

	* Errors are no longer removed from the context when you call
	  nih_error_get(), this means that to clear the error you must free
	  it and it's now a bug to call nih_error_raise_error() to raise
	  it again.

	* Unhandled errors now result in an assertion error, rather than a
	  log message being emitted.  This assertion will include the
	  filename, line number and function name where the error was
	  originally raised.  The assertion may be generated on exit from
	  the program.

	* nih_option_help() produces slightly different output if the
	  bug reporting address is a URL.

	* GNU C Library v2.4 (or backported inotify support) is required

	* D-Bus object and proxy interface structure definitions have been
	  moved to nih-dbus/dbus_interface.h, this file is still included
	  by nih-dbus/dbus_object.h and nih-dbus/dbus_proxy.h so there
	  may be no need to include it directly.

	* nih_dbus_proxy_new() has additional arguments, a lost handler
	  function which enables tracking of the owner of the well-known
	  name, and a data pointer.  NihDBusProxy has a new owner member
	  which contains this.

	* Signals may be connected using nih_dbus_proxy_connect(), this
	  requires both a handler function and an intermediate filter
	  function.  The NihDBusSignal structure gained a filter member
	  to specify the latter.

	* The D-Bus binding tool has moved into a separate nih-dbus-tool
	  subdirectory, and rewritten from Python to C.

	* The D-Bus binding tool now uses annotations rather than XML
	  namespaced attributes to adjust the output:
	  - set com.netsplit.Nih.Method.Async to "true" instead of using
	    nih:object="async"
	  - com.netsplit.Nih.Symbol may be used to override C symbol name
	    generation
          - org.freedesktop.DBus.Deprecated results in a deprecated
	    attribute on external API

	* Function names generated by the D-Bus binding tool now include
	  the last element of the interface name; my_method() would now
	  be named my_interface_method().  The interface name can be
	  ommitted by setting the com.netsplit.Nih.Symbol annotation to ""

	* Proxy method functions are now asynchronous by default, the
	  synchronous version has _sync() appended to its name.

	* Signal function names now always include "emit" in them.

	* Signal filter functions are generated by the binding tool for use
	  with nih_dbus_proxy_connect()

	* Get and Set access functions are now generated for properties,
	  and in object mode are expected to be provided.

	* Arrays of arrays are now fully supported; if the array is an
	  array of basic types, the function will have two arguments; a
	  NULL-terminated array of arrays, and a second NULL-terminated
	  array of those array lengths.  This is supported to infinite
	  depths.

	* D-Bus 1.2.4 is now required.

	* pkg-config 0.22 is now required, it probably was anyway but we
	  now explicitly check for it.

	* Dependency on Python for the D-Bus binding tool has been dropped
	  and replaced with a dependency on expat 2.0.0

	* The NIH_DBUS_ERROR and NIH_DBUS_INVALID_ARGS error enums have
	  been moved to nih-dbus/errors.h

0.2.0  2009-01-29

	* nih_alloc_set_allocator() is now a macro that casts the function
	  to the right typedef, so such casts are no longer needed

	* nih_alloc() now permits multiple parent references
	  - nih_ref(ptr, parent) creates a new parent reference
	  - nih_unref(ptr, parent) drops a reference and frees if the last
	  - nih_unref_only(ptr, parent) drops a reference without freeing
	  - nih_free() unconditionally frees as it always has
	  - nih_discard() only frees if there are no references

	* nih_local may be added to variable definitions to have the
	  pointer automatically discarded when it goes out of scope, unless
	  it is referenced in the meantime:

		{
			nih_local char *str = NULL;
			str = nih_strdup (NULL, "some string");
			pass_to_func (str);
		}

	* nih_alloc_reparent() has been dropped, it can be replaced with
	  an nih_unref_only()/nih_ref() pair - however many uses of this
	  are no longer necessary and it's worth taking some time to refactor
	  the code.

	* nih_alloc_parent() has changed; it now accepts both an object ptr
	  and a parent and returns TRUE if the object has that parent, if
	  parent is NULL is returns TRUE of the object has any parent.
	  (previously it was used to return _the_ parent).

	* TEST_ALLOC_PARENT() now behaves as nih_alloc_parent(), which means
	  testing for no parent with NULL has the exact opposite behaviour
	  use the new TEST_ALLOC_ORPHAN(ptr) macro instead.

	* nih_str_array_addp() now references the passed pointer, instead
	  of reparenting it.  Calling code should be modified to make sure
	  it either calls nih_discard() or uses nih_local to be safe in case
	  of error.

	* nih_strv_free() has been dropped since it did not match the
	  behaviour of the other functions

	* new NIH_LIST_ITER(iter, type, member) macro to handle the case of
	  an offset head in an iterated structure

	* nih_hash_pointer_new(), nih_hash_pointer_key(),
	  nih_hash_pointer_hash() and nih_hash_pointer_cmp() have been dropped
	  since they did strange things to pointers that probably aren't
	  legal C.

	* nih_config_parse() now reads the file into memory, instead of using
	  mmap().  The API is unchanged, however the errors may be different.

	* The D-Bus bindings have been moved into a separate sub-directory
	  and split out into multiple files.  You will need to update your
	  includes as follows:
	  - NihDBusError and nih_dbus_error_*() are in nih-dbus/dbus_error.h
	  - nih_dbus_connect(), nih_dbus_bus(), nih_dbus_setup() and
	    nih_dbus_server() are in nih-dbus/dbus_connection.h
	  - NihDBusMessage and nih_dbus_message_*() are in
	    nih-dbus/dbus_message.h
	  - NihDBusObject, NihDBusInterface and nih_dbus_object_new() are in
	    nih-dbus/dbus_object.h
	  - NihDBusProxy and nih_dbus_proxy_new() are in nih-dbus/dbus_proxy.h
	  - nih_dbus_path() is now in nih-dbus/dbus_util.h

	* The D-Bus test macros are now in nih-dbus/test_dbus.h

	* nih_dbus_message_new() now exists as a function in its own right

	* Asynchronous method callbacks must take a reference to the
	  NihDBusMessage object they are passed, otherwise it will be freed

	* Reply functions and nih_dbus_message_error() no longer free the
	  message passed in, this is consistent with the above change.

	* libtool 2.2.4 is now required

	* The MIN() and MAX() macros are no longer defined, instead use
	  nih_min() and nih_max() which do not re-evaluate their parameters
	  multiple times.

	* The nih_main_package_string() function has been dropped, instead
	  just access the package_string global set by nih_main_init_full()

0.1.0  2008-10-24
 
	* Initial public release.

